libstdc++
profile/deque
Go to the documentation of this file.
1 // Profiling deque implementation -*- C++ -*-
2 
3 // Copyright (C) 2009-2018 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::size_type size_type;
47  typedef typename _Base::value_type value_type;
48 
49  // 23.2.1.1 construct/copy/destroy:
50 
51 #if __cplusplus < 201103L
52  deque()
53  : _Base() { }
54  deque(const deque& __x)
55  : _Base(__x) { }
56 
57  ~deque() { }
58 #else
59  deque() = default;
60  deque(const deque&) = default;
61  deque(deque&&) = default;
62 
63  deque(const deque& __d, const _Allocator& __a)
64  : _Base(__d, __a) { }
65 
66  deque(deque&& __d, const _Allocator& __a)
67  : _Base(std::move(__d), __a) { }
68 
69  ~deque() = default;
70 
71  deque(initializer_list<value_type> __l,
72  const _Allocator& __a = _Allocator())
73  : _Base(__l, __a) { }
74 #endif
75 
76  explicit
77  deque(const _Allocator& __a)
78  : _Base(__a) { }
79 
80 #if __cplusplus >= 201103L
81  explicit
82  deque(size_type __n, const _Allocator& __a = _Allocator())
83  : _Base(__n, __a) { }
84 
85  deque(size_type __n, const _Tp& __value,
86  const _Allocator& __a = _Allocator())
87  : _Base(__n, __value, __a) { }
88 #else
89  explicit
90  deque(size_type __n, const _Tp& __value = _Tp(),
91  const _Allocator& __a = _Allocator())
92  : _Base(__n, __value, __a) { }
93 #endif
94 
95 #if __cplusplus >= 201103L
96  template<typename _InputIterator,
97  typename = std::_RequireInputIter<_InputIterator>>
98 #else
99  template<typename _InputIterator>
100 #endif
101  deque(_InputIterator __first, _InputIterator __last,
102  const _Allocator& __a = _Allocator())
103  : _Base(__first, __last, __a)
104  { }
105 
106  deque(const _Base& __x)
107  : _Base(__x) { }
108 
109 #if __cplusplus < 201103L
110  deque&
111  operator=(const deque& __x)
112  {
113  _M_base() = __x;
114  return *this;
115  }
116 #else
117  deque&
118  operator=(const deque&) = default;
119 
120  deque&
121  operator=(deque&&) = default;
122 
123  deque&
124  operator=(initializer_list<value_type> __l)
125  {
126  _M_base() = __l;
127  return *this;
128  }
129 #endif
130 
131  void
132  swap(deque& __x)
133  _GLIBCXX_NOEXCEPT_IF( noexcept(declval<_Base&>().swap(__x)) )
134  { _Base::swap(__x); }
135 
136  _Base&
137  _M_base() _GLIBCXX_NOEXCEPT { return *this; }
138 
139  const _Base&
140  _M_base() const _GLIBCXX_NOEXCEPT { return *this; }
141  };
142 
143  template<typename _Tp, typename _Alloc>
144  inline bool
145  operator==(const deque<_Tp, _Alloc>& __lhs,
146  const deque<_Tp, _Alloc>& __rhs)
147  { return __lhs._M_base() == __rhs._M_base(); }
148 
149  template<typename _Tp, typename _Alloc>
150  inline bool
151  operator!=(const deque<_Tp, _Alloc>& __lhs,
152  const deque<_Tp, _Alloc>& __rhs)
153  { return __lhs._M_base() != __rhs._M_base(); }
154 
155  template<typename _Tp, typename _Alloc>
156  inline bool
157  operator<(const deque<_Tp, _Alloc>& __lhs,
158  const deque<_Tp, _Alloc>& __rhs)
159  { return __lhs._M_base() < __rhs._M_base(); }
160 
161  template<typename _Tp, typename _Alloc>
162  inline bool
163  operator<=(const deque<_Tp, _Alloc>& __lhs,
164  const deque<_Tp, _Alloc>& __rhs)
165  { return __lhs._M_base() <= __rhs._M_base(); }
166 
167  template<typename _Tp, typename _Alloc>
168  inline bool
169  operator>=(const deque<_Tp, _Alloc>& __lhs,
170  const deque<_Tp, _Alloc>& __rhs)
171  { return __lhs._M_base() >= __rhs._M_base(); }
172 
173  template<typename _Tp, typename _Alloc>
174  inline bool
175  operator>(const deque<_Tp, _Alloc>& __lhs,
176  const deque<_Tp, _Alloc>& __rhs)
177  { return __lhs._M_base() > __rhs._M_base(); }
178 
179  template<typename _Tp, typename _Alloc>
180  inline void
181  swap(deque<_Tp, _Alloc>& __lhs, deque<_Tp, _Alloc>& __rhs)
182  _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs)))
183  { __lhs.swap(__rhs); }
184 
185 } // namespace __profile
186 } // namespace std
187 
188 #endif