Home | History | Annotate | Download | only in profile
      1 // Profiling deque implementation -*- C++ -*-
      2 
      3 // Copyright (C) 2009-2013 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 #if __cplusplus >= 201103L
     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 #if __cplusplus >= 201103L
     83       template<typename _InputIterator,
     84 	       typename = std::_RequireInputIter<_InputIterator>>
     85 #else
     86       template<typename _InputIterator>
     87 #endif
     88         deque(_InputIterator __first, _InputIterator __last,
     89 	      const _Allocator& __a = _Allocator())
     90 	: _Base(__first, __last, __a)
     91         { }
     92 
     93       deque(const deque& __x)
     94       : _Base(__x) { }
     95 
     96       deque(const _Base& __x)
     97       : _Base(__x) { }
     98 
     99 #if __cplusplus >= 201103L
    100       deque(deque&& __x)
    101       : _Base(std::move(__x))
    102       { }
    103 
    104       deque(initializer_list<value_type> __l,
    105 	    const allocator_type& __a = allocator_type())
    106       : _Base(__l, __a) { }
    107 #endif
    108 
    109       ~deque() _GLIBCXX_NOEXCEPT { }
    110 
    111       deque&
    112       operator=(const deque& __x)
    113       {
    114 	*static_cast<_Base*>(this) = __x;
    115 	return *this;
    116       }
    117 
    118 #if __cplusplus >= 201103L
    119       deque&
    120       operator=(deque&& __x)
    121       {
    122 	// NB: DR 1204.
    123 	// NB: DR 675.
    124 	this->clear();
    125 	this->swap(__x);
    126 	return *this;
    127       }
    128 
    129       deque&
    130       operator=(initializer_list<value_type> __l)
    131       {
    132 	*static_cast<_Base*>(this) = __l;
    133 	return *this;
    134       }
    135 #endif
    136 
    137 #if __cplusplus >= 201103L
    138       template<typename _InputIterator,
    139 	       typename = std::_RequireInputIter<_InputIterator>>
    140 #else
    141       template<typename _InputIterator>
    142 #endif
    143         void
    144         assign(_InputIterator __first, _InputIterator __last)
    145         {
    146 	  _Base::assign(__first, __last);
    147 	}
    148 
    149       void
    150       assign(size_type __n, const _Tp& __t)
    151       {
    152 	_Base::assign(__n, __t);
    153       }
    154 
    155 #if __cplusplus >= 201103L
    156       void
    157       assign(initializer_list<value_type> __l)
    158       {
    159 	_Base::assign(__l);
    160       }
    161 #endif
    162 
    163       using _Base::get_allocator;
    164 
    165       // iterators:
    166       iterator
    167       begin() _GLIBCXX_NOEXCEPT
    168       { return iterator(_Base::begin()); }
    169 
    170       const_iterator
    171       begin() const _GLIBCXX_NOEXCEPT
    172       { return const_iterator(_Base::begin()); }
    173 
    174       iterator
    175       end() _GLIBCXX_NOEXCEPT
    176       { return iterator(_Base::end()); }
    177 
    178       const_iterator
    179       end() const _GLIBCXX_NOEXCEPT
    180       { return const_iterator(_Base::end()); }
    181 
    182       reverse_iterator
    183       rbegin() _GLIBCXX_NOEXCEPT
    184       { return reverse_iterator(end()); }
    185 
    186       const_reverse_iterator
    187       rbegin() const _GLIBCXX_NOEXCEPT
    188       { return const_reverse_iterator(end()); }
    189 
    190       reverse_iterator
    191       rend() _GLIBCXX_NOEXCEPT
    192       { return reverse_iterator(begin()); }
    193 
    194       const_reverse_iterator
    195       rend() const _GLIBCXX_NOEXCEPT
    196       { return const_reverse_iterator(begin()); }
    197 
    198 #if __cplusplus >= 201103L
    199       const_iterator
    200       cbegin() const noexcept
    201       { return const_iterator(_Base::begin()); }
    202 
    203       const_iterator
    204       cend() const noexcept
    205       { return const_iterator(_Base::end()); }
    206 
    207       const_reverse_iterator
    208       crbegin() const noexcept
    209       { return const_reverse_iterator(end()); }
    210 
    211       const_reverse_iterator
    212       crend() const noexcept
    213       { return const_reverse_iterator(begin()); }
    214 #endif
    215 
    216       // 23.2.1.2 capacity:
    217       using _Base::size;
    218       using _Base::max_size;
    219 
    220 #if __cplusplus >= 201103L
    221       void
    222       resize(size_type __sz)
    223       {
    224 	_Base::resize(__sz);
    225       }
    226 
    227       void
    228       resize(size_type __sz, const _Tp& __c)
    229       {
    230 	_Base::resize(__sz, __c);
    231       }
    232 #else
    233       void
    234       resize(size_type __sz, _Tp __c = _Tp())
    235       {
    236 	_Base::resize(__sz, __c);
    237       }
    238 #endif
    239 
    240 #if __cplusplus >= 201103L
    241       using _Base::shrink_to_fit;
    242 #endif
    243 
    244       using _Base::empty;
    245 
    246       // element access:
    247       reference
    248       operator[](size_type __n)
    249       {
    250 	return _M_base()[__n];
    251       }
    252 
    253       const_reference
    254       operator[](size_type __n) const
    255       {
    256 	return _M_base()[__n];
    257       }
    258 
    259       using _Base::at;
    260 
    261       reference
    262       front()
    263       {
    264 	return _Base::front();
    265       }
    266 
    267       const_reference
    268       front() const
    269       {
    270 	return _Base::front();
    271       }
    272 
    273       reference
    274       back()
    275       {
    276 	return _Base::back();
    277       }
    278 
    279       const_reference
    280       back() const
    281       {
    282 	return _Base::back();
    283       }
    284 
    285       // 23.2.1.3 modifiers:
    286       void
    287       push_front(const _Tp& __x)
    288       {
    289 	_Base::push_front(__x);
    290       }
    291 
    292       void
    293       push_back(const _Tp& __x)
    294       {
    295 	_Base::push_back(__x);
    296       }
    297 
    298 #if __cplusplus >= 201103L
    299       void
    300       push_front(_Tp&& __x)
    301       { emplace_front(std::move(__x)); }
    302 
    303       void
    304       push_back(_Tp&& __x)
    305       { emplace_back(std::move(__x)); }
    306 
    307       template<typename... _Args>
    308         void
    309         emplace_front(_Args&&... __args)
    310 	{
    311 	  _Base::emplace_front(std::forward<_Args>(__args)...);
    312 	}
    313 
    314       template<typename... _Args>
    315         void
    316         emplace_back(_Args&&... __args)
    317 	{
    318 	  _Base::emplace_back(std::forward<_Args>(__args)...);
    319 	}
    320 
    321       template<typename... _Args>
    322         iterator
    323         emplace(iterator __position, _Args&&... __args)
    324 	{
    325 	  typename _Base::iterator __res = _Base::emplace(__position,
    326 					    std::forward<_Args>(__args)...);
    327 	  return iterator(__res);
    328 	}
    329 #endif
    330 
    331       iterator
    332       insert(iterator __position, const _Tp& __x)
    333       {
    334 	typename _Base::iterator __res = _Base::insert(__position, __x);
    335 	return iterator(__res);
    336       }
    337 
    338 #if __cplusplus >= 201103L
    339       iterator
    340       insert(iterator __position, _Tp&& __x)
    341       { return emplace(__position, std::move(__x)); }
    342 
    343       void
    344       insert(iterator __p, initializer_list<value_type> __l)
    345       {
    346 	_Base::insert(__p, __l);
    347       }
    348 #endif
    349 
    350       void
    351       insert(iterator __position, size_type __n, const _Tp& __x)
    352       {
    353 	_Base::insert(__position, __n, __x);
    354       }
    355 
    356 #if __cplusplus >= 201103L
    357       template<typename _InputIterator,
    358 	       typename = std::_RequireInputIter<_InputIterator>>
    359 #else
    360       template<typename _InputIterator>
    361 #endif
    362         void
    363         insert(iterator __position,
    364 	       _InputIterator __first, _InputIterator __last)
    365         {
    366 	  _Base::insert(__position, __first, __last);
    367 	}
    368 
    369       void
    370       pop_front()
    371       {
    372 	_Base::pop_front();
    373       }
    374 
    375       void
    376       pop_back()
    377       {
    378 	_Base::pop_back();
    379       }
    380 
    381       iterator
    382       erase(iterator __position)
    383       {
    384 	if (__position == begin() || __position == end()-1)
    385 	  {
    386 	    return iterator(_Base::erase(__position));
    387 	  }
    388 	else
    389 	  {
    390 	    typename _Base::iterator __res = _Base::erase(__position);
    391 	    return iterator(__res);
    392 	  }
    393       }
    394 
    395       iterator
    396       erase(iterator __first, iterator __last)
    397       {
    398 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
    399 	// 151. can't currently clear() empty container
    400         return iterator(_Base::erase(__first, __last));
    401       }
    402 
    403       void
    404       swap(deque& __x)
    405       {
    406 	_Base::swap(__x);
    407       }
    408 
    409       void
    410       clear() _GLIBCXX_NOEXCEPT
    411       {
    412 	_Base::clear();
    413       }
    414 
    415       _Base&
    416       _M_base() _GLIBCXX_NOEXCEPT       { return *this; }
    417 
    418       const _Base&
    419       _M_base() const _GLIBCXX_NOEXCEPT { return *this; }
    420     };
    421 
    422   template<typename _Tp, typename _Alloc>
    423     inline bool
    424     operator==(const deque<_Tp, _Alloc>& __lhs,
    425 	       const deque<_Tp, _Alloc>& __rhs)
    426     { return __lhs._M_base() == __rhs._M_base(); }
    427 
    428   template<typename _Tp, typename _Alloc>
    429     inline bool
    430     operator!=(const deque<_Tp, _Alloc>& __lhs,
    431 	       const deque<_Tp, _Alloc>& __rhs)
    432     { return __lhs._M_base() != __rhs._M_base(); }
    433 
    434   template<typename _Tp, typename _Alloc>
    435     inline bool
    436     operator<(const deque<_Tp, _Alloc>& __lhs,
    437 	      const deque<_Tp, _Alloc>& __rhs)
    438     { return __lhs._M_base() < __rhs._M_base(); }
    439 
    440   template<typename _Tp, typename _Alloc>
    441     inline bool
    442     operator<=(const deque<_Tp, _Alloc>& __lhs,
    443 	       const deque<_Tp, _Alloc>& __rhs)
    444     { return __lhs._M_base() <= __rhs._M_base(); }
    445 
    446   template<typename _Tp, typename _Alloc>
    447     inline bool
    448     operator>=(const deque<_Tp, _Alloc>& __lhs,
    449 	       const deque<_Tp, _Alloc>& __rhs)
    450     { return __lhs._M_base() >= __rhs._M_base(); }
    451 
    452   template<typename _Tp, typename _Alloc>
    453     inline bool
    454     operator>(const deque<_Tp, _Alloc>& __lhs,
    455 	      const deque<_Tp, _Alloc>& __rhs)
    456     { return __lhs._M_base() > __rhs._M_base(); }
    457 
    458   template<typename _Tp, typename _Alloc>
    459     inline void
    460     swap(deque<_Tp, _Alloc>& __lhs, deque<_Tp, _Alloc>& __rhs)
    461     { __lhs.swap(__rhs); }
    462 
    463 } // namespace __profile
    464 } // namespace std
    465 
    466 #endif
    467