_slist.h
来自「C++类模版库实现」· C头文件 代码 · 共 872 行 · 第 1/3 页
H
872 行
typedef value_type& reference; typedef value_type const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef forward_iterator_tag _Iterator_category; typedef _Slist_iterator<value_type, _Nonconst_traits<value_type> > iterator; typedef _Slist_iterator<value_type, _Const_traits<value_type> > const_iterator; _STLP_FORCE_ALLOCATORS(value_type, _Alloc) typedef typename _Base::allocator_type allocator_type;public: allocator_type get_allocator() const { return _M_container.get_allocator(); } explicit slist(const allocator_type& __a = allocator_type()) : _M_container(__a) {}#if !defined(_STLP_DONT_SUP_DFLT_PARAM) explicit slist(size_type __n, const_reference __x = 0,#else slist(size_type __n, const_reference __x,#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ const allocator_type& __a = allocator_type()) : _M_container(__n, cast_traits::cast(__x), __a) {}#if defined(_STLP_DONT_SUP_DFLT_PARAM) explicit slist(size_type __n) : _M_container(__n) {}#endif /*_STLP_DONT_SUP_DFLT_PARAM*/#ifdef _STLP_MEMBER_TEMPLATES // We don't need any dispatching tricks here, because _M_insert_after_range // already does them. template <class _InputIte> slist(_InputIte __first, _InputIte __last, const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) : _M_container(__iterator_wrapper<_Tp, _InputIte>(__first), __iterator_wrapper<_Tp, _InputIte>(__last), __a) {}# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS // VC++ needs this crazyness template <class _InputIte> slist(_InputIte __first, _InputIte __last) : _M_container(__iterator_wrapper<_Tp, _InputIte>(__first), __iterator_wrapper<_Tp, _InputIte>(__last)) {}# endif#else /* _STLP_MEMBER_TEMPLATES */ slist(const_iterator __first, const_iterator __last, const allocator_type& __a = allocator_type() ) : _M_container(const_void_iterator(__first._M_node), const_void_iterator(__last._M_node), __a) {} slist(const value_type* __first, const value_type* __last, const allocator_type& __a = allocator_type()) : _M_container(__first, __last, __a) {}#endif /* _STLP_MEMBER_TEMPLATES */ slist(const _Self& __x) : _M_container(__x._M_container) {} /*explicit slist(__full_move_source<_Self> src) : _Slist_base<void*, _Alloc>(_FullMoveSource<_Slist_base<void*, _Alloc> >(src.get())) { }*/ explicit slist(__partial_move_source<_Self> src) : _M_container(__partial_move_source<_Base>(src.get()._M_container)) {} _Self& operator= (const _Self& __x) { _M_container = __x._M_container; return *this; }public: // assign(), a generalized assignment member function. Two // versions: one that takes a count, and one that takes a range. // The range version is a member template, so we dispatch on whether // or not the type is an integer. void assign(size_type __n, const_reference __val) { _M_container.assign(__n, cast_traits::cast(__val)); }#ifdef _STLP_MEMBER_TEMPLATES template <class _InputIte> void assign(_InputIte __first, _InputIte __last) { _M_container.assign(__iterator_wrapper<_Tp, _InputIte>(__first), __iterator_wrapper<_Tp, _InputIte>(__last)); }#endif /* _STLP_MEMBER_TEMPLATES */ iterator before_begin() { return iterator(_M_container.before_begin()._M_node); } const_iterator before_begin() const { return const_iterator(const_cast<_Slist_node_base*>(_M_container.before_begin()._M_node)); } iterator begin() { return iterator(_M_container.begin()._M_node); } const_iterator begin() const { return const_iterator(const_cast<_Slist_node_base*>(_M_container.begin()._M_node));} iterator end() { return iterator(0); } const_iterator end() const { return const_iterator(0); } size_type size() const { return _M_container.size(); } size_type max_size() const { return size_type(-1); } bool empty() const { return _M_container.empty(); } void swap(_Self& __x) { _M_container.swap(__x._M_container); }public: reference front() { return *begin(); } const_reference front() const { return *begin(); }#if !defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS) void push_front(const_reference __x = 0) {#else void push_front(const_reference __x) {#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/ _M_container.push_front(cast_traits::cast(__x)); }# if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS) void push_front() { _M_container.push_front();}# endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/ void pop_front() { _M_container.pop_front(); } iterator previous(const_iterator __pos) { return iterator(_M_container.previous(const_void_iterator(__pos._M_node))._M_node); } const_iterator previous(const_iterator __pos) const { return const_iterator(const_cast<_Slist_node_base*>(_M_container.previous(const_void_iterator(__pos._M_node))._M_node)); }#if !defined(_STLP_DONT_SUP_DFLT_PARAM) iterator insert_after(iterator __pos, const_reference __x = 0) {#else iterator insert_after(iterator __pos, const_reference __x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ return iterator(_M_container.insert_after(void_iterator(__pos._M_node), cast_traits::cast(__x))._M_node); }#if defined(_STLP_DONT_SUP_DFLT_PARAM) iterator insert_after(iterator __pos) { return iterator(_M_container.insert_after(void_iterator(__pos._M_node))._M_node);}#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ void insert_after(iterator __pos, size_type __n, const_reference __x) { _M_container.insert_after(void_iterator(__pos._M_node), __n, cast_traits::cast(__x)); }#ifdef _STLP_MEMBER_TEMPLATES // We don't need any dispatching tricks here, because _M_insert_after_range // already does them. template <class _InIter> void insert_after(iterator __pos, _InIter __first, _InIter __last) { _M_container.insert_after(void_iterator(__pos._M_node), __iterator_wrapper<_Tp, _InIter>(__first), __iterator_wrapper<_Tp, _InIter>(__last)); }#else /* _STLP_MEMBER_TEMPLATES */ void insert_after(iterator __pos, const_iterator __first, const_iterator __last) { _M_container.insert_after(void_iterator(__pos._M_node), const_void_iterator(__first._M_node), const_void_iterator(__last._M_node)); } void insert_after(iterator __pos, const value_type* __first, const value_type* __last) { _M_container.insert_after(void_iterator(__pos._M_node), __first, __last); }#endif /* _STLP_MEMBER_TEMPLATES */#if !defined(_STLP_DONT_SUP_DFLT_PARAM) iterator insert(iterator __pos, const_reference __x = 0) {#else iterator insert(iterator __pos, const_reference __x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ return iterator(_M_container.insert(void_iterator(__pos._M_node), cast_traits::cast(__x))._M_node); }#if defined(_STLP_DONT_SUP_DFLT_PARAM) iterator insert(iterator __pos) { return iterator(_M_container.insert(void_iterator(__pos._M_node))); }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ void insert(iterator __pos, size_type __n, const_reference __x) { _M_container.insert(void_iterator(__pos._M_node), __n, cast_traits::cast(__x)); }#ifdef _STLP_MEMBER_TEMPLATES // We don't need any dispatching tricks here, because _M_insert_after_range // already does them. template <class _InIter> void insert(iterator __pos, _InIter __first, _InIter __last) { _M_container.insert(void_iterator(__pos._M_node), __iterator_wrapper<_Tp, _InIter>(__first), __iterator_wrapper<_Tp, _InIter>(__last)); }#else /* _STLP_MEMBER_TEMPLATES */ void insert(iterator __pos, const_iterator __first, const_iterator __last) { _M_container.insert(void_iterator(__pos._M_node), const_void_iterator(__first._M_node), const_void_iterator(__last._M_node)); } void insert(iterator __pos, const value_type* __first, const value_type* __last) { _M_container.insert(void_iterator(__pos._M_node), __first, __last); }#endif /* _STLP_MEMBER_TEMPLATES */public: iterator erase_after(iterator __pos) { return iterator(_M_container.erase_after(void_iterator(__pos._M_node))._M_node); } iterator erase_after(iterator __before_first, iterator __last) { return iterator(_M_container.erase_after(void_iterator(__before_first._M_node), void_iterator(__last._M_node))._M_node); } iterator erase(iterator __pos) { return iterator(_M_container.erase(void_iterator(__pos._M_node))._M_node); } iterator erase(iterator __first, iterator __last) { return iterator(_M_container.erase(void_iterator(__first._M_node), void_iterator(__last._M_node))._M_node); }#if !defined(_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type __new_size, const_reference __x = 0)#else void resize(size_type __new_size, const_reference __x)#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ { _M_container.resize(__new_size, cast_traits::cast(__x));}#if defined(_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type __new_size) { _M_container.resize(__new_size); }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ void clear() { _M_container.clear(); } void splice_after(iterator __pos, iterator __before_first, iterator __before_last) { _M_container.splice_after(void_iterator(__pos._M_node), void_iterator(__before_first._M_node), void_iterator(__before_last._M_node)); } void splice_after(iterator __pos, iterator __prev) { _M_container.splice_after(void_iterator(__pos._M_node), void_iterator(__prev._M_node)); } void splice_after(iterator __pos, _Self& __x) { _M_container.splice_after(void_iterator(__pos._M_node), __x._M_container); } void splice(iterator __pos, _Self& __x) { _M_container.splice(void_iterator(__pos._M_node), __x._M_container); } void splice(iterator __pos, _Self& __x, iterator __i) { _M_container.splice(void_iterator(__pos._M_node), __x._M_container, void_iterator(__i._M_node)); } void splice(iterator __pos, _Self& __x, iterator __first, iterator __last) { _M_container.splice(void_iterator(__pos._M_node), __x._M_container, void_iterator(__first._M_node), void_iterator(__last._M_node)); }public: void reverse() { _M_container.reverse(); } void remove(const_reference __val) { _M_container.remove(cast_traits::cast(__val)); } void unique() { _M_container.unique(); } void merge(_Self& __x) { _M_container.merge(__x._M_container); } void sort() {_M_container.sort(); }#ifdef _STLP_MEMBER_TEMPLATES template <class _Predicate> void remove_if(_Predicate __pred) { _M_container.remove_if(__unary_pred_wrapper<_Tp, _Predicate>(__pred)); } template <class _BinaryPredicate> void unique(_BinaryPredicate __pred) { _M_container.unique(__binary_pred_wrapper<_Tp, _BinaryPredicate>(__pred)); } template <class _StrictWeakOrdering> void merge(_Self& __x, _StrictWeakOrdering __comp) { _M_container.merge(__x._M_container, __binary_pred_wrapper<_Tp, _StrictWeakOrdering>(__comp)); } template <class _StrictWeakOrdering> void sort(_StrictWeakOrdering __comp) { _M_container.sort(__binary_pred_wrapper<_Tp, _StrictWeakOrdering>(__comp)); }#endif /* _STLP_MEMBER_TEMPLATES */};#endif /* _STLP_SPECIALIZED_SLIST_H */// Local Variables:// mode:C++// End:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?