]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/include/iconector.h
Agrego primer version muy chota de lo que va a ser el Simulador
[z.facultad/75.42/plaqui.git] / Model / include / iconector.h
1
2
3 #ifndef _I_CONECTOR_H_
4 #define _I_CONECTOR_H_
5
6 #include <list>
7
8 namespace PlaQui {
9
10 namespace Model {
11 /** Conector genérico de elementos
12  *
13  *  El conector es un interfaz común que permite a objetos de distinto
14  *  tipo comunicarse entre sí sin la necesidad de conocerse.
15  *  Maneja una lista de elementos conectados a uno, que pueden estar
16  *  tanto conectados a una entrada como a una salida.
17  */
18 class IConector {
19 public:
20         /** Constructor
21          *
22          *  \param in Cantidad de entradas
23          *  \param out Cantidad de salidas
24          */
25         IConector(unsigned in, unsigned out);
26         /// Destructor
27         virtual ~IConector();
28
29         /** Envía un mensage a los elementos conectados
30          *
31          *  Envía un mensage a los elementos conectados a la entrada o
32          *  a la salida.
33          *  \param where Donde enviar el mensage, IConector::IN o IConector::OUT
34          *  \param msg Mensage a enviar
35          */
36         void send_msg(int where, int msg, void *data=NULL);
37         
38         /** Recibe un mensage
39          *
40          *  Este procedimiento atiende los mensages enviados por otros objetos.
41          *  El mensage \e msg es enviado por \e who, quien puede enviar opcionalmente
42          *  un dato en \e data. El campo \e data debe ser interpretado en forma
43          *  correcta dependiendo del mensage enviado.
44          *  El objeto que recibe un mensage puede, de ser necesario, responder al
45          *  objeto que lo envió llamando directamente al método recieve_msg del objeto
46          *  \e who. No se recomienda enviar un mensage mediante send_msg ya que puede
47          *  ocacionar que objetos que no esten esperando una respuesta se comporte de
48          *  manera indeterminada.
49          *  \param msg ID del mensage enviado.
50          *  \param who Objeto que envía el mensage.
51          *  \param data Dato opcional a enviar.
52          */
53         virtual void recieve_msg(int msg, IConector *who, void *data);
54
55         /** Conecta un objeto con otro
56          *
57          *  \param place IConector::IN o IConecor::OUT para conectar a la entrada o salida.
58          *  \param obj Objeto a conectar
59          *  \return true si se pudo conectar
60          */
61         bool connect(IConector *obj, int place);
62
63         /// Constantes de posición donde conectar
64         enum {
65                 IN, ///< conectar a la entrada
66                 OUT ///< conectar a la salida
67         };
68
69         /** Mensages a este nivel
70          *
71          *  Las clases descendientes que quieran definir sus mensajes deben utilizar
72          *  el valor de IConector::MSG_LAST como valor para el primer msg, a fin
73          *  de evitar solapamiento de mensajes.
74          *  Por ejemplo, si tenemos una clase B con un mensaje TEST se declararía
75          *  como :
76          *  \verbatim
77          *      class B:public IConector {
78          *              enum {
79          *                      MSG_TEST=IConector::MSG_LAST,
80          *                      MSG_LAST
81          *      };
82          *  \endverbatim
83          */
84         enum {
85                 MSG_DISCONECT=0, ///< Desconectar el objeto que envía el mensaje
86                 MSG_LAST
87         };
88 protected:
89         /// Lista de objetos conectados a las entradas
90         std::list<IConector *> in_list;
91         /// Lista de objetos conectados a las salidas
92         std::list<IConector *> out_list;
93         /// Cantidad de entradas disponibles
94         unsigned int in_slots;
95         /// Canitidad de salidas disponibles
96         unsigned int out_slots;
97
98 private:
99         // Oculto copia entre clases
100         IConector() {}
101         IConector(const IConector &) {}
102         IConector &operator = (const IConector &) { return (*this); }
103 };
104
105 } // namespace Model
106 } // namespace PlaQui
107
108 #endif // _I_CONECTOR_H_
109