Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / include / anna / dbos / SetFacade.hpp
diff --git a/include/anna/dbos/SetFacade.hpp b/include/anna/dbos/SetFacade.hpp
new file mode 100644 (file)
index 0000000..babadc9
--- /dev/null
@@ -0,0 +1,126 @@
+// ANNA - Anna is Not Nothingness Anymore                                                         //
+//                                                                                                //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
+//                                                                                                //
+// See project site at http://redmine.teslayout.com/projects/anna-suite                           //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
+
+
+#ifndef anna_dbos_SetFacade_hpp
+#define anna_dbos_SetFacade_hpp
+
+#include <vector>
+
+#include <anna/dbos/Set.hpp>
+#include <anna/dbos/ObjectFacade.hpp>
+
+namespace anna {
+
+namespace dbos {
+
+/**
+   Clase que facilita el acceso y uso de las clases encargadas de la instanciacion de multiples objetos a partir de los
+   datos contenidos en un medio fisico, que normalmente seria la tabla de una base de datos.
+
+   Esta nos facilita el manejo de instancias multiples, es decir, para una condicion de carga dada hay varios registros
+   o elementos del medio fisico que la cumplen.
+
+   La clase \em T debe tener definidos los siquientes metodos:
+      \li anna::dbos::Object::instantiate: Interpreta la informacin la del medio fisico para adecuarla a
+      la clase C++.
+      \li void destroy () throw (): Libera los recursos reservados por este objeto
+
+   \see dbos_declare_set
+   \see dbos_prepare_set
+*/
+template <typename T> class SetFacade : public ObjectFacade < Set <T> > {
+public:
+  typedef typename Set<T>::iterator iterator;
+  typedef typename Set<T>::const_iterator const_iterator;
+
+  /**
+     Devuelve el numero de elementos contenidos en el conjunto recibido como parametro.
+      Se puede usar sin tener que preocuparse por
+     el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
+     \param t Instancia del conjunto.
+     \return El numero de elementos que contiene el conjunto.
+  */
+  static int size(Set<T>* t) throw() { return (t == NULL) ? 0 : t->size(); }
+
+  /**
+     Iterator al primer elemento del conjunto. Se puede usar sin tener que preocuparse por
+     el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
+     \return Un iterador del primer elemento del conjunto.
+  */
+  static iterator begin(Set<T>* t) throw() {
+    return (t == NULL) ? iterator(0) : t->begin();
+  }
+
+  /**
+     Iterator al ultimo elemento del conjunto. Se puede usar sin tener que preocuparse por
+     el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
+     \return Un iterador del primer elemento del conjunto.
+  */
+  static iterator end(Set<T>* t) throw() {
+    return (t == NULL) ? iterator(0) : t->end();
+  }
+
+  /**
+     Iterator al primer elemento del conjunto. Se puede usar sin tener que preocuparse por
+     el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
+     \return Un iterador del primer elemento del conjunto.
+  */
+  static const_iterator begin(const Set<T>* t) throw() {
+    return (t == NULL) ? const_iterator(0) : t->begin();
+  }
+
+  /**
+     Iterator al ultimo elemento del conjunto. Se puede usar sin tener que preocuparse por
+     el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
+     \return Un iterador del primer elemento del conjunto.
+  */
+  static const_iterator end(const Set<T>* t) throw() {
+    return (t == NULL) ? const_iterator(0) : t->end();
+  }
+  /**
+     Devuelve el objeto referenciado por el iterator recibido como parametro.
+     \return El objeto referenciado por el iterator recibido como parametro.
+  */
+  static T* data(iterator ii) throw() { return Set<T>::data(ii); }
+
+  /**
+     Devuelve el objeto referenciado por el iterator recibido como parametro.
+     \return El objeto referenciado por el iterator recibido como parametro.
+  */
+  static const T* data(const_iterator ii) throw() { return Set<T>::data(ii); }
+
+protected:
+  /**
+     Contructor.
+  */
+  SetFacade() {}
+};
+
+/**
+   Definicion a la que hay que invocar en la implementacion de la clase que hereda
+   de anna::dbos::SetFacade.
+
+   \param T Nombre de la clase que vamos a tratar en el ambito de C++.
+*/
+#define dbos_prepare_set(T) \
+   template <> anna::dbos::StorageArea* anna::dbos::ObjectFacade < anna::dbos::Set <T> >::st_storageArea = NULL
+
+/**
+   Definicion a la que hay que invocar dentro de la definicion de la clase que hereda
+   de anna::dbos::SetFacade.
+
+   \param T Nombre de la clase que vamos a tratar en el ambito de C++.
+*/
+#define dbos_declare_set(T) \
+   friend class anna::Allocator<T>; \
+   friend class anna::dbos::Set <T>
+
+}
+}
+
+#endif