]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/include/iconector.h
3ca3f2b394e9bbb5e4ce1e481203940dc609af4d
[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          *  \return Respuesta al mensage. Se interpreta dependiendo del mensage
26          */
27         int send_msg(int where, int msg);
28         
29         /// Recive un mensage
30         virtual void recieve_msg(int msg, IConector *who);
31
32         /** Conecta un objeto con otro
33          *
34          *  \param place IConector::IN o IConecor::OUT para conectar a la entrada o salida.
35          *  \param obj Objeto a conectar
36          *  \return true si se pudo conectar
37          */
38         bool connect(IConector *obj, int place);
39
40         /// Constantes de posición donde conectar
41         enum {
42                 IN, ///< conectar a la entrada
43                 OUT ///< conectar a la salida
44         };
45
46         /** Mensages a este nivel
47          *
48          *  Las clases descendientes que quieran definir sus mensajes deben utilizar
49          *  el valor de IConector::MSG_LAST como valor para el primer msg, a fin
50          *  de evitar solapamiento de mensajes.
51          *  Por ejemplo, si tenemos una clase B con un mensaje TEST se declararía
52          *  como :
53          *  \verbatim
54          *      class B:public IConector {
55          *              enum {
56          *                      MSG_TEST=IConector::MSG_LAST,
57          *                      MSG_LAST
58          *      };
59          *  \endverbatim
60          */
61         enum {
62                 MSG_DISCONECT=0, ///< Desconectar el objeto que envía el mensaje
63                 MSG_LAST
64         };
65 protected:
66         /// Lista de objetos conectados a las entradas
67         std::list<IConector *> in_list;
68         /// Lista de objetos conectados a las salidas
69         std::list<IConector *> out_list;
70         /// Cantidad de entradas disponibles
71         unsigned int in_slots;
72         /// Canitidad de salidas disponibles
73         unsigned int out_slots;
74
75 private:
76         // Oculto copia entre clases
77         IConector() {}
78         IConector(const IConector &) {}
79         IConector &operator = (const IConector &) { return (*this); }
80 };
81
82 }
83
84 #endif // _I_CONECTOR_H_