_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