_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 + -
显示快捷键?