CMS 3D CMS Logo

lat::PODVector< T > Struct Template Reference

Container like std::vector except that its representation Data is guaranteed to be a structure that can be stored and initialised as a part of another POD structure. More...

#include <Iguana/Utilities/classlib/utils/PODVector.h>

List of all members.

Public Types

typedef const value_typeconst_iterator
typedef const value_typeconst_pointer
typedef const value_typeconst_reference
typedef STDC::ptrdiff_t difference_type
typedef value_typeiterator
typedef value_typepointer
typedef value_typereference
typedef STDC::size_t size_type
typedef T value_type

Public Member Functions

typedef REVERSE_ITERATOR (reverse_iterator, random_access_iterator_tag, const_iterator, value_type, const_reference, const_pointer, difference_type) const _reverse_iterator
typedef REVERSE_ITERATOR (reverse_iterator, random_access_iterator_tag, iterator, value_type, reference, pointer, difference_type) reverse_iterator

Static Public Member Functions

static const_reference back (const Data &vector)
static reference back (Data &vector)
static const_iterator begin (const Data &vector)
static iterator begin (Data &vector)
static size_type capacity (const Data &vector)
static void clear (Data &vector)
static bool empty (const Data &vector)
static const_iterator end (const Data &vector)
static iterator end (Data &vector)
static iterator erase (Data &vector, iterator first, iterator last)
static iterator erase (Data &vector, iterator pos)
static const_reference front (const Data &vector)
static reference front (Data &vector)
static void insert (Data &vector, iterator pos, long n, const T &x)
static void insert (Data &vector, iterator pos, int n, const T &x)
static void insert (Data &vector, iterator pos, size_type n, const T &x)
static iterator insert (Data &vector, iterator pos)
static iterator insert (Data &vector, iterator pos, const T &x)
static size_type max_size (const Data &vector)
static void pop_back (Data &vector)
static void push_back (Data &vector, const T &x)
static const_reverse_iterator rbegin (const Data &vector)
static reverse_iterator rbegin (Data &vector)
static const_reverse_iterator rend (const Data &vector)
static reverse_iterator rend (Data &vector)
static void reserve (Data &vector, size_type n)
static void resize (Data &vector, size_type new_size)
static void resize (Data &vector, size_type new_size, const T &x)
static size_type size (const Data &vector)
static void swap (Data &vector, Data &other)

Static Private Member Functions

static void insert_grow (Data &vector, iterator pos, const T &x)

Classes

struct  Data


Detailed Description

template<class T>
struct lat::PODVector< T >

Container like std::vector except that its representation Data is guaranteed to be a structure that can be stored and initialised as a part of another POD structure.

No operation on T may throw. Full erase guarantees complete memory release. Since Data is a POD structure, all methods are outside it in the shell class and have to be passed a Data reference.

Definition at line 24 of file PODVector.h.


Member Typedef Documentation

template<class T>
typedef const value_type* lat::PODVector< T >::const_iterator

Definition at line 37 of file PODVector.h.

template<class T>
typedef const value_type* lat::PODVector< T >::const_pointer

Definition at line 35 of file PODVector.h.

template<class T>
typedef const value_type& lat::PODVector< T >::const_reference

Definition at line 39 of file PODVector.h.

template<class T>
typedef STDC::ptrdiff_t lat::PODVector< T >::difference_type

Definition at line 41 of file PODVector.h.

template<class T>
typedef value_type* lat::PODVector< T >::iterator

Definition at line 36 of file PODVector.h.

template<class T>
typedef value_type* lat::PODVector< T >::pointer

Definition at line 34 of file PODVector.h.

template<class T>
typedef value_type& lat::PODVector< T >::reference

Definition at line 38 of file PODVector.h.

template<class T>
typedef STDC::size_t lat::PODVector< T >::size_type

Definition at line 40 of file PODVector.h.

template<class T>
typedef T lat::PODVector< T >::value_type

Definition at line 33 of file PODVector.h.


Member Function Documentation

template<class T>
PODVector< T >::const_reference lat::PODVector< T >::back ( const Data vector  )  [inline, static]

Definition at line 203 of file PODVector.h.

References lat::PODVector< T >::Data::end.

00204 { return *(vector.end-1); }

