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
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