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