]> git.llucax.com Git - z.facultad/75.29/susanita.git/blob - src/persona.h
Bugfix (estaba eligiendo a la persona menos preferida =)
[z.facultad/75.29/susanita.git] / src / persona.h
1 #ifndef _PERSONA_H_
2 #define _PERSONA_H_
3
4 #include <deque>
5 #include <string>
6 #include <ostream>
7 #include <istream>
8 #include "hashtable.h"
9
10 struct Persona
11 {
12         /// Tipos de listas
13         typedef std::deque< Persona* > prefs_type;
14         typedef std::deque< Persona* > ofertas_type;
15         typedef HashTable rechazos_type;
16         typedef HashTable::size_type size_type;
17
18         /// Estados posibles de una persona
19         enum estado_type { SOLTERO, DECLARADO, COMPROMETIDO };
20
21         /// Sexo
22         enum sexo_type { M, F };
23
24         /// Constructor
25         Persona(const std::string& nombre, sexo_type sexo, size_type cap);
26
27         /// Nombre de la persona, sólo con fines de representación
28         std::string nombre;
29
30         /// Para la lista de personas que prefiere usamos dos estructuras: la
31         /// primera es una lista en donde el primer elemento es la persona
32         /// mejor posicionada; la segunda es un hash indexado por el nombre de
33         /// la persona, y como valor la posicion numerica.
34         /// Esta dualidad nos permite tener iteracion en orden, O(1) en
35         /// encontrar el mejor, y O(1) en ver quien es el preferido entre dos
36         /// personas.
37         prefs_type prefs;
38         HashTable<int> prefs_hash;
39
40         /// Estado de la persona
41         estado_type estado;
42
43         /// Sexo
44         sexo_type sexo;
45
46         /// De estar declarado o comprometido, quien es su pareja
47         Persona* pareja;
48
49         /// Lista de la gente que se le declaro
50         ofertas_type ofertas;
51
52         /// Lista de la gente que lo rechazo
53         rechazos_type rechazos;
54
55         /// Función de comparación entre dos personas según nuestras prefs
56         int cmp(const Persona& p1, const Persona& p2) const;
57
58         /// Ordenamos las ofertas según nuestras preferencias
59         void ordenar_ofertas();
60
61         /// Nos declaramos a la persona p
62         void declarar_a(Persona& p);
63
64         /// Nos comprometemos con la persona p, quien se nos habia declarado
65         /// previamente
66         void comprometer_con(Persona& p);
67         
68         // Nos comprometemos con la otra persona y a ella la comprometemos con nosotros
69         void comprometer_con_bt(Persona& p);
70         
71         // Rompemos el compromiso
72         void romper_compromiso(Persona& p);
73 };
74
75 /// Para representación
76 std::ostream& operator<< (std::ostream& os, const Persona::estado_type e);
77
78 /// Para representación
79 std::ostream& operator<< (std::ostream& os, const Persona& p);
80
81 #endif // _PERSONA_H_