_slist.h
来自「stl的源码」· C头文件 代码 · 共 915 行 · 第 1/3 页
H
915 行
template <class _InputIterator> slist(_InputIterator __first, _InputIterator __last, const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a) { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }# if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS) // VC++ needs this crazyness template <class _InputIterator> slist(_InputIterator __first, _InputIterator __last) : _STLP_PRIV _Slist_base<_Tp,_Alloc>(allocator_type()) { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }# endif#else /* _STLP_MEMBER_TEMPLATES */ slist(const_iterator __first, const_iterator __last, const allocator_type& __a = allocator_type() ) : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a) { _M_insert_after_range(&this->_M_head._M_data, __first, __last); } slist(const value_type* __first, const value_type* __last, const allocator_type& __a = allocator_type()) : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a) { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }#endif /* _STLP_MEMBER_TEMPLATES */ slist(const _Self& __x) : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__x.get_allocator()) { _M_insert_after_range(&this->_M_head._M_data, __x.begin(), __x.end()); }#if !defined (_STLP_NO_MOVE_SEMANTIC) slist(__move_source<_Self> src) : _STLP_PRIV _Slist_base<_Tp, _Alloc>(__move_source<_Base>(src.get())) {}#endif _Self& operator= (const _Self& __x); ~slist() {}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 _Tp& __val) { _M_fill_assign(__n, __val); }private: void _M_fill_assign(size_type __n, const _Tp& __val);#if defined (_STLP_MEMBER_TEMPLATES)public: template <class _InputIterator> void assign(_InputIterator __first, _InputIterator __last) { typedef typename _IsIntegral<_InputIterator>::_Ret _Integral; _M_assign_dispatch(__first, __last, _Integral()); }private: template <class _Integer> void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type& /*_IsIntegral*/) { _M_fill_assign((size_type) __n, (_Tp) __val); } template <class _InputIter> void _M_assign_dispatch(_InputIter __first, _InputIter __last, const __false_type& /*_IsIntegral*/) {#elsepublic: void assign(const_pointer __first, const_pointer __last) { _Node_base* __prev = &this->_M_head._M_data; _Node_base* __node = this->_M_head._M_data._M_next; while (__node != 0 && __first != __last) { __STATIC_CAST(_Node*, __node)->_M_data = *__first; __prev = __node; __node = __node->_M_next; ++__first; } if (__first != __last) _M_insert_after_range(__prev, __first, __last); else this->_M_erase_after(__prev, 0); } void assign(const_iterator __first, const_iterator __last) {#endif /* _STLP_MEMBER_TEMPLATES */ _Node_base* __prev = &this->_M_head._M_data; _Node_base* __node = this->_M_head._M_data._M_next; while (__node != 0 && __first != __last) { __STATIC_CAST(_Node*, __node)->_M_data = *__first; __prev = __node; __node = __node->_M_next; ++__first; } if (__first != __last) _M_insert_after_range(__prev, __first, __last); else this->_M_erase_after(__prev, 0); }public: // Experimental new feature: before_begin() returns a // non-dereferenceable iterator that, when incremented, yields // begin(). This iterator may be used as the argument to // insert_after, erase_after, etc. Note that even for an empty // slist, before_begin() is not the same iterator as end(). It // is always necessary to increment before_begin() at least once to // obtain end(). iterator before_begin() { return iterator(&this->_M_head._M_data); } const_iterator before_begin() const { return const_iterator(__CONST_CAST(_Node_base*, &this->_M_head._M_data)); } iterator begin() { return iterator(this->_M_head._M_data._M_next); } const_iterator begin() const { return const_iterator(this->_M_head._M_data._M_next);} iterator end() { return iterator(); } const_iterator end() const { return const_iterator(); } size_type size() const { return _STLP_PRIV _Sl_global_inst::size(this->_M_head._M_data._M_next); } size_type max_size() const { return size_type(-1); } bool empty() const { return this->_M_head._M_data._M_next == 0; } void swap(_Self& __x) { this->_M_head.swap(__x._M_head); }#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) void _M_swap_workaround(_Self& __x) { swap(__x); }#endifpublic: 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 value_type& __x = _Tp()) {#else void push_front(const value_type& __x) {#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/ _STLP_PRIV __slist_make_link(&this->_M_head._M_data, _M_create_node(__x)); }#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS) void push_front() { _STLP_PRIV __slist_make_link(&this->_M_head._M_data, _M_create_node());}#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/ void pop_front() { _Node* __node = __STATIC_CAST(_Node*, this->_M_head._M_data._M_next); this->_M_head._M_data._M_next = __node->_M_next; _STLP_STD::_Destroy(&__node->_M_data); this->_M_head.deallocate(__node, 1); } iterator previous(const_iterator __pos) { return iterator(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node)); } const_iterator previous(const_iterator __pos) const { return const_iterator(__CONST_CAST(_Node_base*, _STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node))); }private:#if !defined (_STLP_DONT_SUP_DFLT_PARAM) _Node* _M_insert_after(_Node_base* __pos, const value_type& __x = _Tp()) {#else _Node* _M_insert_after(_Node_base* __pos, const value_type& __x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ return __STATIC_CAST(_Node*, _STLP_PRIV __slist_make_link(__pos, _M_create_node(__x))); }#if defined (_STLP_DONT_SUP_DFLT_PARAM) _Node* _M_insert_after(_Node_base* __pos) { return __STATIC_CAST(_Node*, _STLP_PRIV __slist_make_link(__pos, _M_create_node())); }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ void _M_insert_after_fill(_Node_base* __pos, size_type __n, const value_type& __x) { for (size_type __i = 0; __i < __n; ++__i) __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(__x)); }#if defined (_STLP_MEMBER_TEMPLATES) // Check whether it's an integral type. If so, it's not an iterator. template <class _InIter> void _M_insert_after_range(_Node_base* __pos, _InIter __first, _InIter __last) { typedef typename _IsIntegral<_InIter>::_Ret _Integral; _M_insert_after_range(__pos, __first, __last, _Integral()); } template <class _Integer> void _M_insert_after_range(_Node_base* __pos, _Integer __n, _Integer __x, const __true_type&) { _M_insert_after_fill(__pos, __n, __x); } template <class _InIter> void _M_insert_after_range(_Node_base* __pos, _InIter __first, _InIter __last, const __false_type&) {#else /* _STLP_MEMBER_TEMPLATES */ void _M_insert_after_range(_Node_base* __pos, const value_type* __first, const value_type* __last) { while (__first != __last) { __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(*__first)); ++__first; } } void _M_insert_after_range(_Node_base* __pos, const_iterator __first, const_iterator __last) {#endif /* _STLP_MEMBER_TEMPLATES */ while (__first != __last) { __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(*__first)); ++__first; } }#if defined (_STLP_MEMBER_TEMPLATES) // Check whether it's an integral type. If so, it's not an iterator. template <class _InIter> void _M_splice_after_range(_Node_base* __pos, _InIter __first, _InIter __last) { typedef typename _IsIntegral<_InIter>::_Ret _Integral; _M_splice_after_range(__pos, __first, __last, _Integral()); } template <class _Integer> void _M_splice_after_range(_Node_base* __pos, _Integer __n, _Integer __x, const __true_type&) { _M_insert_after_fill(__pos, __n, __x); } template <class _InIter> void _M_splice_after_range(_Node_base* __pos, _InIter __first, _InIter __last, const __false_type&) {#else /* _STLP_MEMBER_TEMPLATES */ void _M_splice_after_range(_Node_base* __pos, const value_type* __first, const value_type* __last) { while (__first != __last) { __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(*__first)); ++__first; } } void _M_splice_after_range(_Node_base* __pos, const_iterator __first, const_iterator __last) {#endif /* _STLP_MEMBER_TEMPLATES */ //We use a temporary slist to avoid the auto reference troubles (infinite loop) _Self __tmp(__first, __last, this->get_allocator()); splice_after(iterator(__pos), __tmp); }#if defined (_STLP_MEMBER_TEMPLATES) // Check whether it's an integral type. If so, it's not an iterator. template <class _InIter> void _M_splice_range(_Node_base* __pos, _InIter __first, _InIter __last) { typedef typename _IsIntegral<_InIter>::_Ret _Integral; _M_splice_range(__pos, __first, __last, _Integral()); } template <class _Integer> void _M_splice_range(_Node_base* __pos, _Integer __n, _Integer __x, const __true_type&) { _M_insert_after_fill(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos), __n, __x); } template <class _InIter> void _M_splice_range(_Node_base* __pos, _InIter __first, _InIter __last, const __false_type&) {#else /* _STLP_MEMBER_TEMPLATES */ void _M_splice_range(_Node_base* __pos, const value_type* __first, const value_type* __last) { while (__first != __last) { __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(*__first)); ++__first; } } void _M_splice_range(_Node_base* __pos, const_iterator __first, const_iterator __last) {#endif /* _STLP_MEMBER_TEMPLATES */ //We use a temporary slist to avoid the auto reference troubles (infinite loop) _Self __tmp(__first, __last, this->get_allocator()); splice(iterator(__pos), __tmp); }public:#if !defined (_STLP_DONT_SUP_DFLT_PARAM) iterator insert_after(iterator __pos, const value_type& __x = _Tp()) {#else iterator insert_after(iterator __pos, const value_type& __x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ return iterator(_M_insert_after(__pos._M_node, __x)); }#if defined (_STLP_DONT_SUP_DFLT_PARAM) iterator insert_after(iterator __pos) { return insert_after(__pos, _STLP_DEFAULT_CONSTRUCTED(_Tp));
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?