xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/profile/forward_list (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
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