_rope.h

来自「stl的源码」· C头文件 代码 · 共 1,929 行 · 第 1/5 页

H
1,929
字号
  void copy(_CharT* __buffer) const {    _STLP_STD::_Destroy_Range(__buffer, __buffer + size());    _S_flatten(_M_tree_ptr._M_data, __buffer);  }  /*   * This is the copy function from the standard, but   * with the arguments reordered to make it consistent with the   * rest of the interface.   * Note that this guaranteed not to compile if the draft standard   * order is assumed.   */  size_type copy(size_type __pos, size_type __n, _CharT* __buffer) const {    size_t _p_size = size();    size_t __len = (__pos + __n > _p_size? _p_size - __pos : __n);    _STLP_STD::_Destroy_Range(__buffer, __buffer + __len);    _S_flatten(_M_tree_ptr._M_data, __pos, __len, __buffer);    return __len;  }# ifdef _STLP_DEBUG  // Print to stdout, exposing structure.  May be useful for  // performance debugging.  void dump() {    _S_dump(_M_tree_ptr._M_data);  }# endif  // Convert to 0 terminated string in new allocated memory.  // Embedded 0s in the input do not terminate the copy.  const _CharT* c_str() const;  // As above, but also use the flattened representation as the  // the new rope representation.  const _CharT* replace_with_c_str();  // Reclaim memory for the c_str generated flattened string.  // Intentionally undocumented, since it's hard to say when this  // is safe for multiple threads.  void delete_c_str () {    if (0 == _M_tree_ptr._M_data) return;    if (_RopeRep::_S_leaf == _M_tree_ptr._M_data->_M_tag &&        ((_RopeLeaf*)_M_tree_ptr._M_data)->_M_data ==        _M_tree_ptr._M_data->_M_c_string) {      // Representation shared      return;    }    _M_tree_ptr._M_data->_M_free_c_string();    _M_tree_ptr._M_data->_M_c_string = 0;  }  _CharT operator[] (size_type __pos) const {    return _S_fetch(_M_tree_ptr._M_data, __pos);  }  _CharT at(size_type __pos) const {    if (__pos >= size()) _M_throw_out_of_range();    return (*this)[__pos];  }  const_iterator begin() const {    return(const_iterator(_M_tree_ptr._M_data, 0));  }  // An easy way to get a const iterator from a non-const container.  const_iterator const_begin() const {    return(const_iterator(_M_tree_ptr._M_data, 0));  }  const_iterator end() const {    return(const_iterator(_M_tree_ptr._M_data, size()));  }  const_iterator const_end() const {    return(const_iterator(_M_tree_ptr._M_data, size()));  }  size_type size() const {    return(0 == _M_tree_ptr._M_data? 0 : _M_tree_ptr._M_data->_M_size._M_data);  }  size_type length() const {    return size();  }  size_type max_size() const {    return _S_min_len[__ROPE_MAX_DEPTH-1] - 1;    //  Guarantees that the result can be sufficiently    //  balanced.  Longer ropes will probably still work,    //  but it's harder to make guarantees.  }  const_reverse_iterator rbegin() const {    return const_reverse_iterator(end());  }  const_reverse_iterator const_rbegin() const {    return const_reverse_iterator(end());  }  const_reverse_iterator rend() const {    return const_reverse_iterator(begin());  }  const_reverse_iterator const_rend() const {    return const_reverse_iterator(begin());  }  // The symmetric cases are intentionally omitted, since they're presumed  // to be less common, and we don't handle them as well.  // The following should really be templatized.  // The first argument should be an input iterator or  // forward iterator with value_type _CharT.  _Self& append(const _CharT* __iter, size_t __n) {    _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, __iter, __n));    return *this;  }  _Self& append(const _CharT* __c_string) {    size_t __len = _S_char_ptr_len(__c_string);    append(__c_string, __len);    return *this;  }  _Self& append(const _CharT* __s, const _CharT* __e) {    _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, __s, __e - __s));    return *this;  }  _Self& append(const_iterator __s, const_iterator __e) {    _STLP_ASSERT(__s._M_root == __e._M_root)    _STLP_ASSERT(get_allocator() == __s._M_root->get_allocator())    _Self_destruct_ptr __appendee(_S_substring(__s._M_root, __s._M_current_pos, __e._M_current_pos));    _M_reset(_S_concat_rep(_M_tree_ptr._M_data, (_RopeRep*)__appendee));    return *this;  }  _Self& append(_CharT __c) {    _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, &__c, 1));    return *this;  }  _Self& append() { return append(_CharT()); }  // XXX why?  _Self& append(const _Self& __y) {    _STLP_ASSERT(__y.get_allocator() == get_allocator())    _M_reset(_S_concat_rep(_M_tree_ptr._M_data, __y._M_tree_ptr._M_data));    return *this;  }  _Self& append(size_t __n, _CharT __c) {    rope<_CharT,_Alloc> __last(__n, __c);    return append(__last);  }  void swap(_Self& __b) {    _M_tree_ptr.swap(__b._M_tree_ptr);  }#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)  void _M_swap_workaround(_Self& __x) { swap(__x); }#endifprotected:  // Result is included in refcount.  static _RopeRep* replace(_RopeRep* __old, size_t __pos1,                           size_t __pos2, _RopeRep* __r) {    if (0 == __old) { _S_ref(__r); return __r; }    _Self_destruct_ptr __left(_S_substring(__old, 0, __pos1));    _Self_destruct_ptr __right(_S_substring(__old, __pos2, __old->_M_size._M_data));    _STLP_MPWFIX_TRY  //*TY 06/01/2000 -    _RopeRep* __result;    if (0 == __r) {      __result = _S_concat_rep(__left, __right);    } else {      _STLP_ASSERT(__old->get_allocator() == __r->get_allocator())      _Self_destruct_ptr __left_result(_S_concat_rep(__left, __r));      __result = _S_concat_rep(__left_result, __right);    }    return __result;    _STLP_MPWFIX_CATCH  //*TY 06/01/2000 -  }public:  void insert(size_t __p, const _Self& __r) {    if (__p > size()) _M_throw_out_of_range();    _STLP_ASSERT(get_allocator() == __r.get_allocator())    _M_reset(replace(_M_tree_ptr._M_data, __p, __p, __r._M_tree_ptr._M_data));  }  void insert(size_t __p, size_t __n, _CharT __c) {    rope<_CharT,_Alloc> __r(__n,__c);    insert(__p, __r);  }  void insert(size_t __p, const _CharT* __i, size_t __n) {    if (__p > size()) _M_throw_out_of_range();    _Self_destruct_ptr __left(_S_substring(_M_tree_ptr._M_data, 0, __p));    _Self_destruct_ptr __right(_S_substring(_M_tree_ptr._M_data, __p, size()));    _Self_destruct_ptr __left_result(                                     _S_concat_char_iter(__left, __i, __n));    // _S_ destr_concat_char_iter should be safe here.    // But as it stands it's probably not a win, since __left    // is likely to have additional references.    _M_reset(_S_concat_rep(__left_result, __right));  }  void insert(size_t __p, const _CharT* __c_string) {    insert(__p, __c_string, _S_char_ptr_len(__c_string));  }  void insert(size_t __p, _CharT __c) {    insert(__p, &__c, 1);  }  void insert(size_t __p) {    _CharT __c = _CharT();    insert(__p, &__c, 1);  }  void insert(size_t __p, const _CharT* __i, const _CharT* __j) {    _Self __r(__i, __j);    insert(__p, __r);  }  void insert(size_t __p, const const_iterator& __i,                          const const_iterator& __j) {    _Self __r(__i, __j);    insert(__p, __r);  }  void insert(size_t __p, const iterator& __i,                          const iterator& __j) {    _Self __r(__i, __j);    insert(__p, __r);  }  // (position, length) versions of replace operations:  void replace(size_t __p, size_t __n, const _Self& __r) {    if (__p > size()) _M_throw_out_of_range();    _M_reset(replace(_M_tree_ptr._M_data, __p, __p + __n, __r._M_tree_ptr._M_data));  }  void replace(size_t __p, size_t __n,               const _CharT* __i, size_t __i_len) {    _Self __r(__i, __i_len);    replace(__p, __n, __r);  }  void replace(size_t __p, size_t __n, _CharT __c) {    _Self __r(__c);    replace(__p, __n, __r);  }  void replace(size_t __p, size_t __n, const _CharT* __c_string) {    _Self __r(__c_string);    replace(__p, __n, __r);  }  void replace(size_t __p, size_t __n,               const _CharT* __i, const _CharT* __j) {    _Self __r(__i, __j);    replace(__p, __n, __r);  }  void replace(size_t __p, size_t __n,               const const_iterator& __i, const const_iterator& __j) {    _Self __r(__i, __j);    replace(__p, __n, __r);  }  void replace(size_t __p, size_t __n,               const iterator& __i, const iterator& __j) {    _Self __r(__i, __j);    replace(__p, __n, __r);  }  // Single character variants:  void replace(size_t __p, _CharT __c) {    if (__p > size()) _M_throw_out_of_range();    iterator __i(this, __p);    *__i = __c;  }  void replace(size_t __p, const _Self& __r) {    replace(__p, 1, __r);  }  void replace(size_t __p, const _CharT* __i, size_t __i_len) {    replace(__p, 1, __i, __i_len);  }  void replace(size_t __p, const _CharT* __c_string) {    replace(__p, 1, __c_string);  }  void replace(size_t __p, const _CharT* __i, const _CharT* __j) {    replace(__p, 1, __i, __j);  }  void replace(size_t __p, const const_iterator& __i,                           const const_iterator& __j) {    replace(__p, 1, __i, __j);  }  void replace(size_t __p, const iterator& __i,                           const iterator& __j) {    replace(__p, 1, __i, __j);  }  // Erase, (position, size) variant.  void erase(size_t __p, size_t __n) {    if (__p > size()) _M_throw_out_of_range();    _M_reset(replace(_M_tree_ptr._M_data, __p, __p + __n, 0));  }  // Erase, single character  void erase(size_t __p) {    erase(__p, __p + 1);  }  // Insert, iterator variants.  iterator insert(const iterator& __p, const _Self& __r)  { insert(__p.index(), __r); return __p; }  iterator insert(const iterator& __p, size_t __n, _CharT __c)  { insert(__p.index(), __n, __c); return __p; }  iterator insert(const iterator& __p, _CharT __c)  { insert(__p.index(), __c); return __p; }  iterator insert(const iterator& __p )  { insert(__p.index()); return __p; }  iterator insert(const iterator& __p, const _CharT* c_string)  { insert(__p.index(), c_string); return __p; }  iterator insert(const iterator& __p, const _CharT* __i, size_t __n)  { insert(__p.index(), __i, __n); return __p; }  iterator insert(const iterator& __p, const _CharT* __i,                  const _CharT* __j)  { insert(__p.index(), __i, __j);  return __p; }  iterator insert(const iterator& __p,                  const const_iterator& __i, const const_iterator& __j)  { insert(__p.index(), __i, __j); return __p; }  iterator insert(const iterator& __p,                  const iterator& __i, const iterator& __j)  { insert(__p.index(), __i, __j); return __p; }  // Replace, range variants.  void replace(const iterator& __p, const iterator& __q,               const _Self& __r)  { replace(__p.index(), __q.index() - __p.index(), __r); }  void replace(const iterator& __p, const iterator& __q, _CharT __c)  { replace(__p.index(), __q.index() - __p.index(), __c); }  void replace(const iterator& __p, const iterator& __q,               const _CharT* __c_string)  { replace(__p.index(), __q.index() - __p.index(), __c_string); }  void replace(const iterator& __p, const iterator& __q,               const _CharT* __i, size_t __n)  { replace(__p.index(), __q.index() - __p.index(), __i, __n); }  void replace(const iterator& __p, const iterator& __q,               const _CharT* __i, const _CharT* __j)  { replace(__p.index(), __q.index() - __p.index(), __i, __j); }  void replace(const iterator& __p, const iterator& __q,               const const_iterator& __i, const const_iterator& __j)  { replace(__p.index(), __q.index() - __p.index(), __i, __j); }  void replace(const iterator& __p, const iterator& __q,               const iterator& __i, const iterator& __j)  { replace(__p.index(), __q.index() - __p.index(), __i, __j); }  // Replace, iterator variants.  void replace(const iterator& __p, const _Self& __r)  { replace(__p.index(), __r); }  void replace(const iterator& __p, _CharT __c)  { replace(__p.index(), __c); }  void replace(const iterator& __p, const _CharT* __c_string)  { replace(__p.index(), __c_string); }  void replace(const iterator& __p, const _CharT* __i, size_t __n)  { replace(__p.index(), __i, __n); }  void replace(const iterator& __p, const _CharT* __i, const _CharT* __j)  { replace(__p.index(), __i, __j); }  void replace(const iterator& __p, const_iterator __i,               const_iterator __j)  { replace(__p.index(), __i, __j); }  void replace(const iterator& __p, iterator __i, iterator __j)  { replace(__p.index(), __i, __j); }  // Iterator and ran

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?