Rheolef  7.1
an efficient C++ finite element environment
Vector.h
Go to the documentation of this file.
1 #ifndef _RHEO_VECTOR_H
2 #define _RHEO_VECTOR_H
3 
24 /*Class:csr
25 NAME: @code{Vector} - STL @code{vector<T>} with reference counting
26 @clindex Vector
27 DESCRIPTION:
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>}.
38 NOTE:
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 
61 AUTHOR:
62  Pierre Saramito
63  | Pierre.Saramito@imag.fr
64  LMC-IMAG, 38041 Grenoble cedex 9, France
65 DATE: 14 september 1997
66 End:
67 */
68 
69 /*
70 //<Vector:
71 template<class T>
72 class Vector : private smart_pointer<vector_rep<T> > {
73 
74 public:
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 ?
111 private:
112  const_reference operator[] (size_type n) const;
113  reference operator[] (size_type n);
114 public:
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 
138 namespace rheolef {
139 template<class T>
140 struct 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 
158  vector_rep (const vector_rep& x)
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 
174 template<class T>
175 struct Vector : smart_pointer<vector_rep<T> >
176 {
178 
179 public:
180 
181 // typedefs:
182 
183  typedef typename DATA::iterator iterator;
185  typedef typename DATA::pointer pointer;
186  typedef typename DATA::reference reference;
188  typedef typename DATA::size_type size_type;
190  typedef T value_type;
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  {
213  smart_pointer<vector_rep<T> >::data().swap(*x.p);
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  }
229  const_iterator end () const
230  {
231  return smart_pointer<vector_rep<T> >::data().end();
232  }
234  {
236  }
238  {
240  }
242  {
244  }
246  {
248  }
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 ?
266  void resize (size_type sz, T v = T ())
267  {
268  if (sz > (smart_pointer<vector_rep<T> >::data().size ())) {
270  } else if (sz < (smart_pointer<vector_rep<T> >::data().size())) {
272  }
273  }
275  {
276  return smart_pointer<vector_rep<T> >::data().operator[] (n);
277  }
279  {
280  return smart_pointer<vector_rep<T> >::data().operator[] (n);
281  }
282 public:
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  {
329  smart_pointer<vector_rep<T> >::data().pop_back();
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 };
340 template<class IteratorValue, class ConstIteratorValue>
341 struct VectorOfIterators : Vector<IteratorValue>
342 {
345 
346  typedef IteratorValue value_type;
347  typedef ConstIteratorValue const_value_type;
348 
349  typedef typename V::iterator iterator;
351  typedef typename V::pointer pointer;
352  typedef typename V::reference reference;
354  typedef typename V::size_type size_type;
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  }
375  {
377  }
378  const_iterator end () const
379  {
381  }
383  {
384  return Vector<IteratorValue>::data().end();
385  }
387  {
389  }
391  {
393  }
395  {
397  }
399  {
401  }
402 private:
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  }
411 public:
413  {
414  return const_reference(Vector<IteratorValue>::data().operator[] (n));
415  }
417  {
418  return Vector<IteratorValue>::data().operator[] (n);
419  }
421  {
423  }
425  {
426  return Vector<IteratorValue>::data().front();
427  }
429  {
431  }
433  {
434  return Vector<IteratorValue>::data().back();
435  }
436 };
437 }// namespace rheolef
438 #endif /* _RHEO_VECTOR_H */
439 
rheolef::Vector::back
const_reference back() const
Definition: Vector.h:303
rheolef::VectorOfIterators::rbegin
const_reverse_iterator rbegin() const
Definition: Vector.h:386
mkgeo_ball.n
int n
Definition: mkgeo_ball.sh:150
rheolef::Vector::Vector
Vector(size_type n=0, const T &value=T())
Definition: Vector.h:197
rheolef::Vector::resize
void resize(size_type sz, T v=T())
Definition: Vector.h:266
rheolef::Vector::Vector
Vector(const_iterator first, const_iterator last)
Definition: Vector.h:202
rheolef::vector_rep::value_type
T value_type
Definition: Vector.h:152
rheolef::Vector::back
reference back()
Definition: Vector.h:299
rheolef::vector_rep::const_iterator
DATA::const_iterator const_iterator
Definition: Vector.h:146
rheolef::VectorOfIterators::rend
reverse_iterator rend()
Definition: Vector.h:398
rheolef::Vector
Definition: Vector.h:176
rheolef::Vector::at
const_reference at(size_type n) const
Definition: Vector.h:283
rheolef::vector_rep::reverse_iterator
DATA::reverse_iterator reverse_iterator
Definition: Vector.h:153
rheolef::Vector::DATA
vector_rep< T > DATA
Definition: Vector.h:177
rheolef::Vector::end
iterator end()
Definition: Vector.h:225
rheolef::VectorOfIterators
Definition: Vector.h:342
rheolef::Vector::difference_type
DATA::difference_type difference_type
Definition: Vector.h:189
rheolef::Vector::end
const_iterator end() const
Definition: Vector.h:229
rheolef::Vector::push_back
void push_back(const T &x)
Definition: Vector.h:309
rheolef::Vector::insert
iterator insert(iterator position, const T &x=T())
Definition: Vector.h:313
rheolef::VectorOfIterators::reverse_iterator
V::reverse_iterator reverse_iterator
Definition: Vector.h:356
rheolef::VectorOfIterators::difference_type
V::difference_type difference_type
Definition: Vector.h:355
rheolef::VectorOfIterators::end
const_iterator end() const
Definition: Vector.h:378
rheolef::value
rheolef::std value
rheolef::vector_rep
Definition: Vector.h:140
rheolef::vector_rep::const_reverse_iterator
DATA::const_reverse_iterator const_reverse_iterator
Definition: Vector.h:154
rheolef::vector_rep::vector_rep
vector_rep(size_type n=0, const T &value=T())
Definition: Vector.h:163
rheolef::VectorOfIterators::pointer
V::pointer pointer
Definition: Vector.h:351
rheolef::Vector::rbegin
reverse_iterator rbegin()
Definition: Vector.h:233
rheolef::Vector::const_reverse_iterator
DATA::const_reverse_iterator const_reverse_iterator
Definition: Vector.h:192
rheolef::vector_rep::reference
DATA::reference reference
Definition: Vector.h:148
rheolef::Vector::insert
void insert(iterator position, const_iterator first, const_iterator last)
Definition: Vector.h:322
rheolef::VectorOfIterators::VectorOfIterators
VectorOfIterators(const_iterator first, const_iterator last)
Definition: Vector.h:365
rheolef::VectorOfIterators::at
reference at(size_type n)
Definition: Vector.h:416
rheolef::VectorOfIterators::const_reverse_iterator
CONST_V::const_reverse_iterator const_reverse_iterator
Definition: Vector.h:357
rheolef::VectorOfIterators::back
const_reference back() const
Definition: Vector.h:428
rheolef::Vector::capacity
size_type capacity() const
Definition: Vector.h:257
rheolef::vector_rep::const_reference
DATA::const_reference const_reference
Definition: Vector.h:149
rheolef::VectorOfIterators::const_iterator
CONST_V::const_iterator const_iterator
Definition: Vector.h:350
rheolef::vector_rep::vector_rep
vector_rep(const_iterator first, const_iterator last)
Definition: Vector.h:168
rheolef::VectorOfIterators::begin
const_iterator begin() const
Definition: Vector.h:374
rheolef::Vector::rend
reverse_iterator rend()
Definition: Vector.h:241
rheolef::VectorOfIterators::VectorOfIterators
VectorOfIterators(size_type n, const IteratorValue &value=IteratorValue())
Definition: Vector.h:360
rheolef::Vector::iterator
DATA::iterator iterator
Definition: Vector.h:183
rheolef::Vector::erase
void erase(iterator first, iterator last)
Definition: Vector.h:335
rheolef::vector_rep::pointer
DATA::pointer pointer
Definition: Vector.h:147
rheolef::smart_pointer
see the smart_pointer page for the full documentation
Definition: smart_pointer.h:351
rheolef::Vector::empty
bool empty() const
Definition: Vector.h:261
rheolef::vector_rep::difference_type
DATA::difference_type difference_type
Definition: Vector.h:151
rheolef::Vector::reference
DATA::reference reference
Definition: Vector.h:186
rheolef::vector_rep::iterator
DATA::iterator iterator
Definition: Vector.h:145
rheolef::Vector::begin
const_iterator begin() const
Definition: Vector.h:221
rheolef::VectorOfIterators::begin
iterator begin()
Definition: Vector.h:370
rheolef::VectorOfIterators::value_type
IteratorValue value_type
Definition: Vector.h:346
rheolef::Vector::pop_back
void pop_back()
Definition: Vector.h:327
rheolef::Vector::size_type
DATA::size_type size_type
Definition: Vector.h:188
rheolef::Vector::erase
void erase(iterator position)
Definition: Vector.h:331
rheolef::Vector::swap
void swap(Vector< T > &x)
Definition: Vector.h:211
rheolef::VectorOfIterators::iterator
V::iterator iterator
Definition: Vector.h:349
rheolef::Vector::rbegin
const_reverse_iterator rbegin() const
Definition: Vector.h:237
rheolef::VectorOfIterators::reference
V::reference reference
Definition: Vector.h:352
rheolef::vector_rep::DATA
std::vector< T > DATA
Definition: Vector.h:143
rheolef
This file is part of Rheolef.
Definition: compiler_eigen.h:37
rheolef::Vector::insert
void insert(iterator position, size_type n, const T &x)
Definition: Vector.h:317
rheolef::vector_rep::vector_rep
vector_rep(const vector_rep &x)
Definition: Vector.h:158
rheolef::smart_pointer_base< vector_rep< T >, details::constructor_copy< vector_rep< T > > >::data
const vector_rep< T > & data() const
Definition: smart_pointer.h:266
rheolef::Vector::value_type
T value_type
Definition: Vector.h:190
rheolef::Vector::at
reference at(size_type n)
Definition: Vector.h:287
rheolef::Vector::begin
iterator begin()
Definition: Vector.h:217
rheolef::VectorOfIterators::const_reference
CONST_V::const_reference const_reference
Definition: Vector.h:353
rheolef::Vector::size
size_type size() const
Definition: Vector.h:249
rheolef::VectorOfIterators::at
const_reference at(size_type n) const
Definition: Vector.h:412
rheolef::VectorOfIterators::end
iterator end()
Definition: Vector.h:382
rheolef::VectorOfIterators::front
reference front()
Definition: Vector.h:424
rheolef::Vector::operator[]
const_reference operator[](size_type n) const
Definition: Vector.h:274
rheolef::VectorOfIterators::V
Vector< IteratorValue > V
Definition: Vector.h:343
rheolef::Vector::pointer
DATA::pointer pointer
Definition: Vector.h:185
rheolef::Vector::max_size
size_type max_size() const
Definition: Vector.h:253
rheolef::space_constant::vector
@ vector
Definition: space_constant.h:137
rheolef::Vector::reserve
void reserve(size_type n)
Definition: Vector.h:207
rheolef::vector_rep::size_type
DATA::size_type size_type
Definition: Vector.h:150
rheolef::Vector::front
reference front()
Definition: Vector.h:291
size_type
field::size_type size_type
Definition: branch.cc:425
rheolef::Vector::rend
const_reverse_iterator rend() const
Definition: Vector.h:245
rheolef::VectorOfIterators::rbegin
reverse_iterator rbegin()
Definition: Vector.h:390
rheolef::VectorOfIterators::CONST_V
Vector< ConstIteratorValue > CONST_V
Definition: Vector.h:344
rheolef::VectorOfIterators::size_type
V::size_type size_type
Definition: Vector.h:354
rheolef::Vector::front
const_reference front() const
Definition: Vector.h:295
rheolef::VectorOfIterators::rend
const_reverse_iterator rend() const
Definition: Vector.h:394
rheolef::std
Definition: vec_expr_v2.h:402
rheolef::Vector::reverse_iterator
DATA::reverse_iterator reverse_iterator
Definition: Vector.h:191
rheolef::VectorOfIterators::back
reference back()
Definition: Vector.h:432
rheolef::VectorOfIterators::front
const_reference front() const
Definition: Vector.h:420
T
Expr1::float_type T
Definition: field_expr.h:261
rheolef::Vector::const_reference
DATA::const_reference const_reference
Definition: Vector.h:187
rheolef::VectorOfIterators::const_value_type
ConstIteratorValue const_value_type
Definition: Vector.h:347
rheolef::Vector::const_iterator
DATA::const_iterator const_iterator
Definition: Vector.h:184