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