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