Index: third_party/libcxx/include/forward_list |
=================================================================== |
--- third_party/libcxx/include/forward_list (revision 0) |
+++ third_party/libcxx/include/forward_list (revision 0) |
@@ -0,0 +1,1663 @@ |
+// -*- C++ -*- |
+//===----------------------- forward_list ---------------------------------===// |
+// |
+// The LLVM Compiler Infrastructure |
+// |
+// This file is dual licensed under the MIT and the University of Illinois Open |
+// Source Licenses. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#ifndef _LIBCPP_FORWARD_LIST |
+#define _LIBCPP_FORWARD_LIST |
+ |
+/* |
+ forward_list synopsis |
+ |
+namespace std |
+{ |
+ |
+template <class T, class Allocator = allocator<T>> |
+class forward_list |
+{ |
+public: |
+ typedef T value_type; |
+ typedef Allocator allocator_type; |
+ |
+ typedef value_type& reference; |
+ typedef const value_type& const_reference; |
+ typedef typename allocator_traits<allocator_type>::pointer pointer; |
+ typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; |
+ typedef typename allocator_traits<allocator_type>::size_type size_type; |
+ typedef typename allocator_traits<allocator_type>::difference_type difference_type; |
+ |
+ typedef <details> iterator; |
+ typedef <details> const_iterator; |
+ |
+ forward_list() |
+ noexcept(is_nothrow_default_constructible<allocator_type>::value); |
+ explicit forward_list(const allocator_type& a); |
+ explicit forward_list(size_type n); |
+ explicit forward_list(size_type n, const allocator_type& a); // C++14 |
+ forward_list(size_type n, const value_type& v); |
+ forward_list(size_type n, const value_type& v, const allocator_type& a); |
+ template <class InputIterator> |
+ forward_list(InputIterator first, InputIterator last); |
+ template <class InputIterator> |
+ forward_list(InputIterator first, InputIterator last, const allocator_type& a); |
+ forward_list(const forward_list& x); |
+ forward_list(const forward_list& x, const allocator_type& a); |
+ forward_list(forward_list&& x) |
+ noexcept(is_nothrow_move_constructible<allocator_type>::value); |
+ forward_list(forward_list&& x, const allocator_type& a); |
+ forward_list(initializer_list<value_type> il); |
+ forward_list(initializer_list<value_type> il, const allocator_type& a); |
+ |
+ ~forward_list(); |
+ |
+ forward_list& operator=(const forward_list& x); |
+ forward_list& operator=(forward_list&& x) |
+ noexcept( |
+ allocator_type::propagate_on_container_move_assignment::value && |
+ is_nothrow_move_assignable<allocator_type>::value); |
+ forward_list& operator=(initializer_list<value_type> il); |
+ |
+ template <class InputIterator> |
+ void assign(InputIterator first, InputIterator last); |
+ void assign(size_type n, const value_type& v); |
+ void assign(initializer_list<value_type> il); |
+ |
+ allocator_type get_allocator() const noexcept; |
+ |
+ iterator begin() noexcept; |
+ const_iterator begin() const noexcept; |
+ iterator end() noexcept; |
+ const_iterator end() const noexcept; |
+ |
+ const_iterator cbegin() const noexcept; |
+ const_iterator cend() const noexcept; |
+ |
+ iterator before_begin() noexcept; |
+ const_iterator before_begin() const noexcept; |
+ const_iterator cbefore_begin() const noexcept; |
+ |
+ bool empty() const noexcept; |
+ size_type max_size() const noexcept; |
+ |
+ reference front(); |
+ const_reference front() const; |
+ |
+ template <class... Args> void emplace_front(Args&&... args); |
+ void push_front(const value_type& v); |
+ void push_front(value_type&& v); |
+ |
+ void pop_front(); |
+ |
+ template <class... Args> |
+ iterator emplace_after(const_iterator p, Args&&... args); |
+ iterator insert_after(const_iterator p, const value_type& v); |
+ iterator insert_after(const_iterator p, value_type&& v); |
+ iterator insert_after(const_iterator p, size_type n, const value_type& v); |
+ template <class InputIterator> |
+ iterator insert_after(const_iterator p, |
+ InputIterator first, InputIterator last); |
+ iterator insert_after(const_iterator p, initializer_list<value_type> il); |
+ |
+ iterator erase_after(const_iterator p); |
+ iterator erase_after(const_iterator first, const_iterator last); |
+ |
+ void swap(forward_list& x) |
+ noexcept(!allocator_type::propagate_on_container_swap::value || |
+ __is_nothrow_swappable<allocator_type>::value); |
+ |
+ void resize(size_type n); |
+ void resize(size_type n, const value_type& v); |
+ void clear() noexcept; |
+ |
+ void splice_after(const_iterator p, forward_list& x); |
+ void splice_after(const_iterator p, forward_list&& x); |
+ void splice_after(const_iterator p, forward_list& x, const_iterator i); |
+ void splice_after(const_iterator p, forward_list&& x, const_iterator i); |
+ void splice_after(const_iterator p, forward_list& x, |
+ const_iterator first, const_iterator last); |
+ void splice_after(const_iterator p, forward_list&& x, |
+ const_iterator first, const_iterator last); |
+ void remove(const value_type& v); |
+ template <class Predicate> void remove_if(Predicate pred); |
+ void unique(); |
+ template <class BinaryPredicate> void unique(BinaryPredicate binary_pred); |
+ void merge(forward_list& x); |
+ void merge(forward_list&& x); |
+ template <class Compare> void merge(forward_list& x, Compare comp); |
+ template <class Compare> void merge(forward_list&& x, Compare comp); |
+ void sort(); |
+ template <class Compare> void sort(Compare comp); |
+ void reverse() noexcept; |
+}; |
+ |
+template <class T, class Allocator> |
+ bool operator==(const forward_list<T, Allocator>& x, |
+ const forward_list<T, Allocator>& y); |
+ |
+template <class T, class Allocator> |
+ bool operator< (const forward_list<T, Allocator>& x, |
+ const forward_list<T, Allocator>& y); |
+ |
+template <class T, class Allocator> |
+ bool operator!=(const forward_list<T, Allocator>& x, |
+ const forward_list<T, Allocator>& y); |
+ |
+template <class T, class Allocator> |
+ bool operator> (const forward_list<T, Allocator>& x, |
+ const forward_list<T, Allocator>& y); |
+ |
+template <class T, class Allocator> |
+ bool operator>=(const forward_list<T, Allocator>& x, |
+ const forward_list<T, Allocator>& y); |
+ |
+template <class T, class Allocator> |
+ bool operator<=(const forward_list<T, Allocator>& x, |
+ const forward_list<T, Allocator>& y); |
+ |
+template <class T, class Allocator> |
+ void swap(forward_list<T, Allocator>& x, forward_list<T, Allocator>& y) |
+ noexcept(noexcept(x.swap(y))); |
+ |
+} // std |
+ |
+*/ |
+ |
+#include <__config> |
+ |
+#include <initializer_list> |
+#include <memory> |
+#include <limits> |
+#include <iterator> |
+#include <algorithm> |
+ |
+#include <__undef_min_max> |
+ |
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
+#pragma GCC system_header |
+#endif |
+ |
+_LIBCPP_BEGIN_NAMESPACE_STD |
+ |
+template <class _Tp, class _VoidPtr> struct __forward_list_node; |
+ |
+template <class _NodePtr> |
+struct __forward_begin_node |
+{ |
+ typedef __forward_begin_node __self; |
+ typedef _NodePtr pointer; |
+ |
+ pointer __next_; |
+ |
+ _LIBCPP_INLINE_VISIBILITY __forward_begin_node() : __next_(nullptr) {} |
+}; |
+ |
+template <class _Tp, class _VoidPtr> |
+struct __forward_list_node |
+ : public __forward_begin_node |
+ < |
+ typename pointer_traits<_VoidPtr>::template |
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
+ rebind<__forward_list_node<_Tp, _VoidPtr> > |
+#else |
+ rebind<__forward_list_node<_Tp, _VoidPtr> >::other |
+#endif |
+ > |
+{ |
+ typedef _Tp value_type; |
+ |
+ value_type __value_; |
+}; |
+ |
+template<class _Tp, class _Alloc> class _LIBCPP_TYPE_VIS_ONLY forward_list; |
+template<class _NodeConstPtr> class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator; |
+ |
+template <class _NodePtr> |
+class _LIBCPP_TYPE_VIS_ONLY __forward_list_iterator |
+{ |
+ typedef _NodePtr __node_pointer; |
+ |
+ __node_pointer __ptr_; |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ explicit __forward_list_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {} |
+ |
+ template<class, class> friend class _LIBCPP_TYPE_VIS_ONLY forward_list; |
+ template<class> friend class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator; |
+ |
+public: |
+ typedef forward_iterator_tag iterator_category; |
+ typedef typename pointer_traits<__node_pointer>::element_type::value_type |
+ value_type; |
+ typedef value_type& reference; |
+ typedef typename pointer_traits<__node_pointer>::difference_type |
+ difference_type; |
+ typedef typename pointer_traits<__node_pointer>::template |
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
+ rebind<value_type> |
+#else |
+ rebind<value_type>::other |
+#endif |
+ pointer; |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ __forward_list_iterator() _NOEXCEPT : __ptr_(nullptr) {} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ reference operator*() const {return __ptr_->__value_;} |
+ _LIBCPP_INLINE_VISIBILITY |
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ __forward_list_iterator& operator++() |
+ { |
+ __ptr_ = __ptr_->__next_; |
+ return *this; |
+ } |
+ _LIBCPP_INLINE_VISIBILITY |
+ __forward_list_iterator operator++(int) |
+ { |
+ __forward_list_iterator __t(*this); |
+ ++(*this); |
+ return __t; |
+ } |
+ |
+ friend _LIBCPP_INLINE_VISIBILITY |
+ bool operator==(const __forward_list_iterator& __x, |
+ const __forward_list_iterator& __y) |
+ {return __x.__ptr_ == __y.__ptr_;} |
+ friend _LIBCPP_INLINE_VISIBILITY |
+ bool operator!=(const __forward_list_iterator& __x, |
+ const __forward_list_iterator& __y) |
+ {return !(__x == __y);} |
+}; |
+ |
+template <class _NodeConstPtr> |
+class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator |
+{ |
+ typedef _NodeConstPtr __node_const_pointer; |
+ |
+ __node_const_pointer __ptr_; |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ explicit __forward_list_const_iterator(__node_const_pointer __p) _NOEXCEPT |
+ : __ptr_(__p) {} |
+ |
+ typedef typename remove_const |
+ < |
+ typename pointer_traits<__node_const_pointer>::element_type |
+ >::type __node; |
+ typedef typename pointer_traits<__node_const_pointer>::template |
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
+ rebind<__node> |
+#else |
+ rebind<__node>::other |
+#endif |
+ __node_pointer; |
+ |
+ template<class, class> friend class forward_list; |
+ |
+public: |
+ typedef forward_iterator_tag iterator_category; |
+ typedef typename __node::value_type value_type; |
+ typedef const value_type& reference; |
+ typedef typename pointer_traits<__node_const_pointer>::difference_type |
+ difference_type; |
+ typedef typename pointer_traits<__node_const_pointer>::template |
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
+ rebind<const value_type> |
+#else |
+ rebind<const value_type>::other |
+#endif |
+ pointer; |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ __forward_list_const_iterator() _NOEXCEPT : __ptr_(nullptr) {} |
+ _LIBCPP_INLINE_VISIBILITY |
+ __forward_list_const_iterator(__forward_list_iterator<__node_pointer> __p) _NOEXCEPT |
+ : __ptr_(__p.__ptr_) {} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ reference operator*() const {return __ptr_->__value_;} |
+ _LIBCPP_INLINE_VISIBILITY |
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ __forward_list_const_iterator& operator++() |
+ { |
+ __ptr_ = __ptr_->__next_; |
+ return *this; |
+ } |
+ _LIBCPP_INLINE_VISIBILITY |
+ __forward_list_const_iterator operator++(int) |
+ { |
+ __forward_list_const_iterator __t(*this); |
+ ++(*this); |
+ return __t; |
+ } |
+ |
+ friend _LIBCPP_INLINE_VISIBILITY |
+ bool operator==(const __forward_list_const_iterator& __x, |
+ const __forward_list_const_iterator& __y) |
+ {return __x.__ptr_ == __y.__ptr_;} |
+ friend _LIBCPP_INLINE_VISIBILITY |
+ bool operator!=(const __forward_list_const_iterator& __x, |
+ const __forward_list_const_iterator& __y) |
+ {return !(__x == __y);} |
+}; |
+ |
+template <class _Tp, class _Alloc> |
+class __forward_list_base |
+{ |
+protected: |
+ typedef _Tp value_type; |
+ typedef _Alloc allocator_type; |
+ |
+ typedef typename allocator_traits<allocator_type>::void_pointer void_pointer; |
+ typedef __forward_list_node<value_type, void_pointer> __node; |
+ typedef typename __node::__self __begin_node; |
+ typedef typename allocator_traits<allocator_type>::template |
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
+ rebind_alloc<__node> |
+#else |
+ rebind_alloc<__node>::other |
+#endif |
+ __node_allocator; |
+ typedef allocator_traits<__node_allocator> __node_traits; |
+ typedef typename __node_traits::pointer __node_pointer; |
+ typedef typename __node_traits::pointer __node_const_pointer; |
+ |
+ typedef typename allocator_traits<allocator_type>::template |
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
+ rebind_alloc<__begin_node> |
+#else |
+ rebind_alloc<__begin_node>::other |
+#endif |
+ __begin_node_allocator; |
+ typedef typename allocator_traits<__begin_node_allocator>::pointer __begin_node_pointer; |
+ |
+ __compressed_pair<__begin_node, __node_allocator> __before_begin_; |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ __node_pointer __before_begin() _NOEXCEPT |
+ {return static_cast<__node_pointer>(pointer_traits<__begin_node_pointer>:: |
+ pointer_to(__before_begin_.first()));} |
+ _LIBCPP_INLINE_VISIBILITY |
+ __node_const_pointer __before_begin() const _NOEXCEPT |
+ {return static_cast<__node_const_pointer>(pointer_traits<__begin_node_pointer>:: |
+ pointer_to(const_cast<__begin_node&>(__before_begin_.first())));} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ __node_allocator& __alloc() _NOEXCEPT |
+ {return __before_begin_.second();} |
+ _LIBCPP_INLINE_VISIBILITY |
+ const __node_allocator& __alloc() const _NOEXCEPT |
+ {return __before_begin_.second();} |
+ |
+ typedef __forward_list_iterator<__node_pointer> iterator; |
+ typedef __forward_list_const_iterator<__node_pointer> const_iterator; |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ __forward_list_base() |
+ _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value) |
+ : __before_begin_(__begin_node()) {} |
+ _LIBCPP_INLINE_VISIBILITY |
+ __forward_list_base(const allocator_type& __a) |
+ : __before_begin_(__begin_node(), __node_allocator(__a)) {} |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+public: |
+ __forward_list_base(__forward_list_base&& __x) |
+ _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value); |
+ __forward_list_base(__forward_list_base&& __x, const allocator_type& __a); |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+private: |
+ __forward_list_base(const __forward_list_base&); |
+ __forward_list_base& operator=(const __forward_list_base&); |
+ |
+public: |
+ ~__forward_list_base(); |
+ |
+protected: |
+ _LIBCPP_INLINE_VISIBILITY |
+ void __copy_assign_alloc(const __forward_list_base& __x) |
+ {__copy_assign_alloc(__x, integral_constant<bool, |
+ __node_traits::propagate_on_container_copy_assignment::value>());} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ void __move_assign_alloc(__forward_list_base& __x) |
+ _NOEXCEPT_(!__node_traits::propagate_on_container_move_assignment::value || |
+ is_nothrow_move_assignable<__node_allocator>::value) |
+ {__move_assign_alloc(__x, integral_constant<bool, |
+ __node_traits::propagate_on_container_move_assignment::value>());} |
+ |
+public: |
+ void swap(__forward_list_base& __x) |
+ _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || |
+ __is_nothrow_swappable<__node_allocator>::value); |
+protected: |
+ void clear() _NOEXCEPT; |
+ |
+private: |
+ _LIBCPP_INLINE_VISIBILITY |
+ void __copy_assign_alloc(const __forward_list_base&, false_type) {} |
+ _LIBCPP_INLINE_VISIBILITY |
+ void __copy_assign_alloc(const __forward_list_base& __x, true_type) |
+ { |
+ if (__alloc() != __x.__alloc()) |
+ clear(); |
+ __alloc() = __x.__alloc(); |
+ } |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ void __move_assign_alloc(__forward_list_base& __x, false_type) _NOEXCEPT |
+ {} |
+ _LIBCPP_INLINE_VISIBILITY |
+ void __move_assign_alloc(__forward_list_base& __x, true_type) |
+ _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value) |
+ {__alloc() = _VSTD::move(__x.__alloc());} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ static void __swap_alloc(__node_allocator& __x, __node_allocator& __y) |
+ _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || |
+ __is_nothrow_swappable<__node_allocator>::value) |
+ {__swap_alloc(__x, __y, integral_constant<bool, |
+ __node_traits::propagate_on_container_swap::value>());} |
+ _LIBCPP_INLINE_VISIBILITY |
+ static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, |
+ false_type) |
+ _NOEXCEPT |
+ {} |
+ _LIBCPP_INLINE_VISIBILITY |
+ static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, |
+ true_type) |
+ _NOEXCEPT_(__is_nothrow_swappable<__node_allocator>::value) |
+ { |
+ using _VSTD::swap; |
+ swap(__x, __y); |
+ } |
+}; |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x) |
+ _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value) |
+ : __before_begin_(_VSTD::move(__x.__before_begin_)) |
+{ |
+ __x.__before_begin()->__next_ = nullptr; |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x, |
+ const allocator_type& __a) |
+ : __before_begin_(__begin_node(), __node_allocator(__a)) |
+{ |
+ if (__alloc() == __x.__alloc()) |
+ { |
+ __before_begin()->__next_ = __x.__before_begin()->__next_; |
+ __x.__before_begin()->__next_ = nullptr; |
+ } |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+template <class _Tp, class _Alloc> |
+__forward_list_base<_Tp, _Alloc>::~__forward_list_base() |
+{ |
+ clear(); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+void |
+__forward_list_base<_Tp, _Alloc>::swap(__forward_list_base& __x) |
+ _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || |
+ __is_nothrow_swappable<__node_allocator>::value) |
+{ |
+ __swap_alloc(__alloc(), __x.__alloc()); |
+ using _VSTD::swap; |
+ swap(__before_begin()->__next_, __x.__before_begin()->__next_); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+__forward_list_base<_Tp, _Alloc>::clear() _NOEXCEPT |
+{ |
+ __node_allocator& __a = __alloc(); |
+ for (__node_pointer __p = __before_begin()->__next_; __p != nullptr;) |
+ { |
+ __node_pointer __next = __p->__next_; |
+ __node_traits::destroy(__a, _VSTD::addressof(__p->__value_)); |
+ __node_traits::deallocate(__a, __p, 1); |
+ __p = __next; |
+ } |
+ __before_begin()->__next_ = nullptr; |
+} |
+ |
+template <class _Tp, class _Alloc = allocator<_Tp> > |
+class _LIBCPP_TYPE_VIS_ONLY forward_list |
+ : private __forward_list_base<_Tp, _Alloc> |
+{ |
+ typedef __forward_list_base<_Tp, _Alloc> base; |
+ typedef typename base::__node_allocator __node_allocator; |
+ typedef typename base::__node __node; |
+ typedef typename base::__node_traits __node_traits; |
+ typedef typename base::__node_pointer __node_pointer; |
+ |
+public: |
+ typedef _Tp value_type; |
+ typedef _Alloc allocator_type; |
+ |
+ typedef value_type& reference; |
+ typedef const value_type& const_reference; |
+ typedef typename allocator_traits<allocator_type>::pointer pointer; |
+ typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; |
+ typedef typename allocator_traits<allocator_type>::size_type size_type; |
+ typedef typename allocator_traits<allocator_type>::difference_type difference_type; |
+ |
+ typedef typename base::iterator iterator; |
+ typedef typename base::const_iterator const_iterator; |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ forward_list() |
+ _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value) |
+ {} // = default; |
+ explicit forward_list(const allocator_type& __a); |
+ explicit forward_list(size_type __n); |
+#if _LIBCPP_STD_VER > 11 |
+ explicit forward_list(size_type __n, const allocator_type& __a); |
+#endif |
+ forward_list(size_type __n, const value_type& __v); |
+ forward_list(size_type __n, const value_type& __v, const allocator_type& __a); |
+ template <class _InputIterator> |
+ forward_list(_InputIterator __f, _InputIterator __l, |
+ typename enable_if< |
+ __is_input_iterator<_InputIterator>::value |
+ >::type* = nullptr); |
+ template <class _InputIterator> |
+ forward_list(_InputIterator __f, _InputIterator __l, |
+ const allocator_type& __a, |
+ typename enable_if< |
+ __is_input_iterator<_InputIterator>::value |
+ >::type* = nullptr); |
+ forward_list(const forward_list& __x); |
+ forward_list(const forward_list& __x, const allocator_type& __a); |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ _LIBCPP_INLINE_VISIBILITY |
+ forward_list(forward_list&& __x) |
+ _NOEXCEPT_(is_nothrow_move_constructible<base>::value) |
+ : base(_VSTD::move(__x)) {} |
+ forward_list(forward_list&& __x, const allocator_type& __a); |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ forward_list(initializer_list<value_type> __il); |
+ forward_list(initializer_list<value_type> __il, const allocator_type& __a); |
+#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+ // ~forward_list() = default; |
+ |
+ forward_list& operator=(const forward_list& __x); |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ forward_list& operator=(forward_list&& __x) |
+ _NOEXCEPT_( |
+ __node_traits::propagate_on_container_move_assignment::value && |
+ is_nothrow_move_assignable<allocator_type>::value); |
+#endif |
+#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ forward_list& operator=(initializer_list<value_type> __il); |
+#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+ template <class _InputIterator> |
+ typename enable_if |
+ < |
+ __is_input_iterator<_InputIterator>::value, |
+ void |
+ >::type |
+ assign(_InputIterator __f, _InputIterator __l); |
+ void assign(size_type __n, const value_type& __v); |
+#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ void assign(initializer_list<value_type> __il); |
+#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ allocator_type get_allocator() const _NOEXCEPT |
+ {return allocator_type(base::__alloc());} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ iterator begin() _NOEXCEPT |
+ {return iterator(base::__before_begin()->__next_);} |
+ _LIBCPP_INLINE_VISIBILITY |
+ const_iterator begin() const _NOEXCEPT |
+ {return const_iterator(base::__before_begin()->__next_);} |
+ _LIBCPP_INLINE_VISIBILITY |
+ iterator end() _NOEXCEPT |
+ {return iterator(nullptr);} |
+ _LIBCPP_INLINE_VISIBILITY |
+ const_iterator end() const _NOEXCEPT |
+ {return const_iterator(nullptr);} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ const_iterator cbegin() const _NOEXCEPT |
+ {return const_iterator(base::__before_begin()->__next_);} |
+ _LIBCPP_INLINE_VISIBILITY |
+ const_iterator cend() const _NOEXCEPT |
+ {return const_iterator(nullptr);} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ iterator before_begin() _NOEXCEPT |
+ {return iterator(base::__before_begin());} |
+ _LIBCPP_INLINE_VISIBILITY |
+ const_iterator before_begin() const _NOEXCEPT |
+ {return const_iterator(base::__before_begin());} |
+ _LIBCPP_INLINE_VISIBILITY |
+ const_iterator cbefore_begin() const _NOEXCEPT |
+ {return const_iterator(base::__before_begin());} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ bool empty() const _NOEXCEPT |
+ {return base::__before_begin()->__next_ == nullptr;} |
+ _LIBCPP_INLINE_VISIBILITY |
+ size_type max_size() const _NOEXCEPT |
+ {return numeric_limits<size_type>::max();} |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ reference front() {return base::__before_begin()->__next_->__value_;} |
+ _LIBCPP_INLINE_VISIBILITY |
+ const_reference front() const {return base::__before_begin()->__next_->__value_;} |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+#ifndef _LIBCPP_HAS_NO_VARIADICS |
+ template <class... _Args> void emplace_front(_Args&&... __args); |
+#endif |
+ void push_front(value_type&& __v); |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ void push_front(const value_type& __v); |
+ |
+ void pop_front(); |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+#ifndef _LIBCPP_HAS_NO_VARIADICS |
+ template <class... _Args> |
+ iterator emplace_after(const_iterator __p, _Args&&... __args); |
+#endif // _LIBCPP_HAS_NO_VARIADICS |
+ iterator insert_after(const_iterator __p, value_type&& __v); |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ iterator insert_after(const_iterator __p, const value_type& __v); |
+ iterator insert_after(const_iterator __p, size_type __n, const value_type& __v); |
+ template <class _InputIterator> |
+ _LIBCPP_INLINE_VISIBILITY |
+ typename enable_if |
+ < |
+ __is_input_iterator<_InputIterator>::value, |
+ iterator |
+ >::type |
+ insert_after(const_iterator __p, _InputIterator __f, _InputIterator __l); |
+#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ iterator insert_after(const_iterator __p, initializer_list<value_type> __il) |
+ {return insert_after(__p, __il.begin(), __il.end());} |
+#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+ iterator erase_after(const_iterator __p); |
+ iterator erase_after(const_iterator __f, const_iterator __l); |
+ |
+ _LIBCPP_INLINE_VISIBILITY |
+ void swap(forward_list& __x) |
+ _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || |
+ __is_nothrow_swappable<__node_allocator>::value) |
+ {base::swap(__x);} |
+ |
+ void resize(size_type __n); |
+ void resize(size_type __n, const value_type& __v); |
+ _LIBCPP_INLINE_VISIBILITY |
+ void clear() _NOEXCEPT {base::clear();} |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ _LIBCPP_INLINE_VISIBILITY |
+ void splice_after(const_iterator __p, forward_list&& __x); |
+ _LIBCPP_INLINE_VISIBILITY |
+ void splice_after(const_iterator __p, forward_list&& __x, const_iterator __i); |
+ _LIBCPP_INLINE_VISIBILITY |
+ void splice_after(const_iterator __p, forward_list&& __x, |
+ const_iterator __f, const_iterator __l); |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ void splice_after(const_iterator __p, forward_list& __x); |
+ void splice_after(const_iterator __p, forward_list& __x, const_iterator __i); |
+ void splice_after(const_iterator __p, forward_list& __x, |
+ const_iterator __f, const_iterator __l); |
+ void remove(const value_type& __v); |
+ template <class _Predicate> void remove_if(_Predicate __pred); |
+ _LIBCPP_INLINE_VISIBILITY |
+ void unique() {unique(__equal_to<value_type>());} |
+ template <class _BinaryPredicate> void unique(_BinaryPredicate __binary_pred); |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ _LIBCPP_INLINE_VISIBILITY |
+ void merge(forward_list&& __x) {merge(__x, __less<value_type>());} |
+ template <class _Compare> |
+ _LIBCPP_INLINE_VISIBILITY |
+ void merge(forward_list&& __x, _Compare __comp) |
+ {merge(__x, _VSTD::move(__comp));} |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ _LIBCPP_INLINE_VISIBILITY |
+ void merge(forward_list& __x) {merge(__x, __less<value_type>());} |
+ template <class _Compare> void merge(forward_list& __x, _Compare __comp); |
+ _LIBCPP_INLINE_VISIBILITY |
+ void sort() {sort(__less<value_type>());} |
+ template <class _Compare> void sort(_Compare __comp); |
+ void reverse() _NOEXCEPT; |
+ |
+private: |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ void __move_assign(forward_list& __x, true_type) |
+ _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); |
+ void __move_assign(forward_list& __x, false_type); |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+ template <class _Compare> |
+ static |
+ __node_pointer |
+ __merge(__node_pointer __f1, __node_pointer __f2, _Compare& __comp); |
+ |
+ template <class _Compare> |
+ static |
+ __node_pointer |
+ __sort(__node_pointer __f, difference_type __sz, _Compare& __comp); |
+}; |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+forward_list<_Tp, _Alloc>::forward_list(const allocator_type& __a) |
+ : base(__a) |
+{ |
+} |
+ |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>::forward_list(size_type __n) |
+{ |
+ if (__n > 0) |
+ { |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); |
+ for (__node_pointer __p = base::__before_begin(); __n > 0; --__n, |
+ __p = __p->__next_) |
+ { |
+ __h.reset(__node_traits::allocate(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_)); |
+ __h->__next_ = nullptr; |
+ __p->__next_ = __h.release(); |
+ } |
+ } |
+} |
+ |
+#if _LIBCPP_STD_VER > 11 |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>::forward_list(size_type __n, const allocator_type& __a) |
+ : base ( __a ) |
+{ |
+ if (__n > 0) |
+ { |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); |
+ for (__node_pointer __p = base::__before_begin(); __n > 0; --__n, |
+ __p = __p->__next_) |
+ { |
+ __h.reset(__node_traits::allocate(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_)); |
+ __h->__next_ = nullptr; |
+ __p->__next_ = __h.release(); |
+ } |
+ } |
+} |
+#endif |
+ |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v) |
+{ |
+ insert_after(cbefore_begin(), __n, __v); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v, |
+ const allocator_type& __a) |
+ : base(__a) |
+{ |
+ insert_after(cbefore_begin(), __n, __v); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+template <class _InputIterator> |
+forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, |
+ typename enable_if< |
+ __is_input_iterator<_InputIterator>::value |
+ >::type*) |
+{ |
+ insert_after(cbefore_begin(), __f, __l); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+template <class _InputIterator> |
+forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, |
+ const allocator_type& __a, |
+ typename enable_if< |
+ __is_input_iterator<_InputIterator>::value |
+ >::type*) |
+ : base(__a) |
+{ |
+ insert_after(cbefore_begin(), __f, __l); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x) |
+ : base(allocator_type( |
+ __node_traits::select_on_container_copy_construction(__x.__alloc()) |
+ ) |
+ ) |
+{ |
+ insert_after(cbefore_begin(), __x.begin(), __x.end()); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x, |
+ const allocator_type& __a) |
+ : base(__a) |
+{ |
+ insert_after(cbefore_begin(), __x.begin(), __x.end()); |
+} |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>::forward_list(forward_list&& __x, |
+ const allocator_type& __a) |
+ : base(_VSTD::move(__x), __a) |
+{ |
+ if (base::__alloc() != __x.__alloc()) |
+ { |
+ typedef move_iterator<iterator> _Ip; |
+ insert_after(cbefore_begin(), _Ip(__x.begin()), _Ip(__x.end())); |
+ } |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>::forward_list(initializer_list<value_type> __il) |
+{ |
+ insert_after(cbefore_begin(), __il.begin(), __il.end()); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>::forward_list(initializer_list<value_type> __il, |
+ const allocator_type& __a) |
+ : base(__a) |
+{ |
+ insert_after(cbefore_begin(), __il.begin(), __il.end()); |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+template <class _Tp, class _Alloc> |
+forward_list<_Tp, _Alloc>& |
+forward_list<_Tp, _Alloc>::operator=(const forward_list& __x) |
+{ |
+ if (this != &__x) |
+ { |
+ base::__copy_assign_alloc(__x); |
+ assign(__x.begin(), __x.end()); |
+ } |
+ return *this; |
+} |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::__move_assign(forward_list& __x, true_type) |
+ _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) |
+{ |
+ clear(); |
+ base::__move_assign_alloc(__x); |
+ base::__before_begin()->__next_ = __x.__before_begin()->__next_; |
+ __x.__before_begin()->__next_ = nullptr; |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::__move_assign(forward_list& __x, false_type) |
+{ |
+ if (base::__alloc() == __x.__alloc()) |
+ __move_assign(__x, true_type()); |
+ else |
+ { |
+ typedef move_iterator<iterator> _Ip; |
+ assign(_Ip(__x.begin()), _Ip(__x.end())); |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+forward_list<_Tp, _Alloc>& |
+forward_list<_Tp, _Alloc>::operator=(forward_list&& __x) |
+ _NOEXCEPT_( |
+ __node_traits::propagate_on_container_move_assignment::value && |
+ is_nothrow_move_assignable<allocator_type>::value) |
+{ |
+ __move_assign(__x, integral_constant<bool, |
+ __node_traits::propagate_on_container_move_assignment::value>()); |
+ return *this; |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+forward_list<_Tp, _Alloc>& |
+forward_list<_Tp, _Alloc>::operator=(initializer_list<value_type> __il) |
+{ |
+ assign(__il.begin(), __il.end()); |
+ return *this; |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+template <class _Tp, class _Alloc> |
+template <class _InputIterator> |
+typename enable_if |
+< |
+ __is_input_iterator<_InputIterator>::value, |
+ void |
+>::type |
+forward_list<_Tp, _Alloc>::assign(_InputIterator __f, _InputIterator __l) |
+{ |
+ iterator __i = before_begin(); |
+ iterator __j = _VSTD::next(__i); |
+ iterator __e = end(); |
+ for (; __j != __e && __f != __l; ++__i, ++__j, ++__f) |
+ *__j = *__f; |
+ if (__j == __e) |
+ insert_after(__i, __f, __l); |
+ else |
+ erase_after(__i, __e); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::assign(size_type __n, const value_type& __v) |
+{ |
+ iterator __i = before_begin(); |
+ iterator __j = _VSTD::next(__i); |
+ iterator __e = end(); |
+ for (; __j != __e && __n > 0; --__n, ++__i, ++__j) |
+ *__j = __v; |
+ if (__j == __e) |
+ insert_after(__i, __n, __v); |
+ else |
+ erase_after(__i, __e); |
+} |
+ |
+#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+void |
+forward_list<_Tp, _Alloc>::assign(initializer_list<value_type> __il) |
+{ |
+ assign(__il.begin(), __il.end()); |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+#ifndef _LIBCPP_HAS_NO_VARIADICS |
+ |
+template <class _Tp, class _Alloc> |
+template <class... _Args> |
+void |
+forward_list<_Tp, _Alloc>::emplace_front(_Args&&... __args) |
+{ |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), |
+ _VSTD::forward<_Args>(__args)...); |
+ __h->__next_ = base::__before_begin()->__next_; |
+ base::__before_begin()->__next_ = __h.release(); |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_VARIADICS |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::push_front(value_type&& __v) |
+{ |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), _VSTD::move(__v)); |
+ __h->__next_ = base::__before_begin()->__next_; |
+ base::__before_begin()->__next_ = __h.release(); |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::push_front(const value_type& __v) |
+{ |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); |
+ __h->__next_ = base::__before_begin()->__next_; |
+ base::__before_begin()->__next_ = __h.release(); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::pop_front() |
+{ |
+ __node_allocator& __a = base::__alloc(); |
+ __node_pointer __p = base::__before_begin()->__next_; |
+ base::__before_begin()->__next_ = __p->__next_; |
+ __node_traits::destroy(__a, _VSTD::addressof(__p->__value_)); |
+ __node_traits::deallocate(__a, __p, 1); |
+} |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+#ifndef _LIBCPP_HAS_NO_VARIADICS |
+ |
+template <class _Tp, class _Alloc> |
+template <class... _Args> |
+typename forward_list<_Tp, _Alloc>::iterator |
+forward_list<_Tp, _Alloc>::emplace_after(const_iterator __p, _Args&&... __args) |
+{ |
+ __node_pointer const __r = __p.__ptr_; |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), |
+ _VSTD::forward<_Args>(__args)...); |
+ __h->__next_ = __r->__next_; |
+ __r->__next_ = __h.release(); |
+ return iterator(__r->__next_); |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_VARIADICS |
+ |
+template <class _Tp, class _Alloc> |
+typename forward_list<_Tp, _Alloc>::iterator |
+forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v) |
+{ |
+ __node_pointer const __r = __p.__ptr_; |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), _VSTD::move(__v)); |
+ __h->__next_ = __r->__next_; |
+ __r->__next_ = __h.release(); |
+ return iterator(__r->__next_); |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+template <class _Tp, class _Alloc> |
+typename forward_list<_Tp, _Alloc>::iterator |
+forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __v) |
+{ |
+ __node_pointer const __r = __p.__ptr_; |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); |
+ __h->__next_ = __r->__next_; |
+ __r->__next_ = __h.release(); |
+ return iterator(__r->__next_); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+typename forward_list<_Tp, _Alloc>::iterator |
+forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n, |
+ const value_type& __v) |
+{ |
+ __node_pointer __r = __p.__ptr_; |
+ if (__n > 0) |
+ { |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); |
+ __node_pointer __first = __h.release(); |
+ __node_pointer __last = __first; |
+#ifndef _LIBCPP_NO_EXCEPTIONS |
+ try |
+ { |
+#endif // _LIBCPP_NO_EXCEPTIONS |
+ for (--__n; __n != 0; --__n, __last = __last->__next_) |
+ { |
+ __h.reset(__node_traits::allocate(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); |
+ __last->__next_ = __h.release(); |
+ } |
+#ifndef _LIBCPP_NO_EXCEPTIONS |
+ } |
+ catch (...) |
+ { |
+ while (__first != nullptr) |
+ { |
+ __node_pointer __next = __first->__next_; |
+ __node_traits::destroy(__a, _VSTD::addressof(__first->__value_)); |
+ __node_traits::deallocate(__a, __first, 1); |
+ __first = __next; |
+ } |
+ throw; |
+ } |
+#endif // _LIBCPP_NO_EXCEPTIONS |
+ __last->__next_ = __r->__next_; |
+ __r->__next_ = __first; |
+ __r = __last; |
+ } |
+ return iterator(__r); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+template <class _InputIterator> |
+typename enable_if |
+< |
+ __is_input_iterator<_InputIterator>::value, |
+ typename forward_list<_Tp, _Alloc>::iterator |
+>::type |
+forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, |
+ _InputIterator __f, _InputIterator __l) |
+{ |
+ __node_pointer __r = __p.__ptr_; |
+ if (__f != __l) |
+ { |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f); |
+ __node_pointer __first = __h.release(); |
+ __node_pointer __last = __first; |
+#ifndef _LIBCPP_NO_EXCEPTIONS |
+ try |
+ { |
+#endif // _LIBCPP_NO_EXCEPTIONS |
+ for (++__f; __f != __l; ++__f, __last = __last->__next_) |
+ { |
+ __h.reset(__node_traits::allocate(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f); |
+ __last->__next_ = __h.release(); |
+ } |
+#ifndef _LIBCPP_NO_EXCEPTIONS |
+ } |
+ catch (...) |
+ { |
+ while (__first != nullptr) |
+ { |
+ __node_pointer __next = __first->__next_; |
+ __node_traits::destroy(__a, _VSTD::addressof(__first->__value_)); |
+ __node_traits::deallocate(__a, __first, 1); |
+ __first = __next; |
+ } |
+ throw; |
+ } |
+#endif // _LIBCPP_NO_EXCEPTIONS |
+ __last->__next_ = __r->__next_; |
+ __r->__next_ = __first; |
+ __r = __last; |
+ } |
+ return iterator(__r); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+typename forward_list<_Tp, _Alloc>::iterator |
+forward_list<_Tp, _Alloc>::erase_after(const_iterator __f) |
+{ |
+ __node_pointer __p = __f.__ptr_; |
+ __node_pointer __n = __p->__next_; |
+ __p->__next_ = __n->__next_; |
+ __node_allocator& __a = base::__alloc(); |
+ __node_traits::destroy(__a, _VSTD::addressof(__n->__value_)); |
+ __node_traits::deallocate(__a, __n, 1); |
+ return iterator(__p->__next_); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+typename forward_list<_Tp, _Alloc>::iterator |
+forward_list<_Tp, _Alloc>::erase_after(const_iterator __f, const_iterator __l) |
+{ |
+ __node_pointer __e = __l.__ptr_; |
+ if (__f != __l) |
+ { |
+ __node_pointer __p = __f.__ptr_; |
+ __node_pointer __n = __p->__next_; |
+ if (__n != __e) |
+ { |
+ __p->__next_ = __e; |
+ __node_allocator& __a = base::__alloc(); |
+ do |
+ { |
+ __p = __n->__next_; |
+ __node_traits::destroy(__a, _VSTD::addressof(__n->__value_)); |
+ __node_traits::deallocate(__a, __n, 1); |
+ __n = __p; |
+ } while (__n != __e); |
+ } |
+ } |
+ return iterator(__e); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::resize(size_type __n) |
+{ |
+ size_type __sz = 0; |
+ iterator __p = before_begin(); |
+ iterator __i = begin(); |
+ iterator __e = end(); |
+ for (; __i != __e && __sz < __n; ++__p, ++__i, ++__sz) |
+ ; |
+ if (__i != __e) |
+ erase_after(__p, __e); |
+ else |
+ { |
+ __n -= __sz; |
+ if (__n > 0) |
+ { |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); |
+ for (__node_pointer __ptr = __p.__ptr_; __n > 0; --__n, |
+ __ptr = __ptr->__next_) |
+ { |
+ __h.reset(__node_traits::allocate(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_)); |
+ __h->__next_ = nullptr; |
+ __ptr->__next_ = __h.release(); |
+ } |
+ } |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v) |
+{ |
+ size_type __sz = 0; |
+ iterator __p = before_begin(); |
+ iterator __i = begin(); |
+ iterator __e = end(); |
+ for (; __i != __e && __sz < __n; ++__p, ++__i, ++__sz) |
+ ; |
+ if (__i != __e) |
+ erase_after(__p, __e); |
+ else |
+ { |
+ __n -= __sz; |
+ if (__n > 0) |
+ { |
+ __node_allocator& __a = base::__alloc(); |
+ typedef __allocator_destructor<__node_allocator> _Dp; |
+ unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); |
+ for (__node_pointer __ptr = __p.__ptr_; __n > 0; --__n, |
+ __ptr = __ptr->__next_) |
+ { |
+ __h.reset(__node_traits::allocate(__a, 1)); |
+ __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); |
+ __h->__next_ = nullptr; |
+ __ptr->__next_ = __h.release(); |
+ } |
+ } |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, |
+ forward_list& __x) |
+{ |
+ if (!__x.empty()) |
+ { |
+ if (__p.__ptr_->__next_ != nullptr) |
+ { |
+ const_iterator __lm1 = __x.before_begin(); |
+ while (__lm1.__ptr_->__next_ != nullptr) |
+ ++__lm1; |
+ __lm1.__ptr_->__next_ = __p.__ptr_->__next_; |
+ } |
+ __p.__ptr_->__next_ = __x.__before_begin()->__next_; |
+ __x.__before_begin()->__next_ = nullptr; |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, |
+ forward_list& __x, |
+ const_iterator __i) |
+{ |
+ const_iterator __lm1 = _VSTD::next(__i); |
+ if (__p != __i && __p != __lm1) |
+ { |
+ __i.__ptr_->__next_ = __lm1.__ptr_->__next_; |
+ __lm1.__ptr_->__next_ = __p.__ptr_->__next_; |
+ __p.__ptr_->__next_ = __lm1.__ptr_; |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, |
+ forward_list& __x, |
+ const_iterator __f, const_iterator __l) |
+{ |
+ if (__f != __l && __p != __f) |
+ { |
+ const_iterator __lm1 = __f; |
+ while (__lm1.__ptr_->__next_ != __l.__ptr_) |
+ ++__lm1; |
+ if (__f != __lm1) |
+ { |
+ __lm1.__ptr_->__next_ = __p.__ptr_->__next_; |
+ __p.__ptr_->__next_ = __f.__ptr_->__next_; |
+ __f.__ptr_->__next_ = __l.__ptr_; |
+ } |
+ } |
+} |
+ |
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+void |
+forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, |
+ forward_list&& __x) |
+{ |
+ splice_after(__p, __x); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+void |
+forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, |
+ forward_list&& __x, |
+ const_iterator __i) |
+{ |
+ splice_after(__p, __x, __i); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+void |
+forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, |
+ forward_list&& __x, |
+ const_iterator __f, const_iterator __l) |
+{ |
+ splice_after(__p, __x, __f, __l); |
+} |
+ |
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::remove(const value_type& __v) |
+{ |
+ iterator __e = end(); |
+ for (iterator __i = before_begin(); __i.__ptr_->__next_ != nullptr;) |
+ { |
+ if (__i.__ptr_->__next_->__value_ == __v) |
+ { |
+ iterator __j = _VSTD::next(__i, 2); |
+ for (; __j != __e && *__j == __v; ++__j) |
+ ; |
+ erase_after(__i, __j); |
+ if (__j == __e) |
+ break; |
+ __i = __j; |
+ } |
+ else |
+ ++__i; |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+template <class _Predicate> |
+void |
+forward_list<_Tp, _Alloc>::remove_if(_Predicate __pred) |
+{ |
+ iterator __e = end(); |
+ for (iterator __i = before_begin(); __i.__ptr_->__next_ != nullptr;) |
+ { |
+ if (__pred(__i.__ptr_->__next_->__value_)) |
+ { |
+ iterator __j = _VSTD::next(__i, 2); |
+ for (; __j != __e && __pred(*__j); ++__j) |
+ ; |
+ erase_after(__i, __j); |
+ if (__j == __e) |
+ break; |
+ __i = __j; |
+ } |
+ else |
+ ++__i; |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+template <class _BinaryPredicate> |
+void |
+forward_list<_Tp, _Alloc>::unique(_BinaryPredicate __binary_pred) |
+{ |
+ for (iterator __i = begin(), __e = end(); __i != __e;) |
+ { |
+ iterator __j = _VSTD::next(__i); |
+ for (; __j != __e && __binary_pred(*__i, *__j); ++__j) |
+ ; |
+ if (__i.__ptr_->__next_ != __j.__ptr_) |
+ erase_after(__i, __j); |
+ __i = __j; |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+template <class _Compare> |
+void |
+forward_list<_Tp, _Alloc>::merge(forward_list& __x, _Compare __comp) |
+{ |
+ if (this != &__x) |
+ { |
+ base::__before_begin()->__next_ = __merge(base::__before_begin()->__next_, |
+ __x.__before_begin()->__next_, |
+ __comp); |
+ __x.__before_begin()->__next_ = nullptr; |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+template <class _Compare> |
+typename forward_list<_Tp, _Alloc>::__node_pointer |
+forward_list<_Tp, _Alloc>::__merge(__node_pointer __f1, __node_pointer __f2, |
+ _Compare& __comp) |
+{ |
+ if (__f1 == nullptr) |
+ return __f2; |
+ if (__f2 == nullptr) |
+ return __f1; |
+ __node_pointer __r; |
+ if (__comp(__f2->__value_, __f1->__value_)) |
+ { |
+ __node_pointer __t = __f2; |
+ while (__t->__next_ != nullptr && |
+ __comp(__t->__next_->__value_, __f1->__value_)) |
+ __t = __t->__next_; |
+ __r = __f2; |
+ __f2 = __t->__next_; |
+ __t->__next_ = __f1; |
+ } |
+ else |
+ __r = __f1; |
+ __node_pointer __p = __f1; |
+ __f1 = __f1->__next_; |
+ while (__f1 != nullptr && __f2 != nullptr) |
+ { |
+ if (__comp(__f2->__value_, __f1->__value_)) |
+ { |
+ __node_pointer __t = __f2; |
+ while (__t->__next_ != nullptr && |
+ __comp(__t->__next_->__value_, __f1->__value_)) |
+ __t = __t->__next_; |
+ __p->__next_ = __f2; |
+ __f2 = __t->__next_; |
+ __t->__next_ = __f1; |
+ } |
+ __p = __f1; |
+ __f1 = __f1->__next_; |
+ } |
+ if (__f2 != nullptr) |
+ __p->__next_ = __f2; |
+ return __r; |
+} |
+ |
+template <class _Tp, class _Alloc> |
+template <class _Compare> |
+inline _LIBCPP_INLINE_VISIBILITY |
+void |
+forward_list<_Tp, _Alloc>::sort(_Compare __comp) |
+{ |
+ base::__before_begin()->__next_ = __sort(base::__before_begin()->__next_, |
+ _VSTD::distance(begin(), end()), __comp); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+template <class _Compare> |
+typename forward_list<_Tp, _Alloc>::__node_pointer |
+forward_list<_Tp, _Alloc>::__sort(__node_pointer __f1, difference_type __sz, |
+ _Compare& __comp) |
+{ |
+ switch (__sz) |
+ { |
+ case 0: |
+ case 1: |
+ return __f1; |
+ case 2: |
+ if (__comp(__f1->__next_->__value_, __f1->__value_)) |
+ { |
+ __node_pointer __t = __f1->__next_; |
+ __t->__next_ = __f1; |
+ __f1->__next_ = nullptr; |
+ __f1 = __t; |
+ } |
+ return __f1; |
+ } |
+ difference_type __sz1 = __sz / 2; |
+ difference_type __sz2 = __sz - __sz1; |
+ __node_pointer __t = _VSTD::next(iterator(__f1), __sz1 - 1).__ptr_; |
+ __node_pointer __f2 = __t->__next_; |
+ __t->__next_ = nullptr; |
+ return __merge(__sort(__f1, __sz1, __comp), |
+ __sort(__f2, __sz2, __comp), __comp); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+void |
+forward_list<_Tp, _Alloc>::reverse() _NOEXCEPT |
+{ |
+ __node_pointer __p = base::__before_begin()->__next_; |
+ if (__p != nullptr) |
+ { |
+ __node_pointer __f = __p->__next_; |
+ __p->__next_ = nullptr; |
+ while (__f != nullptr) |
+ { |
+ __node_pointer __t = __f->__next_; |
+ __f->__next_ = __p; |
+ __p = __f; |
+ __f = __t; |
+ } |
+ base::__before_begin()->__next_ = __p; |
+ } |
+} |
+ |
+template <class _Tp, class _Alloc> |
+bool operator==(const forward_list<_Tp, _Alloc>& __x, |
+ const forward_list<_Tp, _Alloc>& __y) |
+{ |
+ typedef forward_list<_Tp, _Alloc> _Cp; |
+ typedef typename _Cp::const_iterator _Ip; |
+ _Ip __ix = __x.begin(); |
+ _Ip __ex = __x.end(); |
+ _Ip __iy = __y.begin(); |
+ _Ip __ey = __y.end(); |
+ for (; __ix != __ex && __iy != __ey; ++__ix, ++__iy) |
+ if (!(*__ix == *__iy)) |
+ return false; |
+ return (__ix == __ex) == (__iy == __ey); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+bool operator!=(const forward_list<_Tp, _Alloc>& __x, |
+ const forward_list<_Tp, _Alloc>& __y) |
+{ |
+ return !(__x == __y); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+bool operator< (const forward_list<_Tp, _Alloc>& __x, |
+ const forward_list<_Tp, _Alloc>& __y) |
+{ |
+ return _VSTD::lexicographical_compare(__x.begin(), __x.end(), |
+ __y.begin(), __y.end()); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+bool operator> (const forward_list<_Tp, _Alloc>& __x, |
+ const forward_list<_Tp, _Alloc>& __y) |
+{ |
+ return __y < __x; |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+bool operator>=(const forward_list<_Tp, _Alloc>& __x, |
+ const forward_list<_Tp, _Alloc>& __y) |
+{ |
+ return !(__x < __y); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+bool operator<=(const forward_list<_Tp, _Alloc>& __x, |
+ const forward_list<_Tp, _Alloc>& __y) |
+{ |
+ return !(__y < __x); |
+} |
+ |
+template <class _Tp, class _Alloc> |
+inline _LIBCPP_INLINE_VISIBILITY |
+void |
+swap(forward_list<_Tp, _Alloc>& __x, forward_list<_Tp, _Alloc>& __y) |
+ _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) |
+{ |
+ __x.swap(__y); |
+} |
+ |
+_LIBCPP_END_NAMESPACE_STD |
+ |
+#endif // _LIBCPP_FORWARD_LIST |