template<class T>
PODVector< T >::reference lat::PODVector< T >::back ( Data vector  )  [inline, static]

Definition at line 198 of file PODVector.h.

References lat::PODVector< T >::Data::end.

00199 { return *(vector.end-1); }

template<class T>
PODVector< T >::const_iterator lat::PODVector< T >::begin ( const Data vector  )  [inline, static]

Definition at line 130 of file PODVector.h.

References lat::PODVector< T >::Data::begin.

00131 { return vector.begin; }

template<class T>
PODVector< T >::iterator lat::PODVector< T >::begin ( Data vector  )  [inline, static]

Definition at line 125 of file PODVector.h.

References lat::PODVector< T >::Data::begin.

Referenced by lat::PODVector< T >::insert(), lat::PODVector< T >::insert_grow(), and lat::PODVector< T >::reserve().

00126 { return vector.begin; }

template<class T>
PODVector< T >::size_type lat::PODVector< T >::capacity ( const Data vector  )  [inline, static]

Definition at line 177 of file PODVector.h.

References lat::PODVector< T >::Data::begin, and lat::PODVector< T >::Data::limit.

Referenced by lat::PODVector< T >::reserve().

00178 { return vector.begin ? vector.limit - vector.begin : 0; }

template<class T>
void lat::PODVector< T >::clear ( Data vector  )  [inline, static]

Definition at line 392 of file PODVector.h.

References lat::PODVector< T >::Data::begin, lat::PODVector< T >::Data::end, and lat::PODVector< T >::erase().

00393 { erase (vector.begin, vector.end); }

template<class T>
bool lat::PODVector< T >::empty ( const Data vector  )  [inline, static]

Definition at line 182 of file PODVector.h.

References lat::PODVector< T >::Data::begin, and lat::PODVector< T >::Data::end.

00183 { return vector.begin == vector.end; }

template<class T>
PODVector< T >::const_iterator lat::PODVector< T >::end ( const Data vector  )  [inline, static]

Definition at line 140 of file PODVector.h.

References lat::PODVector< T >::Data::end.

00141 { return vector.end; }

template<class T>
PODVector< T >::iterator lat::PODVector< T >::end ( Data vector  )  [inline, static]

Definition at line 135 of file PODVector.h.

References lat::PODVector< T >::Data::end.

Referenced by lat::PODVector< T >::insert_grow().

00136 { return vector.end; }

template<class T>
PODVector< T >::iterator lat::PODVector< T >::erase ( Data vector,
iterator  first,
iterator  last 
) [inline, static]

Definition at line 365 of file PODVector.h.

References edmNew::copy(), and lat::PODVector< T >::Data::end.

00366 {
00367     for (first = std::copy (last, vector.end, first);
00368          first != vector.end;
00369          ++first)
00370         first->T::~T ();
00371     vector.end -= last - first;
00372     return first;
00373 }

template<class T>
PODVector< T >::iterator lat::PODVector< T >::erase ( Data vector,
iterator  pos 
) [inline, static]

Definition at line 346 of file PODVector.h.

References lat::PODVector< T >::Data::begin, edmNew::copy(), lat::PODVector< T >::Data::end, and lat::PODVector< T >::Data::limit.

Referenced by lat::PODVector< T >::clear(), and lat::PODVector< T >::resize().

00347 {
00348     if (pos+1 != vector.end)
00349         std::copy (pos+1, vector.end, pos);
00350     --vector.end;
00351     vector.end->T::~T ();
00352 
00353     if (vector.begin == vector.end)
00354     {
00355         ::operator delete (vector.begin);
00356         vector.begin = vector.end = vector.limit = 0;
00357         return 0;
00358     }
00359     else
00360         return pos;
00361 }

template<class T>
PODVector< T >::const_reference lat::PODVector< T >::front ( const Data vector  )  [inline, static]

Definition at line 193 of file PODVector.h.

References lat::PODVector< T >::Data::begin.

00194 { return *vector.begin; }

template<class T>
PODVector< T >::reference lat::PODVector< T >::front ( Data vector  )  [inline, static]

Definition at line 188 of file PODVector.h.

References lat::PODVector< T >::Data::begin.

00189 { return *vector.begin; }

template<class T>
void lat::PODVector< T >::insert ( Data vector,
iterator  pos,
long  n,
const T &  x 
) [inline, static]

