Rheolef  7.2
an efficient C++ finite element environment
 
Loading...
Searching...
No Matches
Vector.h
Go to the documentation of this file.
1#ifndef _RHEO_VECTOR_H
2#define _RHEO_VECTOR_H
23
24/*Class:csr
25NAME: @code{Vector} - STL @code{vector<T>} with reference counting
26@clindex Vector
27DESCRIPTION:
28 @noindent
29 The class implement a reference counting wrapper for
30 the STL @code{vector<T>} container class, with shallow copies.
31 See also:
32 @emph{The standard template library}, by Alexander Stephanov and Meng Lee.
33
34 @noindent
35 This class provides the full @code{vector<T>}
36 interface specification
37 an could be used instead of @code{vector<T>}.
38NOTE:
39 @noindent
40 The write accessors
41 @example
42 T& operator[](size_type)
43 @end example
44 @noindent
45 as in @code{v[i]}
46 may checks the reference count for each access.
47 For a loop, a better usage is:
48 @example
49 Vector<T>::iterator i = v.begin();
50 Vector<T>::iterator last = v.end();
51 while (i != last) @{ ...@}
52 @end example
53 @noindent
54 and the reference count check step occurs only two time,
55 when accessing via @code{begin()} and @code{end()}.
56
57 @noindent
58 Thus, in order to encourage users to do it, we declare private
59 theses member functions. A synonym of @code{operator[]} is @code{at}.
60
61AUTHOR:
62 Pierre Saramito
63 | Pierre.Saramito@imag.fr
64 LMC-IMAG, 38041 Grenoble cedex 9, France
65DATE: 14 september 1997
66End:
67*/
68
69/*
70//<Vector:
71template<class T>
72class Vector : private smart_pointer<vector_rep<T> > {
73
74public:
75
76// typedefs:
77
78 typedef iterator;
79 typedef const_iterator;
80 typedef pointer;
81 typedef reference;
82 typedef const_reference;
83 typedef size_type;
84 typedef difference_type;
85 typedef value_type;
86 typedef reverse_iterator;
87 typedef const_reverse_iterator;
88
89// allocation/deallocation:
90
91 explicit Vector (size_type n = 0, const T& value = T ());
92 Vector (const_iterator first, const_iterator last);
93 void reserve (size_type n);
94 void swap (Vector<T>& x) ;
95
96// accessors:
97
98 iterator begin ();
99 const_iterator begin () const;
100 iterator end ();
101 const_iterator end () const;
102 reverse_iterator rbegin();
103 const_reverse_iterator rbegin() const;
104 reverse_iterator rend();
105 const_reverse_iterator rend() const;
106 size_type size () const;
107 size_type max_size () const;
108 size_type capacity () const;
109 bool empty () const;
110 void resize (size_type sz, T v = T ()); // non-standard ?
111private:
112 const_reference operator[] (size_type n) const;
113 reference operator[] (size_type n);
114public:
115 const_reference at (size_type n) const; // non-standard ?
116 reference at (size_type n);
117 reference front ();
118 const_reference front () const;
119 reference back ();
120 const_reference back () const;
121
122// insert/erase:
123
124 void push_back (const T& x);
125 iterator insert (iterator position, const T& x = T ());
126 void insert (iterator position, size_type n, const T& x);
127 void insert (iterator position, const_iterator first, const_iterator last);
128 void pop_back ();
129 void erase (iterator position);
130 void erase (iterator first, iterator last);
131};
132//>Vector:
133*/
134
135#include "rheolef/compiler.h"
136#include "rheolef/smart_pointer.h"
137
138namespace rheolef {
139template<class T>
140struct vector_rep : public std::vector<T> {
141
142// typedefs:
143 typedef std::vector<T> DATA;
144
145 typedef typename DATA::iterator iterator;
146 typedef typename DATA::const_iterator const_iterator;
147 typedef typename DATA::pointer pointer;
148 typedef typename DATA::reference reference;
149 typedef typename DATA::const_reference const_reference;
150 typedef typename DATA::size_type size_type;
151 typedef typename DATA::difference_type difference_type;
152 typedef T value_type;
153 typedef typename DATA::reverse_iterator reverse_iterator;
154 typedef typename DATA::const_reverse_iterator const_reverse_iterator;
155
156// allocators/deallocators:
157
159 : std::vector<T>(x)
160 {}
161
162 explicit
163 vector_rep (size_type n = 0, const T& value = T ())
164 : std::vector<T>(n,value)
165 {}
166
167#ifdef TODO
169 : std::vector<T>(first,last)
170 {}
171#endif // TODO
172};
173
174template<class T>
175struct Vector : smart_pointer<vector_rep<T> >
176{
178
179public:
180
181// typedefs:
182
183 typedef typename DATA::iterator iterator;
184 typedef typename DATA::const_iterator const_iterator;
185 typedef typename DATA::pointer pointer;
186 typedef typename DATA::reference reference;
187 typedef typename DATA::const_reference const_reference;
188 typedef typename DATA::size_type size_type;
189 typedef typename DATA::difference_type difference_type;
190 typedef T value_type;
191 typedef typename DATA::reverse_iterator reverse_iterator;
192 typedef typename DATA::const_reverse_iterator const_reverse_iterator;
193
194// allocation/deallocation:
195
196 explicit
197 Vector (size_type n = 0, const T& value = T ())
198 : smart_pointer<DATA>(new_macro(DATA(n,value)))
199 {}
200
201#ifdef TODO
203 : smart_pointer<DATA>(new_macro(DATA(first,last)))
204 {}
205#endif // TODO
206
208 {
210 }
211 void swap (Vector<T>& x)
212 {
214 }
215// accessors:
216
218 {
219 return smart_pointer<vector_rep<T> >::data().begin();
220 }
222 {
223 return smart_pointer<vector_rep<T> >::data().begin();
224 }
226 {
227 return smart_pointer<vector_rep<T> >::data().end();
228 }
230 {
231 return smart_pointer<vector_rep<T> >::data().end();
232 }
249 size_type size () const
250 {
251 return smart_pointer<vector_rep<T> >::data().size();
252 }
254 {
255 return smart_pointer<vector_rep<T> >::data().max_size ();
256 }
258 {
259 return smart_pointer<vector_rep<T> >::data().capacity ();
260 }
261 bool empty () const
262 {
263 return smart_pointer<vector_rep<T> >::data().empty();
264 }
265 // non-standatd ?
275 {
276 return smart_pointer<vector_rep<T> >::data().operator[] (n);
277 }
279 {
280 return smart_pointer<vector_rep<T> >::data().operator[] (n);
281 }
282public:
284 {
285 return smart_pointer<vector_rep<T> >::data().operator[] (n);
286 }
288 {
289 return smart_pointer<vector_rep<T> >::data().operator[] (n);
290 }
292 {
293 return smart_pointer<vector_rep<T> >::data().front();
294 }
296 {
297 return smart_pointer<vector_rep<T> >::data().front();
298 }
300 {
301 return smart_pointer<vector_rep<T> >::data().back();
302 }
304 {
305 return smart_pointer<vector_rep<T> >::data().back();
306 }
307// insert/erase:
308
309 void push_back (const T& x)
310 {
311 smart_pointer<vector_rep<T> >::data().push_back(x);
312 }
313 iterator insert (iterator position, const T& x = T ())
314 {
315 return smart_pointer<vector_rep<T> >::data().insert(position,x);
316 }
317 void insert (iterator position, size_type n, const T& x)
318 {
319 smart_pointer<vector_rep<T> >::data().insert(position,n,x);
320 }
321#ifdef TODO
322 void insert (iterator position, const_iterator first, const_iterator last)
323 {
324 smart_pointer<vector_rep<T> >::data().insert(position,first,last);
325 }
326#endif // TODO
327 void pop_back ()
328 {
330 }
331 void erase (iterator position)
332 {
333 smart_pointer<vector_rep<T> >::data().erase(position);
334 }
335 void erase (iterator first, iterator last)
336 {
337 smart_pointer<vector_rep<T> >::data().erase(first,last);
338 }
339};
340template<class IteratorValue, class ConstIteratorValue>
341struct VectorOfIterators : Vector<IteratorValue>
342{
345
346 typedef IteratorValue value_type;
347 typedef ConstIteratorValue const_value_type;
348
349 typedef typename V::iterator iterator;
350 typedef typename CONST_V::const_iterator const_iterator;
351 typedef typename V::pointer pointer;
352 typedef typename V::reference reference;
353 typedef typename CONST_V::const_reference const_reference;
354 typedef typename V::size_type size_type;
357 typedef typename CONST_V::const_reverse_iterator const_reverse_iterator;
358
359 explicit
360 VectorOfIterators (size_type n, const IteratorValue& value = IteratorValue ())
361 : V(n,value)
362 {}
363
364#ifdef TODO
366 : V(first,last)
367 {}
368#endif // TODO
369
371 {
372 return Vector<IteratorValue>::data().begin();
373 }
379 {
381 }
383 {
384 return Vector<IteratorValue>::data().end();
385 }
402private:
403 const_reference operator[] (size_type n) const
404 {
405 return const_reference(Vector<IteratorValue>::data().operator[] (n));
406 }
407 reference operator[] (size_type n)
408 {
409 return reference(Vector<IteratorValue>::data().operator[] (n));
410 }
411public:
413 {
414 return const_reference(Vector<IteratorValue>::data().operator[] (n));
415 }
417 {
418 return Vector<IteratorValue>::data().operator[] (n);
419 }
425 {
426 return Vector<IteratorValue>::data().front();
427 }
433 {
434 return Vector<IteratorValue>::data().back();
435 }
436};
437}// namespace rheolef
438#endif /* _RHEO_VECTOR_H */
439
field::size_type size_type
Definition branch.cc:430
see the smart_pointer page for the full documentation
Expr1::float_type T
Definition field_expr.h:230
This file is part of Rheolef.
STL namespace.
ConstIteratorValue const_value_type
Definition Vector.h:347
const_reverse_iterator rend() const
Definition Vector.h:394
const_reference front() const
Definition Vector.h:420
Vector< ConstIteratorValue > CONST_V
Definition Vector.h:344
CONST_V::const_reference const_reference
Definition Vector.h:353
V::difference_type difference_type
Definition Vector.h:355
const_iterator begin() const
Definition Vector.h:374
IteratorValue value_type
Definition Vector.h:346
Vector< IteratorValue > V
Definition Vector.h:343
VectorOfIterators(size_type n, const IteratorValue &value=IteratorValue())
Definition Vector.h:360
const_reference back() const
Definition Vector.h:428
reverse_iterator rend()
Definition Vector.h:398
const_reference at(size_type n) const
Definition Vector.h:412
VectorOfIterators(const_iterator first, const_iterator last)
Definition Vector.h:365
CONST_V::const_reverse_iterator const_reverse_iterator
Definition Vector.h:357
const_iterator end() const
Definition Vector.h:378
reverse_iterator rbegin()
Definition Vector.h:390
reference at(size_type n)
Definition Vector.h:416
CONST_V::const_iterator const_iterator
Definition Vector.h:350
V::reference reference
Definition Vector.h:352
const_reverse_iterator rbegin() const
Definition Vector.h:386
V::reverse_iterator reverse_iterator
Definition Vector.h:356
V::size_type size_type
Definition Vector.h:354
void pop_back()
Definition Vector.h:327
const_reverse_iterator rend() const
Definition Vector.h:245
const_reference front() const
Definition Vector.h:295
DATA::const_reverse_iterator const_reverse_iterator
Definition Vector.h:192
DATA::reverse_iterator reverse_iterator
Definition Vector.h:191
const_iterator begin() const
Definition Vector.h:221
void erase(iterator first, iterator last)
Definition Vector.h:335
iterator insert(iterator position, const T &x=T())
Definition Vector.h:313
void reserve(size_type n)
Definition Vector.h:207
size_type size() const
Definition Vector.h:249
const_reference back() const
Definition Vector.h:303
void insert(iterator position, const_iterator first, const_iterator last)
Definition Vector.h:322
bool empty() const
Definition Vector.h:261
Vector(size_type n=0, const T &value=T())
Definition Vector.h:197
DATA::difference_type difference_type
Definition Vector.h:189
reverse_iterator rend()
Definition Vector.h:241
reference front()
Definition Vector.h:291
DATA::pointer pointer
Definition Vector.h:185
void push_back(const T &x)
Definition Vector.h:309
DATA::size_type size_type
Definition Vector.h:188
DATA::iterator iterator
Definition Vector.h:183
DATA::const_iterator const_iterator
Definition Vector.h:184
Vector(const_iterator first, const_iterator last)
Definition Vector.h:202
size_type max_size() const
Definition Vector.h:253
const_reference at(size_type n) const
Definition Vector.h:283
void insert(iterator position, size_type n, const T &x)
Definition Vector.h:317
const_reference operator[](size_type n) const
Definition Vector.h:274
DATA::const_reference const_reference
Definition Vector.h:187
void resize(size_type sz, T v=T())
Definition Vector.h:266
void swap(Vector< T > &x)
Definition Vector.h:211
iterator end()
Definition Vector.h:225
const_iterator end() const
Definition Vector.h:229
reverse_iterator rbegin()
Definition Vector.h:233
size_type capacity() const
Definition Vector.h:257
iterator begin()
Definition Vector.h:217
reference at(size_type n)
Definition Vector.h:287
DATA::reference reference
Definition Vector.h:186
const_reverse_iterator rbegin() const
Definition Vector.h:237
vector_rep< T > DATA
Definition Vector.h:177
reference back()
Definition Vector.h:299
void erase(iterator position)
Definition Vector.h:331
vector_rep(size_type n=0, const T &value=T())
Definition Vector.h:163
DATA::const_reverse_iterator const_reverse_iterator
Definition Vector.h:154
DATA::reverse_iterator reverse_iterator
Definition Vector.h:153
vector_rep(const_iterator first, const_iterator last)
Definition Vector.h:168
DATA::difference_type difference_type
Definition Vector.h:151
DATA::pointer pointer
Definition Vector.h:147
DATA::size_type size_type
Definition Vector.h:150
DATA::iterator iterator
Definition Vector.h:145
DATA::const_iterator const_iterator
Definition Vector.h:146
std::vector< T > DATA
Definition Vector.h:143
DATA::const_reference const_reference
Definition Vector.h:149
vector_rep(const vector_rep &x)
Definition Vector.h:158
DATA::reference reference
Definition Vector.h:148