home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-01-31 | 65.6 KB | 1,747 lines |
- #ifndef __STRING_STL
- #define __STRING_STL
- #pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
- // -*- C++ -*-
- /***************************************************************************
- *
- * string - Declarations for the Standard Library string classes
- *
- ***************************************************************************
- *
- * Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved.
- *
- * This computer software is owned by Rogue Wave Software, Inc. and is
- * protected by U.S. copyright laws and other laws and by international
- * treaties. This computer software is furnished by Rogue Wave Software,
- * Inc. pursuant to a written license agreement and may be used, copied,
- * transmitted, and stored only in accordance with the terms of such
- * license and with the inclusion of the above copyright notice. This
- * computer software or any other copies thereof may not be provided or
- * otherwise made available to any other person.
- *
- * U.S. Government Restricted Rights. This computer software is provided
- * with Restricted Rights. Use, duplication, or disclosure by the
- * Government is subject to restrictions as set forth in subparagraph (c)
- * (1) (ii) of The Rights in Technical Data and Computer Software clause
- * at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
- * Commercial Computer Software รป Restricted Rights at 48 CFR 52.227-19,
- * as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
- * Flatiron Parkway, Boulder, Colorado 80301 USA.
- *
- **************************************************************************/
-
- #ifndef __STD_STRING
- #define __STD_STRING
-
- #include <stdcomp.h>
- #include <rw/rwstderr.h>
-
- #ifndef _RWSTD_NO_NEW_HEADER
- #include <cstring>
- #include <cctype>
- #else
- #include <string.h>
- #include <ctype.h>
- #endif
-
- #ifdef _HPACC_
- #include <wchar.h>
- #else
- #ifndef _RWSTD_NO_WIDE_CHAR
- #ifndef _RWSTD_NO_NEW_HEADER
- #include <cwchar>
- #include <cwctype>
- #else
- #ifndef _RWSTD_NO_WCHAR_H
- #include <wchar.h>
- #endif
- #ifndef _RWSTD_NO_WCTYPE_H
- # include <wctype.h>
- #endif
- #endif
- #endif
- #endif
-
- #ifndef _RW_STD_IOSTREAM
- #include <iostream.h>
- #endif
-
- #include <rw/string_ref>
-
- #ifndef _RWSTD_NO_NAMESPACE
- namespace __rwstd {
- #endif
- //
- // Global error message declarations
- //
- #ifdef _RWSTD_LOCALIZED_ERRORS
- extern const unsigned int _RWSTDExport __rwse_InvalidSizeParam;
- extern const unsigned int _RWSTDExport __rwse_PosBeyondEndOfString;
- extern const unsigned int _RWSTDExport __rwse_ResultLenInvalid;
- extern const unsigned int _RWSTDExport __rwse_StringIndexOutOfRange;
- extern const unsigned int _RWSTDExport __rwse_UnexpectedNullPtr;
- #else
- extern const char _RWSTDExportFunc(*) __rwse_InvalidSizeParam;
- extern const char _RWSTDExportFunc(*) __rwse_PosBeyondEndOfString;
- extern const char _RWSTDExportFunc(*) __rwse_ResultLenInvalid;
- extern const char _RWSTDExportFunc(*) __rwse_StringIndexOutOfRange;
- extern const char _RWSTDExportFunc(*) __rwse_UnexpectedNullPtr;
- #endif
- #ifdef _RWSTD_NO_STATIC_DEF3
- extern unsigned long _RWSTDExport __nullref[];
- extern bool _RWSTDExport __nullref_initialized;
- #endif
-
- #ifndef _RWSTD_NO_NAMESPACE
- } namespace std {
- #endif
-
- template <class charT, class traits , class Allocator >
- class _RWSTDExportTemplate basic_string
- {
- public:
-
- //
- // Implementation types (see rw/string_ref)
- //
- // __string_ref_type is the type of the string reference that holds
- // the data for a basic_string. Defining _RWSTD_NO_STRING_REF_COUNT
- // gets you a basic_string that does not use reference counting at all.
- //
- #ifndef _RWSTD_NO_STRING_REF_COUNT
- typedef __RWSTD::__string_ref<charT,traits,Allocator> __string_ref_type;
- #else
- typedef __RWSTD::__string_noref<charT,traits,Allocator> __string_ref_type;
- #endif
- //
- // __rep_type is the base class of __string_ref_type. This type
- // defines the representation of the reference class.
- //
- typedef _TYPENAME __string_ref_type::__string_ref_rep_type __rep_type;
- //
- // __null_ref_type is the type of the null reference. Every empty
- // string holds a reference to the same null reference object in order
- // to keep the size of an empty string at sizeof(char*) -- assuming
- // your compiler can handle the empty base optimization.
- //
- typedef __RWSTD::__null_string_ref_rep<charT,traits,Allocator,__rep_type> __null_ref_type;
-
- //
- // types
- //
- typedef traits traits_type;
- typedef _TYPENAME traits::char_type value_type;
- typedef Allocator allocator_type;
-
- private:
-
- #ifdef _RWSTD_ALLOCATOR
- typedef Allocator __value_alloc_type;
- typedef _TYPENAME Allocator::template rebind<__string_ref_type>::other __ref_alloc_type;
- #else
- typedef allocator_interface<Allocator,charT> __value_alloc_type;
- typedef allocator_interface<Allocator,__string_ref_type> __ref_alloc_type;
- #endif
-
-
- public:
-
- #ifndef _RWSTD_NO_COMPLICATED_TYPEDEF
- typedef _TYPENAME _RWSTD_ALLOC_SIZE_TYPE size_type;
- typedef _TYPENAME _RWSTD_ALLOC_DIFF_TYPE difference_type;
- typedef _TYPENAME __value_alloc_type::reference reference;
- typedef _TYPENAME __value_alloc_type::const_reference const_reference;
- typedef _TYPENAME __value_alloc_type::pointer pointer;
- typedef _TYPENAME __value_alloc_type::const_pointer const_pointer;
- typedef _TYPENAME __value_alloc_type::pointer iterator;
- typedef _TYPENAME __value_alloc_type::const_pointer const_iterator;
- #else
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef charT& reference;
- typedef const charT& const_reference;
- typedef charT* pointer;
- typedef const charT* const_pointer;
- typedef charT* iterator;
- typedef const charT* const_iterator;
- #endif //_RWSTD_NO_COMPLICATED_TYPEDEF
-
- #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
- typedef _RW_STD::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef _RW_STD::reverse_iterator<iterator> reverse_iterator;
- #else
- typedef _RW_STD::reverse_iterator<const_iterator,
- random_access_iterator_tag, value_type,
- const_reference, const_pointer, difference_type>
- const_reverse_iterator;
- typedef _RW_STD::reverse_iterator<iterator,
- random_access_iterator_tag, value_type,
- reference, pointer, difference_type>
- reverse_iterator;
- #endif
-
- #ifdef _RWSTD_MSC22_STATIC_INIT_BUG
- #define npos (size_type)-1
- #else
- static const size_type npos;
- #endif
-
- inline _EXPLICIT basic_string (const Allocator& _RWSTD_DEFAULT_ARG(Allocator()));
-
- #ifdef _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
- inline basic_string (void);
- #endif
-
- inline basic_string (const basic_string<charT, traits, Allocator>&);
- basic_string (const basic_string<charT, traits, Allocator>&,
- size_type, size_type _RWSTD_DEFAULT_ARG(npos),
- const Allocator& _RWSTD_DEFAULT_ARG(Allocator()));
- basic_string (const charT*, size_type,
- const Allocator& _RWSTD_DEFAULT_ARG(Allocator()));
- basic_string (const charT*, const Allocator& _RWSTD_DEFAULT_ARG(Allocator()));
-
- #ifdef _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
- basic_string (const charT*, size_type);
- basic_string (const charT*);
- basic_string (size_type n, charT c) : __data_((charT*)0,Allocator())
- { __initn(n,c); }
- #endif
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template <class InputIterator>
- basic_string (InputIterator, InputIterator, const Allocator& _RWSTD_DEFAULT_ARG(Allocator()));
- basic_string (int n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- basic_string (unsigned int n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- basic_string (long n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- basic_string (unsigned long n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- basic_string (short n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- basic_string (unsigned short n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- basic_string (char n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- basic_string (unsigned char n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- #ifndef _RWSTD_NO_OVERLOAD_WCHAR
- basic_string (wchar_t n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- #endif
- #ifndef _RWSTD_NO_BOOL
- basic_string (bool n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- #endif
- #else
- basic_string (size_type n, charT c, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
- : __data_((charT*)0,alloc)
- { __initn(n,c); }
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- basic_string (const charT*, const charT*, const Allocator& _RWSTD_DEFAULT_ARG(Allocator()));
- #ifdef _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
- basic_string (const charT*, const charT*);
- #endif
-
- ~basic_string ()
- {
- __unLink();
- }
-
- basic_string<charT, traits, Allocator>& operator= (const basic_string<charT, traits, Allocator>&);
- basic_string<charT, traits, Allocator>& operator= (const charT*);
- inline basic_string<charT, traits, Allocator>& operator= (charT);
-
- //
- // iterators
- //
- iterator begin ()
- { __cow(); __pref()->__setRefCount(0); return __data_.data(); }
- const_iterator begin () const
- { return __data_.data(); }
- iterator end ()
- { __cow(); __pref()->__setRefCount(0); return __data_.data()+length(); }
- const_iterator end () const
- { return __data_.data()+length(); }
-
- reverse_iterator rbegin ()
- { reverse_iterator tmp(end()); return tmp; }
- const_reverse_iterator rbegin () const
- { const_reverse_iterator tmp(end()); return tmp; }
- reverse_iterator rend ()
- { reverse_iterator tmp(begin()); return tmp; }
- const_reverse_iterator rend () const
- { const_reverse_iterator tmp(begin()); return tmp; }
-
- //
- // capacity
- //
- size_type size () const { return length(); }
- inline size_type length () const;
- size_type max_size () const
- {
- return npos - sizeof(__rep_type)-2;
- }
- inline void resize (size_type, charT);
- void resize (size_type n)
- {
- resize(n,__eos());
- }
- inline size_type capacity () const;
- inline void reserve (size_type=0);
- void clear () { erase(); }
- bool empty () const { return length() == 0; }
-
- //
- // element access
- //
- inline const_reference operator[] (size_type) const;
- inline reference operator[] (size_type);
- inline const_reference at (size_type) const;
- inline reference at (size_type);
-
- //
- // modifiers
- //
- inline basic_string<charT, traits, Allocator>& operator+= (const basic_string<charT, traits, Allocator>&);
- inline basic_string<charT, traits, Allocator>& operator+= (const charT*);
- inline basic_string<charT, traits, Allocator>& operator+= (charT);
-
- basic_string<charT, traits, Allocator>& append (
- const basic_string<charT, traits, Allocator>&);
- basic_string<charT, traits, Allocator>& append (
- const basic_string<charT, traits, Allocator>&,
- size_type,
- size_type);
- inline basic_string<charT, traits, Allocator>& append (const charT*, size_type);
- inline basic_string<charT, traits, Allocator>& append (const charT*);
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template<class InputIterator>
- inline basic_string<charT, traits, Allocator>& append (InputIterator,
- InputIterator);
- basic_string<charT, traits, Allocator>& append (int n, charT c)
- { return replace(length(),0,n,c); }
- basic_string<charT, traits, Allocator>& append (unsigned int n, charT c)
- { return replace(length(),0,n,c); }
- basic_string<charT, traits, Allocator>& append (long n, charT c)
- { return replace(length(),0,n,c); }
- basic_string<charT, traits, Allocator>& append (unsigned long n, charT c)
- { return replace(length(),0,n,c); }
- basic_string<charT, traits, Allocator>& append (short n, charT c)
- { return replace(length(),0,n,c); }
- basic_string<charT, traits, Allocator>& append (unsigned short n, charT c)
- { return replace(length(),0,n,c); }
- basic_string<charT, traits, Allocator>& append (char n, charT c)
- { return replace(length(),0,n,c); }
- basic_string<charT, traits, Allocator>& append (unsigned char n, charT c)
- { return replace(length(),0,n,c); }
- #ifndef _RWSTD_NO_OVERLOAD_WCHAR
- basic_string<charT, traits, Allocator>& append (wchar_t n, charT c)
- { return replace(length(),0,n,c); }
- #endif
- #ifndef _RWSTD_NO_BOOL
- basic_string<charT, traits, Allocator>& append (bool n, charT c)
- { return replace(length(),0,n,c); }
- #endif
- #else
- inline basic_string<charT, traits, Allocator>& append (const charT*,
- const charT*);
- inline basic_string<charT, traits, Allocator>& append (size_type, charT);
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- inline void push_back(const charT);
-
- basic_string<charT, traits, Allocator>& assign (
- const basic_string<charT, traits, Allocator>&);
- basic_string<charT, traits, Allocator>& assign (
- const basic_string<charT, traits, Allocator>&,
- size_type,
- size_type);
- inline basic_string<charT, traits, Allocator>& assign (const charT*, size_type);
- inline basic_string<charT, traits, Allocator>& assign (const charT*);
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template<class InputIterator>
- inline basic_string<charT, traits, Allocator>& assign (InputIterator,
- InputIterator);
- basic_string<charT, traits, Allocator>& assign (int n, charT c)
- { return replace(0,length(),n,c); }
- basic_string<charT, traits, Allocator>& assign (unsigned int n, charT c)
- { return replace(0,length(),n,c); }
- basic_string<charT, traits, Allocator>& assign (long n, charT c)
- { return replace(0,length(),n,c); }
- basic_string<charT, traits, Allocator>& assign (unsigned long n, charT c)
- { return replace(0,length(),n,c); }
- basic_string<charT, traits, Allocator>& assign (short n, charT c)
- { return replace(0,length(),n,c); }
- basic_string<charT, traits, Allocator>& assign (unsigned short n, charT c)
- { return replace(0,length(),n,c); }
- basic_string<charT, traits, Allocator>& assign (char n, charT c)
- { return replace(0,length(),n,c); }
- basic_string<charT, traits, Allocator>& assign (unsigned char n, charT c)
- { return replace(0,length(),n,c); }
- #ifndef _RWSTD_NO_OVERLOAD_WCHAR
- basic_string<charT, traits, Allocator>& assign (wchar_t n, charT c)
- { return replace(0,length(),n,c); }
- #endif
- #ifndef _RWSTD_NO_BOOL
- basic_string<charT, traits, Allocator>& assign (bool n, charT c)
- { return replace(0,length(),n,c); }
- #endif
- #else
- inline basic_string<charT, traits, Allocator>& assign (const charT*,
- const charT*);
- inline basic_string<charT, traits, Allocator>& assign (size_type, charT);
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- basic_string<charT, traits, Allocator>& insert (size_type,
- const basic_string<charT, traits, Allocator>&);
- basic_string<charT, traits, Allocator>& insert (
- size_type,
- const basic_string<charT, traits, Allocator>&,
- size_type,
- size_type);
- inline basic_string<charT, traits, Allocator>& insert (
- size_type,
- const charT*,
- size_type);
- inline basic_string<charT, traits, Allocator>& insert (size_type, const charT*);
- iterator insert (iterator pos, charT c)
- {
- iterator tmp = __replace_aux(pos-begin(), 0, basic_string<charT, traits, Allocator>(1,c));
- __pref()->__setRefCount(0);
- return tmp;
- }
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template<class InputIterator>
- inline void insert (iterator, InputIterator, InputIterator);
- void insert (iterator p, int n, charT c)
- { replace(p-begin(),0,n,c); }
- void insert (iterator p, unsigned int n, charT c)
- { replace(p-begin(),0,n,c); }
- void insert (iterator p, long n, charT c)
- { replace(p-begin(),0,n,c); }
- void insert (iterator p, unsigned long n, charT c)
- { replace(p-begin(),0,n,c); }
- void insert (iterator p, short n, charT c)
- { replace(p-begin(),0,n,c); }
- void insert (iterator p, unsigned short n, charT c)
- { replace(p-begin(),0,n,c); }
- void insert (iterator p, char n, charT c)
- { replace(p-begin(),0,n,c); }
- void insert (iterator p, unsigned char n, charT c)
- { replace(p-begin(),0,n,c); }
- basic_string<charT, traits, Allocator>& insert (size_type pos,int n,charT c)
- { return replace(pos,0,n,c); }
- basic_string<charT, traits, Allocator>& insert (size_type pos,unsigned int n,charT c)
- { return replace(pos,0,n,c); }
- basic_string<charT, traits, Allocator>& insert (size_type pos,long n,charT c)
- { return replace(pos,0,n,c); }
- basic_string<charT, traits, Allocator>& insert (size_type pos,unsigned long n,charT c)
- { return replace(pos,0,n,c); }
- basic_string<charT, traits, Allocator>& insert (size_type pos,short n,charT c)
- { return replace(pos,0,n,c); }
- basic_string<charT, traits, Allocator>& insert (size_type pos,unsigned short n,charT c)
- { return replace(pos,0,n,c); }
- basic_string<charT, traits, Allocator>& insert (size_type pos,char n,charT c)
- { return replace(pos,0,n,c); }
- basic_string<charT, traits, Allocator>& insert (size_type pos,unsigned char n,charT c)
- { return replace(pos,0,n,c); }
- #ifndef _RWSTD_NO_OVERLOAD_WCHAR
- void insert (iterator p, wchar_t n, charT c)
- { replace(p-begin(),0,n,c); }
- basic_string<charT, traits, Allocator>& insert (size_type pos,wchar_t n,charT c)
- { return replace(pos,0,n,c); }
- #endif
- #ifndef _RWSTD_NO_BOOL
- void insert (iterator p, bool n, charT c)
- { replace(p-begin(),0,n,c);}
- basic_string<charT, traits, Allocator>& insert (size_type pos,bool n,charT c)
- { return replace(pos,0,n,c); }
- #endif
-
- #else
- inline void insert (iterator, const charT*, const charT*);
- inline basic_string<charT, traits, Allocator>& insert (size_type,size_type,charT);
- inline void insert (iterator, size_type, charT);
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- inline basic_string<charT, traits, Allocator>& erase (size_type = 0,
- size_type = npos);
-
- iterator erase (iterator it)
- {
- iterator ret = replace(it - begin(),1,(const charT *)NULL,0,0,0);
- __pref()->__setRefCount(0);
- return ret;
- }
- iterator erase (iterator first, iterator last)
- {
- iterator ret = replace(first - begin(),last-first,(const charT *)NULL,0,0,0);
- __pref()->__setRefCount(0);
- return ret;
- }
- private:
- //
- // Used for effiency
- //
- _TYPENAME
- basic_string<charT, traits, Allocator>::iterator replace (size_type,
- size_type,
- const charT*,
- size_type,
- size_type,
- size_type);
-
- _TYPENAME
- basic_string<charT, traits, Allocator>::iterator __replace_aux (
- size_type,
- size_type,
- const basic_string<charT, traits, Allocator>&,
- size_type =0,
- size_type =npos);
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template<class InputIterator>
- basic_string<charT, traits, Allocator>& __replace_aux (
- iterator first1,
- iterator last1,
- InputIterator first2,
- InputIterator last2);
- #endif
-
- public:
- inline basic_string<charT, traits, Allocator>& replace (size_type,
- size_type,
- const basic_string<charT, traits, Allocator>&);
- inline basic_string<charT, traits, Allocator>& replace (size_type,
- size_type,
- const basic_string<charT, traits, Allocator>&,
- size_type,
- size_type);
- inline basic_string<charT, traits, Allocator>& replace (size_type,
- size_type,
- const charT*,
- size_type);
- inline basic_string<charT, traits, Allocator>& replace (size_type,
- size_type,
- const charT*);
- basic_string<charT, traits, Allocator>& replace (size_type,
- size_type,
- size_type,
- charT);
- inline basic_string<charT, traits, Allocator>& replace (iterator,
- iterator,
- const basic_string<charT, traits, Allocator>&);
- inline basic_string<charT, traits, Allocator>& replace (iterator,
- iterator,
- const charT*,
- size_type);
- inline basic_string<charT, traits, Allocator>& replace (iterator,
- iterator,
- const charT*);
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template<class InputIterator>
- basic_string<charT, traits, Allocator>& replace (iterator, iterator,
- InputIterator,
- InputIterator);
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- int n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- unsigned int n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- long n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- unsigned long n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- short n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- unsigned short n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- char n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- unsigned char n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- #ifndef _RWSTD_NO_OVERLOAD_WCHAR
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- wchar_t n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- #endif
- #ifndef _RWSTD_NO_BOOL
- basic_string<charT, traits, Allocator>& replace (iterator first,
- iterator last,
- bool n,
- charT c)
- { return replace(first-begin(),last-first,n,c); }
- #endif
- #else
- inline basic_string<charT, traits, Allocator>& replace (iterator, iterator,
- const charT*,
- const charT*);
- inline basic_string<charT, traits, Allocator>& replace (iterator,
- iterator,
- size_type,
- charT);
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- size_type copy (charT*, size_type, size_type = 0) const;
- basic_string<charT, traits, Allocator> copy () const; // Returns deep copy
- void swap(basic_string<charT, traits, Allocator>& s)
- {
- charT * temp = __data_.data(); __data_ = s.__data_.data(); s.__data_ = temp;
- }
-
- //
- // string operations
- //
- inline const charT* c_str () const;
- inline const charT* data () const;
- allocator_type get_allocator() const
- {
- return (allocator_type)__data_;
- }
-
- inline size_type find (const basic_string<charT, traits, Allocator>&,
- size_type = 0) const;
- size_type find (const charT*, size_type, size_type) const;
- inline size_type find (const charT*, size_type = 0) const;
- inline size_type find (charT, size_type = 0) const;
-
- inline size_type rfind (const basic_string<charT, traits, Allocator>&,
- size_type = npos) const;
- size_type rfind (const charT*, size_type, size_type) const;
- inline size_type rfind (const charT*, size_type = npos) const;
- inline size_type rfind (charT, size_type = npos) const;
-
- inline size_type find_first_of (const basic_string<charT, traits, Allocator>&,
- size_type = 0) const;
- size_type find_first_of (const charT*, size_type, size_type) const;
- inline size_type find_first_of (const charT*, size_type = 0) const;
- inline size_type find_first_of (charT, size_type = 0) const;
- inline size_type find_last_of (const basic_string<charT, traits, Allocator>&,
- size_type = npos) const;
- size_type find_last_of (const charT*, size_type, size_type) const;
- inline size_type find_last_of (const charT*, size_type = npos) const;
- inline size_type find_last_of (charT, size_type = npos) const;
-
- inline size_type find_first_not_of (const basic_string<charT, traits, Allocator>&,
- size_type = 0) const;
- size_type find_first_not_of (const charT*, size_type ,
- size_type) const;
- inline size_type find_first_not_of (const charT*, size_type = 0) const;
- inline size_type find_first_not_of (charT, size_type = 0) const;
-
- inline size_type find_last_not_of (const basic_string<charT, traits, Allocator>&,
- size_type = npos) const;
- size_type find_last_not_of (const charT*, size_type, size_type) const;
- inline size_type find_last_not_of (const charT*, size_type = npos) const;
- inline size_type find_last_not_of (charT, size_type = npos) const;
-
- basic_string<charT, traits, Allocator> substr (size_type = 0,
- size_type = npos) const;
-
- inline int compare(const basic_string<charT, traits, Allocator>&) const;
- int compare(size_type, size_type,
- const basic_string<charT, traits, Allocator>&) const;
- int compare(size_type, size_type,
- const basic_string<charT, traits, Allocator>&,
- size_type, size_type) const;
- inline int compare (const charT*) const;
- int compare (size_type, size_type, const charT*, size_type) const;
- inline int compare (size_type, size_type, const charT*) const;
-
- protected:
-
- size_type __getCapac () const { return __pref()->__getCapac(); }
-
- void __clobber (size_type); // Remove old contents
- void __cow () // Do copy on write as necessary
- {
- if (__pref()->__references() > 1)
- __clone();
- }
- void __cow (size_type nc) // Do copy on write w/ new capacity
- {
- if (__pref()->__references() > 1 || __getCapac() < nc)
- __clone(nc);
- }
-
- private:
-
- void __initn(size_type, charT);
-
- static charT __eos () { return (charT)0; }
-
- //
- // Make a distinct copy of self
- //
- void __clone ();
- //
- // Make a distinct copy w/ new capacity nc
- //
- void __clone (size_type nc);
-
- __string_ref_type * __pref () const
- {
- #ifdef _RWSTD_SUNPRO_ANACHRONISM
- return (__string_ref_type*)__data_.data() - 1;
- #else
- return _RWSTD_STATIC_CAST(__string_ref_type*,
- ((_RWSTD_REINTERPRET_CAST(__string_ref_type*,__data_.data())) - 1));
- #endif
- }
-
- //
- // Disconnect from ref, maybe delete it.
- //
- inline void __unLink ();
-
- #ifndef _RWSTD_NO_NAMESPACE
- friend class __RWSTD::__string_ref<charT,traits,Allocator>;
- #else
- friend class __string_ref<charT,traits,Allocator>;
- #endif
-
- //
- // Null string ref
- //
- #ifndef _RWSTD_NO_STATIC_DEF3
- static const __null_ref_type __nullref;
- #endif
-
- static __string_ref_type * __getNullRep ()
- {
- #ifndef _RWSTD_NO_STATIC_DEF3
- # ifdef _RWSTD_NO_STATIC_CAST
- return (__string_ref_type *)&__nullref;
- # else
- return reinterpret_cast<__string_ref_type *>
- (const_cast<__null_ref_type *>(&__nullref));
- # endif // _RWSTD_NO_STATIC_CAST
- #else
- if (!__RWSTD::__nullref_initialized)
- {
- new (&__RWSTD::__nullref) __null_ref_type();
- __RWSTD::__nullref_initialized = 1;
- }
- return (__string_ref_type *) &__RWSTD::__nullref[0];
- #endif // _RWSTD_NO_STATIC_DEF3
- }
- __string_ref_type * __getRep (size_type capac, size_type nchar);
-
- __RWSTD::__rw_basis<charT*,allocator_type> __data_;
- };
- //
- // Standard Type Definitions
- //
- typedef basic_string<char, char_traits<char>, allocator<char> >
- string;
-
- #ifndef _RWSTD_NO_WIDE_CHAR
- typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >
- wstring;
- #endif
-
- //
- // The following has to go after the declaration of the string
- // classes because of cross references.
- //
-
- #ifndef _RWSTD_NO_NAMESPACE
- }
- #endif
-
- #ifdef _RW_STD_EXCEPT
- #include <stdexcept>
- #endif
-
- #if defined(_RWSTD_NO_DESTROY_BUILTIN) || defined(_RWSTD_NO_DESTROY_NONBUILTIN)
-
- #ifndef _RWSTD_NO_NAMESPACE
- namespace __rwstd {
- #endif
- //
- // Specializations for STL destroy
- //
- inline void __destroy (string**) {;}
- inline void __destroy (string***) {;}
- inline void __destroy (string****) {;}
- #ifndef _RWSTD_NO_WIDE_CHAR
- inline void __destroy (wstring**) {;}
- inline void __destroy (wstring***) {;}
- inline void __destroy (wstring****) {;}
- #endif
-
- #ifndef _RWSTD_NO_NAMESPACE
- }
- #endif
- #endif // _RWSTD_NO_DESTROY_BUILTIN || _RWSTD_NO_DESTROY_NONBUILTIN
-
- #ifndef _RWSTD_NO_NAMESPACE
- namespace std {
- #endif
-
- //
- // Inline member functions for class basic_string
- //
-
- template <class charT, class traits , class Allocator >
- inline void basic_string<charT, traits, Allocator>::__unLink()
- {
- if (!__data_.data())
- return;
- if (__pref()->__references() == 0 || __pref()->__removeReference() == 0)
- {
- __ref_alloc_type(__data_).destroy(__pref());
- __value_alloc_type(__data_).
- deallocate(_RWSTD_REINTERPRET_CAST(charT*,__pref()),length());
- __data_ = (charT*)0;
- }
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>
- ::basic_string (const Allocator& alloc) : __data_((charT*)0,alloc)
- {
- __data_ = __getNullRep()->data();
- __getNullRep()->__addReference();
- }
-
- #ifdef _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>
- ::basic_string (void) : __data_((charT*)0,Allocator())
- {
- __data_ = __getNullRep()->data();
- __getNullRep()->__addReference();
- }
- #endif
-
- template <class charT, class traits , class Allocator >
- inline
- basic_string<charT, traits, Allocator>
- ::basic_string (const basic_string<charT, traits, Allocator> & s)
- : __data_((charT*)0,Allocator())
- {
- if ( s.__pref()->__references() > 0 )
- {
- __data_ = s.__data_.data();
- __pref()->__addReference();
- }
- else
- {
- size_type n = s.length();
- __data_ = __getRep(n, n)->data();
- traits::copy(__data_.data(), s.c_str(), n);
- }
- }
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::operator= (charT c)
- {
- replace(0,length(),1,c);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::operator+= (const basic_string<charT, traits, Allocator>& s)
- {
- return append(s);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::operator+= (const charT* s)
- {
- return append(s);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::operator+= (charT c)
- {
- return append((size_type) 1, c);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::append (const charT* s, size_type n)
- {
- replace(size(),0,s,n,0,n);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::append (const charT* s)
- {
- replace(size(),0,s);
- return *this;
- }
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template<class charT, class traits , class Allocator >
- template<class InputIterator>
- inline basic_string<charT, traits, Allocator>&
- basic_string<charT, traits, Allocator>::append (InputIterator first,
- InputIterator last )
- {
- replace(end(),end(),first,last);
- return *this;
- }
- #else
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>&
- basic_string<charT, traits, Allocator>::append (const charT* first,
- const charT* last)
- {
- replace(size(),0,first,last-first,0,last-first);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::append (size_type n, charT c)
- {
- replace(length(),0,n,c);
- return *this;
- }
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- template <class charT, class traits , class Allocator >
- void basic_string<charT, traits, Allocator>::push_back(const charT c)
- {
- replace(size(),0,1,c);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::assign (const charT* s, size_type n)
- {
- replace(0, length(), s, n, 0, n);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::assign (const charT* s)
- {
- size_type len = traits::length(s);
- replace(0, length(), s, len, 0, len);
- return *this;
- }
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template<class charT, class traits , class Allocator >
- template<class InputIterator>
- inline basic_string<charT, traits, Allocator>&
- basic_string<charT, traits, Allocator>::assign (InputIterator first,
- InputIterator last)
- {
- replace(begin(),end(),first,last);
- return *this;
- }
- #else
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>&
- basic_string<charT, traits, Allocator>::assign (const charT* first,
- const charT* last)
- {
- replace(0,length(),first,last-first,0,last-first);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::assign (size_type n, charT c)
- {
- return replace(0,length(),n,c);
- }
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::insert (size_type pos,
- const charT* s,
- size_type n)
- {
- replace(pos, 0, s, n, 0, n);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::insert (size_type pos, const charT* s)
- {
- size_type len = traits::length(s);
- replace(pos, 0, s, len, 0, len);
- return *this;
- }
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template<class charT, class traits , class Allocator >
- template<class InputIterator>
- inline void
- basic_string<charT, traits, Allocator>::insert (
- iterator p,
- InputIterator first,
- InputIterator last)
- {
- replace(p,p,first,last);
- }
- #else
- template <class charT, class traits , class Allocator >
- inline void
- basic_string<charT, traits, Allocator>::insert (
- iterator p,
- const charT* first,
- const charT* last)
- {
- replace(p-begin(),0,first,last-first,0,last-first);
- }
-
- template <class charT, class traits , class Allocator >
- inline void
- basic_string<charT, traits, Allocator>::insert (
- iterator p,
- size_type n,
- charT c)
- {
- replace(p-begin(),0,n,c);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::insert(size_type pos,
- size_type n,
- charT c)
- {
- return replace(pos,0,n,c);
- }
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::erase (size_type pos, size_type n)
- {
- _RWSTD_THROW(pos > length(), out_of_range,
- __RWSTD::except_msg_string(__RWSTD::__rwse_StringIndexOutOfRange,
- "basic_string::erase(size_t,size_t)", pos,length()).msgstr());
-
- size_type len = length() - pos;
- charT tmp[1];
- *tmp = 0;
- return replace(pos,n < len ? n : len, tmp,0);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::replace (size_type pos1,
- size_type n1,
- const basic_string<charT, traits, Allocator> & str,
- size_type pos2,
- size_type n2)
- {
- replace(pos1, n1, str.data(), str.length(), pos2, n2);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::replace (
- size_type pos1,
- size_type n1,
- const basic_string<charT, traits, Allocator> & str)
- {
- replace(pos1, n1, str.data(), str.length(),0,str.length());
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::iterator
- basic_string<charT, traits, Allocator>::__replace_aux (size_type pos1,
- size_type n1,
- const basic_string<charT, traits, Allocator> & str,
- size_type pos2,
- size_type n2)
- {
- return replace(pos1, n1, str.data(), str.length(), pos2, n2);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::replace (size_type pos,
- size_type n1,
- const charT* s,
- size_type n2)
- {
- replace(pos, n1, s, n2, 0, n2);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> &
- basic_string<charT, traits, Allocator>::replace (size_type pos,
- size_type n1,
- const charT* s)
- {
- size_type len = traits::length(s);
- replace(pos, n1, s, len, 0, len);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>&
- basic_string<charT, traits, Allocator>::replace (
- iterator first,
- iterator last,
- const basic_string<charT, traits, Allocator>& str)
- {
- return replace(first - begin(), last - first, str);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>&
- basic_string<charT, traits, Allocator>::replace (
- iterator first,
- iterator last,
- const charT* s,
- size_type n)
- {
- replace(first-begin(),last-first,s,n,0,n);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>&
- basic_string<charT, traits, Allocator>::replace (
- iterator first,
- iterator last,
- const charT* s)
- {
- size_type len = traits::length(s);
- replace(first-begin(),last-first,s,len,0,len);
- return *this;
- }
- #ifdef _RWSTD_NO_MEMBER_TEMPLATES
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>&
- basic_string<charT, traits, Allocator>::replace (
- iterator first1,
- iterator last1,
- const charT* first2,
- const charT* last2)
- {
- replace(first1-begin(),last1-first1,first2,last2-first2,0,last2-first2);
- return *this;
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>&
- basic_string<charT, traits, Allocator>::replace (
- iterator first,
- iterator last,
- size_type n,
- charT c)
- {
- return replace(first-begin(),last-first,n,c);
- }
- #endif
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits,Allocator>::const_reference
- basic_string<charT, traits, Allocator>::operator[] (size_type pos) const
- {
- #ifdef _RWSTD_BOUNDS_CHECKING
- _RWSTD_THROW(pos > size(), out_of_range,
- __RWSTD::except_msg_string(__RWSTD::__rwse_PosBeyondEndOfString,
- "basic_string::operator[](size_t) const", pos,size()).msgstr());
- #endif
- return __data_.data()[pos];
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::reference
- basic_string<charT, traits, Allocator>::operator[] (size_type pos)
- {
- #ifdef _RWSTD_BOUNDS_CHECKING
- _RWSTD_THROW(pos >= size(), out_of_range,
- __RWSTD::except_msg_string(__RWSTD::__rwse_PosBeyondEndOfString,
- "basic_string::operator[](size_t)", pos,size()).msgstr());
- #endif
- __cow();
- __pref()->__setRefCount(0);
- return __data_.data()[pos];
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::const_reference
- basic_string<charT, traits, Allocator>::at (size_type pos) const
- {
- _RWSTD_THROW(pos >= size(), out_of_range,
- __RWSTD::except_msg_string(__RWSTD::__rwse_PosBeyondEndOfString,
- "basic_string::at(size_t) const", pos,size()).msgstr());
-
- return __data_.data()[pos];
- }
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::reference
- basic_string<charT, traits, Allocator>::at (size_type pos)
- {
- _RWSTD_THROW(pos >= size(), out_of_range,
- __RWSTD::except_msg_string(__RWSTD::__rwse_PosBeyondEndOfString,
- "basic_string::at(size_t)", pos,size()).msgstr());
-
- __cow();
- __pref()->__setRefCount(0);
- return __data_.data()[pos];
- }
-
- template <class charT, class traits , class Allocator >
- inline const charT* basic_string<charT, traits, Allocator>::c_str () const
- {
- return __data_.data();
- }
-
- template <class charT, class traits , class Allocator >
- inline const charT* basic_string<charT, traits, Allocator>::data () const
- {
- return __data_.data();
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::length () const
- {
- return __pref()->__nchars_;
- }
-
- template <class charT, class traits , class Allocator >
- inline void
- basic_string<charT, traits, Allocator>::resize (size_type n, charT c)
- {
- _RWSTD_THROW(n > max_size(), length_error,
- __RWSTD::except_msg_string(__RWSTD::__rwse_InvalidSizeParam,
- "basic_string( const charT*,size_type,const Allocator&)",n,npos).msgstr());
- if (n < length())
- erase(n,length()-n);
- else
- replace(length(),0,n-length(),c);
- __pref()->__setRefCount(1);
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::capacity () const
- {
- return __getCapac();
- }
-
- template <class charT, class traits , class Allocator >
- inline void basic_string<charT, traits, Allocator>::reserve(size_type res_arg)
- {
- _RWSTD_THROW(res_arg > max_size(), length_error,
- __RWSTD::except_msg_string(__RWSTD::__rwse_InvalidSizeParam,
- "basic_string::reserve(size_t)",res_arg,max_size()).msgstr());
-
- if (res_arg > __getCapac()) __clone(res_arg);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator>
- basic_string<charT, traits, Allocator>::copy () const
- {
- basic_string<charT, traits, Allocator> temp(*this); // Make referenced copy
- temp.__clone(); // Make a distinct copy
- return temp;
- }
-
- template <class charT, class traits, class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find (
- const basic_string<charT, traits, Allocator>& str,
- size_type pos) const
- {
- return find(str.c_str(),pos,str.length());
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find (const charT* s,
- size_type pos) const
- {
- _RWSTD_THROW(s == 0, logic_error,
- __RWSTD::except_msg_string(__RWSTD::__rwse_UnexpectedNullPtr,
- "basic_string::find(const char*,size_t) const").msgstr());
-
- if (pos > length())
- return npos;
- const charT* p = __RWSTD::rw_traits<charT,traits>::find(__data_.data()+pos,s);
- return p ? p - __data_.data() : npos;
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find (charT c, size_type pos) const
- {
- if (pos > length())
- return npos;
- const charT* p = traits::find(__data_.data()+pos,length()-pos,c);
- return p ? p - __data_.data() : npos;
- }
-
- template <class charT, class traits, class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::rfind (
- const basic_string<charT, traits, Allocator>& str,
- size_type pos) const
- {
- return rfind(str.c_str(), pos, str.length());
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::rfind (const charT* s, size_type pos)
- const
- {
- size_type len = traits::length(s);
- return rfind(s, pos,len);
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::rfind (charT c, size_type pos) const
- {
- if (pos > length())
- pos = length();
- const charT* p = __RWSTD::rw_traits<charT,traits>::rfind(__data_.data(),c,pos);
- return p ? p - __data_.data() : npos;
- }
-
- template <class charT, class traits, class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_first_of (
- const basic_string<charT, traits, Allocator>& str,
- size_type pos) const
- {
- return find_first_of(str.c_str(),pos,str.length());
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_first_of (const charT* s,
- size_type pos) const
- {
- _RWSTD_THROW(s == 0, logic_error,
- __RWSTD::except_msg_string(__RWSTD::__rwse_UnexpectedNullPtr,
- "basic_string::find_first_of(char*,size_t) const").msgstr());
-
- if (pos > length())
- return npos;
- size_type i = __RWSTD::rw_traits<charT,traits>::find_first_of(__data_.data()+pos,s) + pos;
- return i >= length() ? npos : i;
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_first_of (charT c, size_type pos) const
- {
- return find(c, pos);
- }
-
- template <class charT, class traits, class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_last_of (
- const basic_string<charT, traits, Allocator>& str,
- size_type pos) const
- {
- return find_last_of(str.c_str(), pos,str.length());
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_last_of (const charT* s,
- size_type pos) const
- {
- size_type len = traits::length(s);
- return find_last_of(s, pos,len);
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_last_of (charT c, size_type pos)
- const
- {
- return rfind(c,pos);
- }
-
- template <class charT, class traits, class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_first_not_of (
- const basic_string<charT, traits, Allocator>& str,
- size_type pos) const
- {
- return find_first_not_of(str.c_str(), pos, str.length());
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_first_not_of (const charT* s,
- size_type pos) const
- {
- _RWSTD_THROW(s == 0, logic_error,
- __RWSTD::except_msg_string(__RWSTD::__rwse_UnexpectedNullPtr,
- "basic_string::find_first_not_of(char*,size_t) const").msgstr());
-
- if (pos > length())
- return npos;
- size_type i = __RWSTD::rw_traits<charT,traits>::find_first_not_of(__data_.data()+pos,s) + pos;
- return i >= length() ? npos : i;
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_first_not_of (charT c,
- size_type pos) const
- {
- charT tmp[2];
- *tmp = c;
- tmp[1] = 0;
- return find_first_not_of(tmp, pos);
- }
-
- template <class charT, class traits, class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_last_not_of (
- const basic_string<charT, traits, Allocator>& str,
- size_type pos) const
- {
- return find_last_not_of(str.c_str(), pos, str.length());
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_last_not_of (const charT* s,
- size_type pos) const
- {
- size_type len = traits::length(s);
- return find_last_not_of(s, pos, len);
- }
-
- template <class charT, class traits , class Allocator >
- inline _TYPENAME basic_string<charT, traits, Allocator>::size_type
- basic_string<charT, traits, Allocator>::find_last_not_of (charT c,
- size_type pos) const
- {
- charT tmp[2];
- *tmp = c;
- tmp[1] = 0;
- return find_last_not_of(tmp, pos);
- }
-
- template <class charT, class traits, class Allocator >
- inline int
- basic_string<charT, traits, Allocator>::compare (
- const basic_string<charT, traits, Allocator>& str) const
- {
- return compare(0,length(),str.c_str(),str.length());
- }
-
- template <class charT, class traits , class Allocator >
- inline int
- basic_string<charT, traits, Allocator>::compare (size_type pos,
- size_type n1,
- const charT* s) const
- {
- size_type len = traits::length(s);
- return compare(pos,n1,s,len);
- }
-
- template <class charT, class traits , class Allocator >
- inline int
- basic_string<charT, traits, Allocator>::compare (const charT* s) const
- {
- size_type len = traits::length(s);
- return compare(0,length(),s,len);
- }
-
- //
- // Inlined non-member operators
- //
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> operator+(
- const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return basic_string<charT, traits, Allocator>(lhs).append(rhs);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> operator+(
- const charT* lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return basic_string<charT, traits, Allocator>(lhs).append(rhs);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> operator+(
- charT lhs, const basic_string<charT, traits, Allocator>& rhs)
- {
- return basic_string<charT, traits, Allocator>(1,lhs).append(rhs);
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> operator+(
- const basic_string<charT, traits, Allocator>& lhs,
- const charT* rhs)
- {
- return basic_string<charT,traits,Allocator>(lhs).append(basic_string<charT, traits, Allocator>(rhs));
- }
-
- template <class charT, class traits , class Allocator >
- inline basic_string<charT, traits, Allocator> operator+(
- const basic_string<charT, traits, Allocator>& lhs,
- charT rhs)
- {
- return basic_string<charT,traits,Allocator>(lhs).append(basic_string<charT, traits, Allocator>(1,rhs));
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator==(
- const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return lhs.compare(rhs) == 0 ? true : false ;
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator==(
- const charT* lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return basic_string<charT,traits,Allocator>(lhs).compare(rhs)==0?true:false;
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator==(
- const basic_string<charT, traits, Allocator>& lhs,
- const charT* rhs)
- {
- return lhs.compare(basic_string<charT,traits,Allocator>(rhs))==0?true:false;
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator<(
- const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return lhs.compare(rhs) < 0 ? true:false ;
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator<(
- const charT* lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return basic_string<charT,traits,Allocator>(lhs).compare(rhs)<0?true:false;
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator<(
- const basic_string<charT, traits, Allocator>& lhs,
- const charT* rhs)
- {
- return lhs.compare(basic_string<charT,traits,Allocator>(rhs))<0?true:false;
- }
-
- #if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
- template <class charT, class traits , class Allocator >
- inline bool operator!=(
- const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return lhs.compare(rhs) != 0 ? true : false;
- }
- #endif
-
- template <class charT, class traits , class Allocator >
- inline bool operator!=(
- const charT* lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return basic_string<charT,traits,Allocator>(lhs).compare(rhs)!=0?true:false;
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator!=(
- const basic_string<charT, traits, Allocator>& lhs,
- const charT* rhs)
- {
- return lhs.compare(basic_string<charT,traits,Allocator>(rhs))!=0?true:false;
- }
-
- #if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
- template <class charT, class traits , class Allocator >
- inline bool operator>(
- const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return lhs.compare(rhs) > 0 ? true : false;
- }
- #endif
-
- template <class charT, class traits , class Allocator >
- inline bool operator>(
- const charT* lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return basic_string<charT,traits,Allocator>(lhs).compare(rhs)>0?true:false;
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator>(
- const basic_string<charT, traits, Allocator>& lhs,
- const charT* rhs)
- {
- return lhs.compare(basic_string<charT,traits,Allocator>(rhs))>0?true:false;
- }
-
- #if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
- template <class charT, class traits , class Allocator >
- inline bool operator<=(
- const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return lhs.compare(rhs) <= 0 ? true : false;
- }
- #endif
-
- template <class charT, class traits , class Allocator >
- inline bool operator<=(
- const charT* lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return basic_string<charT,traits,Allocator>(lhs).compare(rhs)<=0?true:false;
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator<=(
- const basic_string<charT, traits, Allocator>& lhs,
- const charT* rhs)
- {
- return lhs.compare(basic_string<charT,traits,Allocator>(rhs))<=0?true:false;
- }
-
- #if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
- template <class charT, class traits , class Allocator >
- inline bool operator>=(
- const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return lhs.compare(rhs) >= 0 ? true:false;
- }
- #endif
-
- template <class charT, class traits , class Allocator >
- inline bool operator>=(
- const charT* lhs,
- const basic_string<charT, traits, Allocator>& rhs)
- {
- return basic_string<charT,traits,Allocator>(lhs).compare(rhs)>=0?true:false;
- }
-
- template <class charT, class traits , class Allocator >
- inline bool operator>=(
- const basic_string<charT, traits, Allocator>& lhs,
- const charT* rhs)
- {
- return lhs.compare(basic_string<charT,traits,Allocator>(rhs))>=0?true:false;
- }
-
- #if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
- template <class charT, class traits, class Allocator>
- inline void swap(basic_string<charT,traits,Allocator>& a,
- basic_string<charT,traits,Allocator>& b)
- {
- a.swap(b);
- }
- #endif
-
- #ifndef _RW_STD_IOSTREAM
-
- template<class charT, class traits , class Allocator >
- istream & _RWSTDExportTemplate operator >> (
- istream & is, basic_string<charT, traits, Allocator > & str);
-
- template<class charT, class traits , class Allocator >
- ostream& _RWSTDExportTemplate operator << (
- ostream & os, const basic_string<charT, traits, Allocator > & str);
-
- template<class Stream, class charT, class traits , class Allocator >
- Stream& _RWSTDExportTemplate getline(Stream& is,
- basic_string<charT, traits,Allocator>& str, charT delim);
-
- template<class Stream, class charT, class traits , class Allocator >
- Stream& _RWSTDExportTemplate getline(Stream& is,
- basic_string<charT, traits,Allocator>& str)
- { return getline(is,str,'\n'); }
-
- #endif /*_RW_STD_IOSTREAM*/
-
- #ifdef _RWSTD_MSC22_STATIC_INIT_BUG
- #undef npos
- #endif
-
- #ifndef _RWSTD_NO_NAMESPACE
- }
- #endif
-
- #ifdef _RWSTD_COMPILE_INSTANTIATE
- #include <string.cc>
- #endif
- #endif /*defined __STD_STRING*/
- #pragma option pop
- #endif /* __STRING_STL */
-