Definition at line 335 of file PODVector.h.

References lat::PODVector< T >::insert().

00336 { insert (vector, pos, size_type (n), x); }

template<class T>
void lat::PODVector< T >::insert ( Data vector,
iterator  pos,
int  n,
const T &  x 
) [inline, static]

Definition at line 330 of file PODVector.h.

References lat::PODVector< T >::insert().

00331 { insert (vector, pos, size_type (n), x); }

template<class T>
static void lat::PODVector< T >::insert ( Data vector,
iterator  pos,
size_type  n,
const T &  x 
) [static]

template<class T>
PODVector< T >::iterator lat::PODVector< T >::insert ( Data vector,
iterator  pos 
) [inline, static]

Definition at line 306 of file PODVector.h.

References lat::PODVector< T >::insert().

00307 { return insert (vector, pos, T()); }

template<class T>
PODVector< T >::iterator lat::PODVector< T >::insert ( Data vector,
iterator  pos,
const T &  x 
) [inline, static]

Definition at line 290 of file PODVector.h.

References lat::PODVector< T >::begin(), lat::PODVector< T >::Data::begin, lat::PODVector< T >::Data::end, index, lat::PODVector< T >::insert_grow(), and lat::PODVector< T >::Data::limit.

Referenced by lat::PODVector< T >::insert(), and lat::PODVector< T >::resize().

00291 {
00292     size_type index = pos - begin (vector);
00293     if (vector.end != vector.limit && pos != vector.end)
00294     {
00295         new (vector.end) T (x);
00296         ++vector.end;
00297     }
00298     else
00299         insert_grow (vector, pos, x);
00300 
00301     return vector.begin + index;
00302 }

template<class T>
void lat::PODVector< T >::insert_grow ( Data vector,
iterator  pos,
const T &  x 
) [inline, static, private]

Definition at line 241 of file PODVector.h.

References lat::PODVector< T >::begin(), lat::PODVector< T >::Data::begin, lat::PODVector< T >::Data::end, lat::PODVector< T >::end(), first, prof2calltree::last, lat::PODVector< T >::Data::limit, and lat::PODVector< T >::size().

Referenced by lat::PODVector< T >::insert(), and lat::PODVector< T >::push_back().

00242 {
00243     if (vector.end != vector.limit)
00244     {
00245         new (vector.end) T (*(vector.end-1));
00246         ++vector.end;
00247         std::copy_backward (pos, vector.end-2, vector.end-1);
00248         *pos = x;
00249     }
00250     else
00251     {
00252         size_type       old_size = size (vector);
00253         size_type       new_size = old_size ? 2*old_size : 1;
00254         iterator        begin;
00255         iterator        end;
00256 
00257         begin = static_cast<iterator> (::operator new (new_size * sizeof (T)));
00258         end = std::uninitialized_copy (vector.begin, pos, begin);
00259         new (end) T (x);
00260         ++end;
00261         end = std::uninitialized_copy (pos, vector.end, end);
00262 
00263         for (iterator first = vector.begin, last = vector.end;
00264              first != last;
00265              ++first)
00266             first->T::~T ();
00267         ::operator delete (vector.begin);
00268 
00269         vector.begin = begin;
00270         vector.end   = end;
00271         vector.limit = begin + new_size;
00272     }
00273 }

template<class T>
PODVector< T >::size_type lat::PODVector< T >::max_size ( const Data vector  )  [inline, static]

Definition at line 172 of file PODVector.h.

00173 { return size_type(-1) / sizeof (T); }

template<class T>
void lat::PODVector< T >::pop_back ( Data vector  )  [inline, static]

Definition at line 341 of file PODVector.h.

References lat::PODVector< T >::Data::end.

00342 { --vector.end; vector.end->T::~T (); }

template<class T>
void lat::PODVector< T >::push_back ( Data vector,
const T &  x 
) [inline, static]

Definition at line 277 of file PODVector.h.

References lat::PODVector< T >::Data::end, lat::PODVector< T >::insert_grow(), and lat::PODVector< T >::Data::limit.

00278 {
00279     if (vector.end != vector.limit)
00280     {
00281         new (vector.end) T (value);
00282         ++vector.end;
00283     }
00284     else
00285         insert_grow (vector, vector.end, value);
00286 }

