MIDAS  0.75
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Friends Macros
gpa.h
Go to the documentation of this file.
1 #ifndef MIDAS_GPA_H
2 #define MIDAS_GPA_H
3 
4 
11 namespace midaspace {
12 
22 template <class T> //template <class T, long s = 0, long ds = 1>
23 class GPA
24 {
25  // *************************
26  // /** @name GENERAL **/
27  // *************************
28  // @{
29  protected:
30  long size; // count of assigned (nonzero) pointers
31  long asize; // length of the allocated array
32  long dsize; // allocation increment
33  T **values; // array of pointers to particular objects
34 
35  public:
37  GPA (void) { size = 0; asize = 0; dsize = 0; values = NULL; }
39  GPA (long s, long ds=1) { this->initialize(s, ds); }
41  GPA (const GPA<T> *src) { values = NULL; this->be_copy_of(src); }
43  ~GPA() { delete [] values; }
44  // @}
45 
46 
47  // **********************************
48  // /** @name RE/DE/ALLOCATION **/
49  // **********************************
50  // @{
52  void realloc_core (long new_asize) {
53  T **newvals = new T* [new_asize];
54 
55  for (asize=0; asize< size; asize++) *newvals++ = *values++;
56  for ( ; asize<new_asize; asize++) *newvals++ = NULL;
57 
58  delete [] (values-size);
59  values = newvals-new_asize;
60  }
62  void free_ptrs_core (long newsize) {
63  memset (values+newsize, 0, (asize-newsize)*sizeof(T*));
64  }
65 
67  void realloc (long new_asize)
68  {
69  if (new_asize == asize) return;
70  if (new_asize > asize) this->realloc_core (new_asize);
71  else this->free_ptrs_core (new_asize);
72  }
74  void reallocup (long new_asize)
75  {
76  if (new_asize == 0) new_asize = asize + (dsize ? dsize : 0.1*asize+1);
77  if (new_asize <= asize)
78  errol;
79 
80  this->realloc_core(new_asize);
81  }
83  void reallocdown (long new_asize)
84  {
85  if (new_asize >= asize) errol;
86  this->free_ptrs_core(new_asize);
87  }
89  void reallocplus (long d)
90  {
91 # ifdef DEBUG
92  if (d<0) _errorr ("d<0");
93 # endif
94  this->realloc_core(size+d);
95  }
96 
98  void resize (long newsize) { this->realloc (newsize); size = newsize; }
99  void resizeup (long newsize) { this->reallocup (newsize); size = newsize; }
100  void resizedown (long newsize) { this->reallocdown(newsize); size = newsize; }
101  void resize_zero (void) { size = 0; }
102  // @}
103 
104 
105  // **********************************
106  // /** @name SET **/
107  // **********************************
108  // @{
110  void free_ptrs (void) { memset (values, 0, (asize)*sizeof(T*)); }
111  void free_ptr (T *val) { for (long i=0; i<size; i++) if (values[i] == val) values[i] = NULL; }
112  void free_ptr (long i) { values[i] = NULL; }
113 
115  void delete_object (long i) { delete values[i]; values[i] = NULL; }
117  void delete_objects (void) { for (long i=0; i<size; i++) delete values[i]; free_ptrs(); }
118 
120  void initialize (long s, long ds=0)
121  {
122  size = asize = s;
123  dsize = ds;
124 
125  if (asize) { values = new T* [asize]; memset (values, 0, asize*sizeof(T*)); }
126  else values = NULL;
127  }
129  void be_copy_of (const GPA<T> *src)
130  {
131  size = asize = src->size;
132  ; dsize = src->dsize;
133  delete [] values;
134  values = new T* [asize];
135  memcpy (values, src->values, size*sizeof(T*));
136  }
138  void reverse ()
139  {
140  T *val;
141  int n = size/2;
142  while (n--) {
143  val = values[n];
144  values[n] = values[size-1-n];
145  values[size-1-n] = val;
146  }
147  }
149  void assign (long i, T *val) {
150 # ifdef DEBUG
151  if (i<0 || i>=size)
152  _warningg ("i out of the range");
153 # endif
154  values[i] = val;
155  }
157  T* add (T *val)
158  {
159  if (size == asize) this->reallocup(0);
160  values[size++] = val;
161  return val;
162  }
164  T* wedge (long i, T *val)
165  {
166  if (i<0 || i>=size) errol;
167 
168  if (size < asize) {
169  for (long ii=size; ii>=i; ii--)
170  values[ii] = values[ii-1];
171 
172  values[i] = val;
173  size++;
174  }
175  else {
177  T **newa = new T* [++size];
178 
179  for (asize=0; asize<i ; asize++) *newa++ = *values++;
180  ; asize++; *newa++ = val;
181  for ( ; asize<size; asize++) *newa++ = *values++;
182  newa -= asize;
183 
184  delete [] (values-size+1);
185  values = newa;
186  }
187 
188  return val;
189  }
191  void add_unique ( T *src) { if (! this->is_member(src)) this->add(src); }
193  void add_unique (const GPA<T> &src);
195  bool replace_member_by (T *oldv, T *newv)
196  {
197  for (long i=0; i<size; i++)
198  if (values[i] == oldv) {
199  values[i] = newv;
200  return true;
201  }
202  return false;
203  }
204  // @}
205 
206 
207  // **********************************
208  // /** @name GET **/
209  // **********************************
210  // @{
212  const T** v (void) const { return const_cast<const T**>(values); }
213  //
214  T* operator[] (long i) const {
215 # ifdef DEBUG
216  if (i<0 || i>=size)
217  _warningg ("i out of the range");
218 # endif
219  return values[i];
220  }
221  //
222  T* first (void) const {
223 # ifdef DEBUG
224  if (!size) _errorr ("GPA has no members");
225 # endif
226  return values[0];
227  }
228  T* last (void) const {
229 # ifdef DEBUG
230  if (!size) _errorr ("GPA has no members");
231 # endif
232  return values[size-1];
233  }
234  //
235  T* at_or_null (long i) const {
236  return ( (i<0 || i>=size ) ? NULL : values[i]);
237  }
238 
239  //* *** GET SIZE ***
240  long operator()(void) const { return size; }
241  long give_size (void) const { return size; }
242  long give_asize (void) const { return asize; }
243 
245  long give_num_nonNULL_ptrs () const {
246  long i, sum = 0;
247  for (i=0; i<size; i++) if (values[i]) sum++;
248  return sum;
249  }
251  long give_num_nonNULL_ptrs2 () const {
252  long i, sum = 0;
253  for (i=0; i<size; i++) sum += values[i]->give_num_nonNULL_ptrs();
254  return sum;
255  }
256  // @}
257 
258 
259 
260 
261  // **********************************
262  // /** @name OTHER **/
263  // **********************************
264  // @{
265 
266  //* *** SET VALUE ***
267 
268  //void delete_clear_unoptrs (void)
269  //{
270  // if (values == NULL) return;
271  // for (long i=0; i<size; i++) delete values[i];
272  // delete [] values; values = NULL;
273  // size = asize = 0;
274  //}
276  bool is_member (T *val) const { return is_member_of_array (val, size, values); }
277  bool is_unique (void) const { return members_are_unique (size, values); }
278 
280  bool is_identical_with (const GPA<T> &one) const { if (size != one.size) return false; return ! (bool)arrays_arenot_identical (size, values, one.values); }
281  bool has_same_members_as (const GPA<T> &one) const { return same_array_elements_asym(size, values, one.size, one.values, true); }
282  bool has_these_members (const GPA<T> &one) const { return has_these_members(one(), one.values); }
283  bool has_these_members(long s, const T **one) const
284  {
285  if (size != s) return false;
286 
287  long i,j;
288  const T **vals = new T* [size];
289  for (i=0; i<size; i++) vals[i] = one[i];
290 
291  for (i=0; i<size; i++) {
292  for (j=0; j<size; j++)
293  if (vals[j] && values[i] == vals[j]) {
294  vals[j] = NULL;
295  break;
296  }
297 
298  if (j == size) break;
299  }
300 
301  delete [] vals;
302 
303  return (i == size) ? true : false;
304  }
305 
307  void shake_down (void);
308  // @}
309 };
310 
312 template<class T> void GPA<T> :: shake_down (void)
313 {
314  long i, j;
315 
316  for (j=0; j<size; j++)
317  if (values[j] == NULL) break;
318 
319  for (i=j+1; i<size; i++)
320  if (values[i]) {
321  values[j++] = values[i];
322  values[i] = NULL;
323  }
324 
325  size = j;
326 }
328 template<class T> void GPA<T> :: add_unique (const GPA<T> &src)
329 {
330  if (! src()) return;
331 
332  this->realloc(size+src());
333 
334  for (long i=0; i<src(); i++)
335  if (! this->is_member (src[i]))
336  values[size++] = src[i];
337 
338  if (asize-size>100 && asize>1.5*size) errol;
339 }
340 
341 
342 } // namespace midaspace
343 
344 #endif // MIDAS_GPA_H
void reallocplus(long d)
reallocate receiver to the new size
Definition: gpa.h:89
long dsize
Definition: gpa.h:32
#define _warningg(_1)
Definition: gelib.h:154
T * first(void) const
Definition: gpa.h:222
GPA(void)
CONSTRUCTOR.
Definition: gpa.h:37
~GPA()
DESTRUCTOR.
Definition: gpa.h:43
void reverse()
Definition: gpa.h:138
bool same_array_elements_asym(long nx, const ArgType *x, long ny, const ArgType *y, bool same_dim=false)
Function finds out whether every element of the array 'x' is in the array 'y'.
Definition: gelib.h:333
long size
Definition: gpa.h:30
void shake_down(void)
Definition: gpa.h:312
long give_num_nonNULL_ptrs2() const
get sum of nonNULL pointers in two levels
Definition: gpa.h:251
long arrays_arenot_identical(long n, ArgType *a1, ArgType *a2)
Definition: gelib.h:300
void free_ptrs_core(long newsize)
reallocate down (free pointers) receiver without checking of sizes
Definition: gpa.h:62
void delete_objects(void)
Delete all objects pointed by pointers. The pointers are set to NULL.
Definition: gpa.h:117
long is_member_of_array(ArgType val, long n, const ArgType *array)
check out "val" is member of "array"
Definition: gelib.h:311
T * at_or_null(long i) const
Definition: gpa.h:235
long give_asize(void) const
Definition: gpa.h:242
void initialize(long s, long ds=0)
Definition: gpa.h:120
#define errol
Definition: gelib.h:142
long asize
Definition: gpa.h:31
GPA(const GPA< T > *src)
CONSTRUCTOR COPY.
Definition: gpa.h:41
long give_num_nonNULL_ptrs() const
get sum of nonNULL pointers in two levels
Definition: gpa.h:245
T ** values
Definition: gpa.h:33
bool is_unique(void) const
Definition: gpa.h:277
bool members_are_unique(long n, const ArgType *array)
check out all members of array "a" are uniq
Definition: gelib.h:319
void realloc(long new_asize)
reallocate up receiver with checking the new size
Definition: gpa.h:67
T * operator[](long i) const
Definition: gpa.h:214
bool has_these_members(long s, const T **one) const
Definition: gpa.h:283
GPA(long s, long ds=1)
CONSTRUCTOR.
Definition: gpa.h:39
void realloc_core(long new_asize)
reallocate up receiver without checking of sizes
Definition: gpa.h:52
void be_copy_of(const GPA< T > *src)
Definition: gpa.h:129
void resizeup(long newsize)
Definition: gpa.h:99
void resize_zero(void)
Definition: gpa.h:101
long operator()(void) const
Definition: gpa.h:240
void add_unique(T *src)
add new pointer "src" if unique
Definition: gpa.h:191
GPA - Generic Pointer Array, template class manages 1d array of pointers to objects of type T...
Definition: gpa.h:23
void free_ptr(T *val)
Definition: gpa.h:111
#define _errorr(_1)
Definition: gelib.h:151
void resize(long newsize)
reallocate receiver to the new size
Definition: gpa.h:98
bool has_these_members(const GPA< T > &one) const
Definition: gpa.h:282
bool is_member(T *val) const
Definition: gpa.h:276
void assign(long i, T *val)
Definition: gpa.h:149
void free_ptrs(void)
Definition: gpa.h:110
void reallocdown(long new_asize)
reallocate up receiver with checking the new size
Definition: gpa.h:83
void reallocup(long new_asize)
reallocate up receiver with checking the new size
Definition: gpa.h:74
const T ** v(void) const
Definition: gpa.h:212
void resizedown(long newsize)
Definition: gpa.h:100
T * last(void) const
Definition: gpa.h:228
long give_size(void) const
Definition: gpa.h:241
bool has_same_members_as(const GPA< T > &one) const
Definition: gpa.h:281
T * add(T *val)
add (assign) new pointer to the end; enlarge the receiver if too small
Definition: gpa.h:157
void free_ptr(long i)
Definition: gpa.h:112
bool is_identical_with(const GPA< T > &one) const
Definition: gpa.h:280
T * wedge(long i, T *val)
Definition: gpa.h:164
void delete_object(long i)
Delete object pointed by the i-th pointer. The pointer is set to NULL.
Definition: gpa.h:115
bool replace_member_by(T *oldv, T *newv)
Definition: gpa.h:195