+
+
+#ifndef _I_CONECTOR_H_
+#define _I_CONECTOR_H_
+
+#include <list>
+
+namespace PlaQui {
+
+/** Conector genérico de elementos
+ */
+class IConector {
+public:
+ /// Constructor
+ IConector();
+ /// Destructor
+ virtual ~IConector();
+
+ /** Envía un mensage a los elementos conectados
+ *
+ * Esvía un mensage a los elementos conectados a la entrada o
+ * a la salida.
+ * \param where Donde enviar el mensage, IConector::IN o IConector::OUT
+ * \param msg Mensage a enviar
+ * \return Respuesta al mensage. Se interpreta dependiendo del mensage
+ */
+ int send_msg(int where, int msg);
+
+ /// Recive un mensage
+ virtual void recieve_msg(int msg, IConector *who);
+
+ /** Conecta un objeto con otro
+ *
+ * \param place IConector::IN o IConecor::OUT para conectar a la entrada o salida.
+ * \param obj Objeto a conectar
+ * \return true si se pudo conectar
+ */
+ bool connect(IConector *obj, int place);
+
+ /// Constantes de posición donde conectar
+ enum {
+ IN, ///< conectar a la entrada
+ OUT ///< conectar a la salida
+ };
+
+ /** Mensages a este nivel
+ *
+ * Las clases descendientes que quieran definir sus mensajes deben utilizar
+ * el valor de IConector::MSG_LAST como valor para el primer msg, a fin
+ * de evitar solapamiento de mensajes.
+ * Por ejemplo, si tenemos una clase B con un mensaje TEST se declararía
+ * como :
+ * \verbatim
+ * class B:public IConector {
+ * enum {
+ * MSG_TEST=IConector::MSG_LAST,
+ * MSG_LAST
+ * };
+ * \endverbatim
+ */
+ enum {
+ MSG_DISCONECT=0, ///< Desconectar el objeto que envía el mensaje
+ MSG_LAST
+ };
+protected:
+ std::list<IConector *> entradas;
+ std::list<IConector *> salidas;
+ unsigned int cant_entradas;
+ unsigned int cant_salidas;
+};
+
+}
+
+#endif // _I_CONECTOR_H_