source: CMT/v1r18p20041201/source/cmt_vector.h @ 1

Last change on this file since 1 was 1, checked in by arnault, 19 years ago

Import all tags

File size: 5.1 KB
Line 
1//-----------------------------------------------------------
2// Copyright Christian Arnault LAL-Orsay CNRS
3// arnault@lal.in2p3.fr
4// See the complete license in cmt_license.txt "http://www.cecill.info".
5//-----------------------------------------------------------
6
7#ifndef __cmt_vector_h__
8#define __cmt_vector_h__
9
10#include <stdlib.h>
11
12template <class T> class cmt_vector
13{
14public:
15  typedef T   element_type;
16  typedef T*  element_ptr;
17  typedef T** frame_ptr;
18
19  cmt_vector ()
20    {
21      _data = 0;
22      _frames = 0;
23      _size = 0;
24    }
25
26  cmt_vector (const cmt_vector& other)
27    {
28      _data = 0;
29      _frames = 0;
30      _size = 0;
31
32      cmt_vector<T>& me = *this;
33
34      extend (other._size);
35      for (int i = 0; i < _size; i++)
36        {
37          me.element_at (i) = other.element_at (i);
38        }
39    }
40
41  cmt_vector (int n)
42    {
43      _data = 0;
44      _frames = 0;
45      _size = 0;
46
47      extend (n);
48    }
49
50  ~cmt_vector ()
51    {
52      if (_data != 0)
53        {
54          for (int i = 0; i < _frames; i++)
55            {
56              delete[] _data[i];
57              _data[i] = 0;
58            }
59#ifdef CMT_USE_NEW_DELETE
60          delete[] _data;
61#else
62          free (_data);
63#endif
64        }
65      _data = 0;
66      _frames = 0;
67      _size = 0;
68    }
69
70  void push_back (const T& object)
71    {
72      extend (1);
73      element_at (_size - 1) = object;
74    }
75
76  T& add ()
77    {
78      resize (size() + 1);
79      return (back ());
80    }
81
82  void pop_back ()
83    {
84      if (_size > 0) _size--;
85    }
86
87  void erase (int index)
88    {
89      if ((_data == 0) ||
90          (index < 0) ||
91          (index >= _size))
92        {
93          return;
94        }
95
96      for (int i = index; i < (_size - 1); i++)
97        {
98          element_at (i) = element_at (i + 1);
99        }
100
101      _size--;
102    }
103
104  cmt_vector& operator = (const cmt_vector& other)
105    {
106      clear ();
107
108      cmt_vector<T>& me = *this;
109
110      extend (other._size);
111      for (int i = 0; i < _size; i++)
112        {
113          element_at (i) = other.element_at (i);
114        }
115
116      return (me);
117    }
118
119  T& operator [] (int index) const
120    {
121      if ((_data == 0) ||
122          (index < 0) ||
123          (index >= _size))
124        {
125          static T object;
126          return (object);
127        }
128      else
129        {
130          return (element_at (index));
131        }
132    }
133
134  T& operator [] (int index)
135    {
136      if ((_data == 0) ||
137          (index < 0) ||
138          (index >= _size))
139        {
140          static T object;
141          return (object);
142        }
143      else
144        {
145          return (element_at (index));
146        }
147    }
148
149  T& back () const
150    {
151      if ((_data == 0) ||
152          (_size == 0))
153        {
154          static T object;
155          return (object);
156        }
157      else
158        {
159          return (element_at (_size - 1));
160        }
161    }
162
163  T& back ()
164    {
165      if ((_data == 0) ||
166          (_size == 0))
167        {
168          static T object;
169          return (object);
170        }
171      else
172        {
173          return (element_at (_size - 1));
174        }
175    }
176
177  void resize (int new_size)
178    {
179      if (new_size < 0) return;
180
181      extend (new_size - _size);
182      _size = new_size;
183    }
184
185  int size () const
186    {
187      return (_size);
188    }
189
190  void clear ()
191    {
192      _size = 0;
193    }
194
195  frame_ptr get_frame () const
196      {
197        return (_data);
198      }
199
200  int get_frame_number () const
201      {
202        return (_frames);
203      }
204
205  int get_frame_size () const
206      {
207        return (frame_size);
208      }
209
210private:
211
212  enum {frame_size = 4};
213
214  T& element_at (int index)
215    {
216      int frame = index / frame_size;
217      return (_data[frame][index % frame_size]);
218    }
219
220  T& element_at (int index) const
221    {
222      int frame = index / frame_size;
223      return (_data[frame][index % frame_size]);
224    }
225
226  int frames (int n)
227    {
228      return ((n == 0) ? 0 : ((n - 1) / frame_size) + 1);
229    }
230
231  void extend (int n)
232    {
233      if (n <= 0) return;
234
235      _size += n;
236
237      int f = frames (_size);
238      if (f > _frames)
239        {
240          if (_data == 0)
241            {
242
243#ifdef CMT_USE_NEW_DELETE
244              _data = new element_ptr [f];
245#else
246              _data = (frame_ptr) malloc (f * sizeof (element_ptr));
247#endif
248
249            }
250          else
251            {
252
253#ifdef CMT_USE_NEW_DELETE
254              frame_ptr new_data;
255
256              new_data = new element_ptr [f];
257              for (int i = 0; i < _frames; i++)
258                {
259                  new_data[i] = _data[i];
260                }
261              delete[] _data;
262              _data = new_data;
263#else
264              _data = (frame_ptr) realloc (_data, f * sizeof (element_ptr));
265#endif
266
267            }
268
269          for (int i = _frames; i < f; i++)
270            {
271              _data[i] = new T[frame_size];
272            }
273
274          _frames = f;
275        }
276    }
277
278  frame_ptr _data;
279  int _frames;
280  int _size;
281};
282
283#endif
Note: See TracBrowser for help on using the repository browser.