51 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
53 _GLIBCXX_BEGIN_NAMESPACE_VERSION
59 template <
class _CharT,
class _Alloc>
61 _Rope_iterator_base<_CharT, _Alloc>::
62 _S_setbuf(_Rope_iterator_base<_CharT, _Alloc>& __x)
65 const _RopeRep* __leaf = __x._M_path_end[__x._M_leaf_index];
66 size_t __leaf_pos = __x._M_leaf_pos;
67 size_t __pos = __x._M_current_pos;
69 switch(__leaf->_M_tag)
71 case __detail::_S_leaf:
72 __x._M_buf_start = ((_Rope_RopeLeaf<_CharT, _Alloc>*)__leaf)->_M_data;
73 __x._M_buf_ptr = __x._M_buf_start + (__pos - __leaf_pos);
74 __x._M_buf_end = __x._M_buf_start + __leaf->_M_size;
76 case __detail::_S_function:
77 case __detail::_S_substringfn:
79 size_t __len = _S_iterator_buf_len;
80 size_t __buf_start_pos = __leaf_pos;
81 size_t __leaf_end = __leaf_pos + __leaf->_M_size;
82 char_producer<_CharT>* __fn = ((_Rope_RopeFunction<_CharT,
83 _Alloc>*)__leaf)->_M_fn;
84 if (__buf_start_pos + __len <= __pos)
86 __buf_start_pos = __pos - __len / 4;
87 if (__buf_start_pos + __len > __leaf_end)
88 __buf_start_pos = __leaf_end - __len;
90 if (__buf_start_pos + __len > __leaf_end)
91 __len = __leaf_end - __buf_start_pos;
92 (*__fn)(__buf_start_pos - __leaf_pos, __len, __x._M_tmp_buf);
93 __x._M_buf_ptr = __x._M_tmp_buf + (__pos - __buf_start_pos);
94 __x._M_buf_start = __x._M_tmp_buf;
95 __x._M_buf_end = __x._M_tmp_buf + __len;
105 template <
class _CharT,
class _Alloc>
107 _Rope_iterator_base<_CharT, _Alloc>::
108 _S_setcache(_Rope_iterator_base<_CharT, _Alloc>& __x)
111 const _RopeRep* __path[int(__detail::_S_max_rope_depth) + 1];
112 const _RopeRep* __curr_rope;
113 int __curr_depth = -1;
114 size_t __curr_start_pos = 0;
115 size_t __pos = __x._M_current_pos;
116 unsigned char __dirns = 0;
118 if (__pos >= __x._M_root->_M_size)
123 __curr_rope = __x._M_root;
124 if (0 != __curr_rope->_M_c_string)
127 __x._M_buf_start = __curr_rope->_M_c_string;
128 __x._M_buf_end = __curr_rope->_M_c_string + __curr_rope->_M_size;
129 __x._M_buf_ptr = __curr_rope->_M_c_string + __pos;
130 __x._M_path_end[0] = __curr_rope;
131 __x._M_leaf_index = 0;
138 __path[__curr_depth] = __curr_rope;
139 switch(__curr_rope->_M_tag)
141 case __detail::_S_leaf:
142 case __detail::_S_function:
143 case __detail::_S_substringfn:
144 __x._M_leaf_pos = __curr_start_pos;
146 case __detail::_S_concat:
148 _Rope_RopeConcatenation<_CharT, _Alloc>* __c =
149 (_Rope_RopeConcatenation<_CharT, _Alloc>*)__curr_rope;
150 _RopeRep* __left = __c->_M_left;
151 size_t __left_len = __left->_M_size;
154 if (__pos >= __curr_start_pos + __left_len)
157 __curr_rope = __c->_M_right;
158 __curr_start_pos += __left_len;
161 __curr_rope = __left;
170 int __j = __curr_depth + 1 - int(_S_path_cache_len);
172 if (__j < 0) __j = 0;
173 while (__j <= __curr_depth)
174 __x._M_path_end[++__i] = __path[__j++];
175 __x._M_leaf_index = __i;
177 __x._M_path_directions = __dirns;
183 template <
class _CharT,
class _Alloc>
185 _Rope_iterator_base<_CharT, _Alloc>::
186 _S_setcache_for_incr(_Rope_iterator_base<_CharT, _Alloc>& __x)
189 int __current_index = __x._M_leaf_index;
190 const _RopeRep* __current_node = __x._M_path_end[__current_index];
191 size_t __len = __current_node->_M_size;
192 size_t __node_start_pos = __x._M_leaf_pos;
193 unsigned char __dirns = __x._M_path_directions;
194 _Rope_RopeConcatenation<_CharT, _Alloc>* __c;
196 if (__x._M_current_pos - __node_start_pos < __len)
203 while (--__current_index >= 0)
207 __current_node = __x._M_path_end[__current_index];
208 __c = (_Rope_RopeConcatenation<_CharT, _Alloc>*)__current_node;
211 __node_start_pos -= __c->_M_left->_M_size;
214 if (__current_index < 0)
220 __current_node = __x._M_path_end[__current_index];
221 __c = (_Rope_RopeConcatenation<_CharT, _Alloc>*)__current_node;
225 __node_start_pos += __c->_M_left->_M_size;
226 __current_node = __c->_M_right;
227 __x._M_path_end[++__current_index] = __current_node;
229 while (__detail::_S_concat == __current_node->_M_tag)
232 if (
int(_S_path_cache_len) == __current_index)
235 for (__i = 0; __i < int(_S_path_cache_len) - 1; __i++)
236 __x._M_path_end[__i] = __x._M_path_end[__i+1];
240 ((_Rope_RopeConcatenation<_CharT, _Alloc>*)__current_node)->_M_left;
241 __x._M_path_end[__current_index] = __current_node;
245 __x._M_leaf_index = __current_index;
246 __x._M_leaf_pos = __node_start_pos;
247 __x._M_path_directions = __dirns;
251 template <
class _CharT,
class _Alloc>
253 _Rope_iterator_base<_CharT, _Alloc>::
254 _M_incr(std::size_t __n)
256 _M_current_pos += __n;
259 std::size_t __chars_left = _M_buf_end - _M_buf_ptr;
260 if (__chars_left > __n)
262 else if (__chars_left == __n)
265 _S_setcache_for_incr(*
this);
272 template <
class _CharT,
class _Alloc>
274 _Rope_iterator_base<_CharT, _Alloc>::
275 _M_decr(std::size_t __n)
279 std::size_t __chars_left = _M_buf_ptr - _M_buf_start;
280 if (__chars_left >= __n)
285 _M_current_pos -= __n;
288 template <
class _CharT,
class _Alloc>
290 _Rope_iterator<_CharT, _Alloc>::
293 if (_M_root_rope->_M_tree_ptr != this->_M_root)
296 _RopeRep::_S_unref(this->_M_root);
297 this->_M_root = _M_root_rope->_M_tree_ptr;
298 _RopeRep::_S_ref(this->_M_root);
299 this->_M_buf_ptr = 0;
303 template <
class _CharT,
class _Alloc>
305 _Rope_const_iterator<_CharT, _Alloc>::
306 _Rope_const_iterator(
const _Rope_iterator<_CharT, _Alloc>& __x)
307 : _Rope_iterator_base<_CharT, _Alloc>(__x)
310 template <
class _CharT,
class _Alloc>
312 _Rope_iterator<_CharT, _Alloc>::
313 _Rope_iterator(rope<_CharT, _Alloc>& __r, std::size_t __pos)
314 : _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr, __pos),
316 { _RopeRep::_S_ref(this->_M_root); }
318 template <
class _CharT,
class _Alloc>
320 rope<_CharT, _Alloc>::
321 _S_char_ptr_len(
const _CharT* __s)
323 const _CharT* __p = __s;
325 while (!_S_is0(*__p))
333 template <
class _CharT,
class _Alloc>
335 _Rope_RopeRep<_CharT, _Alloc>::
338 _CharT* __cstr = _M_c_string;
341 std::size_t __size = this->_M_size + 1;
343 this->_Data_deallocate(__cstr, __size);
347 template <
class _CharT,
class _Alloc>
349 _Rope_RopeRep<_CharT, _Alloc>::
350 _S_free_string(_CharT* __s, std::size_t __n, allocator_type& __a)
352 if (!_S_is_basic_char_type((_CharT*)0))
357 _Rope_RopeLeaf<_CharT, _Alloc>::_S_rounded_up_size(__n));
366 template <
class _CharT,
class _Alloc>
368 _Rope_RopeRep<_CharT, _Alloc>::
373 case __detail::_S_leaf:
375 _Rope_RopeLeaf<_CharT, _Alloc>* __l
376 = (_Rope_RopeLeaf<_CharT, _Alloc>*)
this;
377 __l->_Rope_RopeLeaf<_CharT, _Alloc>::~_Rope_RopeLeaf();
378 this->_L_deallocate(__l, 1);
381 case __detail::_S_concat:
383 _Rope_RopeConcatenation<_CharT,_Alloc>* __c
384 = (_Rope_RopeConcatenation<_CharT, _Alloc>*)
this;
385 __c->_Rope_RopeConcatenation<_CharT, _Alloc>::
~_Rope_RopeConcatenation();
386 this->_C_deallocate(__c, 1);
389 case __detail::_S_function:
391 _Rope_RopeFunction<_CharT, _Alloc>* __f
392 = (_Rope_RopeFunction<_CharT, _Alloc>*)
this;
393 __f->_Rope_RopeFunction<_CharT, _Alloc>::~_Rope_RopeFunction();
394 this->_F_deallocate(__f, 1);
397 case __detail::_S_substringfn:
399 _Rope_RopeSubstring<_CharT, _Alloc>* __ss =
400 (_Rope_RopeSubstring<_CharT, _Alloc>*)
this;
401 __ss->_Rope_RopeSubstring<_CharT, _Alloc>::
~_Rope_RopeSubstring();
402 this->_S_deallocate(__ss, 1);
409 template <
class _CharT,
class _Alloc>
411 _Rope_RopeRep<_CharT, _Alloc>::
412 _S_free_string(
const _CharT*, std::size_t, allocator_type)
419 template <
class _CharT,
class _Alloc>
420 typename rope<_CharT, _Alloc>::_RopeLeaf*
421 rope<_CharT, _Alloc>::
422 _S_leaf_concat_char_iter(_RopeLeaf* __r,
const _CharT* __iter,
425 std::size_t __old_len = __r->_M_size;
426 _CharT* __new_data = (_CharT*)
427 rope::_Data_allocate(_S_rounded_up_size(__old_len + __len));
432 _S_cond_store_eos(__new_data[__old_len + __len]);
435 __result = _S_new_RopeLeaf(__new_data, __old_len + __len,
436 __r->_M_get_allocator());
440 _RopeRep::__STL_FREE_STRING(__new_data, __old_len + __len,
441 __r->_M_get_allocator());
442 __throw_exception_again;
449 template <
class _CharT,
class _Alloc>
450 typename rope<_CharT,_Alloc>::_RopeLeaf*
451 rope<_CharT, _Alloc>::
452 _S_destr_leaf_concat_char_iter(_RopeLeaf* __r,
const _CharT* __iter,
455 if (__r->_M_ref_count > 1)
456 return _S_leaf_concat_char_iter(__r, __iter, __len);
457 std::size_t __old_len = __r->_M_size;
458 if (_S_allocated_capacity(__old_len) >= __old_len + __len)
463 if (_S_is_basic_char_type((_CharT*)0))
464 _S_cond_store_eos(__r->_M_data[__old_len + __len]);
465 else if (__r->_M_c_string != __r->_M_data && 0 != __r->_M_c_string)
467 __r->_M_free_c_string();
468 __r->_M_c_string = 0;
470 __r->_M_size = __old_len + __len;
471 __r->_M_ref_count = 2;
476 _RopeLeaf* __result = _S_leaf_concat_char_iter(__r, __iter, __len);
485 template <
class _CharT,
class _Alloc>
486 typename rope<_CharT, _Alloc>::_RopeRep*
487 rope<_CharT, _Alloc>::
488 _S_tree_concat(_RopeRep* __left, _RopeRep* __right)
491 _RopeConcatenation* __result = _S_new_RopeConcatenation(__left, __right,
494 size_t __depth = __result->_M_depth;
497 && (__result->_M_size < 1000
498 || __depth >
size_t(__detail::_S_max_rope_depth)))
500 _RopeRep* __balanced;
504 __balanced = _S_balance(__result);
505 __result->_M_unref_nonnil();
509 rope::_C_deallocate(__result,1);
510 __throw_exception_again;
522 template <
class _CharT,
class _Alloc>
523 typename rope<_CharT, _Alloc>::_RopeRep*
524 rope<_CharT, _Alloc>::
525 _S_concat_char_iter(_RopeRep* __r,
const _CharT*__s, std::size_t __slen)
535 return __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen,
536 __r->_M_get_allocator());
537 if (__r->_M_tag == __detail::_S_leaf
538 && __r->_M_size + __slen <=
size_t(_S_copy_max))
540 __result = _S_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen);
543 if (__detail::_S_concat == __r->_M_tag
544 && __detail::_S_leaf == ((_RopeConcatenation*) __r)->_M_right->_M_tag)
547 (_RopeLeaf* )(((_RopeConcatenation* )__r)->_M_right);
548 if (__right->_M_size + __slen <=
size_t(_S_copy_max))
550 _RopeRep* __left = ((_RopeConcatenation*)__r)->_M_left;
552 _S_leaf_concat_char_iter((_RopeLeaf*)__right, __s, __slen);
553 __left->_M_ref_nonnil();
555 { __result = _S_tree_concat(__left, __nright); }
560 __throw_exception_again;
566 __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->_M_get_allocator());
569 __r->_M_ref_nonnil();
570 __result = _S_tree_concat(__r, __nright);
576 __throw_exception_again;
582 template <
class _CharT,
class _Alloc>
583 typename rope<_CharT,_Alloc>::_RopeRep*
584 rope<_CharT,_Alloc>::
585 _S_destr_concat_char_iter(_RopeRep* __r,
const _CharT* __s,
591 return __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen,
592 __r->_M_get_allocator());
593 size_t __count = __r->_M_ref_count;
594 size_t __orig_size = __r->_M_size;
596 return _S_concat_char_iter(__r, __s, __slen);
599 __r->_M_ref_count = 2;
602 if (__orig_size + __slen <=
size_t(_S_copy_max)
603 && __detail::_S_leaf == __r->_M_tag)
605 __result = _S_destr_leaf_concat_char_iter((_RopeLeaf*)__r, __s,
609 if (__detail::_S_concat == __r->_M_tag)
611 _RopeLeaf* __right = (_RopeLeaf*)(((_RopeConcatenation*)
613 if (__detail::_S_leaf == __right->_M_tag
614 && __right->_M_size + __slen <=
size_t(_S_copy_max))
616 _RopeRep* __new_right =
617 _S_destr_leaf_concat_char_iter(__right, __s, __slen);
618 if (__right == __new_right)
619 __new_right->_M_ref_count = 1;
621 __right->_M_unref_nonnil();
622 __r->_M_ref_count = 2;
623 ((_RopeConcatenation*)__r)->_M_right = __new_right;
624 __r->_M_size = __orig_size + __slen;
625 if (0 != __r->_M_c_string)
627 __r->_M_free_c_string();
628 __r->_M_c_string = 0;
634 __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->_M_get_allocator());
635 __r->_M_ref_nonnil();
637 { __result = _S_tree_concat(__r, __right); }
642 __throw_exception_again;
648 template <
class _CharT,
class _Alloc>
649 typename rope<_CharT, _Alloc>::_RopeRep*
650 rope<_CharT, _Alloc>::
651 _S_concat(_RopeRep* __left, _RopeRep* __right)
661 __left->_M_ref_nonnil();
664 if (__detail::_S_leaf == __right->_M_tag)
666 if (__detail::_S_leaf == __left->_M_tag)
668 if (__right->_M_size + __left->_M_size <=
size_t(_S_copy_max))
669 return _S_leaf_concat_char_iter((_RopeLeaf*)__left,
670 ((_RopeLeaf*)__right)->_M_data,
673 else if (__detail::_S_concat == __left->_M_tag
674 && __detail::_S_leaf == ((_RopeConcatenation*)
675 __left)->_M_right->_M_tag)
677 _RopeLeaf* __leftright =
678 (_RopeLeaf*)(((_RopeConcatenation*)__left)->_M_right);
679 if (__leftright->_M_size
680 + __right->_M_size <=
size_t(_S_copy_max))
682 _RopeRep* __leftleft = ((_RopeConcatenation*)__left)->_M_left;
683 _RopeRep* __rest = _S_leaf_concat_char_iter(__leftright,
688 __leftleft->_M_ref_nonnil();
690 {
return(_S_tree_concat(__leftleft, __rest)); }
693 _S_unref(__leftleft);
695 __throw_exception_again;
700 __left->_M_ref_nonnil();
701 __right->_M_ref_nonnil();
703 {
return(_S_tree_concat(__left, __right)); }
708 __throw_exception_again;
712 template <
class _CharT,
class _Alloc>
713 typename rope<_CharT, _Alloc>::_RopeRep*
714 rope<_CharT, _Alloc>::
715 _S_substring(_RopeRep*
__base, std::size_t __start, std::size_t __endp1)
720 size_t __len =
__base->_M_size;
722 const size_t __lazy_threshold = 128;
724 if (__endp1 >= __len)
736 __adj_endp1 = __endp1;
740 case __detail::_S_concat:
742 _RopeConcatenation* __c = (_RopeConcatenation*)
__base;
743 _RopeRep* __left = __c->_M_left;
744 _RopeRep* __right = __c->_M_right;
745 size_t __left_len = __left->_M_size;
748 if (__adj_endp1 <= __left_len)
749 return _S_substring(__left, __start, __endp1);
750 else if (__start >= __left_len)
751 return _S_substring(__right, __start - __left_len,
752 __adj_endp1 - __left_len);
753 _Self_destruct_ptr __left_result(_S_substring(__left,
756 _Self_destruct_ptr __right_result(_S_substring(__right, 0,
759 __result = _S_concat(__left_result, __right_result);
762 case __detail::_S_leaf:
764 _RopeLeaf* __l = (_RopeLeaf*)
__base;
767 if (__start >= __adj_endp1)
769 __result_len = __adj_endp1 - __start;
770 if (__result_len > __lazy_threshold)
773 const _CharT* __section = __l->_M_data + __start;
774 __result = _S_new_RopeLeaf(__section, __result_len,
775 __base->_M_get_allocator());
776 __result->_M_c_string = 0;
779 __result = __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__l->_M_data + __start,
786 case __detail::_S_substringfn:
789 _RopeSubstring* __old = (_RopeSubstring*)
__base;
791 if (__start >= __adj_endp1)
793 __result_len = __adj_endp1 - __start;
794 if (__result_len > __lazy_threshold)
796 _RopeSubstring* __result =
797 _S_new_RopeSubstring(__old->_M_base,
798 __start + __old->_M_start,
799 __adj_endp1 - __start,
800 __base->_M_get_allocator());
805 case __detail::_S_function:
807 _RopeFunction* __f = (_RopeFunction*)
__base;
810 if (__start >= __adj_endp1)
812 __result_len = __adj_endp1 - __start;
814 if (__result_len > __lazy_threshold)
816 __section = (_CharT*)
817 rope::_Data_allocate(_S_rounded_up_size(__result_len));
819 { (*(__f->_M_fn))(__start, __result_len, __section); }
822 _RopeRep::__STL_FREE_STRING(__section, __result_len,
823 __base->_M_get_allocator());
824 __throw_exception_again;
826 _S_cond_store_eos(__section[__result_len]);
827 return _S_new_RopeLeaf(__section, __result_len,
828 __base->_M_get_allocator());
834 return _S_new_RopeSubstring(
__base, __start, __adj_endp1 - __start,
835 __base->_M_get_allocator());
839 template<
class _CharT>
840 class _Rope_flatten_char_consumer
841 :
public _Rope_char_consumer<_CharT>
847 _Rope_flatten_char_consumer(_CharT* __buffer)
848 { _M_buf_ptr = __buffer; }
850 ~_Rope_flatten_char_consumer() {}
853 operator()(
const _CharT* __leaf, std::size_t __n)
861 template<
class _CharT>
862 class _Rope_find_char_char_consumer
863 :
public _Rope_char_consumer<_CharT>
868 std::size_t _M_count;
870 _Rope_find_char_char_consumer(_CharT __p)
871 : _M_pattern(__p), _M_count(0) {}
873 ~_Rope_find_char_char_consumer() {}
876 operator()(
const _CharT* __leaf, std::size_t __n)
879 for (__i = 0; __i < __n; __i++)
881 if (__leaf[__i] == _M_pattern)
887 _M_count += __n;
return true;
891 template<
class _CharT,
class _Traits>
893 class _Rope_insert_char_consumer
894 :
public _Rope_char_consumer<_CharT>
898 _Insert_ostream& _M_o;
900 _Rope_insert_char_consumer(_Insert_ostream& __writer)
902 ~_Rope_insert_char_consumer() { }
904 bool operator() (
const _CharT* __leaf, std::size_t __n);
908 template<
class _CharT,
class _Traits>
910 _Rope_insert_char_consumer<_CharT, _Traits>::
911 operator()(
const _CharT* __leaf, std::size_t __n)
915 for (__i = 0; __i < __n; __i++)
916 _M_o.put(__leaf[__i]);
920 template <
class _CharT,
class _Alloc>
922 rope<_CharT, _Alloc>::
923 _S_apply_to_pieces(_Rope_char_consumer<_CharT>& __c,
const _RopeRep* __r,
924 std::size_t __begin, std::size_t __end)
931 case __detail::_S_concat:
933 _RopeConcatenation* __conc = (_RopeConcatenation*)__r;
934 _RopeRep* __left = __conc->_M_left;
935 size_t __left_len = __left->_M_size;
936 if (__begin < __left_len)
938 size_t __left_end =
std::min(__left_len, __end);
939 if (!_S_apply_to_pieces(__c, __left, __begin, __left_end))
942 if (__end > __left_len)
944 _RopeRep* __right = __conc->_M_right;
945 size_t __right_start =
std::max(__left_len, __begin);
946 if (!_S_apply_to_pieces(__c, __right,
947 __right_start - __left_len,
953 case __detail::_S_leaf:
955 _RopeLeaf* __l = (_RopeLeaf*)__r;
956 return __c(__l->_M_data + __begin, __end - __begin);
958 case __detail::_S_function:
959 case __detail::_S_substringfn:
961 _RopeFunction* __f = (_RopeFunction*)__r;
962 size_t __len = __end - __begin;
965 (_CharT*)_Alloc().allocate(__len *
sizeof(_CharT));
968 (*(__f->_M_fn))(__begin, __len, __buffer);
969 __result = __c(__buffer, __len);
970 _Alloc().deallocate(__buffer, __len *
sizeof(_CharT));
974 _Alloc().deallocate(__buffer, __len *
sizeof(_CharT));
975 __throw_exception_again;
984 template<
class _CharT,
class _Traits>
988 char __f = __o.
fill();
991 for (__i = 0; __i < __n; __i++)
996 template <
class _CharT>
998 _Rope_is_simple(_CharT*)
1002 _Rope_is_simple(
char*)
1006 _Rope_is_simple(
wchar_t*)
1009 template<
class _CharT,
class _Traits,
class _Alloc>
1012 const rope<_CharT, _Alloc>& __r)
1015 size_t __w = __o.
width();
1018 size_t __rope_len = __r.size();
1019 _Rope_insert_char_consumer<_CharT, _Traits> __c(__o);
1020 bool __is_simple = _Rope_is_simple((_CharT*)0);
1022 if (__rope_len < __w)
1023 __pad_len = __w - __rope_len;
1028 __o.
width(__w / __rope_len);
1031 if (__is_simple && !__left && __pad_len > 0)
1032 _Rope_fill(__o, __pad_len);
1033 __r.apply_to_pieces(0, __r.size(), __c);
1034 if (__is_simple && __left && __pad_len > 0)
1035 _Rope_fill(__o, __pad_len);
1043 __throw_exception_again;
1048 template <
class _CharT,
class _Alloc>
1050 rope<_CharT, _Alloc>::
1051 _S_flatten(_RopeRep* __r, std::size_t __start, std::size_t __len,
1054 _Rope_flatten_char_consumer<_CharT> __c(__buffer);
1055 _S_apply_to_pieces(__c, __r, __start, __start + __len);
1056 return(__buffer + __len);
1059 template <
class _CharT,
class _Alloc>
1061 rope<_CharT, _Alloc>::
1062 find(_CharT __pattern, std::size_t __start)
const
1064 _Rope_find_char_char_consumer<_CharT> __c(__pattern);
1065 _S_apply_to_pieces(__c, this->_M_tree_ptr, __start, size());
1066 size_type __result_pos = __start + __c._M_count;
1067 #ifndef __STL_OLD_ROPE_SEMANTICS
1068 if (__result_pos == size())
1069 __result_pos = npos;
1071 return __result_pos;
1074 template <
class _CharT,
class _Alloc>
1076 rope<_CharT, _Alloc>::
1077 _S_flatten(_RopeRep* __r, _CharT* __buffer)
1083 case __detail::_S_concat:
1085 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1086 _RopeRep* __left = __c->_M_left;
1087 _RopeRep* __right = __c->_M_right;
1088 _CharT* __rest = _S_flatten(__left, __buffer);
1089 return _S_flatten(__right, __rest);
1091 case __detail::_S_leaf:
1093 _RopeLeaf* __l = (_RopeLeaf*)__r;
1094 return copy_n(__l->_M_data, __l->_M_size, __buffer).second;
1096 case __detail::_S_function:
1097 case __detail::_S_substringfn:
1101 _RopeFunction* __f = (_RopeFunction*)__r;
1102 (*(__f->_M_fn))(0, __f->_M_size, __buffer);
1103 return __buffer + __f->_M_size;
1111 template <
class _CharT,
class _Alloc>
1113 rope<_CharT, _Alloc>::
1114 _S_dump(_RopeRep* __r,
int __indent)
1117 for (
int __i = 0; __i < __indent; __i++)
1124 if (__detail::_S_concat == __r->_M_tag)
1126 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1127 _RopeRep* __left = __c->_M_left;
1128 _RopeRep* __right = __c->_M_right;
1131 printf(
"Concatenation %p (depth = %d, len = %ld, %s balanced)\n",
1132 __r, __r->_M_depth, __r->_M_size,
1133 __r->_M_is_balanced?
"" :
"not");
1135 printf(
"Concatenation %p (rc = %ld, depth = %d, "
1136 "len = %ld, %s balanced)\n",
1137 __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size,
1138 __r->_M_is_balanced?
"" :
"not");
1140 _S_dump(__left, __indent + 2);
1141 _S_dump(__right, __indent + 2);
1148 switch (__r->_M_tag)
1150 case __detail::_S_leaf:
1153 case __detail::_S_function:
1154 __kind =
"Function";
1156 case __detail::_S_substringfn:
1157 __kind =
"Function representing substring";
1160 __kind =
"(corrupted kind field!)";
1163 printf(
"%s %p (depth = %d, len = %ld) ",
1164 __kind, __r, __r->_M_depth, __r->_M_size);
1166 printf(
"%s %p (rc = %ld, depth = %d, len = %ld) ",
1167 __kind, __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size);
1169 if (_S_is_one_byte_char_type((_CharT*)0))
1171 const int __max_len = 40;
1172 _Self_destruct_ptr __prefix(_S_substring(__r, 0, __max_len));
1173 _CharT __buffer[__max_len + 1];
1174 bool __too_big = __r->_M_size > __prefix->_M_size;
1176 _S_flatten(__prefix, __buffer);
1177 __buffer[__prefix->_M_size] = _S_eos((_CharT*)0);
1178 printf(
"%s%s\n", (
char*)__buffer,
1179 __too_big?
"...\n" :
"\n");
1186 template <
class _CharT,
class _Alloc>
1188 rope<_CharT, _Alloc>::
1189 _S_min_len[int(__detail::_S_max_rope_depth) + 1] = {
1190 1, 2, 3, 5, 8, 13, 21,
1191 34, 55, 89, 144, 233, 377,
1192 610, 987, 1597, 2584, 4181,
1193 6765, 10946, 17711, 28657, 46368,
1194 75025, 121393, 196418, 317811,
1195 514229, 832040, 1346269, 2178309,
1196 3524578, 5702887, 9227465, 14930352,
1197 24157817, 39088169, 63245986, 102334155,
1198 165580141, 267914296, 433494437,
1199 701408733, 1134903170, 1836311903,
1203 template <
class _CharT,
class _Alloc>
1204 typename rope<_CharT, _Alloc>::_RopeRep*
1205 rope<_CharT, _Alloc>::
1206 _S_balance(_RopeRep* __r)
1208 _RopeRep* __forest[int(__detail::_S_max_rope_depth) + 1];
1209 _RopeRep* __result = 0;
1217 for (__i = 0; __i <= int(__detail::_S_max_rope_depth); ++__i)
1221 _S_add_to_forest(__r, __forest);
1222 for (__i = 0; __i <= int(__detail::_S_max_rope_depth); ++__i)
1223 if (0 != __forest[__i])
1226 _Self_destruct_ptr __old(__result);
1228 __result = _S_concat(__forest[__i], __result);
1229 __forest[__i]->_M_unref_nonnil();
1230 #if !defined(__GC) && __cpp_exceptions
1237 for(__i = 0; __i <= int(__detail::_S_max_rope_depth); __i++)
1238 _S_unref(__forest[__i]);
1239 __throw_exception_again;
1242 if (__result->_M_depth >
int(__detail::_S_max_rope_depth))
1243 std::__throw_length_error(__N(
"rope::_S_balance"));
1247 template <
class _CharT,
class _Alloc>
1249 rope<_CharT, _Alloc>::
1250 _S_add_to_forest(_RopeRep* __r, _RopeRep** __forest)
1252 if (__r->_M_is_balanced)
1254 _S_add_leaf_to_forest(__r, __forest);
1259 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1261 _S_add_to_forest(__c->_M_left, __forest);
1262 _S_add_to_forest(__c->_M_right, __forest);
1267 template <
class _CharT,
class _Alloc>
1269 rope<_CharT, _Alloc>::
1270 _S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest)
1272 _RopeRep* __insertee;
1273 _RopeRep* __too_tiny = 0;
1275 std::size_t __s = __r->_M_size;
1277 for (__i = 0; __s >= _S_min_len[__i+1]; ++__i)
1279 if (0 != __forest[__i])
1282 _Self_destruct_ptr __old(__too_tiny);
1284 __too_tiny = _S_concat_and_set_balanced(__forest[__i],
1286 __forest[__i]->_M_unref_nonnil();
1292 _Self_destruct_ptr __old(__too_tiny);
1294 __insertee = _S_concat_and_set_balanced(__too_tiny, __r);
1300 if (0 != __forest[__i])
1303 _Self_destruct_ptr __old(__insertee);
1305 __insertee = _S_concat_and_set_balanced(__forest[__i],
1307 __forest[__i]->_M_unref_nonnil();
1310 if (__i ==
int(__detail::_S_max_rope_depth)
1311 || __insertee->_M_size < _S_min_len[__i+1])
1313 __forest[__i] = __insertee;
1320 template <
class _CharT,
class _Alloc>
1322 rope<_CharT, _Alloc>::
1323 _S_fetch(_RopeRep* __r, size_type __i)
1325 __GC_CONST _CharT* __cstr = __r->_M_c_string;
1333 case __detail::_S_concat:
1335 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1336 _RopeRep* __left = __c->_M_left;
1337 std::size_t __left_len = __left->_M_size;
1339 if (__i >= __left_len)
1342 __r = __c->_M_right;
1348 case __detail::_S_leaf:
1350 _RopeLeaf* __l = (_RopeLeaf*)__r;
1351 return __l->_M_data[__i];
1353 case __detail::_S_function:
1354 case __detail::_S_substringfn:
1356 _RopeFunction* __f = (_RopeFunction*)__r;
1359 (*(__f->_M_fn))(__i, 1, &__result);
1369 template <
class _CharT,
class _Alloc>
1371 rope<_CharT, _Alloc>::
1372 _S_fetch_ptr(_RopeRep* __r, size_type __i)
1374 _RopeRep* __clrstack[__detail::_S_max_rope_depth];
1375 std::size_t __csptr = 0;
1379 if (__r->_M_ref_count > 1)
1383 case __detail::_S_concat:
1385 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1386 _RopeRep* __left = __c->_M_left;
1387 std::size_t __left_len = __left->_M_size;
1389 if (__c->_M_c_string != 0)
1390 __clrstack[__csptr++] = __c;
1391 if (__i >= __left_len)
1394 __r = __c->_M_right;
1400 case __detail::_S_leaf:
1402 _RopeLeaf* __l = (_RopeLeaf*)__r;
1403 if (__l->_M_c_string != __l->_M_data && __l->_M_c_string != 0)
1404 __clrstack[__csptr++] = __l;
1408 _RopeRep* __d = __clrstack[__csptr];
1409 __d->_M_free_c_string();
1410 __d->_M_c_string = 0;
1412 return __l->_M_data + __i;
1414 case __detail::_S_function:
1415 case __detail::_S_substringfn:
1426 template <
class _CharT,
class _Alloc>
1428 rope<_CharT, _Alloc>::
1429 _S_compare (
const _RopeRep* __left,
const _RopeRep* __right)
1431 std::size_t __left_len;
1432 std::size_t __right_len;
1438 __left_len = __left->_M_size;
1439 __right_len = __right->_M_size;
1440 if (__detail::_S_leaf == __left->_M_tag)
1442 _RopeLeaf* __l = (_RopeLeaf*) __left;
1443 if (__detail::_S_leaf == __right->_M_tag)
1445 _RopeLeaf* __r = (_RopeLeaf*) __right;
1447 __l->_M_data + __left_len,
1448 __r->_M_data, __r->_M_data
1453 const_iterator __rstart(__right, 0);
1454 const_iterator __rend(__right, __right_len);
1462 const_iterator __lstart(__left, 0);
1463 const_iterator __lend(__left, __left_len);
1464 if (__detail::_S_leaf == __right->_M_tag)
1466 _RopeLeaf* __r = (_RopeLeaf*) __right;
1468 __r->_M_data, __r->_M_data
1473 const_iterator __rstart(__right, 0);
1474 const_iterator __rend(__right, __right_len);
1482 template <
class _CharT,
class _Alloc>
1483 _Rope_char_ref_proxy<_CharT, _Alloc>&
1484 _Rope_char_ref_proxy<_CharT, _Alloc>::
1485 operator=(_CharT __c)
1487 _RopeRep* __old = _M_root->_M_tree_ptr;
1491 _CharT* __ptr = _My_rope::_S_fetch_ptr(__old, _M_pos);
1498 _Self_destruct_ptr __left(_My_rope::_S_substring(__old, 0, _M_pos));
1499 _Self_destruct_ptr __right(_My_rope::_S_substring(__old, _M_pos + 1,
1501 _Self_destruct_ptr __result_left(_My_rope::
1502 _S_destr_concat_char_iter(__left,
1505 _RopeRep* __result = _My_rope::_S_concat(__result_left, __right);
1507 _RopeRep::_S_unref(__old);
1509 _M_root->_M_tree_ptr = __result;
1513 template <
class _CharT,
class _Alloc>
1514 inline _Rope_char_ref_proxy<_CharT, _Alloc>::
1515 operator _CharT()
const
1517 if (_M_current_valid)
1520 return _My_rope::_S_fetch(_M_root->_M_tree_ptr, _M_pos);
1523 template <
class _CharT,
class _Alloc>
1524 _Rope_char_ptr_proxy<_CharT, _Alloc>
1527 {
return _Rope_char_ptr_proxy<_CharT, _Alloc>(*
this); }
1529 template <
class _CharT,
class _Alloc>
1530 rope<_CharT, _Alloc>::
1531 rope(std::size_t __n, _CharT __c,
const allocator_type& __a)
1534 using std::__uninitialized_fill_n_a;
1536 rope<_CharT,_Alloc> __result;
1537 const std::size_t __exponentiate_threshold = 32;
1538 std::size_t __exponent;
1540 _CharT* __rest_buffer;
1541 _RopeRep* __remainder;
1542 rope<_CharT, _Alloc> __remainder_rope;
1547 __exponent = __n / __exponentiate_threshold;
1548 __rest = __n % __exponentiate_threshold;
1553 __rest_buffer = this->_Data_allocate(_S_rounded_up_size(__rest));
1554 __uninitialized_fill_n_a(__rest_buffer, __rest, __c,
1555 _M_get_allocator());
1556 _S_cond_store_eos(__rest_buffer[__rest]);
1558 { __remainder = _S_new_RopeLeaf(__rest_buffer, __rest,
1559 _M_get_allocator()); }
1562 _RopeRep::__STL_FREE_STRING(__rest_buffer, __rest,
1563 _M_get_allocator());
1564 __throw_exception_again;
1567 __remainder_rope._M_tree_ptr = __remainder;
1568 if (__exponent != 0)
1570 _CharT* __base_buffer =
1571 this->_Data_allocate(_S_rounded_up_size(__exponentiate_threshold));
1572 _RopeLeaf* __base_leaf;
1574 __uninitialized_fill_n_a(__base_buffer, __exponentiate_threshold, __c,
1575 _M_get_allocator());
1576 _S_cond_store_eos(__base_buffer[__exponentiate_threshold]);
1579 __base_leaf = _S_new_RopeLeaf(__base_buffer,
1580 __exponentiate_threshold,
1581 _M_get_allocator());
1585 _RopeRep::__STL_FREE_STRING(__base_buffer,
1586 __exponentiate_threshold,
1587 _M_get_allocator());
1588 __throw_exception_again;
1590 __base_rope._M_tree_ptr = __base_leaf;
1591 if (1 == __exponent)
1592 __result = __base_rope;
1594 __result =
power(__base_rope, __exponent,
1595 _Rope_Concat_fn<_CharT, _Alloc>());
1597 if (0 != __remainder)
1598 __result += __remainder_rope;
1601 __result = __remainder_rope;
1603 this->_M_tree_ptr = __result._M_tree_ptr;
1604 this->_M_tree_ptr->_M_ref_nonnil();
1607 template<
class _CharT,
class _Alloc>
1609 rope<_CharT, _Alloc>::_S_empty_c_str[1];
1611 template<
class _CharT,
class _Alloc>
1613 rope<_CharT, _Alloc>::
1616 if (0 == this->_M_tree_ptr)
1618 _S_empty_c_str[0] = _S_eos((_CharT*)0);
1620 return _S_empty_c_str;
1622 __gthread_mutex_lock (&this->_M_tree_ptr->_M_c_string_lock);
1623 __GC_CONST _CharT* __result = this->_M_tree_ptr->_M_c_string;
1626 std::size_t __s = size();
1627 __result = this->_Data_allocate(__s + 1);
1628 _S_flatten(this->_M_tree_ptr, __result);
1629 __result[__s] = _S_eos((_CharT*)0);
1630 this->_M_tree_ptr->_M_c_string = __result;
1632 __gthread_mutex_unlock (&this->_M_tree_ptr->_M_c_string_lock);
1636 template<
class _CharT,
class _Alloc>
1637 const _CharT* rope<_CharT, _Alloc>::
1638 replace_with_c_str()
1640 if (0 == this->_M_tree_ptr)
1642 _S_empty_c_str[0] = _S_eos((_CharT*)0);
1643 return _S_empty_c_str;
1645 __GC_CONST _CharT* __old_c_string = this->_M_tree_ptr->_M_c_string;
1646 if (__detail::_S_leaf == this->_M_tree_ptr->_M_tag
1647 && 0 != __old_c_string)
1648 return(__old_c_string);
1649 std::size_t __s = size();
1650 _CharT* __result = this->_Data_allocate(_S_rounded_up_size(__s));
1651 _S_flatten(this->_M_tree_ptr, __result);
1652 __result[__s] = _S_eos((_CharT*)0);
1653 this->_M_tree_ptr->_M_unref_nonnil();
1654 this->_M_tree_ptr = _S_new_RopeLeaf(__result, __s,
1655 this->_M_get_allocator());
1661 template<
class _Rope_iterator>
1663 _Rope_rotate(_Rope_iterator __first,
1664 _Rope_iterator __middle,
1665 _Rope_iterator __last)
1667 typedef typename _Rope_iterator::value_type _CharT;
1668 typedef typename _Rope_iterator::_allocator_type _Alloc;
1670 rope<_CharT, _Alloc>& __r(__first.container());
1671 rope<_CharT, _Alloc> __prefix = __r.substr(0, __first.index());
1672 rope<_CharT, _Alloc> __suffix =
1673 __r.substr(__last.index(), __r.size() - __last.index());
1674 rope<_CharT, _Alloc> __part1 =
1675 __r.substr(__middle.index(), __last.index() - __middle.index());
1676 rope<_CharT, _Alloc> __part2 =
1677 __r.substr(__first.index(), __middle.index() - __first.index());
1684 #if !defined(__GNUC__)
1687 rotate(_Rope_iterator<
char, __STL_DEFAULT_ALLOCATOR(
char)> __first,
1688 _Rope_iterator<
char, __STL_DEFAULT_ALLOCATOR(
char)> __middle,
1689 _Rope_iterator<
char, __STL_DEFAULT_ALLOCATOR(
char)> __last)
1690 { _Rope_rotate(__first, __middle, __last); }
1702 rotate(_Rope_iterator<
wchar_t, __STL_DEFAULT_ALLOCATOR(
char)> __first,
1703 _Rope_iterator<
wchar_t, __STL_DEFAULT_ALLOCATOR(
char)> __middle,
1704 _Rope_iterator<
wchar_t, __STL_DEFAULT_ALLOCATOR(
char)> __last)
1705 { _Rope_rotate(__first, __middle, __last); }
1708 _GLIBCXX_END_NAMESPACE_VERSION
1710
_Tp power(_Tp __x, _Integer __n, _MonoidOperation __monoid_op)
int lexicographical_compare_3way(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
memcmp on steroids.
_ForwardIterator uninitialized_copy_n(_InputIterator __first, _Size __n, _ForwardIterator __result)
Copies the range [first,first+n) into result.
constexpr const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
constexpr const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
basic_ostream< _Ch_type, _Ch_traits > & operator<<(basic_ostream< _Ch_type, _Ch_traits > &__os, const sub_match< _Bi_iter > &__m)
Inserts a matched string into an output stream.
bitset< _Nb > operator&(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
void _Destroy(_ForwardIterator __first, _ForwardIterator __last, _Allocator &__alloc)
GNU extensions for public use.
constexpr _Iterator __base(_Iterator __it)
char_type fill() const
Retrieves the empty character.
Template class basic_ostream.
__ostream_type & put(char_type __c)
Simple insertion.
fmtflags flags() const
Access to format flags.
streamsize width() const
Flags access.
static const fmtflags left
Adds fill characters on the right (final positions) of certain generated output. (I....