1*e4b17023SJohn Marino// <forward_list> -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino// Copyright (C) 2010, 2011 Free Software Foundation, Inc. 4*e4b17023SJohn Marino// 5*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library. This library is free 6*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the 7*e4b17023SJohn Marino// terms of the GNU General Public License as published by the 8*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option) 9*e4b17023SJohn Marino// any later version. 10*e4b17023SJohn Marino 11*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful, 12*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of 13*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*e4b17023SJohn Marino// GNU General Public License for more details. 15*e4b17023SJohn Marino 16*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional 17*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version 18*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation. 19*e4b17023SJohn Marino 20*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and 21*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program; 22*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>. 24*e4b17023SJohn Marino 25*e4b17023SJohn Marino/** @file profile/forward_list 26*e4b17023SJohn Marino * This file is a GNU debug extension to the Standard C++ Library. 27*e4b17023SJohn Marino */ 28*e4b17023SJohn Marino 29*e4b17023SJohn Marino#ifndef _GLIBCXX_PROFILE_FORWARD_LIST 30*e4b17023SJohn Marino#define _GLIBCXX_PROFILE_FORWARD_LIST 1 31*e4b17023SJohn Marino 32*e4b17023SJohn Marino#ifndef __GXX_EXPERIMENTAL_CXX0X__ 33*e4b17023SJohn Marino# include <bits/c++0x_warning.h> 34*e4b17023SJohn Marino#else 35*e4b17023SJohn Marino 36*e4b17023SJohn Marino#include <forward_list> 37*e4b17023SJohn Marino 38*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 39*e4b17023SJohn Marino{ 40*e4b17023SJohn Marinonamespace __profile 41*e4b17023SJohn Marino{ 42*e4b17023SJohn Marino /// Class std::forward_list wrapper with performance instrumentation. 43*e4b17023SJohn Marino template<typename _Tp, typename _Alloc = std::allocator<_Tp> > 44*e4b17023SJohn Marino class forward_list 45*e4b17023SJohn Marino : public _GLIBCXX_STD_C::forward_list<_Tp, _Alloc> 46*e4b17023SJohn Marino { 47*e4b17023SJohn Marino typedef _GLIBCXX_STD_C::forward_list<_Tp, _Alloc> _Base; 48*e4b17023SJohn Marino 49*e4b17023SJohn Marino public: 50*e4b17023SJohn Marino typedef typename _Base::size_type size_type; 51*e4b17023SJohn Marino 52*e4b17023SJohn Marino public: 53*e4b17023SJohn Marino // 23.2.3.1 construct/copy/destroy: 54*e4b17023SJohn Marino explicit 55*e4b17023SJohn Marino forward_list(const _Alloc& __al = _Alloc()) 56*e4b17023SJohn Marino : _Base(__al) { } 57*e4b17023SJohn Marino 58*e4b17023SJohn Marino forward_list(const forward_list& __list, const _Alloc& __al) 59*e4b17023SJohn Marino : _Base(__list, __al) 60*e4b17023SJohn Marino { } 61*e4b17023SJohn Marino 62*e4b17023SJohn Marino forward_list(forward_list&& __list, const _Alloc& __al) 63*e4b17023SJohn Marino : _Base(std::move(__list), __al) 64*e4b17023SJohn Marino { } 65*e4b17023SJohn Marino 66*e4b17023SJohn Marino explicit 67*e4b17023SJohn Marino forward_list(size_type __n) 68*e4b17023SJohn Marino : _Base(__n) 69*e4b17023SJohn Marino { } 70*e4b17023SJohn Marino 71*e4b17023SJohn Marino forward_list(size_type __n, const _Tp& __value, 72*e4b17023SJohn Marino const _Alloc& __al = _Alloc()) 73*e4b17023SJohn Marino : _Base(__n, __value, __al) 74*e4b17023SJohn Marino { } 75*e4b17023SJohn Marino 76*e4b17023SJohn Marino template<typename _InputIterator> 77*e4b17023SJohn Marino forward_list(_InputIterator __first, _InputIterator __last, 78*e4b17023SJohn Marino const _Alloc& __al = _Alloc()) 79*e4b17023SJohn Marino : _Base(__first, __last, __al) 80*e4b17023SJohn Marino { } 81*e4b17023SJohn Marino 82*e4b17023SJohn Marino forward_list(const forward_list& __list) 83*e4b17023SJohn Marino : _Base(__list) 84*e4b17023SJohn Marino { } 85*e4b17023SJohn Marino 86*e4b17023SJohn Marino forward_list(forward_list&& __list) noexcept 87*e4b17023SJohn Marino : _Base(std::move(__list)) { } 88*e4b17023SJohn Marino 89*e4b17023SJohn Marino forward_list(std::initializer_list<_Tp> __il, 90*e4b17023SJohn Marino const _Alloc& __al = _Alloc()) 91*e4b17023SJohn Marino : _Base(__il, __al) 92*e4b17023SJohn Marino { } 93*e4b17023SJohn Marino 94*e4b17023SJohn Marino ~forward_list() noexcept 95*e4b17023SJohn Marino { } 96*e4b17023SJohn Marino 97*e4b17023SJohn Marino forward_list& 98*e4b17023SJohn Marino operator=(const forward_list& __list) 99*e4b17023SJohn Marino { 100*e4b17023SJohn Marino static_cast<_Base&>(*this) = __list; 101*e4b17023SJohn Marino return *this; 102*e4b17023SJohn Marino } 103*e4b17023SJohn Marino 104*e4b17023SJohn Marino forward_list& 105*e4b17023SJohn Marino operator=(forward_list&& __list) 106*e4b17023SJohn Marino { 107*e4b17023SJohn Marino // NB: DR 1204. 108*e4b17023SJohn Marino // NB: DR 675. 109*e4b17023SJohn Marino _Base::clear(); 110*e4b17023SJohn Marino _Base::swap(__list); 111*e4b17023SJohn Marino return *this; 112*e4b17023SJohn Marino } 113*e4b17023SJohn Marino 114*e4b17023SJohn Marino forward_list& 115*e4b17023SJohn Marino operator=(std::initializer_list<_Tp> __il) 116*e4b17023SJohn Marino { 117*e4b17023SJohn Marino static_cast<_Base&>(*this) = __il; 118*e4b17023SJohn Marino return *this; 119*e4b17023SJohn Marino } 120*e4b17023SJohn Marino 121*e4b17023SJohn Marino _Base& 122*e4b17023SJohn Marino _M_base() noexcept { return *this; } 123*e4b17023SJohn Marino 124*e4b17023SJohn Marino const _Base& 125*e4b17023SJohn Marino _M_base() const noexcept { return *this; } 126*e4b17023SJohn Marino }; 127*e4b17023SJohn Marino 128*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 129*e4b17023SJohn Marino inline bool 130*e4b17023SJohn Marino operator==(const forward_list<_Tp, _Alloc>& __lx, 131*e4b17023SJohn Marino const forward_list<_Tp, _Alloc>& __ly) 132*e4b17023SJohn Marino { return __lx._M_base() == __ly._M_base(); } 133*e4b17023SJohn Marino 134*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 135*e4b17023SJohn Marino inline bool 136*e4b17023SJohn Marino operator<(const forward_list<_Tp, _Alloc>& __lx, 137*e4b17023SJohn Marino const forward_list<_Tp, _Alloc>& __ly) 138*e4b17023SJohn Marino { return __lx._M_base() < __ly._M_base(); } 139*e4b17023SJohn Marino 140*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 141*e4b17023SJohn Marino inline bool 142*e4b17023SJohn Marino operator!=(const forward_list<_Tp, _Alloc>& __lx, 143*e4b17023SJohn Marino const forward_list<_Tp, _Alloc>& __ly) 144*e4b17023SJohn Marino { return !(__lx == __ly); } 145*e4b17023SJohn Marino 146*e4b17023SJohn Marino /// Based on operator< 147*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 148*e4b17023SJohn Marino inline bool 149*e4b17023SJohn Marino operator>(const forward_list<_Tp, _Alloc>& __lx, 150*e4b17023SJohn Marino const forward_list<_Tp, _Alloc>& __ly) 151*e4b17023SJohn Marino { return (__ly < __lx); } 152*e4b17023SJohn Marino 153*e4b17023SJohn Marino /// Based on operator< 154*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 155*e4b17023SJohn Marino inline bool 156*e4b17023SJohn Marino operator>=(const forward_list<_Tp, _Alloc>& __lx, 157*e4b17023SJohn Marino const forward_list<_Tp, _Alloc>& __ly) 158*e4b17023SJohn Marino { return !(__lx < __ly); } 159*e4b17023SJohn Marino 160*e4b17023SJohn Marino /// Based on operator< 161*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 162*e4b17023SJohn Marino inline bool 163*e4b17023SJohn Marino operator<=(const forward_list<_Tp, _Alloc>& __lx, 164*e4b17023SJohn Marino const forward_list<_Tp, _Alloc>& __ly) 165*e4b17023SJohn Marino { return !(__ly < __lx); } 166*e4b17023SJohn Marino 167*e4b17023SJohn Marino /// See std::forward_list::swap(). 168*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 169*e4b17023SJohn Marino inline void 170*e4b17023SJohn Marino swap(forward_list<_Tp, _Alloc>& __lx, 171*e4b17023SJohn Marino forward_list<_Tp, _Alloc>& __ly) 172*e4b17023SJohn Marino { __lx.swap(__ly); } 173*e4b17023SJohn Marino 174*e4b17023SJohn Marino} // namespace __profile 175*e4b17023SJohn Marino} // namespace std 176*e4b17023SJohn Marino 177*e4b17023SJohn Marino#endif // __GXX_EXPERIMENTAL_CXX0X__ 178*e4b17023SJohn Marino 179*e4b17023SJohn Marino#endif 180