177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1996,1997 477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc. 577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1997 777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Moscow Center for SPARC Technology 877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999 1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev 1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed 1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk. 1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted 1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies. 1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted, 1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was 1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice. 2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* NOTE: This is an internal header file, included by other STL headers. 2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * You should not attempt to use it directly. 2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// rope<_CharT,_Alloc> is a sequence of _CharT. 2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Ropes appear to be mutable, but update operations 2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// really copy enough of the data structure to leave the original 3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// valid. Thus ropes can be logically copied by just copying 3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// a pointer value. 3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ROPE_H 3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_INTERNAL_ROPE_H 3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ALGOBASE_H 3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_algobase.h> 3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_USE_NO_IOSTREAMS) && !defined (_STLP_INTERNAL_IOSFWD) 4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_iosfwd.h> 4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ALLOC_H 4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_alloc.h> 4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ITERATOR_H 4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_iterator.h> 5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ALGO_H 5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_algo.h> 5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_FUNCTION_BASE_H 5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_function_base.h> 5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_NUMERIC_H 6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_numeric.h> 6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_HASH_FUN_H 6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_hash_fun.h> 6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_CHAR_TRAITS_H 6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/char_traits.h> 7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_THREADS_H 7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_threads.h> 7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_SGI_THREADS 7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <mutex.h> 7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE 8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) (_Alloc_traits<_Tp,__atype>::create_allocator(__a)) 8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) __stl_alloc_create(__a,(_Tp*)0) 8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE 8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// First a lot of forward declarations. The standard seems to require 8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// much stricter "declaration before use" than many of the implementations 9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// that preceded it. 9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_CharT>) > class rope; 9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> struct _Rope_RopeConcatenation; 9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> struct _Rope_RopeRep; 9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> struct _Rope_RopeLeaf; 9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> struct _Rope_RopeFunction; 9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> struct _Rope_RopeSubstring; 9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> class _Rope_iterator; 9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> class _Rope_const_iterator; 9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> class _Rope_char_ref_proxy; 10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> class _Rope_char_ptr_proxy; 10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE 10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT> 10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _BasicCharType { typedef __false_type _Ret; }; 10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL 10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _BasicCharType<char> { typedef __true_type _Ret; }; 10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_HAS_WCHAR_T 11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL 11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _BasicCharType<wchar_t> { typedef __true_type _Ret; }; 11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Some helpers, so we can use the power algorithm on ropes. 11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// See below for why this isn't local to the implementation. 11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// This uses a nonstandard refcount convention. 11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// The result has refcount 0. 12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Rope_Concat_fn 12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : public binary_function<rope<_CharT,_Alloc>, rope<_CharT,_Alloc>, 12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc> > { 12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc> operator() (const rope<_CharT,_Alloc>& __x, 12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const rope<_CharT,_Alloc>& __y) { 12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __x + __y; 12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline 13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerrope<_CharT,_Alloc> 13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__identity_element(_Rope_Concat_fn<_CharT, _Alloc>) 13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return rope<_CharT,_Alloc>(); } 13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE 13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Store an eos 13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT> 14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void _S_construct_null_aux(_CharT *__p, const __true_type&) 14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ *__p = 0; } 14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT> 14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void _S_construct_null_aux(_CharT *__p, const __false_type&) 14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_STD::_Construct(__p); } 14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT> 14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void _S_construct_null(_CharT *__p) { 14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsIntegral<_CharT>::_Ret _Char_Is_Integral; 15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_construct_null_aux(__p, _Char_Is_Integral()); 15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// char_producers are logically functions that generate a section of 15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// a string. These can be converted to ropes. The resulting rope 15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// invokes the char_producer on demand. This allows, for example, 15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// files to be viewed as ropes without reading the entire file. 15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT> 15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass char_producer { 15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner virtual ~char_producer() {} 16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner virtual void operator()(size_t __start_pos, size_t __len, 16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* __buffer) = 0; 16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Buffer should really be an arbitrary output iterator. 16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // That way we could flatten directly into an ostream, etc. 16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // This is thoroughly impossible, since iterator types don't 16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // have runtime descriptions. 16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Sequence buffers: 17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Sequence must provide an append operation that appends an 17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// array to the sequence. Sequence buffers are useful only if 17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// appending an entire array is cheaper than appending element by element. 17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// This is true for many string representations. 17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// This should perhaps inherit from ostream<sequence::value_type> 17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// and be implemented correspondingly, so that they can be used 17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// for formatted. For the sake of portability, we don't do this yet. 17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// For now, sequence buffers behave as output iterators. But they also 18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// behave a little like basic_ostringstream<sequence::value_type> and a 18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// little like containers. 18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _Sequence 18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !(defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) || \ 18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner defined ( _STLP_NO_DEFAULT_NON_TYPE_PARAM )) 18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner , size_t _Buf_sz = 100 18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined(__sgi) && !defined(__GNUC__) 18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define __TYPEDEF_WORKAROUND 18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ,class _V = typename _Sequence::value_type 19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* __sgi */ 19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */ 19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner > 19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// The 3rd parameter works around a common compiler bug. 19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass sequence_buffer : public iterator <output_iterator_tag, void, void, void, void> { 19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef __TYPEDEF_WORKAROUND 19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Sequence::value_type value_type; 19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef sequence_buffer<_Sequence 19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !(defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) || \ 20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner defined ( _STLP_NO_DEFAULT_NON_TYPE_PARAM )) 20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner , _Buf_sz 20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner > _Self; 20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else /* _STLP_NON_TYPE_TMPL_PARAM_BUG */ 20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner > _Self; 20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _Buf_sz = 100}; 20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */ 20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // # endif 20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else /* __TYPEDEF_WORKAROUND */ 20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _V value_type; 21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef sequence_buffer<_Sequence, _Buf_sz, _V> _Self; 21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* __TYPEDEF_WORKAROUND */ 21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected: 21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Sequence* _M_prefix; 21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner value_type _M_buffer[_Buf_sz]; 21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _M_buf_count; 21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void flush() { 21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_prefix->append(_M_buffer, _M_buffer + _M_buf_count); 21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_count = 0; 22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ~sequence_buffer() { flush(); } 22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner sequence_buffer() : _M_prefix(0), _M_buf_count(0) {} 22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner sequence_buffer(const _Self& __x) { 22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_prefix = __x._M_prefix; 22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_count = __x._M_buf_count; 22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer); 22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner sequence_buffer(_Self& __x) { 22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __x.flush(); 23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_prefix = __x._M_prefix; 23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_count = 0; 23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner sequence_buffer(_Sequence& __s) : _M_prefix(&__s), _M_buf_count(0) {} 23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator= (_Self& __x) { 23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __x.flush(); 23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_prefix = __x._M_prefix; 23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_count = 0; 23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator= (const _Self& __x) { 24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_prefix = __x._M_prefix; 24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_count = __x._M_buf_count; 24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer); 24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 24577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void push_back(value_type __x) { 24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_M_buf_count < _Buf_sz) { 24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buffer[_M_buf_count] = __x; 24977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ++_M_buf_count; 25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner flush(); 25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buffer[0] = __x; 25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_count = 1; 25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void append(const value_type *__s, size_t __len) { 25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__len + _M_buf_count <= _Buf_sz) { 25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __i = _M_buf_count; 25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __j = 0; 26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (; __j < __len; __i++, __j++) { 26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buffer[__i] = __s[__j]; 26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_count += __len; 26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else if (0 == _M_buf_count) { 26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_prefix->append(__s, __s + __len); 26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner flush(); 26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner append(__s, __len); 26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& write(const value_type *__s, size_t __len) { 27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner append(__s, __len); 27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& put(value_type __x) { 27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner push_back(__x); 27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator=(const value_type& __rhs) { 28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner push_back(__rhs); 28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator*() { return *this; } 28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator++() { return *this; } 28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator++(int) { return *this; } 28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// The following should be treated as private, at least for now. 28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT> 29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _Rope_char_consumer { 29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_MEMBER_TEMPLATES) 29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //Without member templates we have to use run-time parameterization. 29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The symmetry with char_producer is accidental and temporary. 29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner virtual ~_Rope_char_consumer() {} 29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner virtual bool operator()(const _CharT* __buffer, size_t __len) = 0; 29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// What follows should really be local to rope. Unfortunately, 30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// that doesn't work, since it makes it impossible to define generic 30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// equality on rope iterators. According to the draft standard, the 30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// template parameters for such an equality operator cannot be inferred 30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// from the occurence of a member class as a parameter. 30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// (SGI compilers in fact allow this, but the __result wouldn't be 30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// portable.) 30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Similarly, some of the static member functions are member functions 30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// only to avoid polluting the global namespace, and to circumvent 31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// restrictions on type inference for template functions. 31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// The internal data structure for representing a rope. This is 31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// private to the implementation. A rope is really just a pointer 31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// to one of these. 31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// A few basic functions for manipulating this data structure 31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// are members of _RopeRep. Most of the more complex algorithms 32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// are implemented as rope members. 32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Some of the static member functions of _RopeRep have identically 32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// named functions in rope that simply invoke the _RopeRep versions. 32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Rope_RopeRep 32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : public _Refcount_Base 32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT, _Alloc> _Self; 33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // 33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // GAB: 11/09/05 33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // 33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // "__ROPE_DEPTH_SIZE" is set to one more then the "__ROPE_MAX_DEPTH". 33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // This was originally just an addition of "__ROPE_MAX_DEPTH + 1" 33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // but this addition causes the sunpro compiler to complain about 33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // multiple declarations during the initialization of "_S_min_len". 33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Changed to be a fixed value and the sunpro compiler appears to 34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // be happy??? 34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // 34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define __ROPE_MAX_DEPTH 45 34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define __ROPE_DEPTH_SIZE 46 // __ROPE_MAX_DEPTH + 1 34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _S_max_rope_depth = __ROPE_MAX_DEPTH }; 34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum _Tag {_S_leaf, _S_concat, _S_substringfn, _S_function}; 34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Apparently needed by VC++ 34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The data fields of leaves are allocated with some 34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // extra space, to accomodate future growth and for basic 34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // character types, to hold a trailing eos character. 35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _S_alloc_granularity = 8 }; 35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Tag _M_tag:8; 35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool _M_is_balanced:8; 35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Alloc allocator_type; 35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner allocator_type get_allocator() const { return allocator_type(_M_size); } 35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner unsigned char _M_depth; 36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* _STLP_VOLATILE _M_c_string; 36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV _STLP_alloc_proxy<size_t, _CharT, allocator_type> _M_size; 36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_NO_ARROW_OPERATOR 36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeRep() : _Refcount_Base(1), _M_size(allocator_type(), 0) { 36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (_STLP_CHECK_RUNTIME_COMPATIBILITY) 36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_CHECK_RUNTIME_COMPATIBILITY(); 36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* Flattened version of string, if needed. */ 37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* typically 0. */ 37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* If it's not 0, then the memory is owned */ 37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* by this node. */ 37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* In the case of a leaf, this may point to */ 37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* the same memory as the data field. */ 37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeRep(_Tag __t, unsigned char __d, bool __b, size_t _p_size, 37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner allocator_type __a) : 38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Refcount_Base(1), 38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tag(__t), _M_is_balanced(__b), _M_depth(__d), _M_c_string(0), _M_size(__a, _p_size) { 38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_CHECK_RUNTIME_COMPATIBILITY) 38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_CHECK_RUNTIME_COMPATIBILITY(); 38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _STLP_TYPENAME _STLP_PRIV _BasicCharType<_CharT>::_Ret _IsBasicCharType; 38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if 0 39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* Please tell why this code is necessary if you uncomment it. 39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Problem with it is that rope implementation expect that _S_rounded_up_size(n) 39277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * returns a size > n in order to store the terminating null charater. When 39377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * instanciation type is not a char or wchar_t this is not guaranty resulting in 39477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * memory overrun. 39577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 39677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static size_t _S_rounded_up_size_aux(size_t __n, __true_type const& /*_IsBasicCharType*/) { 39777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Allow slop for in-place expansion. 39877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (__n + _S_alloc_granularity) & ~(_S_alloc_granularity - 1); 39977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 40077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 40177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static size_t _S_rounded_up_size_aux(size_t __n, __false_type const& /*_IsBasicCharType*/) { 40277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Allow slop for in-place expansion. 40377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (__n + _S_alloc_granularity - 1) & ~(_S_alloc_granularity - 1); 40477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 40577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 40677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // fbp : moved from RopeLeaf 40777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static size_t _S_rounded_up_size(size_t __n) 40877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //{ return _S_rounded_up_size_aux(__n, _IsBasicCharType()); } 40977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { return (__n + _S_alloc_granularity) & ~(_S_alloc_granularity - 1); } 41077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 41177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_free_string( _CharT* __s, size_t __len, 41277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner allocator_type __a) { 41377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::_Destroy_Range(__s, __s + __len); 41477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // This has to be a static member, so this gets a bit messy 41577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE 41677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __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 41777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 41877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __stl_alloc_rebind (__a, (_CharT*)0).deallocate(__s, _S_rounded_up_size(__len)); 41977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 42077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 42177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 42277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Deallocate data section of a leaf. 42377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // This shouldn't be a member function. 42477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // But its hard to do anything else at the 42577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // moment, because it's templatized w.r.t. 42677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // an allocator. 42777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Does nothing if __GC is defined. 42877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_free_c_string(); 42977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_free_tree(); 43077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Deallocate t. Assumes t is not 0. 43177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_unref_nonnil() { 43277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_M_decr() == 0) _M_free_tree(); 43377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 43477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_ref_nonnil() { 43577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_incr(); 43677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 43777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_unref(_Self* __t) { 43877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 != __t) { 43977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __t->_M_unref_nonnil(); 44077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 44177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 44277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_ref(_Self* __t) { 44377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 != __t) __t->_M_incr(); 44477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 44577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //static void _S_free_if_unref(_Self* __t) { 44677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // if (0 != __t && 0 == __t->_M_ref_count) __t->_M_free_tree(); 44777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //} 44877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 44977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 45077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 45177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Rope_RopeLeaf : public _Rope_RopeRep<_CharT,_Alloc> { 45277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 45377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* _M_data; /* Not necessarily 0 terminated. */ 45477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* The allocated size is */ 45577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* _S_rounded_up_size(size), except */ 45677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* in the GC case, in which it */ 45777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* doesn't matter. */ 45877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate: 45977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 46077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _RopeRep::_IsBasicCharType _IsBasicCharType; 46177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_init(__true_type const& /*_IsBasicCharType*/) { 46277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_c_string = _M_data; 46377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 46477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_init(__false_type const& /*_IsBasicCharType*/) {} 46577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 46677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 46777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 46877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _RopeRep::allocator_type allocator_type; 46977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 47077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeLeaf( _CharT* __d, size_t _p_size, allocator_type __a) 47177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _Rope_RopeRep<_CharT,_Alloc>(_RopeRep::_S_leaf, 0, true, _p_size, __a), 47277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_data(__d) { 47377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(_p_size > 0) 47477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_init(_IsBasicCharType()); 47577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 47677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 47777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef _STLP_NO_ARROW_OPERATOR 47877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeLeaf() {} 47977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeLeaf(const _Rope_RopeLeaf<_CharT, _Alloc>& ) {} 48077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 48177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 48277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// The constructor assumes that d has been allocated with 48377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // the proper allocator and the properly padded size. 48477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // In contrast, the destructor deallocates the data: 48577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ~_Rope_RopeLeaf() { 48677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_M_data != this->_M_c_string) { 48777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_free_c_string(); 48877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 48977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep::_S_free_string(_M_data, this->_M_size._M_data, this->get_allocator()); 49077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 49177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 49277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 49377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 49477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Rope_RopeConcatenation : public _Rope_RopeRep<_CharT, _Alloc> { 49577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate: 49677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 49777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 49877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 49977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* _M_left; 50077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* _M_right; 50177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 50277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _RopeRep::allocator_type allocator_type; 50377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeConcatenation(_RopeRep* __l, _RopeRep* __r, allocator_type __a) 50477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _Rope_RopeRep<_CharT,_Alloc>(_RopeRep::_S_concat, 50577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner (max)(__l->_M_depth, __r->_M_depth) + 1, false, 50677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __l->_M_size._M_data + __r->_M_size._M_data, __a), _M_left(__l), _M_right(__r) 50777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner {} 50877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef _STLP_NO_ARROW_OPERATOR 50977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeConcatenation() {} 51077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeConcatenation(const _Rope_RopeConcatenation<_CharT, _Alloc>&) {} 51177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 51277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 51377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ~_Rope_RopeConcatenation() { 51477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_free_c_string(); 51577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_left->_M_unref_nonnil(); 51677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_right->_M_unref_nonnil(); 51777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 51877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 51977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 52077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 52177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Rope_RopeFunction : public _Rope_RopeRep<_CharT, _Alloc> { 52277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate: 52377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 52477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 52577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner char_producer<_CharT>* _M_fn; 52677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* 52777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Char_producer is owned by the 52877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * rope and should be explicitly 52977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * deleted when the rope becomes 53077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * inaccessible. 53177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 53277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool _M_delete_when_done; 53377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 53477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type; 53577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef _STLP_NO_ARROW_OPERATOR 53677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeFunction() {} 53777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeFunction(const _Rope_RopeFunction<_CharT, _Alloc>& ) {} 53877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 53977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 54077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeFunction(char_producer<_CharT>* __f, size_t _p_size, 54177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool __d, allocator_type __a) 54277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _Rope_RopeRep<_CharT,_Alloc>(_RopeRep::_S_function, 0, true, _p_size, __a), _M_fn(__f) 54377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner , _M_delete_when_done(__d) 54477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { _STLP_ASSERT(_p_size > 0) } 54577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 54677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ~_Rope_RopeFunction() { 54777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_free_c_string(); 54877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_M_delete_when_done) { 54977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner delete _M_fn; 55077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 55177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 55277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 55377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 55477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 55577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Substring results are usually represented using just 55677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * concatenation nodes. But in the case of very long flat ropes 55777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or ropes with a functional representation that isn't practical. 55877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * In that case, we represent the __result as a special case of 55977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * RopeFunction, whose char_producer points back to the rope itself. 56077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * In all cases except repeated substring operations and 56177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * deallocation, we treat the __result as a RopeFunction. 56277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 56377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 56477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Rope_RopeSubstring : public char_producer<_CharT>, public _Rope_RopeFunction<_CharT,_Alloc> { 56577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 56677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // XXX this whole class should be rewritten. 56777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 56877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep *_M_base; // not 0 56977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _M_start; 57077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* virtual */ void operator()(size_t __start_pos, size_t __req_len, 57177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* __buffer) { 57277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeFunction<_CharT,_Alloc> _RopeFunction; 57377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeLeaf<_CharT,_Alloc> _RopeLeaf; 57477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner switch (_M_base->_M_tag) { 57577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner case _RopeRep::_S_function: 57677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner case _RopeRep::_S_substringfn: 57777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { 57877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner char_producer<_CharT>* __fn = 57977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(_RopeFunction*, _M_base)->_M_fn; 58077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(__start_pos + __req_len <= this->_M_size._M_data) 58177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(_M_start + this->_M_size._M_data <= _M_base->_M_size._M_data) 58277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner (*__fn)(__start_pos + _M_start, __req_len, __buffer); 58377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 58477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner break; 58577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner case _RopeRep::_S_leaf: 58677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { 58777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* __s = 58877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(_RopeLeaf*, _M_base)->_M_data; 58977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __ucopy_n(__s + __start_pos + _M_start, __req_len, __buffer); 59077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 59177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner break; 59277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner default: 59377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(false) 59477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ; 59577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 59677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 59777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 59877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 59977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _RopeRep::allocator_type allocator_type; 60077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 60177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeSubstring(_RopeRep* __b, size_t __s, size_t __l, allocator_type __a) 60277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _Rope_RopeFunction<_CharT,_Alloc>(this, __l, false, __a), 60377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_base(__b), _M_start(__s) { 60477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(__l > 0) 60577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(__s + __l <= __b->_M_size._M_data) 60677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_base->_M_ref_nonnil(); 60777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_tag = _RopeRep::_S_substringfn; 60877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 60977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner virtual ~_Rope_RopeSubstring() 61077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { _M_base->_M_unref_nonnil(); } 61177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 61277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 61377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 61477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Self-destructing pointers to Rope_rep. 61577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * These are not conventional smart pointers. Their 61677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * only purpose in life is to ensure that unref is called 61777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * on the pointer either at normal exit or if an exception 61877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * is raised. It is the caller's responsibility to 61977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * adjust reference counts when these pointers are initialized 62077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or assigned to. (This convention significantly reduces 62177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * the number of potentially expensive reference count 62277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * updates.) 62377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 62477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 62577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Rope_self_destruct_ptr { 62677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeRep<_CharT,_Alloc>* _M_ptr; 62777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ~_Rope_self_destruct_ptr() 62877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { _Rope_RopeRep<_CharT,_Alloc>::_S_unref(_M_ptr); } 62977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef _STLP_USE_EXCEPTIONS 63077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_self_destruct_ptr() : _M_ptr(0) {} 63177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 63277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_self_destruct_ptr() {} 63377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 63477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_self_destruct_ptr(_Rope_RopeRep<_CharT,_Alloc>* __p) : _M_ptr(__p) {} 63577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeRep<_CharT,_Alloc>& operator*() { return *_M_ptr; } 63677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeRep<_CharT,_Alloc>* operator->() { return _M_ptr; } 63777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner operator _Rope_RopeRep<_CharT,_Alloc>*() { return _M_ptr; } 63877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_self_destruct_ptr<_CharT, _Alloc>& 63977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner operator= (_Rope_RopeRep<_CharT,_Alloc>* __x) 64077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { _M_ptr = __x; return *this; } 64177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 64277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 64377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 64477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Dereferencing a nonconst iterator has to return something 64577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * that behaves almost like a reference. It's not possible to 64677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * return an actual reference since assignment requires extra 64777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * work. And we would get into the same problems as with the 64877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * CD2 version of basic_string. 64977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 65077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 65177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _Rope_char_ref_proxy { 65277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_char_ref_proxy<_CharT, _Alloc> _Self; 65377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class rope<_CharT,_Alloc>; 65477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class _Rope_iterator<_CharT,_Alloc>; 65577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class _Rope_char_ptr_proxy<_CharT,_Alloc>; 65677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr; 65777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 65877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef rope<_CharT,_Alloc> _My_rope; 65977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _M_pos; 66077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT _M_current; 66177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool _M_current_valid; 66277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _My_rope* _M_root; // The whole rope. 66377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 66477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ref_proxy(_My_rope* __r, size_t __p) : 66577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_pos(__p), _M_current_valid(false), _M_root(__r) {} 66677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ref_proxy(const _Self& __x) : 66777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_pos(__x._M_pos), _M_current_valid(false), _M_root(__x._M_root) {} 66877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Don't preserve cache if the reference can outlive the 66977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // expression. We claim that's not possible without calling 67077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // a copy constructor or generating reference to a proxy 67177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // reference. We declare the latter to have undefined semantics. 67277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ref_proxy(_My_rope* __r, size_t __p, _CharT __c) 67377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_pos(__p), _M_current(__c), _M_current_valid(true), _M_root(__r) {} 67477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner inline operator _CharT () const; 67577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator= (_CharT __c); 67677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ptr_proxy<_CharT, _Alloc> operator& () const; 67777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator= (const _Self& __c) { 67877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return operator=((_CharT)__c); 67977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 68077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 68177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 68277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER 68377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class __Alloc> 68477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a, 68577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ref_proxy <_CharT, __Alloc > __b) { 68677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT __tmp = __a; 68777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __a = __b; 68877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __b = __tmp; 68977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 69077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 69177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// There is no really acceptable way to handle this. The default 69277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// definition of swap doesn't work for proxy references. 69377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// It can't really be made to work, even with ugly hacks, since 69477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// the only unusual operation it uses is the copy constructor, which 69577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// is needed for other purposes. We provide a macro for 69677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// full specializations, and instantiate the most common case. 69777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _ROPE_SWAP_SPECIALIZATION(_CharT, __Alloc) \ 69877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner inline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a, \ 69977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ref_proxy <_CharT, __Alloc > __b) { \ 70077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT __tmp = __a; \ 70177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __a = __b; \ 70277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __b = __tmp; \ 70377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 70477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 70577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_ROPE_SWAP_SPECIALIZATION(char, allocator<char>) 70677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 70777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_NO_WCHAR_T 70877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_ROPE_SWAP_SPECIALIZATION(wchar_t, allocator<wchar_t>) 70977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 71077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 71177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* !_STLP_FUNCTION_TMPL_PARTIAL_ORDER */ 71277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 71377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 71477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _Rope_char_ptr_proxy { 71577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // XXX this class should be rewritten. 71677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 71777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_char_ptr_proxy<_CharT, _Alloc> _Self; 71877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class _Rope_char_ref_proxy<_CharT,_Alloc>; 71977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _M_pos; 72077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc>* _M_root; // The whole rope. 72177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 72277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ptr_proxy(const _Rope_char_ref_proxy<_CharT,_Alloc>& __x) 72377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_pos(__x._M_pos), _M_root(__x._M_root) {} 72477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ptr_proxy(const _Self& __x) 72577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_pos(__x._M_pos), _M_root(__x._M_root) {} 72677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ptr_proxy() {} 72777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ptr_proxy(_CharT* __x) : _M_pos(0), _M_root(0) { 72877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(0 == __x) 72977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 73077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator= (const _Self& __x) { 73177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_pos = __x._M_pos; 73277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_root = __x._M_root; 73377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 73477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 73577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 73677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_char_ref_proxy<_CharT,_Alloc> operator*() const { 73777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _Rope_char_ref_proxy<_CharT,_Alloc>(_M_root, _M_pos); 73877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 73977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 74077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 74177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 74277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 74377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Rope iterators: 74477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Unlike in the C version, we cache only part of the stack 74577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * for rope iterators, since they must be efficiently copyable. 74677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * When we run out of cache, we have to reconstruct the iterator 74777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * value. 74877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Pointers from iterators are not included in reference counts. 74977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Iterators are assumed to be thread private. Ropes can 75077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * be shared. 75177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 75277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 75377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _Rope_iterator_base 75477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* : public random_access_iterator<_CharT, ptrdiff_t> */ 75577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 75677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class rope<_CharT,_Alloc>; 75777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_iterator_base<_CharT, _Alloc> _Self; 75877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeConcatenation<_CharT,_Alloc> _RopeConcat; 75977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 76077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 76177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 76277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _S_path_cache_len = 4 }; // Must be <= 9 because of _M_path_direction. 76377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _S_iterator_buf_len = 15 }; 76477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _M_current_pos; 76577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The whole rope. 76677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* _M_root; 76777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Starting position for current leaf 76877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _M_leaf_pos; 76977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Buffer possibly containing current char. 77077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* _M_buf_start; 77177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Pointer to current char in buffer, != 0 ==> buffer valid. 77277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* _M_buf_ptr; 77377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // One past __last valid char in buffer. 77477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* _M_buf_end; 77577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 77677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // What follows is the path cache. We go out of our 77777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // way to make this compact. 77877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Path_end contains the bottom section of the path from 77977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // the root to the current leaf. 78077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner struct { 78177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (__BORLANDC__) && (__BORLANDC__ < 0x560) 78277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep const*_M_data[4]; 78377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 78477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep const*_M_data[_S_path_cache_len]; 78577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 78677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } _M_path_end; 78777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Last valid __pos in path_end; 78877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // _M_path_end[0] ... _M_path_end[_M_leaf_index-1] 78977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // point to concatenation nodes. 79077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int _M_leaf_index; 79177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // (_M_path_directions >> __i) & 1 is 1 79277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // if we got from _M_path_end[leaf_index - __i - 1] 79377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // to _M_path_end[leaf_index - __i] by going to the 79477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // __right. Assumes path_cache_len <= 9. 79577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner unsigned char _M_path_directions; 79677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Short buffer for surrounding chars. 79777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // This is useful primarily for 79877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // RopeFunctions. We put the buffer 79977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // here to avoid locking in the 80077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // multithreaded case. 80177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The cached path is generally assumed to be valid 80277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // only if the buffer is valid. 80377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner struct { 80477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (__BORLANDC__) && (__BORLANDC__ < 0x560) 80577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT _M_data[15]; 80677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 80777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT _M_data[_S_iterator_buf_len]; 80877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 80977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } _M_tmp_buf; 81077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 81177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Set buffer contents given path cache. 81277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_setbuf(_Rope_iterator_base<_CharT, _Alloc>& __x); 81377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Set buffer contents and path cache. 81477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_setcache(_Rope_iterator_base<_CharT, _Alloc>& __x); 81577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // As above, but assumes path cache is valid for previous posn. 81677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_setcache_for_incr(_Rope_iterator_base<_CharT, _Alloc>& __x); 81777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator_base() {} 81877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator_base(_RopeRep* __root, size_t __pos) 81977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_current_pos(__pos),_M_root(__root), _M_buf_ptr(0) {} 82077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_incr(size_t __n); 82177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_decr(size_t __n); 82277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 82377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t index() const { return _M_current_pos; } 82477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate: 82577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_copy_buf(const _Self& __x) { 82677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tmp_buf = __x._M_tmp_buf; 82777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__x._M_buf_start == __x._M_tmp_buf._M_data) { 82877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_start = _M_tmp_buf._M_data; 82977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_end = _M_buf_start + (__x._M_buf_end - __x._M_buf_start); 83077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_ptr = _M_buf_start + (__x._M_buf_ptr - __x._M_buf_start); 83177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 83277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_end = __x._M_buf_end; 83377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 83477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 83577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 83677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 83777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator_base(const _Self& __x) : 83877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_current_pos(__x._M_current_pos), 83977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_root(__x._M_root), 84077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_leaf_pos( __x._M_leaf_pos ), 84177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_start(__x._M_buf_start), 84277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_ptr(__x._M_buf_ptr), 84377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_path_end(__x._M_path_end), 84477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_leaf_index(__x._M_leaf_index), 84577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_path_directions(__x._M_path_directions) 84677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { 84777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 != __x._M_buf_ptr) { 84877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_copy_buf(__x); 84977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 85077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 85177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator = (const _Self& __x) 85277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { 85377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_current_pos = __x._M_current_pos; 85477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_root = __x._M_root; 85577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_start = __x._M_buf_start; 85677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buf_ptr = __x._M_buf_ptr; 85777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_path_end = __x._M_path_end; 85877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_leaf_index = __x._M_leaf_index; 85977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_path_directions = __x._M_path_directions; 86077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_leaf_pos = __x._M_leaf_pos; 86177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 != __x._M_buf_ptr) { 86277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_copy_buf(__x); 86377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 86477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 86577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 86677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 86777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 86877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> class _Rope_iterator; 86977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 87077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 87177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _Rope_const_iterator : public _Rope_iterator_base<_CharT,_Alloc> { 87277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class rope<_CharT,_Alloc>; 87377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_const_iterator<_CharT, _Alloc> _Self; 87477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_iterator_base<_CharT,_Alloc> _Base; 87577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // protected: 87677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 87777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_HAS_NO_NAMESPACES 87877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 87977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The one from the base class may not be directly visible. 88077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 88177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_const_iterator(const _RopeRep* __root, size_t __pos): 88277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator_base<_CharT,_Alloc>(__CONST_CAST(_RopeRep*,__root), __pos) 88377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Only nonconst iterators modify root ref count 88477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner {} 88577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 88677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _CharT reference; // Really a value. Returning a reference 88777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Would be a mess, since it would have 88877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // to be included in refcount. 88977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef const _CharT* pointer; 89077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _CharT value_type; 89177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef ptrdiff_t difference_type; 89277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef random_access_iterator_tag iterator_category; 89377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 89477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 89577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_const_iterator() {} 89677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_const_iterator(const _Self& __x) : 89777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator_base<_CharT,_Alloc>(__x) { } 89877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_const_iterator(const _Rope_iterator<_CharT,_Alloc>& __x): 89977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator_base<_CharT,_Alloc>(__x) {} 90077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_const_iterator(const rope<_CharT,_Alloc>& __r, size_t __pos) : 90177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr._M_data, __pos) {} 90277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator= (const _Self& __x) { 90377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Base::operator=(__x); 90477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 90577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 90677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reference operator*() { 90777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == this->_M_buf_ptr) 9087414fafb3c392b0fee2932afd175a4ed0950aae9Andrew Hsieh#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || __GNUC_MINOR__ >= 7)) 90934ed92a1b33fc95e1bf48a7f1840ddbcbacb5e3eLogan Chien this->_S_setcache(*this); 91034ed92a1b33fc95e1bf48a7f1840ddbcbacb5e3eLogan Chien#elif !defined (__DMC__) 91177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_setcache(*this); 91277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 91377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { _Rope_iterator_base<_CharT, _Alloc>* __x = this; _S_setcache(*__x); } 91477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 91577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *(this->_M_buf_ptr); 91677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 91777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator++() 91877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { 91977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( this->_M_buf_ptr != 0 ) { 92077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT *__next = this->_M_buf_ptr + 1; 92177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( __next < this->_M_buf_end ) { 92277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_buf_ptr = __next; 92377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ++this->_M_current_pos; 92477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 92577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 92677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 92777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_incr(1); 92877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 92977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 93077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator+=(ptrdiff_t __n) { 93177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n >= 0) { 93277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_incr(__n); 93377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 93477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_decr(-__n); 93577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 93677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 93777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 93877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator--() { 93977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_decr(1); 94077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 94177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 94277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator-=(ptrdiff_t __n) { 94377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n >= 0) { 94477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_decr(__n); 94577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 94677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_incr(-__n); 94777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 94877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 94977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 95077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self operator++(int) { 95177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __old_pos = this->_M_current_pos; 95277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_incr(1); 95377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _Rope_const_iterator<_CharT,_Alloc>(this->_M_root, __old_pos); 95477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // This makes a subsequent dereference expensive. 95577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Perhaps we should instead copy the iterator 95677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // if it has a valid cache? 95777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 95877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self operator--(int) { 95977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __old_pos = this->_M_current_pos; 96077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_decr(1); 96177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _Rope_const_iterator<_CharT,_Alloc>(this->_M_root, __old_pos); 96277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 96377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner inline reference operator[](size_t __n); 96477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 96577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 96677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Alloc> 96777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _Rope_iterator : public _Rope_iterator_base<_CharT,_Alloc> { 96877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class rope<_CharT,_Alloc>; 96977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_iterator<_CharT, _Alloc> _Self; 97077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_iterator_base<_CharT,_Alloc> _Base; 97177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep; 97277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 97377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 97477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc>* _M_root_rope; 97577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // root is treated as a cached version of this, 97677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // and is used to detect changes to the underlying 97777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // rope. 97877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Root is included in the reference count. 97977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // This is necessary so that we can detect changes reliably. 98077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Unfortunately, it requires careful bookkeeping for the 98177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // nonGC case. 98277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator(rope<_CharT,_Alloc>* __r, size_t __pos); 98377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 98477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_check(); 98577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 98677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_char_ref_proxy<_CharT,_Alloc> reference; 98777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_char_ref_proxy<_CharT,_Alloc>* pointer; 98877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _CharT value_type; 98977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef ptrdiff_t difference_type; 99077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef random_access_iterator_tag iterator_category; 99177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 99277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ~_Rope_iterator() { //*TY 5/6/00 - added dtor to balance reference count 99377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep::_S_unref(this->_M_root); 99477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 99577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 99677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc>& container() { return *_M_root_rope; } 99777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator() { 99877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_root = 0; // Needed for reference counting. 99977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 100077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator(const _Self& __x) : 100177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator_base<_CharT,_Alloc>(__x) { 100277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_root_rope = __x._M_root_rope; 100377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep::_S_ref(this->_M_root); 100477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 100577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator(rope<_CharT,_Alloc>& __r, size_t __pos); 100677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator= (const _Self& __x) { 100777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __old = this->_M_root; 100877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep::_S_ref(__x._M_root); 100977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Base::operator=(__x); 101077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_root_rope = __x._M_root_rope; 101177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep::_S_unref(__old); 101277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 101377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 101477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reference operator*() { 101577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_check(); 101677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == this->_M_buf_ptr) { 101777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return reference(_M_root_rope, this->_M_current_pos); 101877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 101977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return reference(_M_root_rope, this->_M_current_pos, *(this->_M_buf_ptr)); 102077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 102177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 102277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator++() { 102377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_incr(1); 102477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 102577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 102677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator+=(ptrdiff_t __n) { 102777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n >= 0) { 102877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_incr(__n); 102977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 103077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_decr(-__n); 103177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 103277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 103377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 103477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator--() { 103577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_decr(1); 103677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 103777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 103877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator-=(ptrdiff_t __n) { 103977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n >= 0) { 104077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_decr(__n); 104177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 104277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_incr(-__n); 104377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 104477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 104577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 104677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self operator++(int) { 104777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __old_pos = this->_M_current_pos; 104877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_incr(1); 104977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _Self(_M_root_rope, __old_pos); 105077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 105177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self operator--(int) { 105277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __old_pos = this->_M_current_pos; 105377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner this->_M_decr(1); 105477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _Self(_M_root_rope, __old_pos); 105577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 105677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reference operator[](ptrdiff_t __n) { 105777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return reference(_M_root_rope, this->_M_current_pos + __n); 105877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 105977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 106077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 106177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES 106277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 106377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline random_access_iterator_tag 106477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneriterator_category(const _Rope_iterator<_CharT,_Alloc>&) { return random_access_iterator_tag();} 106577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 106677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _CharT* value_type(const _Rope_iterator<_CharT,_Alloc>&) { return 0; } 106777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 106877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline ptrdiff_t* distance_type(const _Rope_iterator<_CharT,_Alloc>&) { return 0; } 106977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 107077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline random_access_iterator_tag 107177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneriterator_category(const _Rope_const_iterator<_CharT,_Alloc>&) { return random_access_iterator_tag(); } 107277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 107377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _CharT* value_type(const _Rope_const_iterator<_CharT,_Alloc>&) { return 0; } 107477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 107577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline ptrdiff_t* distance_type(const _Rope_const_iterator<_CharT,_Alloc>&) { return 0; } 107677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */ 107777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 107877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc, class _CharConsumer> 107977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool _S_apply_to_pieces(_CharConsumer& __c, 108077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_RopeRep<_CharT, _Alloc> *__r, 108177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __begin, size_t __end); 108277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // begin and end are assumed to be in range. 108377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 108477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 108577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass rope 108677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 108777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : public __stlport_class<rope<_CharT, _Alloc> > 108877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 108977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 109077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef rope<_CharT,_Alloc> _Self; 109177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 109277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _CharT value_type; 109377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef ptrdiff_t difference_type; 109477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef size_t size_type; 109577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _CharT const_reference; 109677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef const _CharT* const_pointer; 109777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_iterator<_CharT,_Alloc> iterator; 109877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_const_iterator<_CharT,_Alloc> const_iterator; 109977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_char_ref_proxy<_CharT,_Alloc> reference; 110077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_char_ptr_proxy<_CharT,_Alloc> pointer; 110177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 110277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class _Rope_iterator<_CharT,_Alloc>; 110377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class _Rope_const_iterator<_CharT,_Alloc>; 110477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend struct _Rope_RopeRep<_CharT,_Alloc>; 110577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class _Rope_iterator_base<_CharT,_Alloc>; 110677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class _Rope_char_ptr_proxy<_CharT,_Alloc>; 110777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend class _Rope_char_ref_proxy<_CharT,_Alloc>; 110877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend struct _Rope_RopeSubstring<_CharT,_Alloc>; 110977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 111077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS; 111177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 111277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected: 111377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _CharT* _Cstrptr; 111477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 111577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _CharT _S_empty_c_str[1]; 111677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 111777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _S_copy_max = 23 }; 111877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // For strings shorter than _S_copy_max, we copy to 111977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // concatenate. 112077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 112177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeRep<_CharT, _Alloc> _RopeRep; 112277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _RopeRep::_IsBasicCharType _IsBasicCharType; 112377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 112477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 112577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_FORCE_ALLOCATORS(_CharT, _Alloc) 112677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Alloc allocator_type; 112777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 112877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 112977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The only data member of a rope: 113077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV _STLP_alloc_proxy<_RopeRep*, _CharT, allocator_type> _M_tree_ptr; 113177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 113277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 113377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner allocator_type get_allocator() const { return allocator_type(_M_tree_ptr); } 113477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 113577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 113677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeConcatenation<_CharT,_Alloc> _RopeConcatenation; 113777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeLeaf<_CharT,_Alloc> _RopeLeaf; 113877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeFunction<_CharT,_Alloc> _RopeFunction; 113977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_RopeSubstring<_CharT,_Alloc> _RopeSubstring; 114077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 114177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Retrieve a character at the indicated position. 114277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _CharT _S_fetch(_RopeRep* __r, size_type __pos); 114377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 114477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Obtain a pointer to the character at the indicated position. 114577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The pointer can be used to change the character. 114677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // If such a pointer cannot be produced, as is frequently the 114777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // case, 0 is returned instead. 114877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // (Returns nonzero only if all nodes in the path have a refcount 114977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // of 1.) 115077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _CharT* _S_fetch_ptr(_RopeRep* __r, size_type __pos); 115177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 115277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_unref(_RopeRep* __t) { 115377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep::_S_unref(__t); 115477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 115577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_ref(_RopeRep* __t) { 115677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep::_S_ref(__t); 115777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 115877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 115977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr; 116077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 116177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // _Result is counted in refcount. 116277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeRep* _S_substring(_RopeRep* __base, 116377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __start, size_t __endp1); 116477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 116577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeRep* _S_concat_char_iter(_RopeRep* __r, 116677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __iter, size_t __slen); 116777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Concatenate rope and char ptr, copying __s. 116877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Should really take an arbitrary iterator. 116977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Result is counted in refcount. 117077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeRep* _S_destr_concat_char_iter(_RopeRep* __r, 117177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __iter, size_t __slen); 117277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // As above, but one reference to __r is about to be 117377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // destroyed. Thus the pieces may be recycled if all 117477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // relevent reference counts are 1. 117577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 117677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // General concatenation on _RopeRep. _Result 117777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // has refcount of 1. Adjusts argument refcounts. 117877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeRep* _S_concat_rep(_RopeRep* __left, _RopeRep* __right); 117977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 118077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 118177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MEMBER_TEMPLATES) 118277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner template <class _CharConsumer> 118377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 118477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Rope_char_consumer<_CharT> _CharConsumer; 118577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 118677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void apply_to_pieces(size_t __begin, size_t __end, 118777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharConsumer& __c) const 118877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { _S_apply_to_pieces(__c, _M_tree_ptr._M_data, __begin, __end); } 118977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 119077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected: 119177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 119277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static size_t _S_rounded_up_size(size_t __n) 119377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { return _RopeRep::_S_rounded_up_size(__n); } 119477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 119577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Allocate and construct a RopeLeaf using the supplied allocator 119677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Takes ownership of s instead of copying. 119777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeLeaf* _S_new_RopeLeaf(_CharT *__s, 119877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _p_size, allocator_type __a) { 119977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeLeaf* __space = _STLP_CREATE_ALLOCATOR(allocator_type, __a, 120077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeLeaf).allocate(1); 120177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_TRY { 120277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner new(__space) _RopeLeaf(__s, _p_size, __a); 120377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 120477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_UNWIND(_STLP_CREATE_ALLOCATOR(allocator_type,__a, 120577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeLeaf).deallocate(__space, 1)) 120677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __space; 120777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 120877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 120977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeConcatenation* _S_new_RopeConcatenation(_RopeRep* __left, _RopeRep* __right, 121077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner allocator_type __a) { 121177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeConcatenation* __space = _STLP_CREATE_ALLOCATOR(allocator_type, __a, 121277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeConcatenation).allocate(1); 121377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return new(__space) _RopeConcatenation(__left, __right, __a); 121477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 121577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 121677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeFunction* _S_new_RopeFunction(char_producer<_CharT>* __f, 121777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _p_size, bool __d, allocator_type __a) { 121877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeFunction* __space = _STLP_CREATE_ALLOCATOR(allocator_type, __a, 121977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeFunction).allocate(1); 122077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return new(__space) _RopeFunction(__f, _p_size, __d, __a); 122177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 122277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 122377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeSubstring* _S_new_RopeSubstring(_Rope_RopeRep<_CharT,_Alloc>* __b, size_t __s, 122477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __l, allocator_type __a) { 122577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeSubstring* __space = _STLP_CREATE_ALLOCATOR(allocator_type, __a, 122677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeSubstring).allocate(1); 122777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return new(__space) _RopeSubstring(__b, __s, __l, __a); 122877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 122977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 123077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static 123177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeLeaf* _S_RopeLeaf_from_unowned_char_ptr(const _CharT *__s, 123277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _p_size, allocator_type __a) { 123377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == _p_size) return 0; 123477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 123577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* __buf = _STLP_CREATE_ALLOCATOR(allocator_type,__a, _CharT).allocate(_S_rounded_up_size(_p_size)); 123677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 123777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __ucopy_n(__s, _p_size, __buf); 123877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_construct_null(__buf + _p_size); 123977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 124077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_TRY { 124177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _S_new_RopeLeaf(__buf, _p_size, __a); 124277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 124377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_UNWIND(_RopeRep::_S_free_string(__buf, _p_size, __a)) 124477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_RET_AFTER_THROW(0) 124577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 124677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 124777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 124877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Concatenation of nonempty strings. 124977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Always builds a concatenation node. 125077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Rebalances if the result is too deep. 125177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Result has refcount 1. 125277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Does not increment left and right ref counts even though 125377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // they are referenced. 125477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeRep* 125577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_tree_concat(_RopeRep* __left, _RopeRep* __right); 125677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 125777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Concatenation helper functions 125877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeLeaf* 125977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_leaf_concat_char_iter(_RopeLeaf* __r, 126077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __iter, size_t __slen); 126177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Concatenate by copying leaf. 126277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // should take an arbitrary iterator 126377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // result has refcount 1. 126477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeLeaf* _S_destr_leaf_concat_char_iter 126577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner (_RopeLeaf* __r, const _CharT* __iter, size_t __slen); 126677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // A version that potentially clobbers __r if __r->_M_ref_count == 1. 126777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 126877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 126977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // A helper function for exponentiating strings. 127077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // This uses a nonstandard refcount convention. 127177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The result has refcount 0. 127277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _STLP_PRIV _Rope_Concat_fn<_CharT,_Alloc> _Concat_fn; 127377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (__GNUC__) || (__GNUC__ < 3) 127477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend _Concat_fn; 127577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 127677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner friend struct _STLP_PRIV _Rope_Concat_fn<_CharT,_Alloc>; 127777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 127877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 127977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 128077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static size_t _S_char_ptr_len(const _CharT* __s) { 128177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return char_traits<_CharT>::length(__s); 128277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 128377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 128477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: /* for operators */ 128577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(_RopeRep* __t, const allocator_type& __a = allocator_type()) 128677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__a, __t) { } 128777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate: 128877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Copy __r to the _CharT buffer. 128977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Returns __buffer + __r->_M_size._M_data. 129077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Assumes that buffer is uninitialized. 129177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _CharT* _S_flatten(_RopeRep* __r, _CharT* __buffer); 129277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 129377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Again, with explicit starting position and length. 129477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Assumes that buffer is uninitialized. 129577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _CharT* _S_flatten(_RopeRep* __r, 129677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __start, size_t __len, 129777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* __buffer); 129877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 129977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // fbp : HP aCC prohibits access to protected min_len from within static methods ( ?? ) 130077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 130177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static const unsigned long _S_min_len[__ROPE_DEPTH_SIZE]; 130277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected: 130377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static bool _S_is_balanced(_RopeRep* __r) 130477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { return (__r->_M_size._M_data >= _S_min_len[__r->_M_depth]); } 130577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 130677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static bool _S_is_almost_balanced(_RopeRep* __r) { 130777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (__r->_M_depth == 0 || 130877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __r->_M_size._M_data >= _S_min_len[__r->_M_depth - 1]); 130977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 131077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 131177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static bool _S_is_roughly_balanced(_RopeRep* __r) { 131277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (__r->_M_depth <= 1 || 131377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __r->_M_size._M_data >= _S_min_len[__r->_M_depth - 2]); 131477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 131577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 131677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Assumes the result is not empty. 131777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeRep* _S_concat_and_set_balanced(_RopeRep* __left, 131877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __right) { 131977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __result = _S_concat_rep(__left, __right); 132077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_S_is_balanced(__result)) __result->_M_is_balanced = true; 132177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result; 132277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 132377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 132477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The basic rebalancing operation. Logically copies the 132577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // rope. The result has refcount of 1. The client will 132677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // usually decrement the reference count of __r. 132777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The result is within height 2 of balanced by the above 132877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // definition. 132977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeRep* _S_balance(_RopeRep* __r); 133077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 133177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Add all unbalanced subtrees to the forest of balanceed trees. 133277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Used only by balance. 133377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_add_to_forest(_RopeRep*__r, _RopeRep** __forest); 133477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 133577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Add __r to forest, assuming __r is already balanced. 133677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest); 133777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 133877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_DEBUG 133977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Print to stdout, exposing structure 134077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static void _S_dump(_RopeRep* __r, int __indent = 0); 134177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 134277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 134377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Return -1, 0, or 1 if __x < __y, __x == __y, or __x > __y resp. 134477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static int _S_compare(const _RopeRep* __x, const _RopeRep* __y); 134577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 134677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _STLP_FUNCTION_THROWS _M_throw_out_of_range() const; 134777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 134877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_reset(_RopeRep* __r) { 134977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //if (__r != _M_tree_ptr._M_data) { 135077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_unref(_M_tree_ptr._M_data); 135177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data = __r; 135277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //} 135377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 135477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 135577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 135677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool empty() const { return 0 == _M_tree_ptr._M_data; } 135777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 135877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Comparison member function. This is public only for those 135977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // clients that need a ternary comparison. Others 136077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // should use the comparison operators below. 136177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int compare(const _Self& __y) const { 136277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _S_compare(_M_tree_ptr._M_data, __y._M_tree_ptr._M_data); 136377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 136477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 136577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(const _CharT* __s, const allocator_type& __a = allocator_type()) 136677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__a, _S_RopeLeaf_from_unowned_char_ptr(__s, _S_char_ptr_len(__s),__a)) 136777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner {} 136877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 136977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(const _CharT* __s, size_t __len, 137077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const allocator_type& __a = allocator_type()) 137177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__a, (_S_RopeLeaf_from_unowned_char_ptr(__s, __len, __a))) 137277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner {} 137377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 137477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Should perhaps be templatized with respect to the iterator type 137577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // and use Sequence_buffer. (It should perhaps use sequence_buffer 137677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // even now.) 137777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(const _CharT *__s, const _CharT *__e, 137877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const allocator_type& __a = allocator_type()) 137977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__a, _S_RopeLeaf_from_unowned_char_ptr(__s, __e - __s, __a)) 138077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner {} 138177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 138277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(const const_iterator& __s, const const_iterator& __e, 138377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const allocator_type& __a = allocator_type()) 138477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__a, _S_substring(__s._M_root, __s._M_current_pos, 138577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __e._M_current_pos)) 138677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner {} 138777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 138877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(const iterator& __s, const iterator& __e, 138977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const allocator_type& __a = allocator_type()) 139077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__a, _S_substring(__s._M_root, __s._M_current_pos, 139177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __e._M_current_pos)) 139277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner {} 139377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 139477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(_CharT __c, const allocator_type& __a = allocator_type()) 139577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__a, (_RopeRep*)0) { 139677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* __buf = _M_tree_ptr.allocate(_S_rounded_up_size(1)); 139777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 139877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Copy_Construct(__buf, __c); 139977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_construct_null(__buf + 1); 140077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 140177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_TRY { 140277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data = _S_new_RopeLeaf(__buf, 1, __a); 140377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 140477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_UNWIND(_RopeRep::_S_free_string(__buf, 1, __a)) 140577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 140677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 140777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(size_t __n, _CharT __c, 140877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const allocator_type& __a = allocator_type()): 140977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr(__a, (_RopeRep*)0) { 141077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == __n) 141177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return; 141277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 141377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc> __result; 141477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define __exponentiate_threshold size_t(32) 141577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __remainder; 141677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc> __remainder_rope; 141777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 141877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // gcc-2.7.2 bugs 141977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _STLP_PRIV _Rope_Concat_fn<_CharT,_Alloc> _Concat_fn; 142077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 142177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __exponent = __n / __exponentiate_threshold; 142277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __rest = __n % __exponentiate_threshold; 142377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == __rest) { 142477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __remainder = 0; 142577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 142677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* __rest_buffer = _M_tree_ptr.allocate(_S_rounded_up_size(__rest)); 142777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner uninitialized_fill_n(__rest_buffer, __rest, __c); 142877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_construct_null(__rest_buffer + __rest); 142977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_TRY { 143077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __remainder = _S_new_RopeLeaf(__rest_buffer, __rest, __a); 143177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 143277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_UNWIND(_RopeRep::_S_free_string(__rest_buffer, __rest, __a)) 143377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 143477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __remainder_rope._M_tree_ptr._M_data = __remainder; 143577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__exponent != 0) { 143677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* __base_buffer = _M_tree_ptr.allocate(_S_rounded_up_size(__exponentiate_threshold)); 143777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeLeaf* __base_leaf; 143877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc> __base_rope; 143977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner uninitialized_fill_n(__base_buffer, __exponentiate_threshold, __c); 144077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_construct_null(__base_buffer + __exponentiate_threshold); 144177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_TRY { 144277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __base_leaf = _S_new_RopeLeaf(__base_buffer, 144377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __exponentiate_threshold, __a); 144477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 144577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_UNWIND(_RopeRep::_S_free_string(__base_buffer, 144677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __exponentiate_threshold, __a)) 144777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __base_rope._M_tree_ptr._M_data = __base_leaf; 144877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (1 == __exponent) { 144977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __result = __base_rope; 145077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // One each for base_rope and __result 145177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //_STLP_ASSERT(2 == __result._M_tree_ptr._M_data->_M_ref_count) 145277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 145377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __result = _STLP_PRIV __power(__base_rope, __exponent, _Concat_fn()); 145477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 145577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 != __remainder) { 145677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __result += __remainder_rope; 145777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 145877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 145977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __result = __remainder_rope; 146077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 146177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data = __result._M_tree_ptr._M_data; 146277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data->_M_ref_nonnil(); 146377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# undef __exponentiate_threshold 146477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 146577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 146677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(const allocator_type& __a = allocator_type()) 146777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__a, (_RopeRep*)0) {} 146877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 146977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Construct a rope from a function that can compute its members 147077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(char_producer<_CharT> *__fn, size_t __len, bool __delete_fn, 147177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const allocator_type& __a = allocator_type()) 147277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__a, (_RopeRep*)0) { 147377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data = (0 == __len) ? 147477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 0 : _S_new_RopeFunction(__fn, __len, __delete_fn, __a); 147577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 147677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 147777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(const _Self& __x) 147877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__x._M_tree_ptr, __x._M_tree_ptr._M_data) { 147977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_ref(_M_tree_ptr._M_data); 148077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 148177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 148277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_MOVE_SEMANTIC) 148377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope(__move_source<_Self> __src) 148477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _M_tree_ptr(__src.get()._M_tree_ptr, __src.get()._M_tree_ptr._M_data) { 148577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __src.get()._M_tree_ptr._M_data = 0; 148677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 148777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 148877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 148977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ~rope() { 149077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_unref(_M_tree_ptr._M_data); 149177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 149277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 149377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator=(const _Self& __x) { 149477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(get_allocator() == __x.get_allocator()) 149577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_ref(__x._M_tree_ptr._M_data); 149677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(__x._M_tree_ptr._M_data); 149777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 149877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 149977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 150077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void clear() { 150177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_unref(_M_tree_ptr._M_data); 150277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data = 0; 150377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 150477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void push_back(_CharT __x) { 150577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, &__x, 1)); 150677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 150777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 150877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void pop_back() { 150977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __old = _M_tree_ptr._M_data; 151077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data = 151177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_substring(_M_tree_ptr._M_data, 0, _M_tree_ptr._M_data->_M_size._M_data - 1); 151277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_unref(__old); 151377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 151477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 151577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT back() const { 151677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _S_fetch(_M_tree_ptr._M_data, _M_tree_ptr._M_data->_M_size._M_data - 1); 151777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 151877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 151977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void push_front(_CharT __x) { 152077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __old = _M_tree_ptr._M_data; 152177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __left = 152277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_RopeLeaf_from_unowned_char_ptr(&__x, 1, _M_tree_ptr); 152377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_TRY { 152477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data = _S_concat_rep(__left, _M_tree_ptr._M_data); 152577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_unref(__old); 152677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_unref(__left); 152777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 152877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_UNWIND(_S_unref(__left)) 152977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 153077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 153177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void pop_front() { 153277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __old = _M_tree_ptr._M_data; 153377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data = _S_substring(_M_tree_ptr._M_data, 1, _M_tree_ptr._M_data->_M_size._M_data); 153477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_unref(__old); 153577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 153677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 153777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT front() const { 153877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _S_fetch(_M_tree_ptr._M_data, 0); 153977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 154077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 154177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void balance() { 154277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __old = _M_tree_ptr._M_data; 154377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data = _S_balance(_M_tree_ptr._M_data); 154477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_unref(__old); 154577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 154677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 154777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void copy(_CharT* __buffer) const { 154877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::_Destroy_Range(__buffer, __buffer + size()); 154977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_flatten(_M_tree_ptr._M_data, __buffer); 155077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 155177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 155277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* 155377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This is the copy function from the standard, but 155477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * with the arguments reordered to make it consistent with the 155577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * rest of the interface. 155677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Note that this guaranteed not to compile if the draft standard 155777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * order is assumed. 155877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 155977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type copy(size_type __pos, size_type __n, _CharT* __buffer) const { 156077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _p_size = size(); 156177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __len = (__pos + __n > _p_size? _p_size - __pos : __n); 156277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 156377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::_Destroy_Range(__buffer, __buffer + __len); 156477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_flatten(_M_tree_ptr._M_data, __pos, __len, __buffer); 156577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __len; 156677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 156777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 156877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef _STLP_DEBUG 156977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Print to stdout, exposing structure. May be useful for 157077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // performance debugging. 157177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void dump() { 157277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_dump(_M_tree_ptr._M_data); 157377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 157477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 157577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 157677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Convert to 0 terminated string in new allocated memory. 157777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Embedded 0s in the input do not terminate the copy. 157877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* c_str() const; 157977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 158077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // As above, but also use the flattened representation as the 158177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // the new rope representation. 158277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* replace_with_c_str(); 158377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 158477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Reclaim memory for the c_str generated flattened string. 158577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Intentionally undocumented, since it's hard to say when this 158677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // is safe for multiple threads. 158777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void delete_c_str () { 158877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == _M_tree_ptr._M_data) return; 158977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_RopeRep::_S_leaf == _M_tree_ptr._M_data->_M_tag && 159077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ((_RopeLeaf*)_M_tree_ptr._M_data)->_M_data == 159177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data->_M_c_string) { 159277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Representation shared 159377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return; 159477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 159577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data->_M_free_c_string(); 159677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr._M_data->_M_c_string = 0; 159777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 159877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 159977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT operator[] (size_type __pos) const { 160077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _S_fetch(_M_tree_ptr._M_data, __pos); 160177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 160277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 160377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT at(size_type __pos) const { 160477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__pos >= size()) _M_throw_out_of_range(); 160577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (*this)[__pos]; 160677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 160777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 160877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator begin() const { 160977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return(const_iterator(_M_tree_ptr._M_data, 0)); 161077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 161177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 161277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // An easy way to get a const iterator from a non-const container. 161377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator const_begin() const { 161477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return(const_iterator(_M_tree_ptr._M_data, 0)); 161577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 161677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 161777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator end() const { 161877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return(const_iterator(_M_tree_ptr._M_data, size())); 161977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 162077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 162177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator const_end() const { 162277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return(const_iterator(_M_tree_ptr._M_data, size())); 162377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 162477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 162577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type size() const { 162677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return(0 == _M_tree_ptr._M_data? 0 : _M_tree_ptr._M_data->_M_size._M_data); 162777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 162877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 162977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type length() const { 163077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return size(); 163177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 163277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 163377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type max_size() const { 163477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _S_min_len[__ROPE_MAX_DEPTH-1] - 1; 163577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Guarantees that the result can be sufficiently 163677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // balanced. Longer ropes will probably still work, 163777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // but it's harder to make guarantees. 163877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 163977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 164077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator rbegin() const { 164177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return const_reverse_iterator(end()); 164277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 164377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 164477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator const_rbegin() const { 164577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return const_reverse_iterator(end()); 164677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 164777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 164877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator rend() const { 164977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return const_reverse_iterator(begin()); 165077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 165177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 165277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator const_rend() const { 165377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return const_reverse_iterator(begin()); 165477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 165577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The symmetric cases are intentionally omitted, since they're presumed 165677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // to be less common, and we don't handle them as well. 165777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 165877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The following should really be templatized. 165977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // The first argument should be an input iterator or 166077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // forward iterator with value_type _CharT. 166177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& append(const _CharT* __iter, size_t __n) { 166277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, __iter, __n)); 166377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 166477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 166577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 166677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& append(const _CharT* __c_string) { 166777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __len = _S_char_ptr_len(__c_string); 166877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner append(__c_string, __len); 166977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 167077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 167177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 167277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& append(const _CharT* __s, const _CharT* __e) { 167377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, __s, __e - __s)); 167477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 167577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 167677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 167777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& append(const_iterator __s, const_iterator __e) { 167877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(__s._M_root == __e._M_root) 167977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(get_allocator() == __s._M_root->get_allocator()) 168077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self_destruct_ptr __appendee(_S_substring(__s._M_root, __s._M_current_pos, __e._M_current_pos)); 168177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(_S_concat_rep(_M_tree_ptr._M_data, (_RopeRep*)__appendee)); 168277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 168377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 168477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 168577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& append(_CharT __c) { 168677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(_S_destr_concat_char_iter(_M_tree_ptr._M_data, &__c, 1)); 168777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 168877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 168977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 169077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& append() { return append(_CharT()); } // XXX why? 169177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 169277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& append(const _Self& __y) { 169377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(__y.get_allocator() == get_allocator()) 169477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(_S_concat_rep(_M_tree_ptr._M_data, __y._M_tree_ptr._M_data)); 169577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 169677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 169777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 169877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& append(size_t __n, _CharT __c) { 169977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc> __last(__n, __c); 170077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return append(__last); 170177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 170277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 170377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void swap(_Self& __b) { 170477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_tree_ptr.swap(__b._M_tree_ptr); 170577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 170677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 170777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_swap_workaround(_Self& __x) { swap(__x); } 170877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 170977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 171077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected: 171177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Result is included in refcount. 171277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _RopeRep* replace(_RopeRep* __old, size_t __pos1, 171377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __pos2, _RopeRep* __r) { 171477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == __old) { _S_ref(__r); return __r; } 171577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self_destruct_ptr __left(_S_substring(__old, 0, __pos1)); 171677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self_destruct_ptr __right(_S_substring(__old, __pos2, __old->_M_size._M_data)); 171777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_MPWFIX_TRY //*TY 06/01/2000 - 171877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _RopeRep* __result; 171977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 172077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == __r) { 172177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __result = _S_concat_rep(__left, __right); 172277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 172377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(__old->get_allocator() == __r->get_allocator()) 172477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self_destruct_ptr __left_result(_S_concat_rep(__left, __r)); 172577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __result = _S_concat_rep(__left_result, __right); 172677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 172777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result; 172877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_MPWFIX_CATCH //*TY 06/01/2000 - 172977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 173077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 173177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 173277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void insert(size_t __p, const _Self& __r) { 173377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__p > size()) _M_throw_out_of_range(); 173477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(get_allocator() == __r.get_allocator()) 173577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(replace(_M_tree_ptr._M_data, __p, __p, __r._M_tree_ptr._M_data)); 173677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 173777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 173877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void insert(size_t __p, size_t __n, _CharT __c) { 173977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc> __r(__n,__c); 174077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner insert(__p, __r); 174177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 174277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 174377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void insert(size_t __p, const _CharT* __i, size_t __n) { 174477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__p > size()) _M_throw_out_of_range(); 174577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self_destruct_ptr __left(_S_substring(_M_tree_ptr._M_data, 0, __p)); 174677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self_destruct_ptr __right(_S_substring(_M_tree_ptr._M_data, __p, size())); 174777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self_destruct_ptr __left_result( 174877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _S_concat_char_iter(__left, __i, __n)); 174977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // _S_ destr_concat_char_iter should be safe here. 175077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // But as it stands it's probably not a win, since __left 175177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // is likely to have additional references. 175277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(_S_concat_rep(__left_result, __right)); 175377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 175477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 175577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void insert(size_t __p, const _CharT* __c_string) { 175677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner insert(__p, __c_string, _S_char_ptr_len(__c_string)); 175777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 175877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 175977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void insert(size_t __p, _CharT __c) { 176077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner insert(__p, &__c, 1); 176177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 176277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 176377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void insert(size_t __p) { 176477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT __c = _CharT(); 176577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner insert(__p, &__c, 1); 176677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 176777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 176877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void insert(size_t __p, const _CharT* __i, const _CharT* __j) { 176977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __r(__i, __j); 177077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner insert(__p, __r); 177177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 177277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 177377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void insert(size_t __p, const const_iterator& __i, 177477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const const_iterator& __j) { 177577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __r(__i, __j); 177677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner insert(__p, __r); 177777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 177877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 177977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void insert(size_t __p, const iterator& __i, 178077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const iterator& __j) { 178177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __r(__i, __j); 178277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner insert(__p, __r); 178377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 178477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 178577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // (position, length) versions of replace operations: 178677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, size_t __n, const _Self& __r) { 178777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__p > size()) _M_throw_out_of_range(); 178877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(replace(_M_tree_ptr._M_data, __p, __p + __n, __r._M_tree_ptr._M_data)); 178977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 179077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 179177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, size_t __n, 179277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __i, size_t __i_len) { 179377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __r(__i, __i_len); 179477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, __n, __r); 179577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 179677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 179777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, size_t __n, _CharT __c) { 179877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __r(__c); 179977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, __n, __r); 180077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 180177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 180277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, size_t __n, const _CharT* __c_string) { 180377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __r(__c_string); 180477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, __n, __r); 180577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 180677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 180777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, size_t __n, 180877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __i, const _CharT* __j) { 180977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __r(__i, __j); 181077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, __n, __r); 181177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 181277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 181377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, size_t __n, 181477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const const_iterator& __i, const const_iterator& __j) { 181577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __r(__i, __j); 181677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, __n, __r); 181777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 181877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 181977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, size_t __n, 182077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const iterator& __i, const iterator& __j) { 182177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self __r(__i, __j); 182277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, __n, __r); 182377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 182477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 182577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Single character variants: 182677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, _CharT __c) { 182777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__p > size()) _M_throw_out_of_range(); 182877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator __i(this, __p); 182977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *__i = __c; 183077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 183177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 183277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, const _Self& __r) { 183377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, 1, __r); 183477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 183577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 183677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, const _CharT* __i, size_t __i_len) { 183777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, 1, __i, __i_len); 183877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 183977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 184077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, const _CharT* __c_string) { 184177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, 1, __c_string); 184277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 184377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 184477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, const _CharT* __i, const _CharT* __j) { 184577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, 1, __i, __j); 184677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 184777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 184877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, const const_iterator& __i, 184977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const const_iterator& __j) { 185077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, 1, __i, __j); 185177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 185277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 185377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(size_t __p, const iterator& __i, 185477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const iterator& __j) { 185577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner replace(__p, 1, __i, __j); 185677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 185777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 185877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Erase, (position, size) variant. 185977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void erase(size_t __p, size_t __n) { 186077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__p > size()) _M_throw_out_of_range(); 186177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_reset(replace(_M_tree_ptr._M_data, __p, __p + __n, 0)); 186277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 186377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 186477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Erase, single character 186577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void erase(size_t __p) { 186677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner erase(__p, __p + 1); 186777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 186877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 186977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Insert, iterator variants. 187077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator insert(const iterator& __p, const _Self& __r) 187177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { insert(__p.index(), __r); return __p; } 187277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator insert(const iterator& __p, size_t __n, _CharT __c) 187377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { insert(__p.index(), __n, __c); return __p; } 187477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator insert(const iterator& __p, _CharT __c) 187577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { insert(__p.index(), __c); return __p; } 187677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator insert(const iterator& __p ) 187777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { insert(__p.index()); return __p; } 187877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator insert(const iterator& __p, const _CharT* c_string) 187977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { insert(__p.index(), c_string); return __p; } 188077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator insert(const iterator& __p, const _CharT* __i, size_t __n) 188177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { insert(__p.index(), __i, __n); return __p; } 188277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator insert(const iterator& __p, const _CharT* __i, 188377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __j) 188477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { insert(__p.index(), __i, __j); return __p; } 188577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator insert(const iterator& __p, 188677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const const_iterator& __i, const const_iterator& __j) 188777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { insert(__p.index(), __i, __j); return __p; } 188877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator insert(const iterator& __p, 188977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const iterator& __i, const iterator& __j) 189077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { insert(__p.index(), __i, __j); return __p; } 189177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 189277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Replace, range variants. 189377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const iterator& __q, 189477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Self& __r) 189577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __q.index() - __p.index(), __r); } 189677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const iterator& __q, _CharT __c) 189777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __q.index() - __p.index(), __c); } 189877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const iterator& __q, 189977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __c_string) 190077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __q.index() - __p.index(), __c_string); } 190177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const iterator& __q, 190277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __i, size_t __n) 190377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __q.index() - __p.index(), __i, __n); } 190477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const iterator& __q, 190577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __i, const _CharT* __j) 190677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __q.index() - __p.index(), __i, __j); } 190777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const iterator& __q, 190877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const const_iterator& __i, const const_iterator& __j) 190977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __q.index() - __p.index(), __i, __j); } 191077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const iterator& __q, 191177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const iterator& __i, const iterator& __j) 191277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __q.index() - __p.index(), __i, __j); } 191377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 191477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Replace, iterator variants. 191577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const _Self& __r) 191677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __r); } 191777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, _CharT __c) 191877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __c); } 191977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const _CharT* __c_string) 192077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __c_string); } 192177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const _CharT* __i, size_t __n) 192277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __i, __n); } 192377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const _CharT* __i, const _CharT* __j) 192477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __i, __j); } 192577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, const_iterator __i, 192677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __j) 192777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __i, __j); } 192877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void replace(const iterator& __p, iterator __i, iterator __j) 192977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { replace(__p.index(), __i, __j); } 193077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 193177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Iterator and range variants of erase 193277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator erase(const iterator& __p, const iterator& __q) { 193377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __p_index = __p.index(); 193477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner erase(__p_index, __q.index() - __p_index); 193577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return iterator(this, __p_index); 193677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 193777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator erase(const iterator& __p) { 193877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __p_index = __p.index(); 193977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner erase(__p_index, 1); 194077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return iterator(this, __p_index); 194177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 194277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 194377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self substr(size_t __start, size_t __len = 1) const { 194477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__start > size()) _M_throw_out_of_range(); 194577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __start, __start + __len)); 194677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 194777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 194877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self substr(iterator __start, iterator __end) const { 194977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __start.index(), __end.index())); 195077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 195177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 195277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self substr(iterator __start) const { 195377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __pos = __start.index(); 195477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __pos, __pos + 1)); 195577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 195677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 195777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self substr(const_iterator __start, const_iterator __end) const { 195877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // This might eventually take advantage of the cache in the 195977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // iterator. 196077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __start.index(), __end.index())); 196177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 196277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 196377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner rope<_CharT,_Alloc> substr(const_iterator __start) { 196477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __pos = __start.index(); 196577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return rope<_CharT,_Alloc>(_S_substring(_M_tree_ptr._M_data, __pos, __pos + 1)); 196677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 196777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 196877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <stl/_string_npos.h> 196977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 197077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type find(const _Self& __s, size_type __pos = 0) const { 197177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__pos >= size()) 197277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_OLD_ROPE_SEMANTICS 197377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return npos; 197477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 197577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return size(); 197677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 197777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 197877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __result_pos; 197977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __result = _STLP_STD::search(const_begin() + (ptrdiff_t)__pos, const_end(), __s.begin(), __s.end() ); 198077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __result_pos = __result.index(); 198177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_OLD_ROPE_SEMANTICS 198277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__result_pos == size()) __result_pos = npos; 198377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 198477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result_pos; 198577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 198677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type find(_CharT __c, size_type __pos = 0) const; 198777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type find(const _CharT* __s, size_type __pos = 0) const { 198877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __result_pos; 198977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator __result = _STLP_STD::search(const_begin() + (ptrdiff_t)__pos, const_end(), 199077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __s, __s + _S_char_ptr_len(__s)); 199177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __result_pos = __result.index(); 199277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_OLD_ROPE_SEMANTICS 199377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__result_pos == size()) __result_pos = npos; 199477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 199577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __result_pos; 199677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 199777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 199877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator mutable_begin() { 199977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return(iterator(this, 0)); 200077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 200177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 200277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator mutable_end() { 200377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return(iterator(this, size())); 200477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 200577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 200677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reverse_iterator mutable_rbegin() { 200777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return reverse_iterator(mutable_end()); 200877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 200977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 201077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reverse_iterator mutable_rend() { 201177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return reverse_iterator(mutable_begin()); 201277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 201377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 201477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reference mutable_reference_at(size_type __pos) { 201577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return reference(this, __pos); 201677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 201777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 201877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef __STD_STUFF 201977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reference operator[] (size_type __pos) { 202077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return reference(this, __pos); 202177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 202277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 202377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reference at(size_type __pos) { 202477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__pos >= size()) _M_throw_out_of_range(); 202577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (*this)[__pos]; 202677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 202777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 202877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void resize(size_type, _CharT) {} 202977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void resize(size_type) {} 203077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void reserve(size_type = 0) {} 203177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type capacity() const { 203277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return max_size(); 203377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 203477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 203577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Stuff below this line is dangerous because it's error prone. 203677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // I would really like to get rid of it. 203777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // copy function with funny arg ordering. 203877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type copy(_CharT* __buffer, size_type __n, 203977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_type __pos = 0) const { 204077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return copy(__pos, __n, __buffer); 204177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 204277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 204377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator end() { return mutable_end(); } 204477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 204577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner iterator begin() { return mutable_begin(); } 204677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 204777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reverse_iterator rend() { return mutable_rend(); } 204877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 204977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner reverse_iterator rbegin() { return mutable_rbegin(); } 205077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 205177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 205277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 205377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator end() { return const_end(); } 205477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 205577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_iterator begin() { return const_begin(); } 205677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 205777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator rend() { return const_rend(); } 205877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 205977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const_reverse_iterator rbegin() { return const_rbegin(); } 206077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 206177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 206277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; //class rope 206377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 206477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 96) 206577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 206677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst size_t rope<_CharT, _Alloc>::npos = ~(size_t) 0; 206777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 206877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 206977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 207077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _CharT 207177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_Rope_const_iterator< _CharT, _Alloc>::operator[](size_t __n) 207277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return rope<_CharT,_Alloc>::_S_fetch(this->_M_root, this->_M_current_pos + __n); } 207377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 207477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 207577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator== (const _Rope_const_iterator<_CharT,_Alloc>& __x, 207677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_const_iterator<_CharT,_Alloc>& __y) { 207777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (__x._M_current_pos == __y._M_current_pos && 207877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __x._M_root == __y._M_root); 207977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 208077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 208177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 208277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator< (const _Rope_const_iterator<_CharT,_Alloc>& __x, 208377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_const_iterator<_CharT,_Alloc>& __y) 208477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (__x._M_current_pos < __y._M_current_pos); } 208577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 208677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE 208777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 208877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 208977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator!= (const _Rope_const_iterator<_CharT,_Alloc>& __x, 209077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_const_iterator<_CharT,_Alloc>& __y) 209177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return !(__x == __y); } 209277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 209377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 209477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator> (const _Rope_const_iterator<_CharT,_Alloc>& __x, 209577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_const_iterator<_CharT,_Alloc>& __y) 209677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __y < __x; } 209777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 209877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 209977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator<= (const _Rope_const_iterator<_CharT,_Alloc>& __x, 210077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_const_iterator<_CharT,_Alloc>& __y) 210177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return !(__y < __x); } 210277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 210377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 210477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator>= (const _Rope_const_iterator<_CharT,_Alloc>& __x, 210577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_const_iterator<_CharT,_Alloc>& __y) 210677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return !(__x < __y); } 210777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 210877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ 210977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 211077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 211177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline ptrdiff_t operator-(const _Rope_const_iterator<_CharT,_Alloc>& __x, 211277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_const_iterator<_CharT,_Alloc>& __y) 211377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos; } 211477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 211577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined( __MWERKS__ ) || __MWERKS__ >= 0x2000 // dwa 8/21/97 - "ambiguous access to overloaded function" bug. 211677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 211777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _Rope_const_iterator<_CharT,_Alloc> 211877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator-(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) 211977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Rope_const_iterator<_CharT,_Alloc>(__x._M_root, __x._M_current_pos - __n); } 212077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 212177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 212277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 212377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _Rope_const_iterator<_CharT,_Alloc> 212477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) 212577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Rope_const_iterator<_CharT,_Alloc>(__x._M_root, __x._M_current_pos + __n); } 212677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 212777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 212877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _Rope_const_iterator<_CharT,_Alloc> 212977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+(ptrdiff_t __n, const _Rope_const_iterator<_CharT,_Alloc>& __x) 213077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Rope_const_iterator<_CharT,_Alloc>(__x._M_root, __x._M_current_pos + __n); } 213177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 213277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 213377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator== (const _Rope_iterator<_CharT,_Alloc>& __x, 213477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_iterator<_CharT,_Alloc>& __y) { 213577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (__x._M_current_pos == __y._M_current_pos && 213677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __x._M_root_rope == __y._M_root_rope); 213777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 213877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 213977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 214077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator< (const _Rope_iterator<_CharT,_Alloc>& __x, 214177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_iterator<_CharT,_Alloc>& __y) 214277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (__x._M_current_pos < __y._M_current_pos); } 214377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 214477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_SEPARATE_RELOPS_NAMESPACE) 214577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 214677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator!= (const _Rope_iterator<_CharT,_Alloc>& __x, 214777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_iterator<_CharT,_Alloc>& __y) 214877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return !(__x == __y); } 214977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 215077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 215177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator> (const _Rope_iterator<_CharT,_Alloc>& __x, 215277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_iterator<_CharT,_Alloc>& __y) 215377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __y < __x; } 215477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 215577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 215677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator<= (const _Rope_iterator<_CharT,_Alloc>& __x, 215777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_iterator<_CharT,_Alloc>& __y) 215877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return !(__y < __x); } 215977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 216077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 216177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator>= (const _Rope_iterator<_CharT,_Alloc>& __x, 216277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_iterator<_CharT,_Alloc>& __y) 216377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return !(__x < __y); } 216477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ 216577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 216677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 216777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline ptrdiff_t operator-(const _Rope_iterator<_CharT,_Alloc>& __x, 216877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_iterator<_CharT,_Alloc>& __y) 216977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos; } 217077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 217177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined( __MWERKS__ ) || __MWERKS__ >= 0x2000 // dwa 8/21/97 - "ambiguous access to overloaded function" bug. 217277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 217377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _Rope_iterator<_CharT,_Alloc> 217477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator-(const _Rope_iterator<_CharT,_Alloc>& __x, 217577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t __n) { 217677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _Rope_iterator<_CharT,_Alloc>(__x._M_root_rope, __x._M_current_pos - __n); 217777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 217877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 217977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 218077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 218177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _Rope_iterator<_CharT,_Alloc> 218277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+(const _Rope_iterator<_CharT,_Alloc>& __x, 218377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t __n) { 218477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _Rope_iterator<_CharT,_Alloc>(__x._M_root_rope, __x._M_current_pos + __n); 218577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 218677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 218777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 218877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _Rope_iterator<_CharT,_Alloc> 218977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+(ptrdiff_t __n, const _Rope_iterator<_CharT,_Alloc>& __x) { 219077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _Rope_iterator<_CharT,_Alloc>(__x._M_root_rope, __x._M_current_pos + __n); 219177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 219277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 219377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 219477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline rope<_CharT,_Alloc> 219577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+ (const rope<_CharT,_Alloc>& __left, 219677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const rope<_CharT,_Alloc>& __right) { 219777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_ASSERT(__left.get_allocator() == __right.get_allocator()) 219877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return rope<_CharT,_Alloc>(rope<_CharT,_Alloc>::_S_concat_rep(__left._M_tree_ptr._M_data, __right._M_tree_ptr._M_data)); 219977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Inlining this should make it possible to keep __left and __right in registers. 220077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 220177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 220277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 220377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline rope<_CharT,_Alloc>& 220477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+= (rope<_CharT,_Alloc>& __left, 220577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const rope<_CharT,_Alloc>& __right) { 220677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __left.append(__right); 220777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __left; 220877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 220977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 221077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 221177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline rope<_CharT,_Alloc> 221277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+ (const rope<_CharT,_Alloc>& __left, 221377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __right) { 221477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __rlen = rope<_CharT,_Alloc>::_S_char_ptr_len(__right); 221577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return rope<_CharT,_Alloc>(rope<_CharT,_Alloc>::_S_concat_char_iter(__left._M_tree_ptr._M_data, __right, __rlen)); 221677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 221777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 221877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 221977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline rope<_CharT,_Alloc>& 222077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+= (rope<_CharT,_Alloc>& __left, 222177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _CharT* __right) { 222277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __left.append(__right); 222377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __left; 222477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 222577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 222677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 222777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline rope<_CharT,_Alloc> 222877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+ (const rope<_CharT,_Alloc>& __left, _CharT __right) { 222977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return rope<_CharT,_Alloc>(rope<_CharT,_Alloc>::_S_concat_char_iter(__left._M_tree_ptr._M_data, &__right, 1)); 223077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 223177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 223277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 223377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline rope<_CharT,_Alloc>& 223477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator+= (rope<_CharT,_Alloc>& __left, _CharT __right) { 223577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __left.append(__right); 223677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __left; 223777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 223877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 223977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 224077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool 224177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator< (const rope<_CharT,_Alloc>& __left, 224277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const rope<_CharT,_Alloc>& __right) { 224377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __left.compare(__right) < 0; 224477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 224577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 224677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 224777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool 224877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator== (const rope<_CharT,_Alloc>& __left, 224977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const rope<_CharT,_Alloc>& __right) { 225077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __left.compare(__right) == 0; 225177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 225277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 225377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE 225477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 225577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 225677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool 225777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator!= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { 225877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return !(__x == __y); 225977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 226077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 226177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 226277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool 226377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator> (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { 226477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __y < __x; 226577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 226677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 226777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 226877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool 226977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator<= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { 227077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return !(__y < __x); 227177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 227277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 227377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 227477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool 227577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneroperator>= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) { 227677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return !(__x < __y); 227777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 227877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 227977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 228077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator!= (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x, 228177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) { 228277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return !(__x == __y); 228377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 228477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 228577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ 228677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 228777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 228877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator== (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x, 228977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) { 229077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (__x._M_pos == __y._M_pos && __x._M_root == __y._M_root); 229177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 229277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 229377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_USE_NO_IOSTREAMS) 229477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT, class _Traits, class _Alloc> 229577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_ostream<_CharT, _Traits>& operator<< (basic_ostream<_CharT, _Traits>& __o, 229677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const rope<_CharT, _Alloc>& __r); 229777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 229877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 229977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef rope<char, allocator<char> > crope; 230077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_HAS_WCHAR_T) 230177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef rope<wchar_t, allocator<wchar_t> > wrope; 230277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 230377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 230477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline crope::reference __mutable_reference_at(crope& __c, size_t __i) 230577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __c.mutable_reference_at(__i); } 230677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 230777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_HAS_WCHAR_T) 230877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline wrope::reference __mutable_reference_at(wrope& __c, size_t __i) 230977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __c.mutable_reference_at(__i); } 231077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 231177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 231277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 231377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 231477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void swap(rope<_CharT,_Alloc>& __x, rope<_CharT,_Alloc>& __y) 231577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ __x.swap(__y); } 231677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 231777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 231877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void swap(crope& __x, crope& __y) { __x.swap(__y); } 231977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef _STLP_HAS_WCHAR_T // dwa 8/21/97 232077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void swap(wrope& __x, wrope& __y) { __x.swap(__y); } 232177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 232277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 232377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */ 232477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 232577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 232677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Hash functions should probably be revisited later: 232777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct hash<crope> { 232877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t operator()(const crope& __str) const { 232977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _p_size = __str.size(); 233077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 233177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == _p_size) return 0; 233277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return 13*__str[0] + 5*__str[_p_size - 1] + _p_size; 233377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 233477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 233577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 233677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_HAS_WCHAR_T) // dwa 8/21/97 233777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct hash<wrope> { 233877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t operator()(const wrope& __str) const { 233977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t _p_size = __str.size(); 234077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 234177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (0 == _p_size) return 0; 234277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return 13*__str[0] + 5*__str[_p_size - 1] + _p_size; 234377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 234477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 234577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 234677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 234777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if (!defined (_STLP_MSVC) || (_STLP_MSVC >= 1310)) 234877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// I couldn't get this to work with VC++ 234977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate<class _CharT,class _Alloc> 235077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (__DMC__) 235177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerextern 235277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 235377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _Rope_rotate(_Rope_iterator<_CharT, _Alloc> __first, 235477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator<_CharT, _Alloc> __middle, 235577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator<_CharT, _Alloc> __last); 235677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 235777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void rotate(_Rope_iterator<char, allocator<char> > __first, 235877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator<char, allocator<char> > __middle, 235977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Rope_iterator<char, allocator<char> > __last) 236077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _Rope_rotate(__first, __middle, __last); } 236177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 236277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 236377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 236477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _Rope_char_ref_proxy<_CharT, _Alloc>::operator _CharT () const { 236577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_M_current_valid) { 236677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _M_current; 236777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 236877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _My_rope::_S_fetch(_M_root->_M_tree_ptr._M_data, _M_pos); 236977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 237077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 237177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 237277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_NO_MOVE_SEMANTIC) 237377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _Alloc> 237477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __move_traits<rope<_CharT, _Alloc> > { 237577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __true_type implemented; 237677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //Completness depends on the allocator: 237777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __move_traits<_Alloc>::complete complete; 237877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 237977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 238077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 238177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE 238277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 238377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_LINK_TIME_INSTANTIATION) 238477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_rope.c> 238577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 238677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 238777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_INTERNAL_ROPE_H */ 238877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 238977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables: 239077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++ 239177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End: 2392