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