51namespace __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>::
386 ~_Rope_RopeConcatenation();
387 this->_C_deallocate(__c, 1);
390 case __detail::_S_function:
392 _Rope_RopeFunction<_CharT, _Alloc>* __f
393 = (_Rope_RopeFunction<_CharT, _Alloc>*)
this;
394 __f->_Rope_RopeFunction<_CharT, _Alloc>::~_Rope_RopeFunction();
395 this->_F_deallocate(__f, 1);
398 case __detail::_S_substringfn:
400 _Rope_RopeSubstring<_CharT, _Alloc>* __ss =
401 (_Rope_RopeSubstring<_CharT, _Alloc>*)
this;
402 __ss->_Rope_RopeSubstring<_CharT, _Alloc>::
403 ~_Rope_RopeSubstring();
404 this->_S_deallocate(__ss, 1);
411 template <
class _CharT,
class _Alloc>
413 _Rope_RopeRep<_CharT, _Alloc>::
414 _S_free_string(
const _CharT*, std::size_t, allocator_type)
421 template <
class _CharT,
class _Alloc>
422 typename rope<_CharT, _Alloc>::_RopeLeaf*
423 rope<_CharT, _Alloc>::
424 _S_leaf_concat_char_iter(_RopeLeaf* __r,
const _CharT* __iter,
427 std::size_t __old_len = __r->_M_size;
428 _CharT* __new_data = (_CharT*)
429 rope::_Data_allocate(_S_rounded_up_size(__old_len + __len));
434 _S_cond_store_eos(__new_data[__old_len + __len]);
437 __result = _S_new_RopeLeaf(__new_data, __old_len + __len,
438 __r->_M_get_allocator());
442 _RopeRep::__STL_FREE_STRING(__new_data, __old_len + __len,
443 __r->_M_get_allocator());
444 __throw_exception_again;
451 template <
class _CharT,
class _Alloc>
452 typename rope<_CharT,_Alloc>::_RopeLeaf*
453 rope<_CharT, _Alloc>::
454 _S_destr_leaf_concat_char_iter(_RopeLeaf* __r,
const _CharT* __iter,
457 if (__r->_M_ref_count > 1)
458 return _S_leaf_concat_char_iter(__r, __iter, __len);
459 std::size_t __old_len = __r->_M_size;
460 if (_S_allocated_capacity(__old_len) >= __old_len + __len)
465 if (_S_is_basic_char_type((_CharT*)0))
466 _S_cond_store_eos(__r->_M_data[__old_len + __len]);
467 else if (__r->_M_c_string != __r->_M_data && 0 != __r->_M_c_string)
469 __r->_M_free_c_string();
470 __r->_M_c_string = 0;
472 __r->_M_size = __old_len + __len;
473 __r->_M_ref_count = 2;
478 _RopeLeaf* __result = _S_leaf_concat_char_iter(__r, __iter, __len);
487 template <
class _CharT,
class _Alloc>
488 typename rope<_CharT, _Alloc>::_RopeRep*
489 rope<_CharT, _Alloc>::
490 _S_tree_concat(_RopeRep* __left, _RopeRep* __right)
493 _RopeConcatenation* __result = _S_new_RopeConcatenation(__left, __right,
496 size_t __depth = __result->_M_depth;
499 && (__result->_M_size < 1000
500 || __depth >
size_t(__detail::_S_max_rope_depth)))
502 _RopeRep* __balanced;
506 __balanced = _S_balance(__result);
507 __result->_M_unref_nonnil();
511 rope::_C_deallocate(__result,1);
512 __throw_exception_again;
524 template <
class _CharT,
class _Alloc>
525 typename rope<_CharT, _Alloc>::_RopeRep*
526 rope<_CharT, _Alloc>::
527 _S_concat_char_iter(_RopeRep* __r,
const _CharT*__s, std::size_t __slen,
538 return __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __a);
539 if (__r->_M_tag == __detail::_S_leaf
540 && __r->_M_size + __slen <=
size_t(_S_copy_max))
542 __result = _S_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen);
545 if (__detail::_S_concat == __r->_M_tag
546 && __detail::_S_leaf == ((_RopeConcatenation*) __r)->_M_right->_M_tag)
549 (_RopeLeaf* )(((_RopeConcatenation* )__r)->_M_right);
550 if (__right->_M_size + __slen <=
size_t(_S_copy_max))
552 _RopeRep* __left = ((_RopeConcatenation*)__r)->_M_left;
554 _S_leaf_concat_char_iter((_RopeLeaf*)__right, __s, __slen);
555 __left->_M_ref_nonnil();
557 { __result = _S_tree_concat(__left, __nright); }
562 __throw_exception_again;
567 _RopeRep* __nright = __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __a);
570 __r->_M_ref_nonnil();
571 __result = _S_tree_concat(__r, __nright);
577 __throw_exception_again;
583 template <
class _CharT,
class _Alloc>
584 typename rope<_CharT,_Alloc>::_RopeRep*
585 rope<_CharT,_Alloc>::
586 _S_destr_concat_char_iter(_RopeRep* __r,
const _CharT* __s,
587 std::size_t __slen, allocator_type& __a)
592 return __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __a);
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, __a);
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;
633 _RopeRep* __right = __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __a);
634 __r->_M_ref_nonnil();
636 { __result = _S_tree_concat(__r, __right); }
641 __throw_exception_again;
647 template <
class _CharT,
class _Alloc>
648 typename rope<_CharT, _Alloc>::_RopeRep*
649 rope<_CharT, _Alloc>::
650 _S_concat(_RopeRep* __left, _RopeRep* __right)
660 __left->_M_ref_nonnil();
663 if (__detail::_S_leaf == __right->_M_tag)
665 if (__detail::_S_leaf == __left->_M_tag)
667 if (__right->_M_size + __left->_M_size <=
size_t(_S_copy_max))
668 return _S_leaf_concat_char_iter((_RopeLeaf*)__left,
669 ((_RopeLeaf*)__right)->_M_data,
672 else if (__detail::_S_concat == __left->_M_tag
673 && __detail::_S_leaf == ((_RopeConcatenation*)
674 __left)->_M_right->_M_tag)
676 _RopeLeaf* __leftright =
677 (_RopeLeaf*)(((_RopeConcatenation*)__left)->_M_right);
678 if (__leftright->_M_size
679 + __right->_M_size <=
size_t(_S_copy_max))
681 _RopeRep* __leftleft = ((_RopeConcatenation*)__left)->_M_left;
682 _RopeRep* __rest = _S_leaf_concat_char_iter(__leftright,
687 __leftleft->_M_ref_nonnil();
689 {
return(_S_tree_concat(__leftleft, __rest)); }
692 _S_unref(__leftleft);
694 __throw_exception_again;
699 __left->_M_ref_nonnil();
700 __right->_M_ref_nonnil();
702 {
return(_S_tree_concat(__left, __right)); }
707 __throw_exception_again;
711 template <
class _CharT,
class _Alloc>
712 typename rope<_CharT, _Alloc>::_RopeRep*
713 rope<_CharT, _Alloc>::
714 _S_substring(_RopeRep* __base, std::size_t __start, std::size_t __endp1)
719 size_t __len =
__base->_M_size;
721 const size_t __lazy_threshold = 128;
723 if (__endp1 >= __len)
735 __adj_endp1 = __endp1;
739 case __detail::_S_concat:
741 _RopeConcatenation* __c = (_RopeConcatenation*)__base;
742 _RopeRep* __left = __c->_M_left;
743 _RopeRep* __right = __c->_M_right;
744 size_t __left_len = __left->_M_size;
747 if (__adj_endp1 <= __left_len)
748 return _S_substring(__left, __start, __endp1);
749 else if (__start >= __left_len)
750 return _S_substring(__right, __start - __left_len,
751 __adj_endp1 - __left_len);
752 _Self_destruct_ptr __left_result(_S_substring(__left,
755 _Self_destruct_ptr __right_result(_S_substring(__right, 0,
758 __result = _S_concat(__left_result, __right_result);
761 case __detail::_S_leaf:
763 _RopeLeaf* __l = (_RopeLeaf*)__base;
766 if (__start >= __adj_endp1)
768 __result_len = __adj_endp1 - __start;
769 if (__result_len > __lazy_threshold)
772 const _CharT* __section = __l->_M_data + __start;
773 __result = _S_new_RopeLeaf(__section, __result_len,
774 __base->_M_get_allocator());
775 __result->_M_c_string = 0;
778 __result = __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__l->_M_data + __start,
785 case __detail::_S_substringfn:
788 _RopeSubstring* __old = (_RopeSubstring*)__base;
790 if (__start >= __adj_endp1)
792 __result_len = __adj_endp1 - __start;
793 if (__result_len > __lazy_threshold)
795 _RopeSubstring* __result =
796 _S_new_RopeSubstring(__old->_M_base,
797 __start + __old->_M_start,
798 __adj_endp1 - __start,
799 __base->_M_get_allocator());
804 case __detail::_S_function:
806 _RopeFunction* __f = (_RopeFunction*)__base;
809 if (__start >= __adj_endp1)
811 __result_len = __adj_endp1 - __start;
813 if (__result_len > __lazy_threshold)
815 __section = (_CharT*)
816 rope::_Data_allocate(_S_rounded_up_size(__result_len));
818 { (*(__f->_M_fn))(__start, __result_len, __section); }
821 _RopeRep::__STL_FREE_STRING(__section, __result_len,
822 __base->_M_get_allocator());
823 __throw_exception_again;
825 _S_cond_store_eos(__section[__result_len]);
826 return _S_new_RopeLeaf(__section, __result_len,
827 __base->_M_get_allocator());
833 return _S_new_RopeSubstring(__base, __start, __adj_endp1 - __start,
834 __base->_M_get_allocator());
838 template<
class _CharT>
839 class _Rope_flatten_char_consumer
840 :
public _Rope_char_consumer<_CharT>
846 _Rope_flatten_char_consumer(_CharT* __buffer)
847 { _M_buf_ptr = __buffer; }
849 ~_Rope_flatten_char_consumer() {}
852 operator()(
const _CharT* __leaf, std::size_t __n)
860 template<
class _CharT>
861 class _Rope_find_char_char_consumer
862 :
public _Rope_char_consumer<_CharT>
867 std::size_t _M_count;
869 _Rope_find_char_char_consumer(_CharT __p)
870 : _M_pattern(__p), _M_count(0) {}
872 ~_Rope_find_char_char_consumer() {}
875 operator()(
const _CharT* __leaf, std::size_t __n)
878 for (__i = 0; __i < __n; __i++)
880 if (__leaf[__i] == _M_pattern)
886 _M_count += __n;
return true;
890 template<
class _CharT,
class _Traits>
892 class _Rope_insert_char_consumer
893 :
public _Rope_char_consumer<_CharT>
897 _Insert_ostream& _M_o;
899 _Rope_insert_char_consumer(_Insert_ostream& __writer)
901 ~_Rope_insert_char_consumer() { }
903 bool operator() (
const _CharT* __leaf, std::size_t __n);
907 template<
class _CharT,
class _Traits>
909 _Rope_insert_char_consumer<_CharT, _Traits>::
910 operator()(
const _CharT* __leaf, std::size_t __n)
914 for (__i = 0; __i < __n; __i++)
915 _M_o.put(__leaf[__i]);
919 template <
class _CharT,
class _Alloc>
921 rope<_CharT, _Alloc>::
922 _S_apply_to_pieces(_Rope_char_consumer<_CharT>& __c,
const _RopeRep* __r,
923 std::size_t __begin, std::size_t __end)
930 case __detail::_S_concat:
932 _RopeConcatenation* __conc = (_RopeConcatenation*)__r;
933 _RopeRep* __left = __conc->_M_left;
934 size_t __left_len = __left->_M_size;
935 if (__begin < __left_len)
937 size_t __left_end =
std::min(__left_len, __end);
938 if (!_S_apply_to_pieces(__c, __left, __begin, __left_end))
941 if (__end > __left_len)
943 _RopeRep* __right = __conc->_M_right;
944 size_t __right_start =
std::max(__left_len, __begin);
945 if (!_S_apply_to_pieces(__c, __right,
946 __right_start - __left_len,
952 case __detail::_S_leaf:
954 _RopeLeaf* __l = (_RopeLeaf*)__r;
955 return __c(__l->_M_data + __begin, __end - __begin);
957 case __detail::_S_function:
958 case __detail::_S_substringfn:
960 _RopeFunction* __f = (_RopeFunction*)__r;
961 size_t __len = __end - __begin;
964 (_CharT*)_Alloc().allocate(__len *
sizeof(_CharT));
967 (*(__f->_M_fn))(__begin, __len, __buffer);
968 __result = __c(__buffer, __len);
969 _Alloc().deallocate(__buffer, __len *
sizeof(_CharT));
973 _Alloc().deallocate(__buffer, __len *
sizeof(_CharT));
974 __throw_exception_again;
983 template<
class _CharT,
class _Traits>
987 char __f = __o.
fill();
990 for (__i = 0; __i < __n; __i++)
995 template <
class _CharT>
997 _Rope_is_simple(_CharT*)
1001 _Rope_is_simple(
char*)
1005 _Rope_is_simple(
wchar_t*)
1008 template<
class _CharT,
class _Traits,
class _Alloc>
1011 const rope<_CharT, _Alloc>& __r)
1014 size_t __w = __o.
width();
1017 size_t __rope_len = __r.size();
1018 _Rope_insert_char_consumer<_CharT, _Traits> __c(__o);
1019 bool __is_simple = _Rope_is_simple((_CharT*)0);
1021 if (__rope_len < __w)
1022 __pad_len = __w - __rope_len;
1027 __o.
width(__w / __rope_len);
1030 if (__is_simple && !__left && __pad_len > 0)
1031 _Rope_fill(__o, __pad_len);
1032 __r.apply_to_pieces(0, __r.size(), __c);
1033 if (__is_simple && __left && __pad_len > 0)
1034 _Rope_fill(__o, __pad_len);
1042 __throw_exception_again;
1047 template <
class _CharT,
class _Alloc>
1049 rope<_CharT, _Alloc>::
1050 _S_flatten(_RopeRep* __r, std::size_t __start, std::size_t __len,
1053 _Rope_flatten_char_consumer<_CharT> __c(__buffer);
1054 _S_apply_to_pieces(__c, __r, __start, __start + __len);
1055 return(__buffer + __len);
1058 template <
class _CharT,
class _Alloc>
1060 rope<_CharT, _Alloc>::
1061 find(_CharT __pattern, std::size_t __start)
const
1063 _Rope_find_char_char_consumer<_CharT> __c(__pattern);
1064 _S_apply_to_pieces(__c, this->_M_tree_ptr, __start, size());
1065 size_type __result_pos = __start + __c._M_count;
1066#ifndef __STL_OLD_ROPE_SEMANTICS
1067 if (__result_pos == size())
1068 __result_pos = npos;
1070 return __result_pos;
1073 template <
class _CharT,
class _Alloc>
1075 rope<_CharT, _Alloc>::
1076 _S_flatten(_RopeRep* __r, _CharT* __buffer)
1082 case __detail::_S_concat:
1084 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1085 _RopeRep* __left = __c->_M_left;
1086 _RopeRep* __right = __c->_M_right;
1087 _CharT* __rest = _S_flatten(__left, __buffer);
1088 return _S_flatten(__right, __rest);
1090 case __detail::_S_leaf:
1092 _RopeLeaf* __l = (_RopeLeaf*)__r;
1093 return copy_n(__l->_M_data, __l->_M_size, __buffer).second;
1095 case __detail::_S_function:
1096 case __detail::_S_substringfn:
1100 _RopeFunction* __f = (_RopeFunction*)__r;
1101 (*(__f->_M_fn))(0, __f->_M_size, __buffer);
1102 return __buffer + __f->_M_size;
1110 template <
class _CharT,
class _Alloc>
1112 rope<_CharT, _Alloc>::
1113 _S_dump(_RopeRep* __r,
int __indent)
1116 for (
int __i = 0; __i < __indent; __i++)
1123 if (__detail::_S_concat == __r->_M_tag)
1125 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1126 _RopeRep* __left = __c->_M_left;
1127 _RopeRep* __right = __c->_M_right;
1130 printf(
"Concatenation %p (depth = %d, len = %ld, %s balanced)\n",
1131 __r, __r->_M_depth, __r->_M_size,
1132 __r->_M_is_balanced?
"" :
"not");
1134 printf(
"Concatenation %p (rc = %ld, depth = %d, "
1135 "len = %ld, %s balanced)\n",
1136 __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size,
1137 __r->_M_is_balanced?
"" :
"not");
1139 _S_dump(__left, __indent + 2);
1140 _S_dump(__right, __indent + 2);
1147 switch (__r->_M_tag)
1149 case __detail::_S_leaf:
1152 case __detail::_S_function:
1153 __kind =
"Function";
1155 case __detail::_S_substringfn:
1156 __kind =
"Function representing substring";
1159 __kind =
"(corrupted kind field!)";
1162 printf(
"%s %p (depth = %d, len = %ld) ",
1163 __kind, __r, __r->_M_depth, __r->_M_size);
1165 printf(
"%s %p (rc = %ld, depth = %d, len = %ld) ",
1166 __kind, __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size);
1168 if (_S_is_one_byte_char_type((_CharT*)0))
1170 const int __max_len = 40;
1171 _Self_destruct_ptr __prefix(_S_substring(__r, 0, __max_len));
1172 _CharT __buffer[__max_len + 1];
1173 bool __too_big = __r->_M_size > __prefix->_M_size;
1175 _S_flatten(__prefix, __buffer);
1176 __buffer[__prefix->_M_size] = _S_eos((_CharT*)0);
1177 printf(
"%s%s\n", (
char*)__buffer,
1178 __too_big?
"...\n" :
"\n");
1185 template <
class _CharT,
class _Alloc>
1187 rope<_CharT, _Alloc>::
1188 _S_min_len[int(__detail::_S_max_rope_depth) + 1] = {
1189 1, 2, 3, 5, 8, 13, 21,
1190 34, 55, 89, 144, 233, 377,
1191 610, 987, 1597, 2584, 4181,
1192 6765, 10946, 17711, 28657, 46368,
1193 75025, 121393, 196418, 317811,
1194 514229, 832040, 1346269, 2178309,
1195 3524578, 5702887, 9227465, 14930352,
1196 24157817, 39088169, 63245986, 102334155,
1197 165580141, 267914296, 433494437,
1198 701408733, 1134903170, 1836311903,
1202 template <
class _CharT,
class _Alloc>
1203 typename rope<_CharT, _Alloc>::_RopeRep*
1204 rope<_CharT, _Alloc>::
1205 _S_balance(_RopeRep* __r)
1207 _RopeRep* __forest[int(__detail::_S_max_rope_depth) + 1];
1208 _RopeRep* __result = 0;
1216 for (__i = 0; __i <= int(__detail::_S_max_rope_depth); ++__i)
1220 _S_add_to_forest(__r, __forest);
1221 for (__i = 0; __i <= int(__detail::_S_max_rope_depth); ++__i)
1222 if (0 != __forest[__i])
1225 _Self_destruct_ptr __old(__result);
1227 __result = _S_concat(__forest[__i], __result);
1228 __forest[__i]->_M_unref_nonnil();
1229#if !defined(__GC) && __cpp_exceptions
1238 for(__i = 0; __i <= int(__detail::_S_max_rope_depth); __i++)
1239 _S_unref(__forest[__i]);
1240 __throw_exception_again;
1243 if (__result->_M_depth >
int(__detail::_S_max_rope_depth))
1244 std::__throw_length_error(__N(
"rope::_S_balance"));
1248 template <
class _CharT,
class _Alloc>
1250 rope<_CharT, _Alloc>::
1251 _S_add_to_forest(_RopeRep* __r, _RopeRep** __forest)
1253 if (__r->_M_is_balanced)
1255 _S_add_leaf_to_forest(__r, __forest);
1260 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1262 _S_add_to_forest(__c->_M_left, __forest);
1263 _S_add_to_forest(__c->_M_right, __forest);
1268 template <
class _CharT,
class _Alloc>
1270 rope<_CharT, _Alloc>::
1271 _S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest)
1273 _RopeRep* __insertee;
1274 _RopeRep* __too_tiny = 0;
1276 std::size_t __s = __r->_M_size;
1278 for (__i = 0; __s >= _S_min_len[__i+1]; ++__i)
1280 if (0 != __forest[__i])
1283 _Self_destruct_ptr __old(__too_tiny);
1285 __too_tiny = _S_concat_and_set_balanced(__forest[__i],
1287 __forest[__i]->_M_unref_nonnil();
1293 _Self_destruct_ptr __old(__too_tiny);
1295 __insertee = _S_concat_and_set_balanced(__too_tiny, __r);
1301 if (0 != __forest[__i])
1304 _Self_destruct_ptr __old(__insertee);
1306 __insertee = _S_concat_and_set_balanced(__forest[__i],
1308 __forest[__i]->_M_unref_nonnil();
1311 if (__i ==
int(__detail::_S_max_rope_depth)
1312 || __insertee->_M_size < _S_min_len[__i+1])
1314 __forest[__i] = __insertee;
1321 template <
class _CharT,
class _Alloc>
1323 rope<_CharT, _Alloc>::
1324 _S_fetch(_RopeRep* __r, size_type __i)
1326 __GC_CONST _CharT* __cstr = __r->_M_c_string;
1334 case __detail::_S_concat:
1336 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1337 _RopeRep* __left = __c->_M_left;
1338 std::size_t __left_len = __left->_M_size;
1340 if (__i >= __left_len)
1343 __r = __c->_M_right;
1349 case __detail::_S_leaf:
1351 _RopeLeaf* __l = (_RopeLeaf*)__r;
1352 return __l->_M_data[__i];
1354 case __detail::_S_function:
1355 case __detail::_S_substringfn:
1357 _RopeFunction* __f = (_RopeFunction*)__r;
1360 (*(__f->_M_fn))(__i, 1, &__result);
1370 template <
class _CharT,
class _Alloc>
1372 rope<_CharT, _Alloc>::
1373 _S_fetch_ptr(_RopeRep* __r, size_type __i)
1375 _RopeRep* __clrstack[__detail::_S_max_rope_depth];
1376 std::size_t __csptr = 0;
1380 if (__r->_M_ref_count > 1)
1384 case __detail::_S_concat:
1386 _RopeConcatenation* __c = (_RopeConcatenation*)__r;
1387 _RopeRep* __left = __c->_M_left;
1388 std::size_t __left_len = __left->_M_size;
1390 if (__c->_M_c_string != 0)
1391 __clrstack[__csptr++] = __c;
1392 if (__i >= __left_len)
1395 __r = __c->_M_right;
1401 case __detail::_S_leaf:
1403 _RopeLeaf* __l = (_RopeLeaf*)__r;
1404 if (__l->_M_c_string != __l->_M_data && __l->_M_c_string != 0)
1405 __clrstack[__csptr++] = __l;
1409 _RopeRep* __d = __clrstack[__csptr];
1410 __d->_M_free_c_string();
1411 __d->_M_c_string = 0;
1413 return __l->_M_data + __i;
1415 case __detail::_S_function:
1416 case __detail::_S_substringfn:
1427 template <
class _CharT,
class _Alloc>
1429 rope<_CharT, _Alloc>::
1430 _S_compare (
const _RopeRep* __left,
const _RopeRep* __right)
1432 std::size_t __left_len;
1433 std::size_t __right_len;
1439 __left_len = __left->_M_size;
1440 __right_len = __right->_M_size;
1441 if (__detail::_S_leaf == __left->_M_tag)
1443 _RopeLeaf* __l = (_RopeLeaf*) __left;
1444 if (__detail::_S_leaf == __right->_M_tag)
1446 _RopeLeaf* __r = (_RopeLeaf*) __right;
1448 __l->_M_data + __left_len,
1449 __r->_M_data, __r->_M_data
1454 const_iterator __rstart(__right, 0);
1455 const_iterator __rend(__right, __right_len);
1463 const_iterator __lstart(__left, 0);
1464 const_iterator __lend(__left, __left_len);
1465 if (__detail::_S_leaf == __right->_M_tag)
1467 _RopeLeaf* __r = (_RopeLeaf*) __right;
1469 __r->_M_data, __r->_M_data
1474 const_iterator __rstart(__right, 0);
1475 const_iterator __rend(__right, __right_len);
1483 template <
class _CharT,
class _Alloc>
1484 _Rope_char_ref_proxy<_CharT, _Alloc>&
1485 _Rope_char_ref_proxy<_CharT, _Alloc>::
1486 operator=(_CharT __c)
1488 _RopeRep* __old = _M_root->_M_tree_ptr;
1492 _CharT* __ptr = _My_rope::_S_fetch_ptr(__old, _M_pos);
1499 _Self_destruct_ptr __left(_My_rope::_S_substring(__old, 0, _M_pos));
1500 _Self_destruct_ptr __right(_My_rope::_S_substring(__old, _M_pos + 1,
1502 typename _RopeRep::allocator_type __a = _M_root->_M_get_allocator();
1503 _Self_destruct_ptr __result_left(_My_rope::
1504 _S_destr_concat_char_iter(__left,
1508 _RopeRep* __result = _My_rope::_S_concat(__result_left, __right);
1510 _RopeRep::_S_unref(__old);
1512 _M_root->_M_tree_ptr = __result;
1516 template <
class _CharT,
class _Alloc>
1517 inline _Rope_char_ref_proxy<_CharT, _Alloc>::
1518 operator _CharT()
const
1520 if (_M_current_valid)
1523 return _My_rope::_S_fetch(_M_root->_M_tree_ptr, _M_pos);
1526 template <
class _CharT,
class _Alloc>
1527 _Rope_char_ptr_proxy<_CharT, _Alloc>
1528 _Rope_char_ref_proxy<_CharT, _Alloc>::
1530 {
return _Rope_char_ptr_proxy<_CharT, _Alloc>(*
this); }
1532 template <
class _CharT,
class _Alloc>
1533 rope<_CharT, _Alloc>::
1534 rope(std::size_t __n, _CharT __c,
const allocator_type& __a)
1537 using std::__uninitialized_fill_n_a;
1539 rope<_CharT,_Alloc> __result;
1540 const std::size_t __exponentiate_threshold = 32;
1541 std::size_t __exponent;
1543 _CharT* __rest_buffer;
1544 _RopeRep* __remainder;
1545 rope<_CharT, _Alloc> __remainder_rope;
1550 __exponent = __n / __exponentiate_threshold;
1551 __rest = __n % __exponentiate_threshold;
1556 __rest_buffer = this->_Data_allocate(_S_rounded_up_size(__rest));
1557 __uninitialized_fill_n_a(__rest_buffer, __rest, __c,
1558 _M_get_allocator());
1559 _S_cond_store_eos(__rest_buffer[__rest]);
1561 { __remainder = _S_new_RopeLeaf(__rest_buffer, __rest,
1562 _M_get_allocator()); }
1565 _RopeRep::__STL_FREE_STRING(__rest_buffer, __rest,
1566 _M_get_allocator());
1567 __throw_exception_again;
1570 __remainder_rope._M_tree_ptr = __remainder;
1571 if (__exponent != 0)
1573 _CharT* __base_buffer =
1574 this->_Data_allocate(_S_rounded_up_size(__exponentiate_threshold));
1575 _RopeLeaf* __base_leaf;
1577 __uninitialized_fill_n_a(__base_buffer, __exponentiate_threshold, __c,
1578 _M_get_allocator());
1579 _S_cond_store_eos(__base_buffer[__exponentiate_threshold]);
1582 __base_leaf = _S_new_RopeLeaf(__base_buffer,
1583 __exponentiate_threshold,
1584 _M_get_allocator());
1588 _RopeRep::__STL_FREE_STRING(__base_buffer,
1589 __exponentiate_threshold,
1590 _M_get_allocator());
1591 __throw_exception_again;
1593 __base_rope._M_tree_ptr = __base_leaf;
1594 if (1 == __exponent)
1595 __result = __base_rope;
1597 __result =
power(__base_rope, __exponent,
1598 _Rope_Concat_fn<_CharT, _Alloc>());
1600 if (0 != __remainder)
1601 __result += __remainder_rope;
1604 __result = __remainder_rope;
1606 this->_M_tree_ptr = __result._M_tree_ptr;
1607 this->_M_tree_ptr->_M_ref_nonnil();
1610 template<
class _CharT,
class _Alloc>
1612 rope<_CharT, _Alloc>::_S_empty_c_str[1];
1614 template<
class _CharT,
class _Alloc>
1616 rope<_CharT, _Alloc>::
1619 if (0 == this->_M_tree_ptr)
1621 _S_empty_c_str[0] = _S_eos((_CharT*)0);
1623 return _S_empty_c_str;
1625 __gthread_mutex_lock (&this->_M_tree_ptr->_M_c_string_lock);
1626 __GC_CONST _CharT* __result = this->_M_tree_ptr->_M_c_string;
1629 std::size_t __s = size();
1630 __result = this->_Data_allocate(__s + 1);
1631 _S_flatten(this->_M_tree_ptr, __result);
1632 __result[__s] = _S_eos((_CharT*)0);
1633 this->_M_tree_ptr->_M_c_string = __result;
1635 __gthread_mutex_unlock (&this->_M_tree_ptr->_M_c_string_lock);
1639 template<
class _CharT,
class _Alloc>
1640 const _CharT* rope<_CharT, _Alloc>::
1641 replace_with_c_str()
1643 if (0 == this->_M_tree_ptr)
1645 _S_empty_c_str[0] = _S_eos((_CharT*)0);
1646 return _S_empty_c_str;
1648 __GC_CONST _CharT* __old_c_string = this->_M_tree_ptr->_M_c_string;
1649 if (__detail::_S_leaf == this->_M_tree_ptr->_M_tag
1650 && 0 != __old_c_string)
1651 return(__old_c_string);
1652 std::size_t __s = size();
1653 _CharT* __result = this->_Data_allocate(_S_rounded_up_size(__s));
1654 _S_flatten(this->_M_tree_ptr, __result);
1655 __result[__s] = _S_eos((_CharT*)0);
1656 this->_M_tree_ptr->_M_unref_nonnil();
1657 this->_M_tree_ptr = _S_new_RopeLeaf(__result, __s,
1658 this->_M_get_allocator());
1664 template<
class _Rope_iterator>
1666 _Rope_rotate(_Rope_iterator __first,
1667 _Rope_iterator __middle,
1668 _Rope_iterator __last)
1670 typedef typename _Rope_iterator::value_type _CharT;
1671 typedef typename _Rope_iterator::_allocator_type _Alloc;
1673 rope<_CharT, _Alloc>& __r(__first.container());
1674 rope<_CharT, _Alloc> __prefix = __r.substr(0, __first.index());
1675 rope<_CharT, _Alloc> __suffix =
1676 __r.substr(__last.index(), __r.size() - __last.index());
1677 rope<_CharT, _Alloc> __part1 =
1678 __r.substr(__middle.index(), __last.index() - __middle.index());
1679 rope<_CharT, _Alloc> __part2 =
1680 __r.substr(__first.index(), __middle.index() - __first.index());
1687#if !defined(__GNUC__)
1690 rotate(_Rope_iterator<
char, __STL_DEFAULT_ALLOCATOR(
char)> __first,
1691 _Rope_iterator<
char, __STL_DEFAULT_ALLOCATOR(
char)> __middle,
1692 _Rope_iterator<
char, __STL_DEFAULT_ALLOCATOR(
char)> __last)
1693 { _Rope_rotate(__first, __middle, __last); }
1705 rotate(_Rope_iterator<
wchar_t, __STL_DEFAULT_ALLOCATOR(
char)> __first,
1706 _Rope_iterator<
wchar_t, __STL_DEFAULT_ALLOCATOR(
char)> __middle,
1707 _Rope_iterator<
wchar_t, __STL_DEFAULT_ALLOCATOR(
char)> __last)
1708 { _Rope_rotate(__first, __middle, __last); }
1711_GLIBCXX_END_NAMESPACE_VERSION
_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.
std::basic_ostream< _CharT, _Traits > & operator<<(std::basic_ostream< _CharT, _Traits > &__os, const bitset< _Nb > &__x)
Global I/O operators for bitsets.
constexpr void _Destroy(_ForwardIterator __first, _ForwardIterator __last)
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....