Home | History | Annotate | Download | only in profile
      1 // Profiling deque implementation -*- C++ -*-
      2 
      3 // Copyright (C) 2009, 2010 Free Software Foundation, Inc.
      4 //
      5 // This file is part of the GNU ISO C++ Library.  This library is free
      6 // software; you can redistribute it and/or modify it under the
      7 // terms of the GNU General Public License as published by the
      8 // Free Software Foundation; either version 3, or (at your option)
      9 // any later version.
     10 
     11 // This library is distributed in the hope that it will be useful,
     12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 // GNU General Public License for more details.
     15 
     16 // Under Section 7 of GPL version 3, you are granted additional
     17 // permissions described in the GCC Runtime Library Exception, version
     18 // 3.1, as published by the Free Software Foundation.
     19 
     20 // You should have received a copy of the GNU General Public License and
     21 // a copy of the GCC Runtime Library Exception along with this program;
     22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23 // <http://www.gnu.org/licenses/>.
     24 
     25 /** @file profile/deque
     26  *  This file is a GNU profile extension to the Standard C++ Library.
     27  */
     28 
     29 #ifndef _GLIBCXX_PROFILE_DEQUE
     30 #define _GLIBCXX_PROFILE_DEQUE 1
     31 
     32 #include <deque>
     33 
     34 namespace std _GLIBCXX_VISIBILITY(default)
     35 {
     36 namespace __profile
     37 {
     38   /// Class std::deque wrapper with performance instrumentation.
     39   template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
     40     class deque
     41     : public _GLIBCXX_STD_C::deque<_Tp, _Allocator>
     42     {
     43       typedef  _GLIBCXX_STD_C::deque<_Tp, _Allocator> _Base;
     44 
     45     public:
     46       typedef typename _Base::reference             reference;
     47       typedef typename _Base::const_reference       const_reference;
     48 
     49       typedef typename _Base::iterator             iterator;
     50       typedef typename _Base::const_iterator       const_iterator;
     51       typedef typename _Base::reverse_iterator     reverse_iterator;
     52       typedef typename _Base::const_reverse_iterator const_reverse_iterator;
     53 
     54       typedef typename _Base::size_type             size_type;
     55       typedef typename _Base::difference_type       difference_type;
     56 
     57       typedef _Tp				    value_type;
     58       typedef _Allocator			    allocator_type;
     59       typedef typename _Base::pointer               pointer;
     60       typedef typename _Base::const_pointer         const_pointer;
     61 
     62       // 23.2.1.1 construct/copy/destroy:
     63       explicit
     64       deque(const _Allocator& __a = _Allocator())
     65       : _Base(__a) { }
     66 
     67 #ifdef __GXX_EXPERIMENTAL_CXX0X__
     68       explicit
     69       deque(size_type __n)
     70       : _Base(__n) { }
     71 
     72       deque(size_type __n, const _Tp& __value,
     73 	    const _Allocator& __a = _Allocator())
     74       : _Base(__n, __value, __a) { }
     75 #else
     76       explicit
     77       deque(size_type __n, const _Tp& __value = _Tp(),
     78 	    const _Allocator& __a = _Allocator())
     79       : _Base(__n, __value, __a) { }
     80 #endif
     81 
     82       template<class _InputIterator>
     83         deque(_InputIterator __first, _InputIterator __last,
     84 	      const _Allocator& __a = _Allocator())
     85 	: _Base(__first, __last, __a)
     86         { }
     87 
     88       deque(const deque& __x)
     89       : _Base(__x) { }
     90 
     91       deque(const _Base& __x)
     92       : _Base(__x) { }
     93 
     94 #ifdef __GXX_EXPERIMENTAL_CXX0X__
     95       deque(deque&& __x)
     96       : _Base(std::move(__x))
     97       { }
     98 
     99       deque(initializer_list<value_type> __l,
    100 	    const allocator_type& __a = allocator_type())
    101       : _Base(__l, __a) { }
    102 #endif
    103 
    104       ~deque() { }
    105 
    106       deque&
    107       operator=(const deque& __x)
    108       {
    109 	*static_cast<_Base*>(this) = __x;
    110 	return *this;
    111       }
    112 
    113 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    114       deque&
    115       operator=(deque&& __x)
    116       {
    117 	// NB: DR 1204.
    118 	// NB: DR 675.
    119 	this->clear();
    120 	this->swap(__x);
    121 	return *this;
    122       }
    123 
    124       deque&
    125       operator=(initializer_list<value_type> __l)
    126       {
    127 	*static_cast<_Base*>(this) = __l;
    128 	return *this;
    129       }
    130 #endif
    131 
    132       template<class _InputIterator>
    133         void
    134         assign(_InputIterator __first, _InputIterator __last)
    135         {
    136 	  _Base::assign(__first, __last);
    137 	}
    138 
    139       void
    140       assign(size_type __n, const _Tp& __t)
    141       {
    142 	_Base::assign(__n, __t);
    143       }
    144 
    145 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    146       void
    147       assign(initializer_list<value_type> __l)
    148       {
    149 	_Base::assign(__l);
    150       }
    151 #endif
    152 
    153       using _Base::get_allocator;
    154 
    155       // iterators:
    156       iterator
    157       begin()
    158       { return iterator(_Base::begin()); }
    159 
    160       const_iterator
    161       begin() const
    162       { return const_iterator(_Base::begin()); }
    163 
    164       iterator
    165       end()
    166       { return iterator(_Base::end()); }
    167 
    168       const_iterator
    169       end() const
    170       { return const_iterator(_Base::end()); }
    171 
    172       reverse_iterator
    173       rbegin()
    174       { return reverse_iterator(end()); }
    175 
    176       const_reverse_iterator
    177       rbegin() const
    178       { return const_reverse_iterator(end()); }
    179 
    180       reverse_iterator
    181       rend()
    182       { return reverse_iterator(begin()); }
    183 
    184       const_reverse_iterator
    185       rend() const
    186       { return const_reverse_iterator(begin()); }
    187 
    188 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    189       const_iterator
    190       cbegin() const
    191       { return const_iterator(_Base::begin()); }
    192 
    193       const_iterator
    194       cend() const
    195       { return const_iterator(_Base::end()); }
    196 
    197       const_reverse_iterator
    198       crbegin() const
    199       { return const_reverse_iterator(end()); }
    200 
    201       const_reverse_iterator
    202       crend() const
    203       { return const_reverse_iterator(begin()); }
    204 #endif
    205 
    206       // 23.2.1.2 capacity:
    207       using _Base::size;
    208       using _Base::max_size;
    209 
    210 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    211       void
    212       resize(size_type __sz)
    213       {
    214 	_Base::resize(__sz);
    215       }
    216 
    217       void
    218       resize(size_type __sz, const _Tp& __c)
    219       {
    220 	_Base::resize(__sz, __c);
    221       }
    222 #else
    223       void
    224       resize(size_type __sz, _Tp __c = _Tp())
    225       {
    226 	_Base::resize(__sz, __c);
    227       }
    228 #endif
    229 
    230 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    231       using _Base::shrink_to_fit;
    232 #endif
    233 
    234       using _Base::empty;
    235 
    236       // element access:
    237       reference
    238       operator[](size_type __n)
    239       {
    240 	return _M_base()[__n];
    241       }
    242 
    243       const_reference
    244       operator[](size_type __n) const
    245       {
    246 	return _M_base()[__n];
    247       }
    248 
    249       using _Base::at;
    250 
    251       reference
    252       front()
    253       {
    254 	return _Base::front();
    255       }
    256 
    257       const_reference
    258       front() const
    259       {
    260 	return _Base::front();
    261       }
    262 
    263       reference
    264       back()
    265       {
    266 	return _Base::back();
    267       }
    268 
    269       const_reference
    270       back() const
    271       {
    272 	return _Base::back();
    273       }
    274 
    275       // 23.2.1.3 modifiers:
    276       void
    277       push_front(const _Tp& __x)
    278       {
    279 	_Base::push_front(__x);
    280       }
    281 
    282       void
    283       push_back(const _Tp& __x)
    284       {
    285 	_Base::push_back(__x);
    286       }
    287 
    288 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    289       void
    290       push_front(_Tp&& __x)
    291       { emplace_front(std::move(__x)); }
    292 
    293       void
    294       push_back(_Tp&& __x)
    295       { emplace_back(std::move(__x)); }
    296 
    297       template<typename... _Args>
    298         void
    299         emplace_front(_Args&&... __args)
    300 	{
    301 	  _Base::emplace_front(std::forward<_Args>(__args)...);
    302 	}
    303 
    304       template<typename... _Args>
    305         void
    306         emplace_back(_Args&&... __args)
    307 	{
    308 	  _Base::emplace_back(std::forward<_Args>(__args)...);
    309 	}
    310 
    311       template<typename... _Args>
    312         iterator
    313         emplace(iterator __position, _Args&&... __args)
    314 	{
    315 	  typename _Base::iterator __res = _Base::emplace(__position,
    316 					    std::forward<_Args>(__args)...);
    317 	  return iterator(__res);
    318 	}
    319 #endif
    320 
    321       iterator
    322       insert(iterator __position, const _Tp& __x)
    323       {
    324 	typename _Base::iterator __res = _Base::insert(__position, __x);
    325 	return iterator(__res);
    326       }
    327 
    328 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    329       iterator
    330       insert(iterator __position, _Tp&& __x)
    331       { return emplace(__position, std::move(__x)); }
    332 
    333       void
    334       insert(iterator __p, initializer_list<value_type> __l)
    335       {
    336 	_Base::insert(__p, __l);
    337       }
    338 #endif
    339 
    340       void
    341       insert(iterator __position, size_type __n, const _Tp& __x)
    342       {
    343 	_Base::insert(__position, __n, __x);
    344       }
    345 
    346       template<class _InputIterator>
    347         void
    348         insert(iterator __position,
    349 	       _InputIterator __first, _InputIterator __last)
    350         {
    351 	  _Base::insert(__position, __first, __last);
    352 	}
    353 
    354       void
    355       pop_front()
    356       {
    357 	_Base::pop_front();
    358       }
    359 
    360       void
    361       pop_back()
    362       {
    363 	_Base::pop_back();
    364       }
    365 
    366       iterator
    367       erase(iterator __position)
    368       {
    369 	if (__position == begin() || __position == end()-1)
    370 	  {
    371 	    return iterator(_Base::erase(__position));
    372 	  }
    373 	else
    374 	  {
    375 	    typename _Base::iterator __res = _Base::erase(__position);
    376 	    return iterator(__res);
    377 	  }
    378       }
    379 
    380       iterator
    381       erase(iterator __first, iterator __last)
    382       {
    383 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
    384 	// 151. can't currently clear() empty container
    385         return iterator(_Base::erase(__first, __last));
    386       }
    387 
    388       void
    389       swap(deque& __x)
    390       {
    391 	_Base::swap(__x);
    392       }
    393 
    394       void
    395       clear()
    396       {
    397 	_Base::clear();
    398       }
    399 
    400       _Base&
    401       _M_base()       { return *this; }
    402 
    403       const _Base&
    404       _M_base() const { return *this; }
    405     };
    406 
    407   template<typename _Tp, typename _Alloc>
    408     inline bool
    409     operator==(const deque<_Tp, _Alloc>& __lhs,
    410 	       const deque<_Tp, _Alloc>& __rhs)
    411     { return __lhs._M_base() == __rhs._M_base(); }
    412 
    413   template<typename _Tp, typename _Alloc>
    414     inline bool
    415     operator!=(const deque<_Tp, _Alloc>& __lhs,
    416 	       const deque<_Tp, _Alloc>& __rhs)
    417     { return __lhs._M_base() != __rhs._M_base(); }
    418 
    419   template<typename _Tp, typename _Alloc>
    420     inline bool
    421     operator<(const deque<_Tp, _Alloc>& __lhs,
    422 	      const deque<_Tp, _Alloc>& __rhs)
    423     { return __lhs._M_base() < __rhs._M_base(); }
    424 
    425   template<typename _Tp, typename _Alloc>
    426     inline bool
    427     operator<=(const deque<_Tp, _Alloc>& __lhs,
    428 	       const deque<_Tp, _Alloc>& __rhs)
    429     { return __lhs._M_base() <= __rhs._M_base(); }
    430 
    431   template<typename _Tp, typename _Alloc>
    432     inline bool
    433     operator>=(const deque<_Tp, _Alloc>& __lhs,
    434 	       const deque<_Tp, _Alloc>& __rhs)
    435     { return __lhs._M_base() >= __rhs._M_base(); }
    436 
    437   template<typename _Tp, typename _Alloc>
    438     inline bool
    439     operator>(const deque<_Tp, _Alloc>& __lhs,
    440 	      const deque<_Tp, _Alloc>& __rhs)
    441     { return __lhs._M_base() > __rhs._M_base(); }
    442 
    443   template<typename _Tp, typename _Alloc>
    444     inline void
    445     swap(deque<_Tp, _Alloc>& __lhs, deque<_Tp, _Alloc>& __rhs)
    446     { __lhs.swap(__rhs); }
    447 
    448 } // namespace __profile
    449 } // namespace std
    450 
    451 #endif
    452