/* 
  Pràctica de PS Quadrimestre Tardor 2004-2005 <EDAMAZE>
  Autors:
          Daniel Clemente Laboreo <www.danielclemente.com>
          Francesc Xavier Morales Pascual <www.xavimorales.biz>
*/

// cambra.cpp: operacions amb cambres

#include <string>
#include <eda/error>
#include <eda/util>
#include "cambra.hpp"

// Ordre en què estan les parets al vector. És el mateix que a l'enumeració a la classe paret.
// Podríem fer l'scoping cada cop (paret::NORD), però així és més curt
enum {NORD, EST, SUD, OEST, NO_DIR};


// Definir membres static
//  (veure discussió: http://lists.debian.org/debian-gcc/2001/12/msg00065.html )

const char cambra::nom_mod[7];
const int cambra::ParetInexistent;
const char cambra::MsgParetInexistent[21];


//Constructora
cambra::cambra(bool n, bool s, bool e, bool o) throw(error) {
  //Canviem els valors dels 4 elements del vector
  // n=cert vol dir que es pot passar
  parets[NORD] = (n)?paret():paret("nord");
  parets[EST] = (e)?paret():paret("est");
  parets[SUD] = (s)?paret():paret("sud");
  parets[OEST] = (o)?paret():paret("oest");
}

cambra::cambra(const cambra & c) throw(error) {
  parets[NORD] = c.parets[NORD];
  parets[EST] = c.parets[EST];
  parets[SUD] = c.parets[SUD];
  parets[OEST] = c.parets[OEST];
}

cambra& cambra::operator=(const cambra & c) throw(error) {
  parets[NORD] = c.parets[NORD];
  parets[EST] = c.parets[EST];
  parets[SUD] = c.parets[SUD];
  parets[OEST] = c.parets[OEST];
  return *this;
}

cambra::~cambra() throw() {}

bool cambra::hi_ha_porta(paret p) const throw() {
  // Retorna cert si es pot passar

  if ((int)p==NO_DIR) { // Això seria un error...
    // throw error(nom_mod, ParetInexistent, MsgParetInexistent);
    // ...però tenim prohibit llençar excepcions: throw()
    return false; // Arbitrari
  }

  return (parets[p] == paret("NO_DIR")); // Cert si aquella paret no existeix
}

void cambra::obre_porta(paret p) throw(error) {
  if ((int)p==NO_DIR)
    throw error(nom_mod, ParetInexistent, MsgParetInexistent);
  parets[p] = paret("NO_DIR"); // La paret no existeix (es pot passar). Veure fitxer .rep
}

void cambra::tanca_porta(paret p) throw(error) {
  if ((int)p==NO_DIR)
    throw error(nom_mod, ParetInexistent, MsgParetInexistent);
  parets[p] = p; // Una mica redundant però va be. Veure fitxer .rep
}

bool cambra::operator==(const cambra & c) const throw() {
  // Dues cambres són iguals si cada una de les quatre parets és igual a la de l'altra cambra
  // Podriem fer un bucle però és més eficient comparar directament
  return (parets[NORD] == c.parets[NORD] && parets[EST] == c.parets[EST] && parets[SUD] == c.parets[SUD] && parets[OEST] == c.parets[OEST]);
}

bool cambra::operator!=(const cambra & c) const throw() {
  return !(*this == c); // Cridem a l'operador de comparació ==
}
