williamr@2: /* williamr@2: * Copyright (c) 1997-1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: williamr@2: #ifndef _STLP_DBG_STRING_H williamr@2: #define _STLP_DBG_STRING_H williamr@2: williamr@2: #include williamr@2: williamr@2: # define _STLP_DBG_STRING_BASE _Nondebug_string <_CharT, _Traits, _Alloc> williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: # ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS williamr@2: template williamr@2: inline _CharT* williamr@2: value_type(const _DBG_iter_base< _STLP_DBG_STRING_BASE >&) { williamr@2: return (_CharT*)0; williamr@2: } williamr@2: template williamr@2: inline random_access_iterator_tag williamr@2: iterator_category(const _DBG_iter_base< _STLP_DBG_STRING_BASE >&) { williamr@2: return random_access_iterator_tag(); williamr@2: } williamr@2: # endif williamr@2: williamr@2: template williamr@2: class basic_string : public _STLP_DBG_STRING_BASE { williamr@2: private: williamr@2: typedef _STLP_DBG_STRING_BASE _Base; williamr@2: typedef basic_string<_CharT, _Traits, _Alloc> _Self; williamr@2: protected: williamr@2: mutable __owned_list _M_iter_list; williamr@2: public: williamr@2: __IMPORT_CONTAINER_TYPEDEFS(_Base) williamr@2: typedef _DBG_iter<_Base, _Nonconst_traits > iterator; williamr@2: typedef _DBG_iter<_Base, _Const_traits > const_iterator; williamr@2: _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS; williamr@2: # ifdef _STLP_USE_NATIVE_STRING williamr@2: // this typedef is being used for conversions williamr@2: typedef _STLP_VENDOR_STD::basic_string<_CharT,_Traits, williamr@2: _STLP_VENDOR_STD::allocator<_CharT> > __std_string; williamr@2: # endif williamr@2: public: // Constructor, destructor, assignment. williamr@2: typedef typename _Base::_Reserve_t _Reserve_t; williamr@2: williamr@2: const _Base* _Get_base() const { return (const _Base*)this; } williamr@2: _Base* _Get_base() { return (_Base*)this; } williamr@2: williamr@2: basic_string() :_STLP_DBG_STRING_BASE(), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: explicit basic_string(const allocator_type& __a): williamr@2: _STLP_DBG_STRING_BASE(__a), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: basic_string(_Reserve_t __r, size_t __n, williamr@2: const allocator_type& __a = allocator_type()) williamr@2: : _STLP_DBG_STRING_BASE(__r, __n, __a), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: basic_string(const _Self& __s): williamr@2: _STLP_DBG_STRING_BASE(__s), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: basic_string(const _Self& __s, size_type __pos, size_type __n = _Base::npos, williamr@2: const allocator_type& __a = allocator_type()): williamr@2: _STLP_DBG_STRING_BASE(__s, __pos, __n, __a), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: basic_string(const _CharT* __s, size_type __n, williamr@2: const allocator_type& __a = allocator_type()): williamr@2: _STLP_DBG_STRING_BASE(__s, __n, __a), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: basic_string(const _CharT* __s, williamr@2: const allocator_type& __a = allocator_type()): williamr@2: _STLP_DBG_STRING_BASE(__s, __a), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: basic_string(size_type __n, _CharT __c, williamr@2: const allocator_type& __a = allocator_type()): williamr@2: _STLP_DBG_STRING_BASE(__n, __c, __a), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: #if defined (_STLP_MEMBER_TEMPLATES) && !(defined(__MRC__)||(defined(__SC__) && !defined(__DMC__))) williamr@2: # ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS williamr@2: template williamr@2: basic_string(_InputIterator __f, _InputIterator __l): williamr@2: _STLP_DBG_STRING_BASE(__f, __l), _M_iter_list(_Get_base()) {} williamr@2: # endif williamr@2: template williamr@2: basic_string(_InputIterator __f, _InputIterator __l, williamr@2: const allocator_type & __a _STLP_ALLOCATOR_TYPE_DFL): williamr@2: _STLP_DBG_STRING_BASE(__f, __l, __a), _M_iter_list(_Get_base()) {} williamr@2: #else /* _STLP_MEMBER_TEMPLATES */ williamr@2: basic_string(const_iterator __f, const_iterator __l, williamr@2: const allocator_type & __a = allocator_type()): williamr@2: _STLP_DBG_STRING_BASE(__f._M_iterator, __l._M_iterator, __a), williamr@2: _M_iter_list(_Get_base()) {} williamr@2: williamr@2: basic_string(const _CharT* __f, const _CharT* __l, williamr@2: const allocator_type& __a = allocator_type()): williamr@2: _STLP_DBG_STRING_BASE(__f, __l, __a), _M_iter_list(_Get_base()) {} williamr@2: #endif williamr@2: williamr@2: # ifdef _STLP_USE_NATIVE_STRING williamr@2: // these conversion operations still needed for williamr@2: // strstream, etc. williamr@2: basic_string (const __std_string& __x) williamr@2: : _STLP_DBG_STRING_BASE(__x.begin(), __x.end()), _M_iter_list(_Get_base()) {} williamr@2: operator __std_string() const { return __std_string(this->data()); } williamr@2: # endif williamr@2: williamr@2: // constructor from non-debug version williamr@2: basic_string (const _Base& __x) williamr@2: : _STLP_DBG_STRING_BASE(__x), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: _Self& operator=(const _Self& __s) { williamr@2: _Base::operator=(__s); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& operator=(const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: _Base::operator=(__s); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& operator=(_CharT __c) { williamr@2: _Base::operator=(__c); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: public: // Iterators. williamr@2: williamr@2: iterator begin() { return iterator(&_M_iter_list, this->_M_start); } williamr@2: const_iterator begin() const { return const_iterator(&_M_iter_list,this->_M_start); } williamr@2: iterator end() { return iterator(&_M_iter_list,this->_M_finish); } williamr@2: const_iterator end() const { return const_iterator(&_M_iter_list,this->_M_finish); } williamr@2: void _M_deallocate_block() { williamr@2: _M_iter_list._Invalidate_all(); williamr@2: _Base::_M_deallocate_block(); williamr@2: } williamr@2: williamr@2: reverse_iterator rbegin() williamr@2: { return reverse_iterator(iterator(&_M_iter_list,this->_M_finish)); } williamr@2: reverse_iterator rend() williamr@2: { return reverse_iterator(iterator(&_M_iter_list,this->_M_start)); } williamr@2: const_reverse_iterator rbegin() const williamr@2: { return const_reverse_iterator(const_iterator(&_M_iter_list,this->_M_finish)); } williamr@2: const_reverse_iterator rend() const williamr@2: { return const_reverse_iterator(const_iterator(&_M_iter_list,this->_M_start)); } williamr@2: williamr@2: public: // Size, capacity, etc. williamr@2: williamr@2: void resize(size_type __n, _CharT __c) { williamr@2: _Base::resize(__n, __c); williamr@2: } williamr@2: void resize(size_type __n) { resize(__n, this->_M_null()); } williamr@2: williamr@2: void reserve(size_type __s= 0) { williamr@2: _Base::reserve(__s); williamr@2: } williamr@2: williamr@2: void clear() { williamr@2: _M_iter_list._Invalidate_all(); williamr@2: _Base::clear(); williamr@2: } williamr@2: williamr@2: public: // Element access. williamr@2: williamr@2: const_reference operator[](size_type __n) const williamr@2: { return *(begin() + __n); } williamr@2: reference operator[](size_type __n) williamr@2: { return *(begin() + __n); } williamr@2: williamr@2: const_reference at(size_type __n) const { williamr@2: if (__n >= this->size()) williamr@2: this->_M_throw_out_of_range(); williamr@2: return *(begin() + __n); williamr@2: } williamr@2: williamr@2: reference at(size_type __n) { williamr@2: if (__n >= this->size()) williamr@2: this->_M_throw_out_of_range(); williamr@2: return *(begin() + __n); williamr@2: } williamr@2: williamr@2: public: // Append, operator+=, push_back. williamr@2: williamr@2: _Self& operator+=(const _Self& __s) { return append(__s); } williamr@2: _Self& operator+=(const _CharT* __s) { _STLP_FIX_LITERAL_BUG(__s) return append(__s); } williamr@2: _Self& operator+=(_CharT __c) { push_back(__c); return *this; } williamr@2: williamr@2: _Self& append(const _Self& __s) { return append(__s._M_start, __s._M_finish); } williamr@2: williamr@2: _Self& append(const _Self& __s, williamr@2: size_type __pos, size_type __n) williamr@2: { williamr@2: _Base::append(__s, __pos, __n); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& append(const _CharT* __s, size_type __n) williamr@2: { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s+__n); } williamr@2: williamr@2: _Self& append(const _CharT* __s) williamr@2: { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s + _Traits::length(__s)); } williamr@2: williamr@2: _Self& append(size_type __n, _CharT __c){ williamr@2: _Base::append(__n, __c); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: williamr@2: // Check to see if _InputIterator is an integer type. If so, then williamr@2: // it can't be an iterator. williamr@2: template williamr@2: _Self& append(_InputIter __first, _InputIter __last) { williamr@2: _Base::append(__first, __last); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MSVC williamr@2: // specialization for append williamr@2: template <> williamr@2: inline _Self& append(iterator __f, iterator __l) { williamr@2: _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l) williamr@2: __check_range(__f, __l); williamr@2: _Base::append(__f._M_iterator, __l._M_iterator); williamr@2: return *this; williamr@2: } williamr@2: #endif williamr@2: williamr@2: #else /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: _Self& append(const _CharT* __first, const _CharT* __last) { williamr@2: _Base::append(__first, __last); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& append(const_iterator __first, const_iterator __last) { williamr@2: _Base::append(__first._M_iterator, __last._M_iterator); williamr@2: return *this; williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: void push_back(_CharT __c) { williamr@2: _Base::push_back(__c); williamr@2: } williamr@2: williamr@2: void pop_back() { williamr@2: __invalidate_iterator(&_M_iter_list,end()); williamr@2: _Base::pop_back(); williamr@2: } williamr@2: williamr@2: williamr@2: public: // Assign williamr@2: williamr@2: _Self& assign(const _Self& __s) { williamr@2: _Base::assign(__s); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& assign(const _Self& __s, williamr@2: size_type __pos, size_type __n) { williamr@2: _Base::assign(__s, __pos, __n); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& assign(const _CharT* __s, size_type __n) williamr@2: { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + __n); } williamr@2: williamr@2: _Self& assign(const _CharT* __s) williamr@2: { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + _Traits::length(__s)); } williamr@2: williamr@2: _Self& assign(size_type __n, _CharT __c) { williamr@2: _Base::assign(__n, __c); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template williamr@2: inline _Self& assign(_InputIter __first, _InputIter __last) { williamr@2: _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) williamr@2: __check_range(__first, __last); williamr@2: _Base::assign(__first, __last); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MSVC williamr@2: // partial specialization for assign williamr@2: template <> williamr@2: inline _Self& assign(iterator __f, iterator __l) { williamr@2: _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l) williamr@2: __check_range(__f, __l); williamr@2: _Base::assign(__f._M_iterator, __l._M_iterator); williamr@2: return *this; williamr@2: } williamr@2: #endif williamr@2: williamr@2: #else williamr@2: _Self& assign(const _CharT* __f, const _CharT* __l) { williamr@2: _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l) williamr@2: __check_range(__f, __l); williamr@2: _Base::assign(__f, __l); williamr@2: return *this; williamr@2: } williamr@2: _Self& assign(const_iterator __f, const_iterator __l) { williamr@2: williamr@2: _Base::assign(__f._M_iterator, __l._M_iterator); williamr@2: return *this; williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: public: // Insert williamr@2: williamr@2: _Self& insert(size_type __pos, const _Self& __s) { williamr@2: _Base::insert(__pos, __s); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& insert(size_type __pos, const _Self& __s, williamr@2: size_type __beg, size_type __n) { williamr@2: _Base::insert(__pos, __s, __beg, __n); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& insert(size_type __pos, const _CharT* __s, size_type __n) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: _Base::insert(__pos, __s, __n); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& insert(size_type __pos, const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: _Base::insert(__pos, __s); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& insert(size_type __pos, size_type __n, _CharT __c) { williamr@2: _Base::insert(__pos, __n, __c); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: iterator insert(iterator __p, _CharT __c) { williamr@2: _STLP_FIX_LITERAL_BUG(__p) williamr@2: __check_if_owner(&_M_iter_list,__p); williamr@2: return iterator(&_M_iter_list,_Base::insert(__p._M_iterator, __c)); williamr@2: } williamr@2: williamr@2: void insert(iterator __p, size_t __n, _CharT __c) { williamr@2: __check_if_owner(&_M_iter_list,__p); williamr@2: _Base::insert(__p._M_iterator, __n, __c); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template williamr@2: void insert(iterator __p, _InputIter __first, _InputIter __last) { williamr@2: __check_if_owner(&_M_iter_list,__p); williamr@2: __check_range(__first,__last); williamr@2: _Base::insert(__p._M_iterator, __first, __last); williamr@2: } williamr@2: #else /* _STLP_MEMBER_TEMPLATES */ williamr@2: void insert(iterator __p, const _CharT* __first, const _CharT* __last) { williamr@2: _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last) williamr@2: __check_if_owner(&_M_iter_list,__p); williamr@2: __check_range(__first,__last); williamr@2: _Base::insert(__p._M_iterator, __first, __last); williamr@2: } williamr@2: void insert(iterator __p, const_iterator __first, const_iterator __last) { williamr@2: __check_range(__first,__last); williamr@2: _Base::insert(__p._M_iterator, __first._M_iterator, __last._M_iterator); williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: public: // Erase. williamr@2: _Self& erase(size_type __pos = 0, size_type __n = _Base::npos) { williamr@2: _Base::erase(__pos, __n); williamr@2: return *this; williamr@2: } williamr@2: iterator erase(iterator __position) { williamr@2: __check_if_owner(&_M_iter_list, __position); williamr@2: __invalidate_iterator(&_M_iter_list,end()); williamr@2: return iterator(&_M_iter_list, _Base::erase(__position._M_iterator)); williamr@2: } williamr@2: iterator erase(iterator __first, iterator __last) { williamr@2: __check_range(__first, __last)&&__check_if_owner(&_M_iter_list,__first); williamr@2: if (__first != __last) { williamr@2: __invalidate_range(&_M_iter_list, __last, end()); williamr@2: } williamr@2: return iterator(&_M_iter_list, _Base::erase(__first._M_iterator, __last._M_iterator)); williamr@2: } williamr@2: williamr@2: public: // Substring. williamr@2: _Self substr(size_type __pos = 0, size_type __n = _Base::npos) const { williamr@2: if (__pos > this->size()) williamr@2: this->_M_throw_out_of_range(); williamr@2: return _Self(this->begin() + __pos, williamr@2: this->begin() + __pos + min(__n, this->size() - __pos), williamr@2: allocator_type()); williamr@2: } williamr@2: public: // Replace. (Conceptually equivalent williamr@2: // to erase followed by insert.) williamr@2: _Self& replace(size_type __pos, size_type __n, williamr@2: const _Self& __s) { williamr@2: _Base::replace(__pos, __n, __s); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& replace(size_type __pos1, size_type __n1, williamr@2: const _Self& __s, williamr@2: size_type __pos2, size_type __n2) { williamr@2: _Base::replace(__pos1, __n1, (const _Base&)__s, __pos2, __n2); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& replace(size_type __pos, size_type __n1, williamr@2: const _CharT* __s, size_type __n2) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: _Base::replace(__pos, __n1, __s, __n2); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& replace(size_type __pos, size_type __n1, williamr@2: const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: _Base::replace(__pos, __n1, __s); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& replace(size_type __pos, size_type __n1, williamr@2: size_type __n2, _CharT __c) { williamr@2: _Base::replace(__pos, __n1, __n2, __c); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& replace(iterator __first, iterator __last, williamr@2: const _Self& __s) { williamr@2: __check_if_owner(&_M_iter_list,__first); williamr@2: __check_range(__first, __last); williamr@2: _Base::replace(__first._M_iterator, __last._M_iterator,__s); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& replace(iterator __first, iterator __last, williamr@2: const _CharT* __s, size_type __n) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: __check_if_owner(&_M_iter_list,__first); williamr@2: __check_range(__first, __last); williamr@2: _Base::replace(__first._M_iterator, __last._M_iterator,__s, __n); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& replace(iterator __first, iterator __last, williamr@2: const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: __check_if_owner(&_M_iter_list,__first); williamr@2: __check_range(__first, __last); williamr@2: _Base::replace(__first._M_iterator, __last._M_iterator,__s); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& replace(iterator __first, iterator __last, williamr@2: size_type __n, _CharT __c) { williamr@2: __check_if_owner(&_M_iter_list,__first); williamr@2: __check_range(__first, __last); williamr@2: _Base::replace(__first._M_iterator, __last._M_iterator, __n, __c); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template williamr@2: _Self& replace(iterator __first, iterator __last, williamr@2: _InputIter __f, _InputIter __l) { williamr@2: __check_if_owner(&_M_iter_list, __first); williamr@2: __check_range(__first, __last); williamr@2: __check_range(__f, __l); williamr@2: _Base::replace(__first._M_iterator, __last._M_iterator, __f, __l); williamr@2: return *this; williamr@2: } williamr@2: #else /* _STLP_MEMBER_TEMPLATES */ williamr@2: _Self& replace(iterator __first, iterator __last, williamr@2: const _CharT* __f, const _CharT* __l) { williamr@2: __check_if_owner(&_M_iter_list, __first); williamr@2: __check_range(__first, __last); williamr@2: __check_range(__f, __l); williamr@2: _Base::replace(__first._M_iterator, __last._M_iterator, __f, __l); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: _Self& replace(iterator __first, iterator __last, williamr@2: const_iterator __f, const_iterator __l) { williamr@2: __check_if_owner(&_M_iter_list, __first); williamr@2: __check_range(__first, __last); williamr@2: __check_range(__f, __l); williamr@2: _Base::replace(__first._M_iterator, __last._M_iterator, williamr@2: __f._M_iterator, __l._M_iterator); williamr@2: return *this; williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: public: // Other modifier member functions. williamr@2: williamr@2: void swap(_Self& __s) { williamr@2: _M_iter_list._Swap_owners(__s._M_iter_list); williamr@2: _Base::swap(__s); williamr@2: } williamr@2: }; williamr@2: williamr@2: williamr@2: // This is a hook to instantiate STLport exports in a designated DLL williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: _STLP_EXPORT template class _STLP_CLASS_DECLSPEC basic_string, allocator >; williamr@2: # if defined (_STLP_HAS_WCHAR_T) williamr@2: _STLP_EXPORT template class _STLP_CLASS_DECLSPEC basic_string, allocator >; williamr@2: # endif williamr@2: # endif /* _STLP_USE_TEMPLATE_EXPORT */ williamr@2: williamr@2: williamr@2: // ------------------------------------------------------------ williamr@2: // Non-member functions. williamr@2: williamr@2: template williamr@2: inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL williamr@2: operator+(const basic_string<_CharT,_Traits,_Alloc>& __s, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) williamr@2: { williamr@2: return basic_string<_CharT,_Traits,_Alloc>(*__s._Get_base() + *__y._Get_base()); williamr@2: } williamr@2: williamr@2: template williamr@2: inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL williamr@2: operator+(const _CharT* __s, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return basic_string<_CharT,_Traits,_Alloc>(__s + *__y._Get_base()); williamr@2: } williamr@2: williamr@2: template williamr@2: inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL williamr@2: operator+(_CharT __c, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: return basic_string<_CharT,_Traits,_Alloc>(__c + *__y._Get_base()); williamr@2: } williamr@2: williamr@2: template williamr@2: inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL williamr@2: operator+(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return basic_string<_CharT,_Traits,_Alloc>(*__x._Get_base()+ __s); williamr@2: } williamr@2: williamr@2: template williamr@2: inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL williamr@2: operator+(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const _CharT __c) { williamr@2: return basic_string<_CharT,_Traits,_Alloc>(*__x._Get_base() + __c); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG williamr@2: williamr@2: // Operator== and operator!= williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator==(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: return (*__x._Get_base() == *__y._Get_base()); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator==(const _CharT* __s, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return (__s == *__y._Get_base()); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator==(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return (*__x._Get_base() == __s); williamr@2: } williamr@2: williamr@2: // Operator< (and also >, <=, and >=). williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator<(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: return (*__x._Get_base() < *__y._Get_base()); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator<(const _CharT* __s, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return (__s < *__y._Get_base()); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator<(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return (*__x._Get_base() < __s); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: return !(__x == __y); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator>(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: return __y < __x; williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: return !(__y < __x); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: return !(__x < __y); williamr@2: } williamr@2: williamr@2: #endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator!=(const _CharT* __s, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return !(__s == __y); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return !(__x == __s); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator>(const _CharT* __s, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return __y < __s; williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator>(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return __s < __x; williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator<=(const _CharT* __s, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return !(__y < __s); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return !(__s < __x); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator>=(const _CharT* __s, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return !(__s < __y); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: const _CharT* __s) { williamr@2: _STLP_FIX_LITERAL_BUG(__s) williamr@2: return !(__x < __s); williamr@2: } williamr@2: #endif /* if 0 */ williamr@2: williamr@2: // Swap. williamr@2: #ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER williamr@2: template williamr@2: inline void swap(basic_string<_CharT,_Traits,_Alloc>& __x, williamr@2: basic_string<_CharT,_Traits,_Alloc>& __y) { williamr@2: __x.swap(__y); williamr@2: } williamr@2: #endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */ williamr@2: williamr@2: // I/O. williamr@2: williamr@2: #ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG williamr@2: #if defined (_STLP_USE_NEW_IOSTREAMS) && ! defined (_STLP_OWN_IOSTREAMS) williamr@2: williamr@2: template williamr@2: basic_ostream<_CharT, _Traits>& _STLP_CALL williamr@2: operator<<(basic_ostream<_CharT, _Traits>& __os, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __s) { williamr@2: return __os << *__s._Get_base(); williamr@2: } williamr@2: williamr@2: template williamr@2: basic_istream<_CharT, _Traits>& _STLP_CALL williamr@2: operator>>(basic_istream<_CharT, _Traits>& __is, williamr@2: basic_string<_CharT,_Traits,_Alloc>& __s) { williamr@2: return __is >> *__s._Get_base(); williamr@2: } williamr@2: williamr@2: #elif ! defined ( _STLP_USE_NO_IOSTREAMS ) williamr@2: williamr@2: template williamr@2: ostream& _STLP_CALL operator<<(ostream& __os, williamr@2: const basic_string<_CharT,_Traits,_Alloc>& __s) { williamr@2: return __os << *__s._Get_base(); williamr@2: } williamr@2: williamr@2: template williamr@2: istream& _STLP_CALL operator>>(istream& __is, basic_string<_CharT,_Traits,_Alloc>& __s) { williamr@2: return __is >> *__s._Get_base(); williamr@2: } williamr@2: williamr@2: #endif /* _STLP_USE_NEW_IOSTREAMS */ williamr@2: #endif /* if _STLP_EXTRA_OPERATORS_FOR_DEBUG */ williamr@2: williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: #endif /* _STLP_DBG_STRING */ williamr@2: williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: williamr@2: