LCOV - code coverage report
Current view: top level - vset - array.hpp (source / functions) Hit Total Coverage
Test: v-set-coverage.info Lines: 58 64 90.6 %
Date: 2019-09-12 Functions: 101 109 92.7 %

          Line data    Source code
       1             : #ifndef VSET_VTREE_ARRAY_HPP
       2             : #define VSET_VTREE_ARRAY_HPP
       3             : 
       4             : #include <algorithm>
       5             : #include <cstddef>
       6             : #include <stdexcept>
       7             : #include <iterator>
       8             : //#include <fas/typemanip/remove_const.hpp>
       9             : 
      10             : namespace vset{ 
      11             : 
      12             : template<typename T, size_t N>
      13             : class array
      14             : {
      15             : public:
      16             :   enum { dimension = N};
      17             :   typedef T value_type;
      18             :   //typedef typename fas::remove_const<T>::type data_type[N];
      19             :   typedef value_type data_type[N];
      20             :   typedef size_t size_type;
      21             :   typedef T& reference;
      22             :   typedef const T& const_reference;
      23             :   typedef T* pointer;
      24             :   typedef const T* const_pointer;
      25             :   typedef pointer iterator;
      26             :   typedef const_pointer const_iterator;
      27             :   typedef std::reverse_iterator<iterator> reverse_iterator;
      28             :   typedef const std::reverse_iterator<iterator> const_reverse_iterator;
      29             :   typedef std::ptrdiff_t difference_type;
      30             : 
      31        1438 :   array()
      32             :     : _size()
      33        1438 :     , _data()
      34             :   {
      35        1438 :   }
      36             : 
      37             :   reference operator[](size_type n)
      38             :   {
      39             :     return this->at(n);
      40             :   }
      41             : 
      42             :   const_reference operator[](size_type n) const
      43             :   {
      44             :     return this->at(n);
      45             :   }
      46             : 
      47         128 :   const_reference at ( size_type n ) const
      48             :   {
      49         128 :     if ( n < _size)
      50         256 :       return _data[n];
      51           0 :     throw std::out_of_range("array::at");
      52             :   }
      53             : 
      54       21589 :   reference at ( size_type n )
      55             :   {
      56       21589 :     if ( n < _size )
      57       43178 :       return _data[n];
      58           0 :     throw std::out_of_range("array::at");
      59             :   }
      60             :   
      61       90596 :   reference front ( )
      62             :   {
      63       90596 :     if ( _size==0 )
      64           0 :       throw std::out_of_range("array::at");
      65       90596 :     return _data[0];
      66             :   }
      67             :   
      68             :   const_reference front ( ) const
      69             :   {
      70             :     if ( _size==0 )
      71             :       throw std::out_of_range("array::at");
      72             :     return _data[0];
      73             :   }
      74             :   
      75       72374 :   reference back ( )
      76             :   {
      77       72374 :     if ( _size==0 )
      78           0 :       throw std::out_of_range("array::at");
      79       72374 :     return _data[_size-1];
      80             :   }
      81             :   
      82             :   const_reference back ( ) const
      83             :   {
      84             :     if ( _size==0 )
      85             :       throw std::out_of_range("array::at");
      86             :     return _data[_size-1];
      87             :   }
      88             : 
      89      158919 :   size_type size() const
      90             :   {
      91      158919 :     return _size;
      92             :   }
      93             :   
      94       21356 :   static size_type max_size() 
      95             :   {
      96       21356 :     return N;
      97             :   }
      98             :   
      99       13247 :   static size_type capacity()
     100             :   {
     101       13247 :     return N;
     102             :   }
     103             :   
     104       16856 :   bool empty () const
     105             :   {
     106       16856 :     return _size==0;
     107             :   }
     108             :   
     109       21356 :   bool filled () const
     110             :   {
     111       21356 :     return _size == N;
     112             :   }
     113             :   
     114       16918 :   void resize ( size_type sz, T value = value_type() )
     115             :   {
     116       16918 :     if (sz > _size)
     117           0 :       std::fill_n( end(), sz - _size, value );
     118       16918 :     _size = sz;
     119       16918 :   }
     120             :   
     121             :   static void reserve ( size_type ) {}
     122             : 
     123             :   reverse_iterator rbegin()
     124             :   {
     125             :     return reverse_iterator(end());
     126             :   }
     127             :   
     128             :   const_reverse_iterator rbegin() const
     129             :   {
     130             :     return const_reverse_iterator( end() );
     131             :   }
     132             : 
     133             :   reverse_iterator rend()
     134             :   {
     135             :     return reverse_iterator( begin() );
     136             :   }
     137             :   
     138             :   const_reverse_iterator rend() const
     139             :   {
     140             :     return const_reverse_iterator( begin() );
     141             :   }
     142             : 
     143      222924 :   iterator begin()
     144             :   {
     145      222924 :     return _data;
     146             :   }
     147             :   
     148          14 :   const_iterator begin() const
     149             :   {
     150          14 :     return _data;
     151             :   }
     152             :   
     153      176390 :   iterator end()
     154             :   {
     155      176390 :     return _data + _size;
     156             :   }
     157             :   
     158          14 :   const_iterator end() const
     159             :   {
     160          14 :     return _data + _size;
     161             :   }
     162             : 
     163             : #ifdef __GXX_EXPERIMENTAL_CXX0X__
     164             : 
     165             :   const reverse_iterator crbegin() const
     166             :   {
     167             :     return const_reverse_iterator(cend());
     168             :   }
     169             : 
     170             :   const_reverse_iterator crend() const
     171             :   {
     172             :     return const_reverse_iterator( begin() );
     173             :   }
     174             : 
     175       33720 :   const_iterator cbegin() const
     176             :   {
     177       33720 :     return _data;
     178             :   }
     179             : 
     180       33726 :   const_iterator cend() const
     181             :   {
     182       33726 :     return _data + _size;
     183             :   }
     184             : 
     185             : #endif
     186             : 
     187             :   iterator last()
     188             :   {
     189             :     return _data + _size - 1;
     190             :   }
     191             :   
     192             :   const_iterator last() const
     193             :   {
     194             :     return _data  + _size - 1;
     195             :   }
     196             : 
     197             :   void clear()
     198             :   {
     199             :     _size = 0;
     200             :   }
     201             : 
     202             :   template <class InputIterator>
     203          62 :   void assign ( InputIterator f, InputIterator l )
     204             :   {
     205          62 :     std::copy( f, l, _data );
     206          62 :     _size = static_cast<size_t>(std::distance(f, l));
     207          62 :   }
     208             : 
     209             :   void assign ( size_type n, const T& u )
     210             :   {
     211             :     std::fill_n( begin(), n, u );
     212             :     _size = n;
     213             :   }
     214             : 
     215        2432 :   void push_back ( const T& x )
     216             :   {
     217        2432 :     _data[_size++] = x;
     218        2432 :   }
     219             : 
     220             :   void pop_back ( )
     221             :   {
     222             :     --_size;
     223             :   }
     224             : 
     225       21356 :   iterator insert ( iterator position, const T& x )
     226             :   {
     227       21356 :     if ( this->size() + 1 > this->max_size() )
     228           0 :       throw std::out_of_range("array::insert");
     229             : 
     230       21356 :     iterator first = position;
     231       21356 :     iterator l = this->end();
     232       21356 :     iterator d_last = l+1;
     233     3924076 :     while (first != l)
     234             :     {
     235     3881364 :         *(--d_last) = *(--l);
     236             :     }
     237             : 
     238       21356 :     *position = x;
     239       21356 :     ++_size;
     240       21356 :     return position;
     241             :   }
     242             : 
     243             :   void insert ( iterator position, size_type n, const T& x )
     244             :   {
     245             :     if ( this->size() + n > this->max_size() )
     246             :       throw std::out_of_range("array::insert");
     247             :     std::copy_backward(position, end(), end()+n);
     248             :     std::fill_n(position, n, x);
     249             :     _size+=n;
     250             :   }
     251             : 
     252             :   template <class InputIterator>
     253             :   void insert ( iterator position, InputIterator f, InputIterator l )
     254             :   {
     255             :     difference_type dist = std::distance(f,l);
     256             :     if (dist<=0)
     257             :       return;
     258             :     if ( this->size() + dist > this->max_size() )
     259             :       throw std::out_of_range("array::insert");
     260             : 
     261             :     std::copy_backward(position, end(), end()+dist );
     262             :     std::copy(f, l, position);
     263             :     _size+=dist;
     264             :   }
     265             : 
     266             : #ifdef __GXX_EXPERIMENTAL_CXX0X__
     267             : 
     268             :   iterator erase ( const_iterator position )
     269             :   {
     270             :     if ( position == this->cend() )
     271             :       throw std::out_of_range("iterator array<>::erase ( iterator position )");
     272             :     
     273             :     std::copy( position + 1, this->end(), position);
     274             :     this->resize( _size - 1 );
     275             :     return position;
     276             :   }
     277             :   
     278             : #else
     279             : 
     280             :   iterator erase ( iterator position )
     281             :   {
     282             :     if ( position == this->end() )
     283             :       throw std::out_of_range("iterator array<>::erase ( iterator position )");
     284             : 
     285             :     std::copy( position + 1, this->end(), position);
     286             :     this->resize( _size - 1 );
     287             :     return position;
     288             :   }
     289             :   
     290             : #endif
     291             : 
     292             :   iterator erase ( iterator f, iterator l )
     293             :   {
     294             :     difference_type dist = std::distance(f,l);;
     295             :     std::copy( l, this->end(), f);
     296             :     this->resize( _size - dist );
     297             :     return f;
     298             :   }
     299             : 
     300             : private:
     301             :   
     302             :   size_type _size;
     303             :   data_type _data;
     304             : };
     305             : 
     306             : }
     307             : 
     308             : #endif

Generated by: LCOV version 1.10