7 Persona(const std::string& nombre, sexo_type sexo):
8 nombre(nombre), estado(SOLTERO), sexo(sexo), pareja(0)
12 /// Para representación
14 operator<< (std::ostream& os, const Persona::estado_type e)
18 case Persona::SOLTERO:
19 return os << "soltero";
20 case Persona::DECLARADO:
21 return os << "declarado";
22 case Persona::COMPROMETIDO:
23 return os << "comprometido";
25 assert("Estado de la persona desconocido");
26 return os << "desconocido";
30 /// Para representación
32 operator<< (std::ostream& os, const Persona::sexo_type s)
41 assert("Sexo de la persona desconocido");
42 return os << "desconocido";
46 /// Para representación
48 operator<< (std::ostream& os, const Persona& p)
50 std::string pareja = "-";
53 pareja = p.pareja->nombre;
55 os << "<" << p.nombre << " (" << p.sexo << "): " << p.estado << " - "
60 /// Función de comparación entre dos personas según nuestras preferencias
63 cmp(const Persona& p1, const Persona& p2) const
65 prefs_type::const_iterator pos_p1
66 = std::find(prefs.begin(), prefs.end(), &p1);
67 prefs_type::const_iterator pos_p2
68 = std::find(prefs.begin(), prefs.end(), &p2);
76 // Para que no se exporte el símbolo, es de uso interno de este módulo
79 /// Functor de ordenamiento auxiliar
83 PersonaCmp(Persona& p): p(p) {}
84 /// devuelve true si p1 < p2
85 bool operator ()(const Persona* const p1, const Persona* const p2)
87 return p.cmp(*p1, *p2) < 0;
92 /// Ordenamos las ofertas segun nuestras preferencias
97 // este sort es in-place y O(N.log(N))
98 // Más info en: http://www.sgi.com/tech/stl/sort.html
99 std::sort(ofertas.begin(), ofertas.end(), PersonaCmp(*this));
102 /// Nos declaramos a la persona p
105 declarar_a(Persona& p)
109 p.ofertas.push_back(this);
112 /// Nos comprometemos con la persona p, quien se nos habia declarado previamente
115 comprometer_con(Persona& p)
117 assert(p.estado == DECLARADO);
118 assert(p.pareja == this);
120 // rompemos el compromiso, si hay
121 if (estado == COMPROMETIDO)
124 pareja->estado = SOLTERO;
126 pareja->rechazos.push_back(this);
130 estado = COMPROMETIDO;
132 p.estado = COMPROMETIDO;
135 // si tenemos ofertas, las rechazamos
136 for (ofertas_type::iterator pretendiente = ofertas.begin();
137 pretendiente != ofertas.end(); ++pretendiente)
139 (*pretendiente)->rechazos.push_back(this);
144 // Nos comprometemos con la otra persona y a ella la comprometemos con nosotros
147 comprometer_con_bt(Persona& p)
150 estado = COMPROMETIDO;
152 p.estado = COMPROMETIDO;
156 // Rompemos el compromiso existente
159 romper_compromiso(Persona& p)
161 assert(pareja == &p);
162 assert(p.pareja == this);
164 // rompemos el compromiso