_rope.h revision e46c9386c4f79aa40185f79a19fc5b2a7ef528b3
19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc. 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk. 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies. 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted, 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice. 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* NOTE: This is an internal header file, included by other STL headers. 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * You should not attempt to use it directly. 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// rope<_CharT,_Alloc> is a sequence of _CharT. 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Ropes appear to be mutable, but update operations 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// really copy enough of the data structure to leave the original 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// valid. Thus ropes can be logically copied by just copying 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// a pointer value. 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ROPE_H 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_ROPE_H 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALGOBASE_H 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_algobase.h> 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_NO_IOSTREAMS) && !defined (_STLP_INTERNAL_IOSFWD) 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <stl/_iosfwd.h> 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALLOC_H 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_alloc.h> 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ITERATOR_H 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_iterator.h> 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALGO_H 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_algo.h> 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_FUNCTION_BASE_H 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_function_base.h> 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_NUMERIC_H 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_numeric.h> 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_HASH_FUN_H 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_hash_fun.h> 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_CHAR_TRAITS_H 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/char_traits.h> 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_THREADS_H 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_threads.h> 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_SGI_THREADS 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <mutex.h> 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) (_Alloc_traits<_Tp,__atype>::create_allocator(__a)) 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) __stl_alloc_create(__a,(_Tp*)0) 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// First a lot of forward declarations. The standard seems to require 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// much stricter "declaration before use" than many of the implementations 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// that preceded it. 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate<class _CharT, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_CharT>) > class rope; 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> struct _Rope_RopeConcatenation; 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> struct _Rope_RopeRep; 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> struct _Rope_RopeLeaf; 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> struct _Rope_RopeFunction; 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> struct _Rope_RopeSubstring; 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> class _Rope_iterator; 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> class _Rope_const_iterator; 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> class _Rope_char_ref_proxy; 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> class _Rope_char_ptr_proxy; 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _CharT> 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct _BasicCharType { typedef __false_type _Ret; }; 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_TEMPLATE_NULL 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct _BasicCharType<char> { typedef __true_type _Ret; }; 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_HAS_WCHAR_T 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_TEMPLATE_NULL 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct _BasicCharType<wchar_t> { typedef __true_type _Ret; }; 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Some helpers, so we can use the power algorithm on ropes. 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// See below for why this isn't local to the implementation. 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This uses a nonstandard refcount convention. 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The result has refcount 0. 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Rope_Concat_fn 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : public binary_function<rope<_CharT,_Alloc>, rope<_CharT,_Alloc>, 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc> > { 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc> operator() (const rope<_CharT,_Alloc>& __x, 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const rope<_CharT,_Alloc>& __y) { 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __x + __y; 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockrope<_CharT,_Alloc> 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__identity_element(_Rope_Concat_fn<_CharT, _Alloc>) 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return rope<_CharT,_Alloc>(); } 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Store an eos 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT> 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _S_construct_null_aux(_CharT *__p, const __true_type&) 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ *__p = 0; } 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT> 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _S_construct_null_aux(_CharT *__p, const __false_type&) 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ _STLP_STD::_Construct(__p); } 1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT> 1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _S_construct_null(_CharT *__p) { 1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _IsIntegral<_CharT>::_Ret _Char_Is_Integral; 1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_construct_null_aux(__p, _Char_Is_Integral()); 1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// char_producers are logically functions that generate a section of 1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// a string. These can be converted to ropes. The resulting rope 1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// invokes the char_producer on demand. This allows, for example, 1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// files to be viewed as ropes without reading the entire file. 1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT> 1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass char_producer { 1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual ~char_producer() {} 1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual void operator()(size_t __start_pos, size_t __len, 1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* __buffer) = 0; 1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Buffer should really be an arbitrary output iterator. 1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // That way we could flatten directly into an ostream, etc. 1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This is thoroughly impossible, since iterator types don't 1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // have runtime descriptions. 1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Sequence buffers: 1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Sequence must provide an append operation that appends an 1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// array to the sequence. Sequence buffers are useful only if 1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// appending an entire array is cheaper than appending element by element. 1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This is true for many string representations. 1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This should perhaps inherit from ostream<sequence::value_type> 1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// and be implemented correspondingly, so that they can be used 1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// for formatted. For the sake of portability, we don't do this yet. 1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// For now, sequence buffers behave as output iterators. But they also 1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// behave a little like basic_ostringstream<sequence::value_type> and a 1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// little like containers. 1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _Sequence 1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if !(defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) || \ 1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block defined ( _STLP_NO_DEFAULT_NON_TYPE_PARAM )) 1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block , size_t _Buf_sz = 100 1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined(__sgi) && !defined(__GNUC__) 1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __TYPEDEF_WORKAROUND 1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ,class _V = typename _Sequence::value_type 1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif /* __sgi */ 1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */ 1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block > 1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The 3rd parameter works around a common compiler bug. 1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass sequence_buffer : public iterator <output_iterator_tag, void, void, void, void> { 1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef __TYPEDEF_WORKAROUND 1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Sequence::value_type value_type; 1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef sequence_buffer<_Sequence 1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if !(defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) || \ 2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block defined ( _STLP_NO_DEFAULT_NON_TYPE_PARAM )) 2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block , _Buf_sz 2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block > _Self; 2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else /* _STLP_NON_TYPE_TMPL_PARAM_BUG */ 2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block > _Self; 2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum { _Buf_sz = 100}; 2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */ 2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // # endif 2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else /* __TYPEDEF_WORKAROUND */ 2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _V value_type; 2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef sequence_buffer<_Sequence, _Buf_sz, _V> _Self; 2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif /* __TYPEDEF_WORKAROUND */ 2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: 2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Sequence* _M_prefix; 2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block value_type _M_buffer[_Buf_sz]; 2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_buf_count; 2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void flush() { 2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_prefix->append(_M_buffer, _M_buffer + _M_buf_count); 2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_count = 0; 2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~sequence_buffer() { flush(); } 2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block sequence_buffer() : _M_prefix(0), _M_buf_count(0) {} 2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block sequence_buffer(const _Self& __x) { 2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_prefix = __x._M_prefix; 2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_count = __x._M_buf_count; 226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_STD::copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer); 2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block sequence_buffer(_Self& __x) { 2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __x.flush(); 2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_prefix = __x._M_prefix; 2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_count = 0; 2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block sequence_buffer(_Sequence& __s) : _M_prefix(&__s), _M_buf_count(0) {} 2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator= (_Self& __x) { 2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __x.flush(); 2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_prefix = __x._M_prefix; 2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_count = 0; 2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator= (const _Self& __x) { 2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_prefix = __x._M_prefix; 2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_count = __x._M_buf_count; 243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_STD::copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer); 2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void push_back(value_type __x) { 2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_buf_count < _Buf_sz) { 2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buffer[_M_buf_count] = __x; 2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++_M_buf_count; 2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block flush(); 2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buffer[0] = __x; 2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_count = 1; 2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void append(const value_type *__s, size_t __len) { 2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__len + _M_buf_count <= _Buf_sz) { 2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __i = _M_buf_count; 2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __j = 0; 2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __j < __len; __i++, __j++) { 2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buffer[__i] = __s[__j]; 2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_count += __len; 2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else if (0 == _M_buf_count) { 2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_prefix->append(__s, __s + __len); 2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block flush(); 2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block append(__s, __len); 2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& write(const value_type *__s, size_t __len) { 2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block append(__s, __len); 2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& put(value_type __x) { 2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block push_back(__x); 2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator=(const value_type& __rhs) { 2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block push_back(__rhs); 2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator*() { return *this; } 2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator++() { return *this; } 2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator++(int) { return *this; } 2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The following should be treated as private, at least for now. 2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT> 2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Rope_char_consumer { 2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_MEMBER_TEMPLATES) 2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //Without member templates we have to use run-time parameterization. 2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The symmetry with char_producer is accidental and temporary. 2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual ~_Rope_char_consumer() {} 2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual bool operator()(const _CharT* __buffer, size_t __len) = 0; 2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// What follows should really be local to rope. Unfortunately, 3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// that doesn't work, since it makes it impossible to define generic 3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// equality on rope iterators. According to the draft standard, the 3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// template parameters for such an equality operator cannot be inferred 3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// from the occurence of a member class as a parameter. 3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// (SGI compilers in fact allow this, but the __result wouldn't be 3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// portable.) 3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Similarly, some of the static member functions are member functions 3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// only to avoid polluting the global namespace, and to circumvent 3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// restrictions on type inference for template functions. 3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The internal data structure for representing a rope. This is 3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// private to the implementation. A rope is really just a pointer 3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// to one of these. 3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A few basic functions for manipulating this data structure 3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// are members of _RopeRep. Most of the more complex algorithms 3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// are implemented as rope members. 3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Some of the static member functions of _RopeRep have identically 3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// named functions in rope that simply invoke the _RopeRep versions. 3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Rope_RopeRep 3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : public _Refcount_Base 3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ 3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT, _Alloc> _Self; 3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // GAB: 11/09/05 3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // "__ROPE_DEPTH_SIZE" is set to one more then the "__ROPE_MAX_DEPTH". 3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This was originally just an addition of "__ROPE_MAX_DEPTH + 1" 3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // but this addition causes the sunpro compiler to complain about 3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // multiple declarations during the initialization of "_S_min_len". 3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Changed to be a fixed value and the sunpro compiler appears to 3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // be happy??? 3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __ROPE_MAX_DEPTH 45 3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __ROPE_DEPTH_SIZE 46 // __ROPE_MAX_DEPTH + 1 3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum { _S_max_rope_depth = __ROPE_MAX_DEPTH }; 3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum _Tag {_S_leaf, _S_concat, _S_substringfn, _S_function}; 3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Apparently needed by VC++ 3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The data fields of leaves are allocated with some 3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // extra space, to accomodate future growth and for basic 3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // character types, to hold a trailing eos character. 3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum { _S_alloc_granularity = 8 }; 3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tag _M_tag:8; 3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool _M_is_balanced:8; 3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef _Alloc allocator_type; 3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block allocator_type get_allocator() const { return allocator_type(_M_size); } 3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block unsigned char _M_depth; 3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* _STLP_VOLATILE _M_c_string; 3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_PRIV _STLP_alloc_proxy<size_t, _CharT, allocator_type> _M_size; 3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_NO_ARROW_OPERATOR 365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Rope_RopeRep() : _Refcount_Base(1), _M_size(allocator_type(), 0) { 366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (_STLP_CHECK_RUNTIME_COMPATIBILITY) 367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_CHECK_RUNTIME_COMPATIBILITY(); 368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* Flattened version of string, if needed. */ 3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* typically 0. */ 3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* If it's not 0, then the memory is owned */ 3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* by this node. */ 3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* In the case of a leaf, this may point to */ 3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* the same memory as the data field. */ 3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeRep(_Tag __t, unsigned char __d, bool __b, size_t _p_size, 3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block allocator_type __a) : 3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Refcount_Base(1), 381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_tag(__t), _M_is_balanced(__b), _M_depth(__d), _M_c_string(0), _M_size(__a, _p_size) { 382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_CHECK_RUNTIME_COMPATIBILITY) 383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_CHECK_RUNTIME_COMPATIBILITY(); 384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef _STLP_TYPENAME _STLP_PRIV _BasicCharType<_CharT>::_Ret _IsBasicCharType; 3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if 0 3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* Please tell why this code is necessary if you uncomment it. 3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Problem with it is that rope implementation expect that _S_rounded_up_size(n) 3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * returns a size > n in order to store the terminating null charater. When 3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * instanciation type is not a char or wchar_t this is not guaranty resulting in 3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * memory overrun. 3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _S_rounded_up_size_aux(size_t __n, __true_type const& /*_IsBasicCharType*/) { 3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Allow slop for in-place expansion. 3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__n + _S_alloc_granularity) & ~(_S_alloc_granularity - 1); 3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _S_rounded_up_size_aux(size_t __n, __false_type const& /*_IsBasicCharType*/) { 4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Allow slop for in-place expansion. 4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__n + _S_alloc_granularity - 1) & ~(_S_alloc_granularity - 1); 4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // fbp : moved from RopeLeaf 4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _S_rounded_up_size(size_t __n) 4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //{ return _S_rounded_up_size_aux(__n, _IsBasicCharType()); } 4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return (__n + _S_alloc_granularity) & ~(_S_alloc_granularity - 1); } 4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_free_string( _CharT* __s, size_t __len, 4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block allocator_type __a) { 4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_STD::_Destroy_Range(__s, __s + __len); 4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This has to be a static member, so this gets a bit messy 4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE 4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __a.deallocate(__s, _S_rounded_up_size(__len)); //*ty 03/24/2001 - restored not to use __stl_alloc_rebind() since it is not defined under _STLP_MEMBER_TEMPLATE_CLASSES 4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_alloc_rebind (__a, (_CharT*)0).deallocate(__s, _S_rounded_up_size(__len)); 4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Deallocate data section of a leaf. 4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This shouldn't be a member function. 4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // But its hard to do anything else at the 4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // moment, because it's templatized w.r.t. 4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // an allocator. 4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Does nothing if __GC is defined. 4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_free_c_string(); 4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_free_tree(); 4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Deallocate t. Assumes t is not 0. 4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_unref_nonnil() { 4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_decr() == 0) _M_free_tree(); 4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_ref_nonnil() { 4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_incr(); 4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_unref(_Self* __t) { 4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 != __t) { 4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __t->_M_unref_nonnil(); 4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_ref(_Self* __t) { 4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 != __t) __t->_M_incr(); 4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //static void _S_free_if_unref(_Self* __t) { 4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // if (0 != __t && 0 == __t->_M_ref_count) __t->_M_free_tree(); 4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //} 4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Rope_RopeLeaf : public _Rope_RopeRep<_CharT,_Alloc> { 4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* _M_data; /* Not necessarily 0 terminated. */ 4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* The allocated size is */ 4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* _S_rounded_up_size(size), except */ 4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* in the GC case, in which it */ 4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* doesn't matter. */ 4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: 4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _RopeRep::_IsBasicCharType _IsBasicCharType; 4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_init(__true_type const& /*_IsBasicCharType*/) { 4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_c_string = _M_data; 4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_init(__false_type const& /*_IsBasicCharType*/) {} 4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _RopeRep::allocator_type allocator_type; 4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeLeaf( _CharT* __d, size_t _p_size, allocator_type __a) 4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _Rope_RopeRep<_CharT,_Alloc>(_RopeRep::_S_leaf, 0, true, _p_size, __a), 4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_data(__d) { 4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(_p_size > 0) 4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_init(_IsBasicCharType()); 4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifdef _STLP_NO_ARROW_OPERATOR 4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeLeaf() {} 4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeLeaf(const _Rope_RopeLeaf<_CharT, _Alloc>& ) {} 4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The constructor assumes that d has been allocated with 4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // the proper allocator and the properly padded size. 4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // In contrast, the destructor deallocates the data: 4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~_Rope_RopeLeaf() { 4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_data != this->_M_c_string) { 4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_free_c_string(); 4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep::_S_free_string(_M_data, this->_M_size._M_data, this->get_allocator()); 4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Rope_RopeConcatenation : public _Rope_RopeRep<_CharT, _Alloc> { 4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: 4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* _M_left; 5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* _M_right; 5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _RopeRep::allocator_type allocator_type; 5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeConcatenation(_RopeRep* __l, _RopeRep* __r, allocator_type __a) 5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _Rope_RopeRep<_CharT,_Alloc>(_RopeRep::_S_concat, 5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block (max)(__l->_M_depth, __r->_M_depth) + 1, false, 5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __l->_M_size._M_data + __r->_M_size._M_data, __a), _M_left(__l), _M_right(__r) 5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block {} 5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifdef _STLP_NO_ARROW_OPERATOR 5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeConcatenation() {} 5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeConcatenation(const _Rope_RopeConcatenation<_CharT, _Alloc>&) {} 5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~_Rope_RopeConcatenation() { 5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_free_c_string(); 5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_left->_M_unref_nonnil(); 5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_right->_M_unref_nonnil(); 5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Rope_RopeFunction : public _Rope_RopeRep<_CharT, _Alloc> { 5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: 5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_producer<_CharT>* _M_fn; 5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* 5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Char_producer is owned by the 5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * rope and should be explicitly 5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * deleted when the rope becomes 5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * inaccessible. 5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool _M_delete_when_done; 5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type; 5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifdef _STLP_NO_ARROW_OPERATOR 5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeFunction() {} 5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeFunction(const _Rope_RopeFunction<_CharT, _Alloc>& ) {} 5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeFunction(char_producer<_CharT>* __f, size_t _p_size, 5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool __d, allocator_type __a) 5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _Rope_RopeRep<_CharT,_Alloc>(_RopeRep::_S_function, 0, true, _p_size, __a), _M_fn(__f) 5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block , _M_delete_when_done(__d) 5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { _STLP_ASSERT(_p_size > 0) } 5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~_Rope_RopeFunction() { 5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_free_c_string(); 5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_delete_when_done) { 5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block delete _M_fn; 5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Substring results are usually represented using just 5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * concatenation nodes. But in the case of very long flat ropes 5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or ropes with a functional representation that isn't practical. 5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * In that case, we represent the __result as a special case of 5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * RopeFunction, whose char_producer points back to the rope itself. 5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * In all cases except repeated substring operations and 5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * deallocation, we treat the __result as a RopeFunction. 5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Rope_RopeSubstring : public char_producer<_CharT>, public _Rope_RopeFunction<_CharT,_Alloc> { 5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // XXX this whole class should be rewritten. 5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep *_M_base; // not 0 5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_start; 5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* virtual */ void operator()(size_t __start_pos, size_t __req_len, 5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* __buffer) { 5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeFunction<_CharT,_Alloc> _RopeFunction; 5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeLeaf<_CharT,_Alloc> _RopeLeaf; 5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block switch (_M_base->_M_tag) { 5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block case _RopeRep::_S_function: 5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block case _RopeRep::_S_substringfn: 5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { 5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_producer<_CharT>* __fn = 5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __STATIC_CAST(_RopeFunction*, _M_base)->_M_fn; 5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(__start_pos + __req_len <= this->_M_size._M_data) 5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(_M_start + this->_M_size._M_data <= _M_base->_M_size._M_data) 5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block (*__fn)(__start_pos + _M_start, __req_len, __buffer); 5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block case _RopeRep::_S_leaf: 5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { 5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* __s = 5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __STATIC_CAST(_RopeLeaf*, _M_base)->_M_data; 5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_PRIV __ucopy_n(__s + __start_pos + _M_start, __req_len, __buffer); 5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block default: 5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(false) 5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ; 5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _RopeRep::allocator_type allocator_type; 6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeSubstring(_RopeRep* __b, size_t __s, size_t __l, allocator_type __a) 6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _Rope_RopeFunction<_CharT,_Alloc>(this, __l, false, __a), 6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_base(__b), _M_start(__s) { 6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(__l > 0) 6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(__s + __l <= __b->_M_size._M_data) 6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_base->_M_ref_nonnil(); 6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_tag = _RopeRep::_S_substringfn; 6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual ~_Rope_RopeSubstring() 6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { _M_base->_M_unref_nonnil(); } 6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Self-destructing pointers to Rope_rep. 6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * These are not conventional smart pointers. Their 6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * only purpose in life is to ensure that unref is called 6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * on the pointer either at normal exit or if an exception 6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * is raised. It is the caller's responsibility to 6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * adjust reference counts when these pointers are initialized 6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or assigned to. (This convention significantly reduces 6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * the number of potentially expensive reference count 6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * updates.) 6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Rope_self_destruct_ptr { 6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeRep<_CharT,_Alloc>* _M_ptr; 6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~_Rope_self_destruct_ptr() 6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { _Rope_RopeRep<_CharT,_Alloc>::_S_unref(_M_ptr); } 6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifdef _STLP_USE_EXCEPTIONS 6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_self_destruct_ptr() : _M_ptr(0) {} 6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_self_destruct_ptr() {} 6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_self_destruct_ptr(_Rope_RopeRep<_CharT,_Alloc>* __p) : _M_ptr(__p) {} 6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeRep<_CharT,_Alloc>& operator*() { return *_M_ptr; } 6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeRep<_CharT,_Alloc>* operator->() { return _M_ptr; } 6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block operator _Rope_RopeRep<_CharT,_Alloc>*() { return _M_ptr; } 6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_self_destruct_ptr<_CharT, _Alloc>& 6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block operator= (_Rope_RopeRep<_CharT,_Alloc>* __x) 6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { _M_ptr = __x; return *this; } 6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Dereferencing a nonconst iterator has to return something 6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * that behaves almost like a reference. It's not possible to 6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * return an actual reference since assignment requires extra 6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * work. And we would get into the same problems as with the 6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * CD2 version of basic_string. 6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Rope_char_ref_proxy { 6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_char_ref_proxy<_CharT, _Alloc> _Self; 6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class rope<_CharT,_Alloc>; 6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class _Rope_iterator<_CharT,_Alloc>; 6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class _Rope_char_ptr_proxy<_CharT,_Alloc>; 6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr; 6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef rope<_CharT,_Alloc> _My_rope; 6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_pos; 6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT _M_current; 6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool _M_current_valid; 6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _My_rope* _M_root; // The whole rope. 6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ref_proxy(_My_rope* __r, size_t __p) : 6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_pos(__p), _M_current_valid(false), _M_root(__r) {} 6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ref_proxy(const _Self& __x) : 6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_pos(__x._M_pos), _M_current_valid(false), _M_root(__x._M_root) {} 6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Don't preserve cache if the reference can outlive the 6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // expression. We claim that's not possible without calling 6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // a copy constructor or generating reference to a proxy 6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // reference. We declare the latter to have undefined semantics. 6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ref_proxy(_My_rope* __r, size_t __p, _CharT __c) 6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_pos(__p), _M_current(__c), _M_current_valid(true), _M_root(__r) {} 6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block inline operator _CharT () const; 6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator= (_CharT __c); 6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ptr_proxy<_CharT, _Alloc> operator& () const; 6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator= (const _Self& __c) { 6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return operator=((_CharT)__c); 6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER 6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class __Alloc> 6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a, 6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ref_proxy <_CharT, __Alloc > __b) { 6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT __tmp = __a; 6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __a = __b; 6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __b = __tmp; 6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// There is no really acceptable way to handle this. The default 6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// definition of swap doesn't work for proxy references. 6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// It can't really be made to work, even with ugly hacks, since 6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// the only unusual operation it uses is the copy constructor, which 6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// is needed for other purposes. We provide a macro for 6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// full specializations, and instantiate the most common case. 6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define _ROPE_SWAP_SPECIALIZATION(_CharT, __Alloc) \ 6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block inline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a, \ 6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ref_proxy <_CharT, __Alloc > __b) { \ 7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT __tmp = __a; \ 7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __a = __b; \ 7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __b = __tmp; \ 7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 705e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_ROPE_SWAP_SPECIALIZATION(char, allocator<char>) 7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_NO_WCHAR_T 708e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_ROPE_SWAP_SPECIALIZATION(wchar_t, allocator<wchar_t>) 7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* !_STLP_FUNCTION_TMPL_PARTIAL_ORDER */ 7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Rope_char_ptr_proxy { 7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // XXX this class should be rewritten. 7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_char_ptr_proxy<_CharT, _Alloc> _Self; 7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class _Rope_char_ref_proxy<_CharT,_Alloc>; 7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_pos; 7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc>* _M_root; // The whole rope. 7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ptr_proxy(const _Rope_char_ref_proxy<_CharT,_Alloc>& __x) 7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_pos(__x._M_pos), _M_root(__x._M_root) {} 7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ptr_proxy(const _Self& __x) 7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_pos(__x._M_pos), _M_root(__x._M_root) {} 7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ptr_proxy() {} 7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ptr_proxy(_CharT* __x) : _M_pos(0), _M_root(0) { 7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(0 == __x) 7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator= (const _Self& __x) { 7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_pos = __x._M_pos; 7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_root = __x._M_root; 7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 7349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_char_ref_proxy<_CharT,_Alloc> operator*() const { 7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Rope_char_ref_proxy<_CharT,_Alloc>(_M_root, _M_pos); 7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Rope iterators: 7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Unlike in the C version, we cache only part of the stack 7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * for rope iterators, since they must be efficiently copyable. 7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * When we run out of cache, we have to reconstruct the iterator 7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * value. 7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Pointers from iterators are not included in reference counts. 7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Iterators are assumed to be thread private. Ropes can 7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * be shared. 7519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Rope_iterator_base 7549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* : public random_access_iterator<_CharT, ptrdiff_t> */ 7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ 7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class rope<_CharT,_Alloc>; 7579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_iterator_base<_CharT, _Alloc> _Self; 7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeConcatenation<_CharT,_Alloc> _RopeConcat; 7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum { _S_path_cache_len = 4 }; // Must be <= 9 because of _M_path_direction. 7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum { _S_iterator_buf_len = 15 }; 7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_current_pos; 7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The whole rope. 7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* _M_root; 7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Starting position for current leaf 7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_leaf_pos; 7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Buffer possibly containing current char. 7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* _M_buf_start; 7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Pointer to current char in buffer, != 0 ==> buffer valid. 7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* _M_buf_ptr; 7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // One past __last valid char in buffer. 7749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* _M_buf_end; 7759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // What follows is the path cache. We go out of our 7779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // way to make this compact. 7789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Path_end contains the bottom section of the path from 7799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // the root to the current leaf. 7809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block struct { 7819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (__BORLANDC__) && (__BORLANDC__ < 0x560) 7829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep const*_M_data[4]; 7839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 7849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep const*_M_data[_S_path_cache_len]; 7859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 7869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } _M_path_end; 7879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Last valid __pos in path_end; 7889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // _M_path_end[0] ... _M_path_end[_M_leaf_index-1] 7899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // point to concatenation nodes. 7909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int _M_leaf_index; 7919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // (_M_path_directions >> __i) & 1 is 1 7929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // if we got from _M_path_end[leaf_index - __i - 1] 7939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // to _M_path_end[leaf_index - __i] by going to the 7949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // __right. Assumes path_cache_len <= 9. 7959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block unsigned char _M_path_directions; 7969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Short buffer for surrounding chars. 7979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This is useful primarily for 7989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // RopeFunctions. We put the buffer 7999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // here to avoid locking in the 8009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // multithreaded case. 8019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The cached path is generally assumed to be valid 8029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // only if the buffer is valid. 8039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block struct { 8049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (__BORLANDC__) && (__BORLANDC__ < 0x560) 8059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT _M_data[15]; 8069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 8079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT _M_data[_S_iterator_buf_len]; 8089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 8099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } _M_tmp_buf; 8109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Set buffer contents given path cache. 8129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_setbuf(_Rope_iterator_base<_CharT, _Alloc>& __x); 8139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Set buffer contents and path cache. 8149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_setcache(_Rope_iterator_base<_CharT, _Alloc>& __x); 8159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // As above, but assumes path cache is valid for previous posn. 8169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_setcache_for_incr(_Rope_iterator_base<_CharT, _Alloc>& __x); 8179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator_base() {} 8189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator_base(_RopeRep* __root, size_t __pos) 8199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_current_pos(__pos),_M_root(__root), _M_buf_ptr(0) {} 8209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_incr(size_t __n); 8219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_decr(size_t __n); 8229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 8239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t index() const { return _M_current_pos; } 8249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: 8259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_copy_buf(const _Self& __x) { 8269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tmp_buf = __x._M_tmp_buf; 8279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__x._M_buf_start == __x._M_tmp_buf._M_data) { 8289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_start = _M_tmp_buf._M_data; 8299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_end = _M_buf_start + (__x._M_buf_end - __x._M_buf_start); 8309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_ptr = _M_buf_start + (__x._M_buf_ptr - __x._M_buf_start); 8319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 8329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_end = __x._M_buf_end; 8339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 8379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator_base(const _Self& __x) : 8389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_current_pos(__x._M_current_pos), 8399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_root(__x._M_root), 8409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_leaf_pos( __x._M_leaf_pos ), 8419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_start(__x._M_buf_start), 8429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_ptr(__x._M_buf_ptr), 8439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_path_end(__x._M_path_end), 8449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_leaf_index(__x._M_leaf_index), 8459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_path_directions(__x._M_path_directions) 8469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { 8479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 != __x._M_buf_ptr) { 8489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copy_buf(__x); 8499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator = (const _Self& __x) 8529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { 8539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_current_pos = __x._M_current_pos; 8549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_root = __x._M_root; 8559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_start = __x._M_buf_start; 8569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buf_ptr = __x._M_buf_ptr; 8579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_path_end = __x._M_path_end; 8589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_leaf_index = __x._M_leaf_index; 8599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_path_directions = __x._M_path_directions; 8609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_leaf_pos = __x._M_leaf_pos; 8619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 != __x._M_buf_ptr) { 8629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copy_buf(__x); 8639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 8659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 8679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> class _Rope_iterator; 8699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 8719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Rope_const_iterator : public _Rope_iterator_base<_CharT,_Alloc> { 8729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class rope<_CharT,_Alloc>; 8739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_const_iterator<_CharT, _Alloc> _Self; 8749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_iterator_base<_CharT,_Alloc> _Base; 8759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // protected: 8769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 8779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_HAS_NO_NAMESPACES 8789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 8799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The one from the base class may not be directly visible. 8809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 8819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_const_iterator(const _RopeRep* __root, size_t __pos): 8829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator_base<_CharT,_Alloc>(__CONST_CAST(_RopeRep*,__root), __pos) 8839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Only nonconst iterators modify root ref count 8849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block {} 8859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 8869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _CharT reference; // Really a value. Returning a reference 8879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Would be a mess, since it would have 8889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // to be included in refcount. 8899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef const _CharT* pointer; 8909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _CharT value_type; 8919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef ptrdiff_t difference_type; 8929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef random_access_iterator_tag iterator_category; 8939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 8959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_const_iterator() {} 8969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_const_iterator(const _Self& __x) : 8979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator_base<_CharT,_Alloc>(__x) { } 8989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_const_iterator(const _Rope_iterator<_CharT,_Alloc>& __x): 8999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator_base<_CharT,_Alloc>(__x) {} 9009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_const_iterator(const rope<_CharT,_Alloc>& __r, size_t __pos) : 9019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr._M_data, __pos) {} 9029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator= (const _Self& __x) { 9039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::operator=(__x); 9049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 9059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference operator*() { 9079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == this->_M_buf_ptr) 9089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (__DMC__) 9099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_setcache(*this); 9109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 9119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { _Rope_iterator_base<_CharT, _Alloc>* __x = this; _S_setcache(*__x); } 9129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 9139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *(this->_M_buf_ptr); 9149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 915e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Self& operator++() 916e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 917e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ( this->_M_buf_ptr != 0 ) { 918e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _CharT *__next = this->_M_buf_ptr + 1; 919e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ( __next < this->_M_buf_end ) { 920e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->_M_buf_ptr = __next; 921e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ++this->_M_current_pos; 922e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return *this; 923e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 924e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 925e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->_M_incr(1); 926e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return *this; 927e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 9289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator+=(ptrdiff_t __n) { 9299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n >= 0) { 9309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_incr(__n); 9319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 9329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_decr(-__n); 9339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 9359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator--() { 9379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_decr(1); 9389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 9399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator-=(ptrdiff_t __n) { 9419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n >= 0) { 9429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_decr(__n); 9439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 9449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_incr(-__n); 9459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 9479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self operator++(int) { 9499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __old_pos = this->_M_current_pos; 9509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_incr(1); 9519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Rope_const_iterator<_CharT,_Alloc>(this->_M_root, __old_pos); 9529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This makes a subsequent dereference expensive. 9539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Perhaps we should instead copy the iterator 9549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // if it has a valid cache? 9559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self operator--(int) { 9579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __old_pos = this->_M_current_pos; 9589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_decr(1); 9599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Rope_const_iterator<_CharT,_Alloc>(this->_M_root, __old_pos); 9609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block inline reference operator[](size_t __n); 9629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 9639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 9649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Alloc> 9659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Rope_iterator : public _Rope_iterator_base<_CharT,_Alloc> { 9669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class rope<_CharT,_Alloc>; 9679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_iterator<_CharT, _Alloc> _Self; 9689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_iterator_base<_CharT,_Alloc> _Base; 9699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 9709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 9719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 9729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc>* _M_root_rope; 9739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // root is treated as a cached version of this, 9749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // and is used to detect changes to the underlying 9759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // rope. 9769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Root is included in the reference count. 9779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This is necessary so that we can detect changes reliably. 9789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Unfortunately, it requires careful bookkeeping for the 9799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // nonGC case. 9809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator(rope<_CharT,_Alloc>* __r, size_t __pos); 9819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 9829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_check(); 9839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 9849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_char_ref_proxy<_CharT,_Alloc> reference; 9859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_char_ref_proxy<_CharT,_Alloc>* pointer; 9869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _CharT value_type; 9879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef ptrdiff_t difference_type; 9889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef random_access_iterator_tag iterator_category; 9899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 9909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~_Rope_iterator() { //*TY 5/6/00 - added dtor to balance reference count 9919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep::_S_unref(this->_M_root); 9929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 9949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc>& container() { return *_M_root_rope; } 9959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator() { 9969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_root = 0; // Needed for reference counting. 9979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 9989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator(const _Self& __x) : 9999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator_base<_CharT,_Alloc>(__x) { 10009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_root_rope = __x._M_root_rope; 10019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep::_S_ref(this->_M_root); 10029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator(rope<_CharT,_Alloc>& __r, size_t __pos); 10049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator= (const _Self& __x) { 10059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __old = this->_M_root; 10069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep::_S_ref(__x._M_root); 10079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::operator=(__x); 10089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_root_rope = __x._M_root_rope; 10099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep::_S_unref(__old); 10109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 10119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference operator*() { 10139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_check(); 10149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == this->_M_buf_ptr) { 10159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return reference(_M_root_rope, this->_M_current_pos); 10169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 10179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return reference(_M_root_rope, this->_M_current_pos, *(this->_M_buf_ptr)); 10189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator++() { 10219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_incr(1); 10229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 10239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator+=(ptrdiff_t __n) { 10259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n >= 0) { 10269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_incr(__n); 10279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 10289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_decr(-__n); 10299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 10319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator--() { 10339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_decr(1); 10349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 10359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator-=(ptrdiff_t __n) { 10379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n >= 0) { 10389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_decr(__n); 10399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 10409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_incr(-__n); 10419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 10439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self operator++(int) { 10459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __old_pos = this->_M_current_pos; 10469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_incr(1); 10479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Self(_M_root_rope, __old_pos); 10489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self operator--(int) { 10509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __old_pos = this->_M_current_pos; 10519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_decr(1); 10529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Self(_M_root_rope, __old_pos); 10539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference operator[](ptrdiff_t __n) { 10559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return reference(_M_root_rope, this->_M_current_pos + __n); 10569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 10579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 10589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 10599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES 10609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 10619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline random_access_iterator_tag 10629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockiterator_category(const _Rope_iterator<_CharT,_Alloc>&) { return random_access_iterator_tag();} 10639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 10649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _CharT* value_type(const _Rope_iterator<_CharT,_Alloc>&) { return 0; } 10659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 10669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline ptrdiff_t* distance_type(const _Rope_iterator<_CharT,_Alloc>&) { return 0; } 10679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 10689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline random_access_iterator_tag 10699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockiterator_category(const _Rope_const_iterator<_CharT,_Alloc>&) { return random_access_iterator_tag(); } 10709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 10719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _CharT* value_type(const _Rope_const_iterator<_CharT,_Alloc>&) { return 0; } 10729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 10739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline ptrdiff_t* distance_type(const _Rope_const_iterator<_CharT,_Alloc>&) { return 0; } 10749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */ 10759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 10769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc, class _CharConsumer> 10779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _S_apply_to_pieces(_CharConsumer& __c, 10789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_RopeRep<_CharT, _Alloc> *__r, 10799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __begin, size_t __end); 10809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // begin and end are assumed to be in range. 10819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 10829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 10839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass rope 10849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 10859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : public __stlport_class<rope<_CharT, _Alloc> > 10869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 10879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ 10889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef rope<_CharT,_Alloc> _Self; 10899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 10909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _CharT value_type; 10919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef ptrdiff_t difference_type; 10929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef size_t size_type; 10939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _CharT const_reference; 10949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef const _CharT* const_pointer; 10959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_iterator<_CharT,_Alloc> iterator; 10969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_const_iterator<_CharT,_Alloc> const_iterator; 10979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_char_ref_proxy<_CharT,_Alloc> reference; 10989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_char_ptr_proxy<_CharT,_Alloc> pointer; 10999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class _Rope_iterator<_CharT,_Alloc>; 11019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class _Rope_const_iterator<_CharT,_Alloc>; 11029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend struct _Rope_RopeRep<_CharT,_Alloc>; 11039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class _Rope_iterator_base<_CharT,_Alloc>; 11049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class _Rope_char_ptr_proxy<_CharT,_Alloc>; 11059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class _Rope_char_ref_proxy<_CharT,_Alloc>; 11069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend struct _Rope_RopeSubstring<_CharT,_Alloc>; 11079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS; 11099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: 11119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _CharT* _Cstrptr; 11129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _CharT _S_empty_c_str[1]; 11149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum { _S_copy_max = 23 }; 11169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // For strings shorter than _S_copy_max, we copy to 11179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // concatenate. 11189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeRep<_CharT, _Alloc> _RopeRep; 11209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _RopeRep::_IsBasicCharType _IsBasicCharType; 11219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 11239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 1124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef _Alloc allocator_type; 11259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 11279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The only data member of a rope: 11289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_PRIV _STLP_alloc_proxy<_RopeRep*, _CharT, allocator_type> _M_tree_ptr; 11299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 11319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block allocator_type get_allocator() const { return allocator_type(_M_tree_ptr); } 11329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 11349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeConcatenation<_CharT,_Alloc> _RopeConcatenation; 11359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeLeaf<_CharT,_Alloc> _RopeLeaf; 11369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeFunction<_CharT,_Alloc> _RopeFunction; 11379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_RopeSubstring<_CharT,_Alloc> _RopeSubstring; 11389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Retrieve a character at the indicated position. 11409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _CharT _S_fetch(_RopeRep* __r, size_type __pos); 11419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Obtain a pointer to the character at the indicated position. 11439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The pointer can be used to change the character. 11449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // If such a pointer cannot be produced, as is frequently the 11459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // case, 0 is returned instead. 11469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // (Returns nonzero only if all nodes in the path have a refcount 11479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // of 1.) 11489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _CharT* _S_fetch_ptr(_RopeRep* __r, size_type __pos); 11499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_unref(_RopeRep* __t) { 11519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep::_S_unref(__t); 11529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 11539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_ref(_RopeRep* __t) { 11549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep::_S_ref(__t); 11559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 11569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr; 11589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // _Result is counted in refcount. 11609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeRep* _S_substring(_RopeRep* __base, 11619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __start, size_t __endp1); 11629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeRep* _S_concat_char_iter(_RopeRep* __r, 11649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __iter, size_t __slen); 11659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Concatenate rope and char ptr, copying __s. 11669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Should really take an arbitrary iterator. 11679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Result is counted in refcount. 11689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeRep* _S_destr_concat_char_iter(_RopeRep* __r, 11699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __iter, size_t __slen); 11709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // As above, but one reference to __r is about to be 11719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // destroyed. Thus the pieces may be recycled if all 11729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // relevent reference counts are 1. 11739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // General concatenation on _RopeRep. _Result 11759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // has refcount of 1. Adjusts argument refcounts. 11769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeRep* _S_concat_rep(_RopeRep* __left, _RopeRep* __right); 11779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 11799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) 11809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _CharConsumer> 11819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 11829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Rope_char_consumer<_CharT> _CharConsumer; 11839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 11849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void apply_to_pieces(size_t __begin, size_t __end, 11859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharConsumer& __c) const 11869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { _S_apply_to_pieces(__c, _M_tree_ptr._M_data, __begin, __end); } 11879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: 11899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _S_rounded_up_size(size_t __n) 11919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return _RopeRep::_S_rounded_up_size(__n); } 11929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 11939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Allocate and construct a RopeLeaf using the supplied allocator 11949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Takes ownership of s instead of copying. 11959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeLeaf* _S_new_RopeLeaf(_CharT *__s, 11969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _p_size, allocator_type __a) { 11979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeLeaf* __space = _STLP_CREATE_ALLOCATOR(allocator_type, __a, 11989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeLeaf).allocate(1); 11999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 1200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new(__space) _RopeLeaf(__s, _p_size, __a); 12019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 12029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND(_STLP_CREATE_ALLOCATOR(allocator_type,__a, 12039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeLeaf).deallocate(__space, 1)) 12049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __space; 12059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 12069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeConcatenation* _S_new_RopeConcatenation(_RopeRep* __left, _RopeRep* __right, 12089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block allocator_type __a) { 12099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeConcatenation* __space = _STLP_CREATE_ALLOCATOR(allocator_type, __a, 12109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeConcatenation).allocate(1); 1211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return new(__space) _RopeConcatenation(__left, __right, __a); 12129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 12139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeFunction* _S_new_RopeFunction(char_producer<_CharT>* __f, 12159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _p_size, bool __d, allocator_type __a) { 12169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeFunction* __space = _STLP_CREATE_ALLOCATOR(allocator_type, __a, 12179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeFunction).allocate(1); 1218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return new(__space) _RopeFunction(__f, _p_size, __d, __a); 12199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 12209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeSubstring* _S_new_RopeSubstring(_Rope_RopeRep<_CharT,_Alloc>* __b, size_t __s, 12229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __l, allocator_type __a) { 12239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeSubstring* __space = _STLP_CREATE_ALLOCATOR(allocator_type, __a, 12249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeSubstring).allocate(1); 1225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return new(__space) _RopeSubstring(__b, __s, __l, __a); 12269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 12279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static 12299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeLeaf* _S_RopeLeaf_from_unowned_char_ptr(const _CharT *__s, 12309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _p_size, allocator_type __a) { 12319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == _p_size) return 0; 12329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* __buf = _STLP_CREATE_ALLOCATOR(allocator_type,__a, _CharT).allocate(_S_rounded_up_size(_p_size)); 12349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_PRIV __ucopy_n(__s, _p_size, __buf); 12369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_construct_null(__buf + _p_size); 12379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 12399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _S_new_RopeLeaf(__buf, _p_size, __a); 12409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 12419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND(_RopeRep::_S_free_string(__buf, _p_size, __a)) 12429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_RET_AFTER_THROW(0) 12439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 12449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Concatenation of nonempty strings. 12479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Always builds a concatenation node. 12489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Rebalances if the result is too deep. 12499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Result has refcount 1. 12509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Does not increment left and right ref counts even though 12519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // they are referenced. 12529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeRep* 12539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_tree_concat(_RopeRep* __left, _RopeRep* __right); 12549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Concatenation helper functions 12569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeLeaf* 12579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_leaf_concat_char_iter(_RopeLeaf* __r, 12589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __iter, size_t __slen); 12599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Concatenate by copying leaf. 12609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // should take an arbitrary iterator 12619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // result has refcount 1. 12629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeLeaf* _S_destr_leaf_concat_char_iter 12639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block (_RopeLeaf* __r, const _CharT* __iter, size_t __slen); 12649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // A version that potentially clobbers __r if __r->_M_ref_count == 1. 12659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // A helper function for exponentiating strings. 12689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This uses a nonstandard refcount convention. 12699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The result has refcount 0. 12709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLP_PRIV _Rope_Concat_fn<_CharT,_Alloc> _Concat_fn; 12719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (__GNUC__) || (__GNUC__ < 3) 12729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend _Concat_fn; 12739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 12749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend struct _STLP_PRIV _Rope_Concat_fn<_CharT,_Alloc>; 12759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 12769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 12789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _S_char_ptr_len(const _CharT* __s) { 12799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return char_traits<_CharT>::length(__s); 12809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 12819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: /* for operators */ 12839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(_RopeRep* __t, const allocator_type& __a = allocator_type()) 12849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__a, __t) { } 12859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: 12869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Copy __r to the _CharT buffer. 12879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Returns __buffer + __r->_M_size._M_data. 12889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Assumes that buffer is uninitialized. 12899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _CharT* _S_flatten(_RopeRep* __r, _CharT* __buffer); 12909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Again, with explicit starting position and length. 12929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Assumes that buffer is uninitialized. 12939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _CharT* _S_flatten(_RopeRep* __r, 12949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __start, size_t __len, 12959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* __buffer); 12969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 12979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // fbp : HP aCC prohibits access to protected min_len from within static methods ( ?? ) 12989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 12999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static const unsigned long _S_min_len[__ROPE_DEPTH_SIZE]; 13009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: 13019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static bool _S_is_balanced(_RopeRep* __r) 13029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return (__r->_M_size._M_data >= _S_min_len[__r->_M_depth]); } 13039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static bool _S_is_almost_balanced(_RopeRep* __r) { 13059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__r->_M_depth == 0 || 13069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __r->_M_size._M_data >= _S_min_len[__r->_M_depth - 1]); 13079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 13089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static bool _S_is_roughly_balanced(_RopeRep* __r) { 13109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__r->_M_depth <= 1 || 13119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __r->_M_size._M_data >= _S_min_len[__r->_M_depth - 2]); 13129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 13139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Assumes the result is not empty. 13159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeRep* _S_concat_and_set_balanced(_RopeRep* __left, 13169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __right) { 13179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __result = _S_concat_rep(__left, __right); 13189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_S_is_balanced(__result)) __result->_M_is_balanced = true; 13199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 13209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 13219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The basic rebalancing operation. Logically copies the 13239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // rope. The result has refcount of 1. The client will 13249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // usually decrement the reference count of __r. 13259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The result is within height 2 of balanced by the above 13269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // definition. 13279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeRep* _S_balance(_RopeRep* __r); 13289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Add all unbalanced subtrees to the forest of balanceed trees. 13309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Used only by balance. 13319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_add_to_forest(_RopeRep*__r, _RopeRep** __forest); 13329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Add __r to forest, assuming __r is already balanced. 13349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest); 13359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_DEBUG 13379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Print to stdout, exposing structure 13389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _S_dump(_RopeRep* __r, int __indent = 0); 13399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 13409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Return -1, 0, or 1 if __x < __y, __x == __y, or __x > __y resp. 13429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static int _S_compare(const _RopeRep* __x, const _RopeRep* __y); 13439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _STLP_FUNCTION_THROWS _M_throw_out_of_range() const; 13459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_reset(_RopeRep* __r) { 13479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //if (__r != _M_tree_ptr._M_data) { 13489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_unref(_M_tree_ptr._M_data); 13499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data = __r; 13509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //} 13519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 13529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 13549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool empty() const { return 0 == _M_tree_ptr._M_data; } 13559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Comparison member function. This is public only for those 13579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // clients that need a ternary comparison. Others 13589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // should use the comparison operators below. 13599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int compare(const _Self& __y) const { 13609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _S_compare(_M_tree_ptr._M_data, __y._M_tree_ptr._M_data); 13619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 13629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(const _CharT* __s, const allocator_type& __a = allocator_type()) 13649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__a, _S_RopeLeaf_from_unowned_char_ptr(__s, _S_char_ptr_len(__s),__a)) 13659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block {} 13669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(const _CharT* __s, size_t __len, 13689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const allocator_type& __a = allocator_type()) 13699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__a, (_S_RopeLeaf_from_unowned_char_ptr(__s, __len, __a))) 13709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block {} 13719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Should perhaps be templatized with respect to the iterator type 13739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // and use Sequence_buffer. (It should perhaps use sequence_buffer 13749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // even now.) 13759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(const _CharT *__s, const _CharT *__e, 13769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const allocator_type& __a = allocator_type()) 13779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__a, _S_RopeLeaf_from_unowned_char_ptr(__s, __e - __s, __a)) 13789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block {} 13799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(const const_iterator& __s, const const_iterator& __e, 13819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const allocator_type& __a = allocator_type()) 13829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__a, _S_substring(__s._M_root, __s._M_current_pos, 13839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __e._M_current_pos)) 13849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block {} 13859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(const iterator& __s, const iterator& __e, 13879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const allocator_type& __a = allocator_type()) 13889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__a, _S_substring(__s._M_root, __s._M_current_pos, 13899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __e._M_current_pos)) 13909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block {} 13919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(_CharT __c, const allocator_type& __a = allocator_type()) 13939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__a, (_RopeRep*)0) { 13949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* __buf = _M_tree_ptr.allocate(_S_rounded_up_size(1)); 13959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Copy_Construct(__buf, __c); 13979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_construct_null(__buf + 1); 13989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 13999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 14009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data = _S_new_RopeLeaf(__buf, 1, __a); 14019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND(_RopeRep::_S_free_string(__buf, 1, __a)) 14039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(size_t __n, _CharT __c, 14069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const allocator_type& __a = allocator_type()): 14079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr(__a, (_RopeRep*)0) { 14089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == __n) 14099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return; 14109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc> __result; 14129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __exponentiate_threshold size_t(32) 14139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __remainder; 14149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc> __remainder_rope; 14159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // gcc-2.7.2 bugs 14179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLP_PRIV _Rope_Concat_fn<_CharT,_Alloc> _Concat_fn; 14189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __exponent = __n / __exponentiate_threshold; 14209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __rest = __n % __exponentiate_threshold; 14219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == __rest) { 14229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __remainder = 0; 14239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 14249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* __rest_buffer = _M_tree_ptr.allocate(_S_rounded_up_size(__rest)); 14259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block uninitialized_fill_n(__rest_buffer, __rest, __c); 14269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_construct_null(__rest_buffer + __rest); 14279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 14289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __remainder = _S_new_RopeLeaf(__rest_buffer, __rest, __a); 14299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND(_RopeRep::_S_free_string(__rest_buffer, __rest, __a)) 14319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __remainder_rope._M_tree_ptr._M_data = __remainder; 14339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__exponent != 0) { 14349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* __base_buffer = _M_tree_ptr.allocate(_S_rounded_up_size(__exponentiate_threshold)); 14359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeLeaf* __base_leaf; 14369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc> __base_rope; 14379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block uninitialized_fill_n(__base_buffer, __exponentiate_threshold, __c); 14389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_construct_null(__base_buffer + __exponentiate_threshold); 14399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 14409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __base_leaf = _S_new_RopeLeaf(__base_buffer, 14419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __exponentiate_threshold, __a); 14429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND(_RopeRep::_S_free_string(__base_buffer, 14449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __exponentiate_threshold, __a)) 14459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __base_rope._M_tree_ptr._M_data = __base_leaf; 14469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (1 == __exponent) { 14479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result = __base_rope; 14489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // One each for base_rope and __result 14499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //_STLP_ASSERT(2 == __result._M_tree_ptr._M_data->_M_ref_count) 14509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 14519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result = _STLP_PRIV __power(__base_rope, __exponent, _Concat_fn()); 14529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 != __remainder) { 14549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result += __remainder_rope; 14559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 14579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result = __remainder_rope; 14589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data = __result._M_tree_ptr._M_data; 14609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data->_M_ref_nonnil(); 14619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# undef __exponentiate_threshold 14629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(const allocator_type& __a = allocator_type()) 14659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__a, (_RopeRep*)0) {} 14669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Construct a rope from a function that can compute its members 14689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(char_producer<_CharT> *__fn, size_t __len, bool __delete_fn, 14699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const allocator_type& __a = allocator_type()) 14709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__a, (_RopeRep*)0) { 14719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data = (0 == __len) ? 14729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 0 : _S_new_RopeFunction(__fn, __len, __delete_fn, __a); 14739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(const _Self& __x) 14769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__x._M_tree_ptr, __x._M_tree_ptr._M_data) { 14779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_ref(_M_tree_ptr._M_data); 14789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1480e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC) 14819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope(__move_source<_Self> __src) 14829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_tree_ptr(__src.get()._M_tree_ptr, __src.get()._M_tree_ptr._M_data) { 14839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __src.get()._M_tree_ptr._M_data = 0; 14849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1485e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 14869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~rope() { 14889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_unref(_M_tree_ptr._M_data); 14899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator=(const _Self& __x) { 14929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(get_allocator() == __x.get_allocator()) 14939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_ref(__x._M_tree_ptr._M_data); 14949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(__x._M_tree_ptr._M_data); 14959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 14969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 14979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 14989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void clear() { 14999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_unref(_M_tree_ptr._M_data); 15009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data = 0; 15019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void push_back(_CharT __x) { 15039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, &__x, 1)); 15049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void pop_back() { 15079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __old = _M_tree_ptr._M_data; 15089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data = 15099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_substring(_M_tree_ptr._M_data, 0, _M_tree_ptr._M_data->_M_size._M_data - 1); 15109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_unref(__old); 15119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT back() const { 15149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _S_fetch(_M_tree_ptr._M_data, _M_tree_ptr._M_data->_M_size._M_data - 1); 15159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void push_front(_CharT __x) { 15189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __old = _M_tree_ptr._M_data; 15199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __left = 15209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_RopeLeaf_from_unowned_char_ptr(&__x, 1, _M_tree_ptr); 15219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_TRY { 15229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data = _S_concat_rep(__left, _M_tree_ptr._M_data); 15239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_unref(__old); 15249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_unref(__left); 15259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_UNWIND(_S_unref(__left)) 15279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void pop_front() { 15309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __old = _M_tree_ptr._M_data; 15319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data = _S_substring(_M_tree_ptr._M_data, 1, _M_tree_ptr._M_data->_M_size._M_data); 15329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_unref(__old); 15339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT front() const { 15369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _S_fetch(_M_tree_ptr._M_data, 0); 15379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void balance() { 15409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __old = _M_tree_ptr._M_data; 15419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data = _S_balance(_M_tree_ptr._M_data); 15429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_unref(__old); 15439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void copy(_CharT* __buffer) const { 15469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_STD::_Destroy_Range(__buffer, __buffer + size()); 15479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_flatten(_M_tree_ptr._M_data, __buffer); 15489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* 15519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This is the copy function from the standard, but 15529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * with the arguments reordered to make it consistent with the 15539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * rest of the interface. 15549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Note that this guaranteed not to compile if the draft standard 15559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * order is assumed. 15569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 15579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type copy(size_type __pos, size_type __n, _CharT* __buffer) const { 15589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _p_size = size(); 15599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __len = (__pos + __n > _p_size? _p_size - __pos : __n); 15609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_STD::_Destroy_Range(__buffer, __buffer + __len); 15629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_flatten(_M_tree_ptr._M_data, __pos, __len, __buffer); 15639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __len; 15649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifdef _STLP_DEBUG 15679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Print to stdout, exposing structure. May be useful for 15689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // performance debugging. 15699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void dump() { 15709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_dump(_M_tree_ptr._M_data); 15719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 15739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Convert to 0 terminated string in new allocated memory. 15759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Embedded 0s in the input do not terminate the copy. 15769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* c_str() const; 15779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // As above, but also use the flattened representation as the 15799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // the new rope representation. 15809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* replace_with_c_str(); 15819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Reclaim memory for the c_str generated flattened string. 15839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Intentionally undocumented, since it's hard to say when this 15849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // is safe for multiple threads. 15859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void delete_c_str () { 15869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == _M_tree_ptr._M_data) return; 15879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_RopeRep::_S_leaf == _M_tree_ptr._M_data->_M_tag && 15889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ((_RopeLeaf*)_M_tree_ptr._M_data)->_M_data == 15899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data->_M_c_string) { 15909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Representation shared 15919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return; 15929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data->_M_free_c_string(); 15949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr._M_data->_M_c_string = 0; 15959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 15969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 15979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT operator[] (size_type __pos) const { 15989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _S_fetch(_M_tree_ptr._M_data, __pos); 15999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT at(size_type __pos) const { 16029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos >= size()) _M_throw_out_of_range(); 16039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (*this)[__pos]; 16049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_iterator begin() const { 16079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return(const_iterator(_M_tree_ptr._M_data, 0)); 16089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // An easy way to get a const iterator from a non-const container. 16119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_iterator const_begin() const { 16129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return(const_iterator(_M_tree_ptr._M_data, 0)); 16139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_iterator end() const { 16169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return(const_iterator(_M_tree_ptr._M_data, size())); 16179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_iterator const_end() const { 16209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return(const_iterator(_M_tree_ptr._M_data, size())); 16219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type size() const { 16249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return(0 == _M_tree_ptr._M_data? 0 : _M_tree_ptr._M_data->_M_size._M_data); 16259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type length() const { 16289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return size(); 16299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type max_size() const { 16329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _S_min_len[__ROPE_MAX_DEPTH-1] - 1; 16339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Guarantees that the result can be sufficiently 16349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // balanced. Longer ropes will probably still work, 16359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // but it's harder to make guarantees. 16369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_reverse_iterator rbegin() const { 16399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return const_reverse_iterator(end()); 16409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_reverse_iterator const_rbegin() const { 16439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return const_reverse_iterator(end()); 16449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_reverse_iterator rend() const { 16479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return const_reverse_iterator(begin()); 16489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_reverse_iterator const_rend() const { 16519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return const_reverse_iterator(begin()); 16529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The symmetric cases are intentionally omitted, since they're presumed 16549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // to be less common, and we don't handle them as well. 16559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The following should really be templatized. 16579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The first argument should be an input iterator or 16589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // forward iterator with value_type _CharT. 16599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const _CharT* __iter, size_t __n) { 16609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, __iter, __n)); 16619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 16629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const _CharT* __c_string) { 16659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __len = _S_char_ptr_len(__c_string); 16669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block append(__c_string, __len); 16679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 16689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const _CharT* __s, const _CharT* __e) { 16719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, __s, __e - __s)); 16729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 16739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const_iterator __s, const_iterator __e) { 16769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(__s._M_root == __e._M_root) 16779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(get_allocator() == __s._M_root->get_allocator()) 16789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self_destruct_ptr __appendee(_S_substring(__s._M_root, __s._M_current_pos, __e._M_current_pos)); 16799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(_S_concat_rep(_M_tree_ptr._M_data, (_RopeRep*)__appendee)); 16809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 16819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(_CharT __c) { 16849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, &__c, 1)); 16859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 16869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append() { return append(_CharT()); } // XXX why? 16899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(const _Self& __y) { 16919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(__y.get_allocator() == get_allocator()) 16929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(_S_concat_rep(_M_tree_ptr._M_data, __y._M_tree_ptr._M_data)); 16939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 16949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 16959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 16969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& append(size_t __n, _CharT __c) { 16979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc> __last(__n, __c); 16989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return append(__last); 16999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void swap(_Self& __b) { 17029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_tree_ptr.swap(__b._M_tree_ptr); 17039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1704e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 1705e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void _M_swap_workaround(_Self& __x) { swap(__x); } 1706e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 17079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: 17099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Result is included in refcount. 17109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _RopeRep* replace(_RopeRep* __old, size_t __pos1, 17119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __pos2, _RopeRep* __r) { 17129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == __old) { _S_ref(__r); return __r; } 17139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self_destruct_ptr __left(_S_substring(__old, 0, __pos1)); 17149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self_destruct_ptr __right(_S_substring(__old, __pos2, __old->_M_size._M_data)); 17159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_MPWFIX_TRY //*TY 06/01/2000 - 17169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _RopeRep* __result; 17179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == __r) { 17199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result = _S_concat_rep(__left, __right); 17209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 17219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(__old->get_allocator() == __r->get_allocator()) 17229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self_destruct_ptr __left_result(_S_concat_rep(__left, __r)); 17239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result = _S_concat_rep(__left_result, __right); 17249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 17269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_MPWFIX_CATCH //*TY 06/01/2000 - 17279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 17309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(size_t __p, const _Self& __r) { 17319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__p > size()) _M_throw_out_of_range(); 17329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(get_allocator() == __r.get_allocator()) 17339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(replace(_M_tree_ptr._M_data, __p, __p, __r._M_tree_ptr._M_data)); 17349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(size_t __p, size_t __n, _CharT __c) { 17379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc> __r(__n,__c); 17389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block insert(__p, __r); 17399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(size_t __p, const _CharT* __i, size_t __n) { 17429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__p > size()) _M_throw_out_of_range(); 17439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self_destruct_ptr __left(_S_substring(_M_tree_ptr._M_data, 0, __p)); 17449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self_destruct_ptr __right(_S_substring(_M_tree_ptr._M_data, __p, size())); 17459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self_destruct_ptr __left_result( 17469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_concat_char_iter(__left, __i, __n)); 17479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // _S_ destr_concat_char_iter should be safe here. 17489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // But as it stands it's probably not a win, since __left 17499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // is likely to have additional references. 17509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(_S_concat_rep(__left_result, __right)); 17519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(size_t __p, const _CharT* __c_string) { 17549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block insert(__p, __c_string, _S_char_ptr_len(__c_string)); 17559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(size_t __p, _CharT __c) { 17589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block insert(__p, &__c, 1); 17599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(size_t __p) { 17629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT __c = _CharT(); 17639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block insert(__p, &__c, 1); 17649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(size_t __p, const _CharT* __i, const _CharT* __j) { 17679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self __r(__i, __j); 17689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block insert(__p, __r); 17699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(size_t __p, const const_iterator& __i, 17729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const const_iterator& __j) { 17739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self __r(__i, __j); 17749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block insert(__p, __r); 17759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void insert(size_t __p, const iterator& __i, 17789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const iterator& __j) { 17799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self __r(__i, __j); 17809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block insert(__p, __r); 17819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // (position, length) versions of replace operations: 17849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, size_t __n, const _Self& __r) { 17859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__p > size()) _M_throw_out_of_range(); 17869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(replace(_M_tree_ptr._M_data, __p, __p + __n, __r._M_tree_ptr._M_data)); 17879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, size_t __n, 17909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __i, size_t __i_len) { 17919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self __r(__i, __i_len); 17929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, __n, __r); 17939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 17959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, size_t __n, _CharT __c) { 17969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self __r(__c); 17979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, __n, __r); 17989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 17999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, size_t __n, const _CharT* __c_string) { 18019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self __r(__c_string); 18029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, __n, __r); 18039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, size_t __n, 18069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __i, const _CharT* __j) { 18079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self __r(__i, __j); 18089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, __n, __r); 18099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, size_t __n, 18129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const const_iterator& __i, const const_iterator& __j) { 18139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self __r(__i, __j); 18149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, __n, __r); 18159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, size_t __n, 18189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const iterator& __i, const iterator& __j) { 18199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self __r(__i, __j); 18209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, __n, __r); 18219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Single character variants: 18249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, _CharT __c) { 18259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__p > size()) _M_throw_out_of_range(); 18269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator __i(this, __p); 18279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *__i = __c; 18289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, const _Self& __r) { 18319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, 1, __r); 18329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, const _CharT* __i, size_t __i_len) { 18359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, 1, __i, __i_len); 18369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, const _CharT* __c_string) { 18399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, 1, __c_string); 18409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, const _CharT* __i, const _CharT* __j) { 18439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, 1, __i, __j); 18449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, const const_iterator& __i, 18479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const const_iterator& __j) { 18489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, 1, __i, __j); 18499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(size_t __p, const iterator& __i, 18529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const iterator& __j) { 18539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block replace(__p, 1, __i, __j); 18549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Erase, (position, size) variant. 18579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void erase(size_t __p, size_t __n) { 18589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__p > size()) _M_throw_out_of_range(); 18599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_reset(replace(_M_tree_ptr._M_data, __p, __p + __n, 0)); 18609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Erase, single character 18639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void erase(size_t __p) { 18649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block erase(__p, __p + 1); 18659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 18669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Insert, iterator variants. 18689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(const iterator& __p, const _Self& __r) 18699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { insert(__p.index(), __r); return __p; } 18709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(const iterator& __p, size_t __n, _CharT __c) 18719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { insert(__p.index(), __n, __c); return __p; } 18729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(const iterator& __p, _CharT __c) 18739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { insert(__p.index(), __c); return __p; } 18749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(const iterator& __p ) 18759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { insert(__p.index()); return __p; } 18769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(const iterator& __p, const _CharT* c_string) 18779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { insert(__p.index(), c_string); return __p; } 18789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(const iterator& __p, const _CharT* __i, size_t __n) 18799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { insert(__p.index(), __i, __n); return __p; } 18809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(const iterator& __p, const _CharT* __i, 18819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __j) 18829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { insert(__p.index(), __i, __j); return __p; } 18839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(const iterator& __p, 18849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const const_iterator& __i, const const_iterator& __j) 18859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { insert(__p.index(), __i, __j); return __p; } 18869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator insert(const iterator& __p, 18879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const iterator& __i, const iterator& __j) 18889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { insert(__p.index(), __i, __j); return __p; } 18899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 18909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Replace, range variants. 18919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const iterator& __q, 18929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Self& __r) 18939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __q.index() - __p.index(), __r); } 18949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const iterator& __q, _CharT __c) 18959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __q.index() - __p.index(), __c); } 18969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const iterator& __q, 18979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __c_string) 18989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __q.index() - __p.index(), __c_string); } 18999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const iterator& __q, 19009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __i, size_t __n) 19019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __q.index() - __p.index(), __i, __n); } 19029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const iterator& __q, 19039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __i, const _CharT* __j) 19049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __q.index() - __p.index(), __i, __j); } 19059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const iterator& __q, 19069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const const_iterator& __i, const const_iterator& __j) 19079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __q.index() - __p.index(), __i, __j); } 19089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const iterator& __q, 19099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const iterator& __i, const iterator& __j) 19109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __q.index() - __p.index(), __i, __j); } 19119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Replace, iterator variants. 19139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const _Self& __r) 19149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __r); } 19159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, _CharT __c) 19169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __c); } 19179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const _CharT* __c_string) 19189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __c_string); } 19199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const _CharT* __i, size_t __n) 19209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __i, __n); } 19219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const _CharT* __i, const _CharT* __j) 19229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __i, __j); } 19239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, const_iterator __i, 19249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_iterator __j) 19259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __i, __j); } 19269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void replace(const iterator& __p, iterator __i, iterator __j) 19279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { replace(__p.index(), __i, __j); } 19289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Iterator and range variants of erase 19309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator erase(const iterator& __p, const iterator& __q) { 19319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __p_index = __p.index(); 19329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block erase(__p_index, __q.index() - __p_index); 19339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return iterator(this, __p_index); 19349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator erase(const iterator& __p) { 19369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __p_index = __p.index(); 19379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block erase(__p_index, 1); 19389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return iterator(this, __p_index); 19399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self substr(size_t __start, size_t __len = 1) const { 19429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__start > size()) _M_throw_out_of_range(); 19439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __start, __start + __len)); 19449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self substr(iterator __start, iterator __end) const { 19479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __start.index(), __end.index())); 19489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self substr(iterator __start) const { 19519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __pos = __start.index(); 19529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __pos, __pos + 1)); 19539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self substr(const_iterator __start, const_iterator __end) const { 19569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This might eventually take advantage of the cache in the 19579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // iterator. 19589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __start.index(), __end.index())); 19599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block rope<_CharT,_Alloc> substr(const_iterator __start) { 19629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __pos = __start.index(); 19639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __pos, __pos + 1)); 19649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <stl/_string_npos.h> 19679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type find(const _Self& __s, size_type __pos = 0) const { 19699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos >= size()) 19709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_OLD_ROPE_SEMANTICS 19719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return npos; 19729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 19739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return size(); 19749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 19759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __result_pos; 1977e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const_iterator __result = _STLP_STD::search(const_begin() + (ptrdiff_t)__pos, const_end(), __s.begin(), __s.end() ); 19789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result_pos = __result.index(); 19799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_OLD_ROPE_SEMANTICS 19809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__result_pos == size()) __result_pos = npos; 19819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 19829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result_pos; 19839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type find(_CharT __c, size_type __pos = 0) const; 19859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type find(const _CharT* __s, size_type __pos = 0) const { 19869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __result_pos; 1987e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const_iterator __result = _STLP_STD::search(const_begin() + (ptrdiff_t)__pos, const_end(), 1988e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __s, __s + _S_char_ptr_len(__s)); 19899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result_pos = __result.index(); 19909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_OLD_ROPE_SEMANTICS 19919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__result_pos == size()) __result_pos = npos; 19929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 19939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result_pos; 19949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 19969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator mutable_begin() { 19979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return(iterator(this, 0)); 19989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 19999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator mutable_end() { 20019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return(iterator(this, size())); 20029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 20039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reverse_iterator mutable_rbegin() { 20059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return reverse_iterator(mutable_end()); 20069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 20079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reverse_iterator mutable_rend() { 20099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return reverse_iterator(mutable_begin()); 20109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 20119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference mutable_reference_at(size_type __pos) { 20139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return reference(this, __pos); 20149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 20159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifdef __STD_STUFF 20179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference operator[] (size_type __pos) { 20189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return reference(this, __pos); 20199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 20209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference at(size_type __pos) { 20229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos >= size()) _M_throw_out_of_range(); 20239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (*this)[__pos]; 20249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 20259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void resize(size_type, _CharT) {} 20279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void resize(size_type) {} 20289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void reserve(size_type = 0) {} 20299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type capacity() const { 20309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return max_size(); 20319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 20329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Stuff below this line is dangerous because it's error prone. 20349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // I would really like to get rid of it. 20359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // copy function with funny arg ordering. 20369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type copy(_CharT* __buffer, size_type __n, 20379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __pos = 0) const { 20389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return copy(__pos, __n, __buffer); 20399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 20409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator end() { return mutable_end(); } 20429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block iterator begin() { return mutable_begin(); } 20449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reverse_iterator rend() { return mutable_rend(); } 20469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reverse_iterator rbegin() { return mutable_rbegin(); } 20489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 20509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_iterator end() { return const_end(); } 20529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_iterator begin() { return const_begin(); } 20549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_reverse_iterator rend() { return const_rend(); } 20569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_reverse_iterator rbegin() { return const_rbegin(); } 20589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 20609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; //class rope 20619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2062e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 96) 20639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 20649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockconst size_t rope<_CharT, _Alloc>::npos = ~(size_t) 0; 20659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 20669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 20689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _CharT 20699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Rope_const_iterator< _CharT, _Alloc>::operator[](size_t __n) 20709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return rope<_CharT,_Alloc>::_S_fetch(this->_M_root, this->_M_current_pos + __n); } 20719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 20739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator== (const _Rope_const_iterator<_CharT,_Alloc>& __x, 20749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_const_iterator<_CharT,_Alloc>& __y) { 20759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__x._M_current_pos == __y._M_current_pos && 20769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __x._M_root == __y._M_root); 20779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 20789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 20809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator< (const _Rope_const_iterator<_CharT,_Alloc>& __x, 20819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_const_iterator<_CharT,_Alloc>& __y) 20829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return (__x._M_current_pos < __y._M_current_pos); } 20839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE 20859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 20879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator!= (const _Rope_const_iterator<_CharT,_Alloc>& __x, 20889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_const_iterator<_CharT,_Alloc>& __y) 20899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__x == __y); } 20909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 20929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator> (const _Rope_const_iterator<_CharT,_Alloc>& __x, 20939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_const_iterator<_CharT,_Alloc>& __y) 20949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __y < __x; } 20959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 20969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 20979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator<= (const _Rope_const_iterator<_CharT,_Alloc>& __x, 20989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_const_iterator<_CharT,_Alloc>& __y) 20999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__y < __x); } 21009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator>= (const _Rope_const_iterator<_CharT,_Alloc>& __x, 21039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_const_iterator<_CharT,_Alloc>& __y) 21049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__x < __y); } 21059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ 21079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline ptrdiff_t operator-(const _Rope_const_iterator<_CharT,_Alloc>& __x, 21109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_const_iterator<_CharT,_Alloc>& __y) 21119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos; } 21129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined( __MWERKS__ ) || __MWERKS__ >= 0x2000 // dwa 8/21/97 - "ambiguous access to overloaded function" bug. 21149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Rope_const_iterator<_CharT,_Alloc> 21169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator-(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) 21179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return _Rope_const_iterator<_CharT,_Alloc>(__x._M_root, __x._M_current_pos - __n); } 21189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 21199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Rope_const_iterator<_CharT,_Alloc> 21229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) 21239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return _Rope_const_iterator<_CharT,_Alloc>(__x._M_root, __x._M_current_pos + __n); } 21249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Rope_const_iterator<_CharT,_Alloc> 21279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+(ptrdiff_t __n, const _Rope_const_iterator<_CharT,_Alloc>& __x) 21289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return _Rope_const_iterator<_CharT,_Alloc>(__x._M_root, __x._M_current_pos + __n); } 21299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator== (const _Rope_iterator<_CharT,_Alloc>& __x, 21329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_iterator<_CharT,_Alloc>& __y) { 21339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__x._M_current_pos == __y._M_current_pos && 21349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __x._M_root_rope == __y._M_root_rope); 21359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 21369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator< (const _Rope_iterator<_CharT,_Alloc>& __x, 21399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_iterator<_CharT,_Alloc>& __y) 21409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return (__x._M_current_pos < __y._M_current_pos); } 21419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_SEPARATE_RELOPS_NAMESPACE) 21439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator!= (const _Rope_iterator<_CharT,_Alloc>& __x, 21459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_iterator<_CharT,_Alloc>& __y) 21469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__x == __y); } 21479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator> (const _Rope_iterator<_CharT,_Alloc>& __x, 21509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_iterator<_CharT,_Alloc>& __y) 21519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __y < __x; } 21529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator<= (const _Rope_iterator<_CharT,_Alloc>& __x, 21559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_iterator<_CharT,_Alloc>& __y) 21569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__y < __x); } 21579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator>= (const _Rope_iterator<_CharT,_Alloc>& __x, 21609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_iterator<_CharT,_Alloc>& __y) 21619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__x < __y); } 21629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ 21639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline ptrdiff_t operator-(const _Rope_iterator<_CharT,_Alloc>& __x, 21669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_iterator<_CharT,_Alloc>& __y) 21679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos; } 21689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined( __MWERKS__ ) || __MWERKS__ >= 0x2000 // dwa 8/21/97 - "ambiguous access to overloaded function" bug. 21709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Rope_iterator<_CharT,_Alloc> 21729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator-(const _Rope_iterator<_CharT,_Alloc>& __x, 21739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ptrdiff_t __n) { 21749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Rope_iterator<_CharT,_Alloc>(__x._M_root_rope, __x._M_current_pos - __n); 21759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 21769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 21779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Rope_iterator<_CharT,_Alloc> 21809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+(const _Rope_iterator<_CharT,_Alloc>& __x, 21819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ptrdiff_t __n) { 21829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Rope_iterator<_CharT,_Alloc>(__x._M_root_rope, __x._M_current_pos + __n); 21839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 21849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Rope_iterator<_CharT,_Alloc> 21879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+(ptrdiff_t __n, const _Rope_iterator<_CharT,_Alloc>& __x) { 21889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Rope_iterator<_CharT,_Alloc>(__x._M_root_rope, __x._M_current_pos + __n); 21899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 21909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 21919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 21929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline rope<_CharT,_Alloc> 21939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+ (const rope<_CharT,_Alloc>& __left, 21949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const rope<_CharT,_Alloc>& __right) { 21959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(__left.get_allocator() == __right.get_allocator()) 21969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return rope<_CharT,_Alloc>(rope<_CharT,_Alloc>::_S_concat_rep(__left._M_tree_ptr._M_data, __right._M_tree_ptr._M_data)); 21979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Inlining this should make it possible to keep __left and __right in registers. 21989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 21999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline rope<_CharT,_Alloc>& 22029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+= (rope<_CharT,_Alloc>& __left, 22039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const rope<_CharT,_Alloc>& __right) { 22049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __left.append(__right); 22059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __left; 22069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline rope<_CharT,_Alloc> 22109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+ (const rope<_CharT,_Alloc>& __left, 22119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __right) { 22129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __rlen = rope<_CharT,_Alloc>::_S_char_ptr_len(__right); 22139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return rope<_CharT,_Alloc>(rope<_CharT,_Alloc>::_S_concat_char_iter(__left._M_tree_ptr._M_data, __right, __rlen)); 22149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline rope<_CharT,_Alloc>& 22189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+= (rope<_CharT,_Alloc>& __left, 22199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _CharT* __right) { 22209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __left.append(__right); 22219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __left; 22229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline rope<_CharT,_Alloc> 22269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+ (const rope<_CharT,_Alloc>& __left, _CharT __right) { 22279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return rope<_CharT,_Alloc>(rope<_CharT,_Alloc>::_S_concat_char_iter(__left._M_tree_ptr._M_data, &__right, 1)); 22289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline rope<_CharT,_Alloc>& 22329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+= (rope<_CharT,_Alloc>& __left, _CharT __right) { 22339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __left.append(__right); 22349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __left; 22359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool 22399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator< (const rope<_CharT,_Alloc>& __left, 22409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const rope<_CharT,_Alloc>& __right) { 22419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __left.compare(__right) < 0; 22429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool 22469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator== (const rope<_CharT,_Alloc>& __left, 22479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const rope<_CharT,_Alloc>& __right) { 22489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __left.compare(__right) == 0; 22499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE 22529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool 22559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator!= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { 22569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return !(__x == __y); 22579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool 22619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator> (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { 22629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __y < __x; 22639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool 22679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { 22689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return !(__y < __x); 22699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool 22739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { 22749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return !(__x < __y); 22759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator!= (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x, 22799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) { 22809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return !(__x == __y); 22819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ 22849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 22869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator== (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x, 22879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) { 22889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__x._M_pos == __y._M_pos && __x._M_root == __y._M_root); 22899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 22909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 22919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_USE_NO_IOSTREAMS) 22929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT, class _Traits, class _Alloc> 22939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_ostream<_CharT, _Traits>& operator<< (basic_ostream<_CharT, _Traits>& __o, 22949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const rope<_CharT, _Alloc>& __r); 22959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 22969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef rope<char, allocator<char> > crope; 22989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_HAS_WCHAR_T) 2299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef rope<wchar_t, allocator<wchar_t> > wrope; 23009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 23019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline crope::reference __mutable_reference_at(crope& __c, size_t __i) 23039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __c.mutable_reference_at(__i); } 23049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_HAS_WCHAR_T) 23069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline wrope::reference __mutable_reference_at(wrope& __c, size_t __i) 23079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __c.mutable_reference_at(__i); } 23089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 23099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 23119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 23129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void swap(rope<_CharT,_Alloc>& __x, rope<_CharT,_Alloc>& __y) 23139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ __x.swap(__y); } 23149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 23159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void swap(crope& __x, crope& __y) { __x.swap(__y); } 23179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifdef _STLP_HAS_WCHAR_T // dwa 8/21/97 23189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void swap(wrope& __x, wrope& __y) { __x.swap(__y); } 23199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 23209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */ 23229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Hash functions should probably be revisited later: 23259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL struct hash<crope> { 23269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t operator()(const crope& __str) const { 23279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _p_size = __str.size(); 23289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == _p_size) return 0; 23309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return 13*__str[0] + 5*__str[_p_size - 1] + _p_size; 23319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 23329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 23339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_HAS_WCHAR_T) // dwa 8/21/97 23359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL struct hash<wrope> { 23369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t operator()(const wrope& __str) const { 23379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _p_size = __str.size(); 23389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (0 == _p_size) return 0; 23409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return 13*__str[0] + 5*__str[_p_size - 1] + _p_size; 23419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 23429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 23439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 23449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if (!defined (_STLP_MSVC) || (_STLP_MSVC >= 1310)) 23469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// I couldn't get this to work with VC++ 23479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _CharT,class _Alloc> 2348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (__DMC__) 23499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockextern 23509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 23519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _Rope_rotate(_Rope_iterator<_CharT, _Alloc> __first, 23529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator<_CharT, _Alloc> __middle, 23539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Rope_iterator<_CharT, _Alloc> __last); 23549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void rotate(_Rope_iterator<char, allocator<char> > __first, 2356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Rope_iterator<char, allocator<char> > __middle, 2357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Rope_iterator<char, allocator<char> > __last) 23589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ _Rope_rotate(__first, __middle, __last); } 23599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 23609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 23629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Rope_char_ref_proxy<_CharT, _Alloc>::operator _CharT () const { 23639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_current_valid) { 23649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_current; 23659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } else { 23669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _My_rope::_S_fetch(_M_root->_M_tree_ptr._M_data, _M_pos); 23679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 23689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 23699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_NO_MOVE_SEMANTIC) 23719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Alloc> 23729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __move_traits<rope<_CharT, _Alloc> > { 2373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef __true_type implemented; 23749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //Completness depends on the allocator: 23759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename __move_traits<_Alloc>::complete complete; 23769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 23779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 23789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 23809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION) 23829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_rope.c> 23839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 23849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_ROPE_H */ 23869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 23879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables: 23889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++ 23899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End: 2390