| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

StaticArray.h

Go to the documentation of this file.
00001 #ifndef DetDesc_StaticArray_h
00002 #define DetDesc_StaticArray_h
00003 
00005 #include "GaudiKernel/GaudiException.h"
00006 
00024 template<typename T, std::size_t N> 
00025 class StaticArray
00026 {
00027 public:
00029 
00030   typedef T                                     value_type;            
00031   typedef T*                                    iterator;              
00032   typedef const T*                              const_iterator;        
00033   typedef std::reverse_iterator<iterator>       reverse_iterator;      
00034   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00035   typedef T&                                    reference;             
00036   typedef const T&                              const_reference;       
00037   typedef std::size_t                           size_type;             
00038   typedef std::ptrdiff_t                        difference_type;       
00040 
00042   StaticArray() : m_size(0) {}
00043 
00044   //template<typename U> StaticArray& operator=(const StaticArray<U, N>&) ;
00045 
00047 
00048   iterator begin()             { return m_data ; }
00049   const_iterator begin() const { return m_data ; }
00050   iterator end()               { return m_data + m_size ; }
00051   const_iterator end() const   { return m_data + m_size ; }
00053 
00055 
00056   reverse_iterator rbegin()             { return reverse_iterator(end()) ; }
00057   const_reverse_iterator rbegin() const { return const_reverse_iterator(end()) ; }
00058   reverse_iterator rend()               { return reverse_iterator(begin()) ; }
00059   const_reverse_iterator rend() const   { return const_reverse_iterator(begin()) ; }
00061 
00063 
00064   size_type size() const { return m_size ; }
00065   bool empty()     const { return m_size==0 ; }
00066   size_type max_size() const { return N ; }
00067   size_type capacity() const { return N ; }
00068   void reserve(size_type n) { testcapacity(n) ; }
00070 
00072 
00073   reference operator[](size_type i)             { return m_data[i] ; }
00074   const_reference operator[](size_type i) const { return m_data[i] ; }
00075   reference at(size_type i)                     { return m_data[i] ; }
00076   const_reference at(size_type i) const         { return m_data[i] ; }
00077   reference front()                             { return m_data[0] ; }
00078   const_reference front() const                 { return m_data[0] ; }
00079   reference back()                              { return m_data[m_size-1] ; }
00080   const_reference back() const                  { return m_data[m_size-1] ; }
00082 
00084   void push_back(const_reference x) { testcapacity(m_size+1) ; at(m_size++) = x ; }
00085 
00087   void clear() { m_size = 0 ; }
00088 
00090   void erase(iterator first, iterator last) {
00091     if( last>first ) {
00092       if(last < end() ) {
00093         int n = end() - last ;
00094         for(int i=0; i<n; ++i) *(first + i) = *(last+i) ;
00095       }
00096       m_size -= last - first ;
00097     }
00098   }
00099 
00101   void erase(iterator pos) { return erase(pos,pos+1) ; }
00102 
00104   void insert(iterator pos, const_reference x) {
00105     testcapacity(m_size+1) ;
00106     for(iterator next = pos; next<end(); ++next) *(next+1) = *(next) ;
00107     ++m_size ;
00108     *pos = x ;
00109   }
00110 
00112   void swap( StaticArray<T, N>& rhs) { 
00113     std::swap_ranges(m_data,m_data+std::max(m_size,rhs.m_size),rhs.m_data) ; 
00114     std::swap( m_size, rhs.m_size ) ;
00115   }
00116   
00117 private:
00119   void testcapacity( size_type newsize ) const {
00120     if( newsize > N ) 
00121       throw GaudiException("DetDesc/StaticArray: trying to add data beyond maximum capacity of this container.\n Please increase the max_size template parameter.","DetDesc/StaticArray overflow", StatusCode::FAILURE) ;
00122   }
00123   
00124 private:
00125   T m_data[N];       
00126   size_type m_size ; 
00127 };
00128 
00129 #endif
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:00:13 2011 for DetDesc by doxygen 1.4.7