LCOV - code coverage report
Current view: top level - vset - sorted_array.hpp (source / functions) Hit Total Coverage
Test: v-set-coverage.info Lines: 30 31 96.8 %
Date: 2019-09-12 Functions: 55 65 84.6 %

          Line data    Source code
       1             : #ifndef VSET_VTREE_SORTED_ARRAY_HPP
       2             : #define VSET_VTREE_SORTED_ARRAY_HPP
       3             : 
       4             : #include <vset/array.hpp>
       5             : 
       6             : namespace vset{
       7             : 
       8             : // TODO: сделать операции < > и пр.
       9             : template<typename T, size_t N, typename Compare = std::less<T> >
      10             : class sorted_array
      11             :   : public array<T, N>
      12             : {
      13             :   typedef array<T, N> super;
      14             : 
      15             : public:
      16             :   
      17             :   typedef Compare key_compare;
      18             :   typedef Compare value_compare;
      19             : 
      20             :   typedef typename super::value_type value_type;
      21             :   typedef typename super::data_type data_type;
      22             :   typedef typename super::size_type size_type;
      23             : 
      24             :   typedef typename super::reference reference;
      25             :   typedef typename super::const_reference const_reference;
      26             : 
      27             :   typedef typename super::pointer pointer;
      28             :   typedef typename super::const_pointer const_pointer;
      29             : 
      30             :   typedef typename super::const_iterator const_iterator;
      31             :   typedef typename super::iterator iterator;
      32             : 
      33             :   typedef typename super::reverse_iterator reverse_iterator;
      34             :   typedef typename super::const_reverse_iterator const_reverse_iterator;
      35             : 
      36             :   typedef std::ptrdiff_t difference_type;
      37             : 
      38             : 
      39        1437 :   sorted_array( )
      40        1437 :     : super()
      41        1437 :   {}
      42             : 
      43       16918 :   void resize ( size_type sz, T value /*= value_type()*/, const value_compare& comp /*= value_compare()*/ )
      44             :   {
      45       16918 :     bool f = this->size() < sz;
      46       16918 :     super_()->resize(sz, value);
      47       16918 :     if ( f ) this->sort(comp);
      48       16918 :   }
      49             : 
      50             :   template <class InputIterator>
      51          62 :   void assign( InputIterator f, InputIterator l, const value_compare& comp /*= value_compare()*/ )
      52             :   {
      53          62 :     super_()->assign(f, l);
      54          62 :     this->sort(comp);
      55          62 :   }
      56             : 
      57        2432 :   void push_back ( const T& x, const value_compare& comp /*= value_compare()*/ )
      58             :   {
      59        2432 :     super_()->push_back(x);
      60        2432 :     this->sort(comp);
      61        2432 :   }
      62             : 
      63       21356 :   iterator insert ( const T& x, const value_compare& comp /*= value_compare()*/ )
      64             :   {
      65       21356 :     iterator position = std::upper_bound(super_()->begin(), super_()->end(), x, comp );
      66       21356 :     return static_cast<super*>(this)->insert(position, x);
      67             :   }
      68             : 
      69             :   
      70             :   void insert ( size_type n, const T& x, const value_compare& comp /*= value_compare()*/ )
      71             :   {
      72             :     iterator position = std::upper_bound(super_()->begin(), super_()->end(), x, comp );
      73             :     return super_()->insert(position, n, x);
      74             :   }
      75             :   
      76             : 
      77             :   template <class InputIterator>
      78             :   void insert ( InputIterator first, InputIterator last, const value_compare& comp /*= value_compare()*/ )
      79             :   {
      80             :     super_()->insert( super_()->end(), first, last );
      81             :     this->sort(comp);
      82             :   }
      83             : 
      84             :   //using super_()->erase;
      85             :   //using super_()->cbegin;
      86             : #ifdef __GXX_EXPERIMENTAL_CXX0X__
      87       16856 :   iterator erase ( const_iterator position, const value_compare& comp )
      88             :   {
      89       16856 :     if ( position == this->cend() )
      90           0 :       throw std::out_of_range("iterator array<>::erase ( iterator position )");
      91             : 
      92       16856 :     iterator dst = this->begin() + std::distance(this->cbegin(), position);
      93       16856 :     std::copy( position + 1, this->cend(), dst);
      94       16856 :     if ( this->size() > 0 )
      95       16856 :       this->resize( this->size() - 1, value_type(), comp );
      96       16856 :     return dst;
      97             :   }
      98             : #else
      99             :   iterator erase ( iterator position, const value_compare& comp )
     100             :   {
     101             :     if ( position == this->end() )
     102             :       throw std::out_of_range("iterator array<>::erase ( iterator position )");
     103             : 
     104             :     std::copy( position + 1, this->end(), position);
     105             :     if ( this->size() > 0 )
     106             :       this->resize( this->size() - 1, value_type(), comp );
     107             :     return position;
     108             :   }
     109             : #endif
     110             : 
     111             : private:
     112             :   /// BUG 
     113             :   size_type erase( const T& x, const value_compare& comp )
     114             :   {
     115             :     size_type count = 0;
     116             :     std::pair<iterator, iterator> range = std::equal_range(super_()->begin(), super_()->end(), x, comp );
     117             :     for (;range.first!=range.second;++range.first, ++count)
     118             :       super_()->erase(range.first);
     119             :     return count;
     120             :   }
     121             : public:
     122             : 
     123        2494 :   void sort(const value_compare& comp )
     124             :   {
     125        2494 :     std::sort( super_()->begin(), super_()->end(), comp );
     126        2494 :   }
     127             : private:
     128             :   const super* super_() const { return static_cast< const super*>(this);}
     129       67112 :   super* super_(){ return static_cast<super*>(this);}
     130             :   
     131             : };
     132             : 
     133             : }
     134             : 
     135             : #endif

Generated by: LCOV version 1.10