Nemo  2.3.46
datatable.h
Go to the documentation of this file.
1 
30 #ifndef DATATABLE_H
31 #define DATATABLE_H
32 
33 #include "output.h"
37 template <class T> class DataTable {
38 
39 private:
41  unsigned int _length;
43  unsigned int _groups;
45  unsigned int _classes;
50  unsigned int **_cumulClassSizes;
55  unsigned int *_cumulGroupSizes;
56 
57  unsigned int **_sizes;
58 
59  T* _table;
60 
61  void store_sizes (unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) {
62 
63  if (_sizes != NULL) {
64  for(unsigned int i = 0; i < nbgroups; ++i) delete [] _sizes[i];
65  delete [] _sizes;
66  }
67 
68  _sizes = new unsigned int * [nbgroups];
69 
70  for(unsigned int i = 0; i < nbgroups; ++i) {
71  _sizes[i] = new unsigned int [nbclasses];
72  for(unsigned int j = 0; j < nbclasses; ++j)
73  _sizes[i][j] = classSizes[i][j];
74  }
75  }
76 
77  bool sizeChange (unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) {
78  bool status = 0;
79  if( nbgroups != _groups || nbclasses != _classes ) return true;
80  else {
81  for (unsigned int i = 0; i < _groups; i++)
82  for (unsigned int j = 0; j < _classes; j++)
83  status |= _sizes[i][j] != classSizes[i][j];
84  }
85  return status;
86  }
87 
88 public:
90  DataTable() : _length(0), _groups(0), _classes(0), _cumulClassSizes(0), _cumulGroupSizes(0), _sizes(0), _table(0) { }
96  DataTable(unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) :
97  _length(0), _groups(0), _classes(0), _cumulClassSizes(0), _cumulGroupSizes(0), _table(0)
98  { allocate(nbgroups, nbclasses, classSizes); }
99 
101 
107  inline void allocate (unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) {
108  //#ifdef _DEBUG_
109  // message("DataTable::allocate:\n");
110  //#endif
111 
112  free();
113 
114  store_sizes(nbgroups, nbclasses, classSizes);
115 
116  _groups = nbgroups;
117  _classes = nbclasses;
118  _length = 0;
119 
120  _cumulClassSizes = new unsigned int*[_groups];
121 
122  for(unsigned int i = 0; i < _groups; i++){
123  _cumulClassSizes[i] = new unsigned int [_classes];
124  _cumulClassSizes[i][0] = 0;
125  for(unsigned int j = 1; j < _classes; ++j)
126  _cumulClassSizes[i][j] = _cumulClassSizes[i][j-1] + classSizes[i][j-1];
127  }
128 
129  _cumulGroupSizes = new unsigned int[_groups];
130 
131  _cumulGroupSizes[0] = 0;
132  for(unsigned int i = 1; i < _groups; i++){
133  _cumulGroupSizes[i] = _cumulGroupSizes[i-1];
134  for(unsigned int j = 0; j < _classes; ++j) {
135  _cumulGroupSizes[i] += classSizes[(i-1)][j];//total size of the previous group
136  _length += classSizes[i][j];//aggregate to compute total length
137  }
138  }
139  //add the sizes of first group classes to have the total length of the table
140  for(unsigned int j = 0; j < _classes; ++j)
141  _length += classSizes[0][j];
142 
143  _table = new T[_length];
144  //#ifdef _DEBUG_
145 // cout<<"DataTable::allocate:_table="<<_table<<endl;
146  //#endif
147  }
148 
154  inline void update(unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) {
155  //#ifdef _DEBUG_
156  // message("DataTable::update:\n");
157  //#endif
158  if( nbgroups != _groups || nbclasses != _classes )
159 
160  allocate(nbgroups, nbclasses, classSizes); //free() is called in allocate
161 
162  else if ( sizeChange(nbgroups, nbclasses, classSizes) ) {
163 
164  store_sizes(nbgroups, nbclasses, classSizes);
165 
166  for(unsigned int i = 0; i < _groups; i++){
167  for(unsigned int j = 1; j < _classes; ++j)
168  _cumulClassSizes[i][j] = _cumulClassSizes[i][j-1] + classSizes[i][j-1];
169  }
170  _length = 0;
171  _cumulGroupSizes[0] = 0;
172  for(unsigned int i = 1; i < _groups; i++){
173  _cumulGroupSizes[i] = _cumulGroupSizes[i-1];
174  for(unsigned int j = 0; j < _classes; ++j) {
175  _cumulGroupSizes[i] += classSizes[(i-1)][j];
176  _length += classSizes[i][j];
177  }
178  }
179 
180  for(unsigned int j = 0; j < _classes; ++j)
181  _length += classSizes[0][j];
182 
183  if(_table != NULL) delete [] _table;
184 
185  _table = new T[_length];
186  }
187  }
189  void free ( ) {
190 // cout << "\ncalling DataTable::free()\n";
191 // cout << " pointer state: table="<<_table<<" cumulGroupSizes="<<_cumulGroupSizes
192 // <<"\n cumulClassSizes="<<_cumulClassSizes<<" sizes="<<_sizes
193 // <<endl;
194 
195  if(_table != NULL) delete [] _table;
196 
197  if(_cumulGroupSizes != NULL) delete [] _cumulGroupSizes;
198 // cout << " delete _cumulClassSizes\n";
199  if(_cumulClassSizes != NULL){
200  for(unsigned int i = 0; i < _groups; ++i) {
201 // cout << " "<<i<<":"<<_cumulClassSizes[i]<<endl;
202  delete [] _cumulClassSizes[i];}
203  delete [] _cumulClassSizes;
204  }
205 // cout << " delete _sizes\n";
206  if(_sizes != NULL){
207  for(unsigned int i = 0; i < _groups; ++i) delete [] _sizes[i];
208  delete [] _sizes;
209  }
210 
211  _table = NULL;
212  _cumulGroupSizes = NULL;
213  _cumulClassSizes = NULL;
214  _sizes = NULL;
215  _length = 0;
216 // cout << "DataTable::free() done\n";
217 }
219  inline unsigned int length ( ) {return _length;}
221  inline T* getTable ( ) {return _table;}
223  inline T* getGroup (unsigned int group) {return &_table[ _cumulGroupSizes[group] ];}
225  inline T* getClassWithinGroup (unsigned int group, unsigned int Class) {
226  return &_table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] ];}
228  inline T get (unsigned int group, unsigned int Class, unsigned int elmnt) {
229  return _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ];
230  }
232  inline void set (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
233  _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] = val;
234  }
236  inline void increment (unsigned int group, unsigned int Class, unsigned int elmnt) {
237  ++_table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ];
238  }
240  inline void plus (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
241  _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] += val;
242  }
244  inline void minus (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
245  _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] -= val;
246  }
248  inline void multiply (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
249  _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] *= val;
250  }
252  inline void divide (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
253  _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] /= val;
254  }
256  inline void init (T val) {for(unsigned int i = 0; i < _length; ++i) _table[i] = val;}
257 
258  unsigned int getNumGroups () {return _groups;}
259  unsigned int getNumClasses () {return _classes;}
260  unsigned int size (unsigned int i, unsigned int j) {return _sizes[i][j];}
261 
262  void show_up ()
263  {
264  message("DataTable: got %i groups of %i classes; total length is %i.\n", _groups, _classes, _length);
265  }
266 };
267 
268 #endif //DATATABLE_H
void message(const char *message,...)
Definition: output.cc:40
unsigned int length()
Returns the length of the table (total number of elements present).
Definition: datatable.h:219
unsigned int getNumGroups()
Definition: datatable.h:258
T * getTable()
Accessor to the table array.
Definition: datatable.h:221
T * getGroup(unsigned int group)
Accessor to a group array.
Definition: datatable.h:223
void divide(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Subdivide 'elmnt' of the class 'Class' in the group 'group' by 'val'.
Definition: datatable.h:252
DataTable()
Default constructor.
Definition: datatable.h:90
unsigned int * _cumulGroupSizes
Stores the indexes of each group present in the table.
Definition: datatable.h:55
void allocate(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Creates a table of size given by the sum of all classes passed by the 'classSizes' matrix...
Definition: datatable.h:107
DataTable(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Constructor.
Definition: datatable.h:96
unsigned int _groups
number of groups in the table
Definition: datatable.h:43
void plus(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Adds 'val' to 'elmnt' in the class 'Class' in the group 'group'.
Definition: datatable.h:240
void minus(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Substracts 'val' from 'elmnt' in the class 'Class' in the group 'group'.
Definition: datatable.h:244
void free()
Deallocates all the allocated tables.
Definition: datatable.h:189
unsigned int getNumClasses()
Definition: datatable.h:259
void update(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Updates the group and classe sizes and re-allocates the table according to its new length...
Definition: datatable.h:154
~DataTable()
Definition: datatable.h:100
void multiply(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Multiplies 'elmnt' of the class 'Class' in the group 'group' by 'val'.
Definition: datatable.h:248
bool sizeChange(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Definition: datatable.h:77
unsigned int size(unsigned int i, unsigned int j)
Definition: datatable.h:260
void store_sizes(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Definition: datatable.h:61
void init(T val)
Sets all elements of the table to value 'val'.
Definition: datatable.h:256
void set(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Sets the element 'elmnt' of the class 'Class' in the group 'group' to the value 'val'.
Definition: datatable.h:232
unsigned int _length
length of the table
Definition: datatable.h:41
T * getClassWithinGroup(unsigned int group, unsigned int Class)
Accessor to a class array whithin a group.
Definition: datatable.h:225
A class to aggregate structured data in an array.
Definition: datatable.h:37
void increment(unsigned int group, unsigned int Class, unsigned int elmnt)
Increments 'elmnt' of the class 'Class' in the group 'group' by one.
Definition: datatable.h:236
unsigned int ** _cumulClassSizes
Stores the indexes of each class of each group present in the table.
Definition: datatable.h:50
void show_up()
Definition: datatable.h:262
T * _table
Definition: datatable.h:59
unsigned int ** _sizes
Definition: datatable.h:57
unsigned int _classes
number of classes within each group
Definition: datatable.h:45

Generated for Nemo v2.3.0 by  doxygen 1.8.8 --
Catalogued on GSR