1 // <forward_list> -*- C++ -*-
 
    3 // Copyright (C) 2010-2014 Free Software Foundation, Inc.
 
    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)
 
   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.
 
   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.
 
   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/>.
 
   25 /** @file profile/forward_list
 
   26  *  This file is a GNU debug extension to the Standard C++ Library.
 
   29 #ifndef _GLIBCXX_PROFILE_FORWARD_LIST
 
   30 #define _GLIBCXX_PROFILE_FORWARD_LIST 1
 
   32 #if __cplusplus < 201103L
 
   33 # include <bits/c++0x_warning.h>
 
   36 #include <forward_list>
 
   38 namespace std _GLIBCXX_VISIBILITY(default)
 
   42   /// Class std::forward_list wrapper with performance instrumentation.
 
   43   template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
 
   45     : public _GLIBCXX_STD_C::forward_list<_Tp, _Alloc>
 
   47       typedef _GLIBCXX_STD_C::forward_list<_Tp, _Alloc> _Base;
 
   49       typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
 
   50         rebind<_GLIBCXX_STD_C::_Fwd_list_node<_Tp>>::other _Node_alloc_type;
 
   52       typedef __gnu_cxx::__alloc_traits<_Node_alloc_type> _Node_alloc_traits;
 
   55       typedef typename _Base::size_type             size_type;
 
   57       // 23.2.3.1 construct/copy/destroy:
 
   59       forward_list(const _Alloc& __al = _Alloc())
 
   62       forward_list(const forward_list& __list, const _Alloc& __al)
 
   66       forward_list(forward_list&& __list, const _Alloc& __al)
 
   67       : _Base(std::move(__list), __al)
 
   71       forward_list(size_type __n, const _Alloc& __al = _Alloc())
 
   75       forward_list(size_type __n, const _Tp& __value,
 
   76                    const _Alloc& __al = _Alloc())
 
   77       : _Base(__n, __value, __al)
 
   80       template<typename _InputIterator,
 
   81           typename = std::_RequireInputIter<_InputIterator>>
 
   82         forward_list(_InputIterator __first, _InputIterator __last,
 
   83                      const _Alloc& __al = _Alloc())
 
   84         : _Base(__first, __last, __al)
 
   87       forward_list(const forward_list& __list)
 
   91       forward_list(forward_list&& __list) noexcept
 
   92       : _Base(std::move(__list)) { }
 
   94       forward_list(std::initializer_list<_Tp> __il,
 
   95                    const _Alloc& __al = _Alloc())
 
   99       ~forward_list() noexcept
 
  103       operator=(const forward_list& __list)
 
  105    static_cast<_Base&>(*this) = __list;
 
  110       operator=(forward_list&& __list)
 
  111       noexcept(_Node_alloc_traits::_S_nothrow_move())
 
  113    static_cast<_Base&>(*this) = std::move(__list);
 
  118       operator=(std::initializer_list<_Tp> __il)
 
  120    static_cast<_Base&>(*this) = __il;
 
  125       _M_base() noexcept       { return *this; }
 
  128       _M_base() const noexcept { return *this; }
 
  131   template<typename _Tp, typename _Alloc>
 
  133     operator==(const forward_list<_Tp, _Alloc>& __lx,
 
  134                const forward_list<_Tp, _Alloc>& __ly)
 
  135     { return __lx._M_base() == __ly._M_base(); }
 
  137   template<typename _Tp, typename _Alloc>
 
  139     operator<(const forward_list<_Tp, _Alloc>& __lx,
 
  140               const forward_list<_Tp, _Alloc>& __ly)
 
  141     { return __lx._M_base() < __ly._M_base(); }
 
  143   template<typename _Tp, typename _Alloc>
 
  145     operator!=(const forward_list<_Tp, _Alloc>& __lx,
 
  146                const forward_list<_Tp, _Alloc>& __ly)
 
  147     { return !(__lx == __ly); }
 
  149   /// Based on operator<
 
  150   template<typename _Tp, typename _Alloc>
 
  152     operator>(const forward_list<_Tp, _Alloc>& __lx,
 
  153               const forward_list<_Tp, _Alloc>& __ly)
 
  154     { return (__ly < __lx); }
 
  156   /// Based on operator<
 
  157   template<typename _Tp, typename _Alloc>
 
  159     operator>=(const forward_list<_Tp, _Alloc>& __lx,
 
  160                const forward_list<_Tp, _Alloc>& __ly)
 
  161     { return !(__lx < __ly); }
 
  163   /// Based on operator<
 
  164   template<typename _Tp, typename _Alloc>
 
  166     operator<=(const forward_list<_Tp, _Alloc>& __lx,
 
  167                const forward_list<_Tp, _Alloc>& __ly)
 
  168     { return !(__ly < __lx); }
 
  170   /// See std::forward_list::swap().
 
  171   template<typename _Tp, typename _Alloc>
 
  173     swap(forward_list<_Tp, _Alloc>& __lx,
 
  174     forward_list<_Tp, _Alloc>& __ly)
 
  177 } // namespace __profile