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