Remove operation help.
[anna.git] / include / anna / dbos / SetFacade.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_dbos_SetFacade_hpp
10 #define anna_dbos_SetFacade_hpp
11
12 #include <vector>
13
14 #include <anna/dbos/Set.hpp>
15 #include <anna/dbos/ObjectFacade.hpp>
16
17 namespace anna {
18
19 namespace dbos {
20
21 /**
22    Clase que facilita el acceso y uso de las clases encargadas de la instanciacion de multiples objetos a partir de los
23    datos contenidos en un medio fisico, que normalmente seria la tabla de una base de datos.
24
25    Esta nos facilita el manejo de instancias multiples, es decir, para una condicion de carga dada hay varios registros
26    o elementos del medio fisico que la cumplen.
27
28    La clase \em T debe tener definidos los siquientes metodos:
29       \li anna::dbos::Object::instantiate: Interpreta la informacin la del medio fisico para adecuarla a
30       la clase C++.
31       \li void destroy () throw (): Libera los recursos reservados por este objeto
32
33    \see dbos_declare_set
34    \see dbos_prepare_set
35 */
36 template <typename T> class SetFacade : public ObjectFacade < Set <T> > {
37 public:
38   typedef typename Set<T>::iterator iterator;
39   typedef typename Set<T>::const_iterator const_iterator;
40
41   /**
42      Devuelve el numero de elementos contenidos en el conjunto recibido como parametro.
43       Se puede usar sin tener que preocuparse por
44      el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
45      \param t Instancia del conjunto.
46      \return El numero de elementos que contiene el conjunto.
47   */
48   static int size(Set<T>* t) throw() { return (t == NULL) ? 0 : t->size(); }
49
50   /**
51      Iterator al primer elemento del conjunto. Se puede usar sin tener que preocuparse por
52      el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
53      \return Un iterador del primer elemento del conjunto.
54   */
55   static iterator begin(Set<T>* t) throw() {
56     return (t == NULL) ? iterator(0) : t->begin();
57   }
58
59   /**
60      Iterator al ultimo elemento del conjunto. Se puede usar sin tener que preocuparse por
61      el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
62      \return Un iterador del primer elemento del conjunto.
63   */
64   static iterator end(Set<T>* t) throw() {
65     return (t == NULL) ? iterator(0) : t->end();
66   }
67
68   /**
69      Iterator al primer elemento del conjunto. Se puede usar sin tener que preocuparse por
70      el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
71      \return Un iterador del primer elemento del conjunto.
72   */
73   static const_iterator begin(const Set<T>* t) throw() {
74     return (t == NULL) ? const_iterator(0) : t->begin();
75   }
76
77   /**
78      Iterator al ultimo elemento del conjunto. Se puede usar sin tener que preocuparse por
79      el valor de la instancia del conjunto, ya que si este es NULL devolveria 0.
80      \return Un iterador del primer elemento del conjunto.
81   */
82   static const_iterator end(const Set<T>* t) throw() {
83     return (t == NULL) ? const_iterator(0) : t->end();
84   }
85   /**
86      Devuelve el objeto referenciado por el iterator recibido como parametro.
87      \return El objeto referenciado por el iterator recibido como parametro.
88   */
89   static T* data(iterator ii) throw() { return Set<T>::data(ii); }
90
91   /**
92      Devuelve el objeto referenciado por el iterator recibido como parametro.
93      \return El objeto referenciado por el iterator recibido como parametro.
94   */
95   static const T* data(const_iterator ii) throw() { return Set<T>::data(ii); }
96
97 protected:
98   /**
99      Contructor.
100   */
101   SetFacade() {}
102 };
103
104 /**
105    Definicion a la que hay que invocar en la implementacion de la clase que hereda
106    de anna::dbos::SetFacade.
107
108    \param T Nombre de la clase que vamos a tratar en el ambito de C++.
109 */
110 #define dbos_prepare_set(T) \
111    template <> anna::dbos::StorageArea* anna::dbos::ObjectFacade < anna::dbos::Set <T> >::st_storageArea = NULL
112
113 /**
114    Definicion a la que hay que invocar dentro de la definicion de la clase que hereda
115    de anna::dbos::SetFacade.
116
117    \param T Nombre de la clase que vamos a tratar en el ambito de C++.
118 */
119 #define dbos_declare_set(T) \
120    friend class anna::Allocator<T>; \
121    friend class anna::dbos::Set <T>
122
123 }
124 }
125
126 #endif