ANNA Suite  2020b
Multipurpose development suite for Telco applications
Set.hpp
Go to the documentation of this file.
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_Set_hpp
10 #define anna_dbos_Set_hpp
11 
13 #include <anna/core/mt/Guard.hpp>
14 #include <anna/core/Allocator.hpp>
15 
16 #include <anna/dbms/Statement.hpp>
18 
19 #include <anna/dbos/Object.hpp>
20 
21 namespace anna {
22 
23 namespace dbos {
24 
65 template <typename T> class Set : public Object {
66 public:
71 
77 
82  typedef typename Container::iterator iterator;
83 
88  const_iterator begin() const { return a_objects.begin(); }
89 
94  iterator begin() { return a_objects.begin(); }
95 
100  const_iterator end() const { return a_objects.end(); }
101 
106  iterator end() { return a_objects.end(); }
107 
111  T* append() noexcept(false) { return a_objects.create(); }
112 
118  void remove(T*& t) noexcept(false) { a_objects.release(t); t = NULL; }
119 
124  int size() const { return a_objects.size(); }
125 
130  static T* data(iterator& ii) { return Container::data(ii); }
131 
136  static const T* data(const_iterator& ii) { return Container::data(ii); }
137 
138 private:
139  Container a_objects;
140 
141  void initialize(Loader& loader)
142  noexcept(false) {
143  T* object;
144  dbms::Statement* statement = loader.getStatement();
145 
146  try {
147  do {
148  a_objects.create()->initialize(loader);
149  } while(statement->fetch() == true);
150  } catch(RuntimeException&) {
151  destroy();
152  throw;
153  } catch(dbms::DatabaseException&) {
154  destroy();
155  throw;
156  }
157  }
158 
159  void destroy()
160  {
161  for(iterator ii = begin(), maxii = end(); ii != maxii; ii ++)
162  data(ii)->destroy();
163 
164  a_objects.clear();
165  }
166 };
167 
168 }
169 }
170 
171 #endif
172 
173 
static T * data(iterator ii)
Definition: Recycler.hpp:233
const_iterator begin() const
Definition: Set.hpp:88
void clear()
Definition: SafeRecycler.hpp:137
int size() const
Definition: Recycler.hpp:77
Definition: Set.hpp:65
Container::iterator iterator
Definition: Set.hpp:82
static T * data(iterator &ii)
Definition: Set.hpp:130
Definition: Object.hpp:35
T * create() noexcept(false)
Definition: SafeRecycler.hpp:64
Definition: Statement.hpp:43
void release(T *t)
Definition: SafeRecycler.hpp:93
Definition: SafeRecycler.hpp:36
iterator end()
Definition: Recycler.hpp:221
dbms::Statement * getStatement() noexcept(false)
Definition: Accesor.hpp:54
Container::const_iterator const_iterator
Definition: Set.hpp:76
virtual bool fetch() noexcept(false)=0
Recycler< T, anna::Allocator< T > >::const_iterator const_iterator
Definition: SafeRecycler.hpp:39
Definition: Loader.hpp:28
anna::SafeRecycler< T, anna::Allocator< T > > Container
Definition: Set.hpp:70
Definition: DatabaseException.hpp:23
Definition: app.hpp:12
const_iterator end() const
Definition: Set.hpp:100
T * append() noexcept(false)
Definition: Set.hpp:111
iterator end()
Definition: Set.hpp:106
iterator begin()
Definition: Recycler.hpp:209
static const T * data(const_iterator &ii)
Definition: Set.hpp:136
Definition: RuntimeException.hpp:23
iterator begin()
Definition: Set.hpp:94
Recycler< T, anna::Allocator< T > >::iterator iterator
Definition: SafeRecycler.hpp:38
int size() const
Definition: Set.hpp:124