template<class T>
PODVector< T >::const_reverse_iterator lat::PODVector< T >::rbegin ( const Data vector  )  [inline, static]

Definition at line 151 of file PODVector.h.

References lat::PODVector< T >::Data::begin.

00152 { return vector.begin; }

template<class T>
PODVector< T >::reverse_iterator lat::PODVector< T >::rbegin ( Data vector  )  [inline, static]

Definition at line 146 of file PODVector.h.

References lat::PODVector< T >::Data::begin.

00147 { return vector.begin; }

template<class T>
PODVector< T >::const_reverse_iterator lat::PODVector< T >::rend ( const Data vector  )  [inline, static]

Definition at line 161 of file PODVector.h.

References lat::PODVector< T >::Data::end.

00162 { return vector.end; }

template<class T>
PODVector< T >::reverse_iterator lat::PODVector< T >::rend ( Data vector  )  [inline, static]

Definition at line 156 of file PODVector.h.

References lat::PODVector< T >::Data::end.

00157 { return vector.end; }

template<class T>
void lat::PODVector< T >::reserve ( Data vector,
size_type  n 
) [inline, static]

Definition at line 219 of file PODVector.h.

References lat::PODVector< T >::begin(), lat::PODVector< T >::Data::begin, lat::PODVector< T >::capacity(), lat::PODVector< T >::Data::end, first, prof2calltree::last, lat::PODVector< T >::Data::limit, and lat::PODVector< T >::size().

00220 {
00221     if (capacity (vector) < new_size)
00222     {
00223         size_type       old_size = size (vector);
00224         iterator        begin = static_cast<iterator> (::operator new (new_size * sizeof (T)));
00225   
00226         std::uninitialized_copy (vector.begin, vector.end, begin);
00227         for (iterator first = vector.begin, last = vector.end;
00228              first != last;
00229              ++first)
00230             first->T::~T ();
00231         ::operator delete (vector.begin);
00232 
00233         vector.begin = begin;
00234         vector.end   = begin + old_size;
00235         vector.limit = begin + new_size;
00236     }
00237 }

template<class T>
void lat::PODVector< T >::resize ( Data vector,
size_type  new_size 
) [inline, static]

Definition at line 387 of file PODVector.h.

References lat::PODVector< T >::resize().

00388 { resize (vector, new_size, T()); }

template<class T>
void lat::PODVector< T >::resize ( Data vector,
size_type  new_size,
const T &  x 
) [inline, static]

Definition at line 377 of file PODVector.h.

References lat::PODVector< T >::Data::begin, lat::PODVector< T >::Data::end, lat::PODVector< T >::erase(), lat::PODVector< T >::insert(), and lat::PODVector< T >::size().

Referenced by lat::PODVector< T >::resize().

00378 {
00379     if (new_size < size ())
00380         erase (vector.begin + new_size, vector.end);
00381     else
00382         insert (vector.end, new_size-size(), x);
00383 }

template<class T>
typedef lat::PODVector< T >::REVERSE_ITERATOR ( reverse_iterator  ,
random_access_iterator_tag  ,
const_iterator  ,
value_type  ,
const_reference  ,
const_pointer  ,
difference_type   
) const

template<class T>
typedef lat::PODVector< T >::REVERSE_ITERATOR ( reverse_iterator  ,
random_access_iterator_tag  ,
iterator  ,
value_type  ,
reference  ,
pointer  ,
difference_type   
)

template<class T>
PODVector< T >::size_type lat::PODVector< T >::size ( const Data vector  )  [inline, static]

Definition at line 167 of file PODVector.h.

References lat::PODVector< T >::Data::begin, and lat::PODVector< T >::Data::end.

Referenced by lat::PODVector< T >::insert_grow(), lat::PODVector< T >::reserve(), and lat::PODVector< T >::resize().

00168 { return vector.begin ? vector.end - vector.begin : 0; }

template<class T>
void lat::PODVector< T >::swap ( Data vector,
Data other 
) [inline, static]

Definition at line 209 of file PODVector.h.

References tmp.

00210 {
00211     Data tmp = vector;
00212     vector = other;
00213     other = tmp;
00214 }


The documentation for this struct was generated from the following file:
Generated on Tue Jun 9 18:48:34 2009 for CMSSW by  doxygen 1.5.4