19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 2003
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Francois Dumont
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_STRING_SUM_H
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_STRING_SUM_H
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*char wrapper to simulate basic_string*/
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT>
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __char_wrapper {
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const _CharT& const_reference;
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __char_wrapper(_CharT __val) : _Val(__val) {}
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _CharT getValue() const { return _Val; }
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t size() const { return 1; }
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference operator[] (size_t __n) const {
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //To avoid a check on __n we use this strange implementation
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return (&_Val)[__n];
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _CharT _Val;
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*C string wrapper to simulate basic_string*/
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT>
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __cstr_wrapper {
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const _CharT& const_reference;
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __cstr_wrapper(const _CharT *__cstr, size_t __size) :
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _CStr(__cstr), _Size(__size) {}
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _CharT* c_str() const { return _CStr; }
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t size() const { return _Size; }
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference operator[] (size_t __n) const { return _CStr[__n]; }
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _CharT *_CStr;
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t _Size;
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*basic_string wrapper to ensure that we only store a reference to the original string and not copy it*/
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc>
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __bstr_wrapper {
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const _CharT& const_reference;
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef basic_string<_CharT, _Traits, _Alloc> _BString;
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __bstr_wrapper (_BString const& __s) :
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _BStr(__s) {}
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t size() const { return _BStr.size(); }
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference operator[] (size_t __n) const { return _BStr[__n]; }
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString const& b_str() const { return _BStr; }
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString const& _BStr;
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __on_left {};
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __on_right {};
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc,
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Left, class _Right,
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _StorageDirection>
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass __bstr_sum {
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef basic_string<_CharT, _Traits, _Alloc> _BString;
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _BString::const_reference const_reference;
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _BString::const_iterator const_iterator;
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _BString::const_reverse_iterator const_reverse_iterator;
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _BString::size_type size_type;
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _BString::allocator_type allocator_type;
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __bstr_sum<_CharT, _Traits, _Alloc, _Left, _Right, _StorageDirection> _Self;
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __bstr_sum (_Left const& lhs, _Right const& rhs) :
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _lhs(lhs), _rhs(rhs) {}
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Left const& getLhs() const { return _lhs; }
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Right const& getRhs() const { return _rhs; }
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  allocator_type get_allocator() const { return _M_get_storage(false).get_allocator(); }
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator begin() const { return _M_get_storage().begin(); }
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator end()   const { return _M_get_storage().end(); }
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rbegin() const { return _M_get_storage().rbegin(); }
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rend()   const { return _M_get_storage().rend(); }
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type size() const { return _lhs.size() + _rhs.size(); }
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type length() const { return size(); }
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t max_size() const { return _M_get_storage().max_size(); }
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type capacity() const { return size(); }
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool empty() const { return size() == 0; }
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference operator[](size_t __n) const
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return (__n < _lhs.size())?_lhs[__n]:_rhs[__n - _lhs.size()]; }
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference at(size_type __n) const
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().at(__n); }
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //operator +=
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __bstr_sum<_CharT, _Traits, _Alloc, _Self, __bstr_wrapper<_CharT, _Traits, _Alloc>, __on_left> _BStrOnLeft;
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BStrOnLeft operator += (const _BString& __s) { return append(__s); }
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __bstr_sum<_CharT, _Traits, _Alloc, _Self, __cstr_wrapper<_CharT>, __on_left> _CStrOnLeft;
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _CStrOnLeft operator += (const _CharT* __s) { return append(__s); }
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __bstr_sum<_CharT, _Traits, _Alloc, _Self, __char_wrapper<_CharT>, __on_left> _CharOnLeft;
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _CharOnLeft operator += (_CharT __c) { return _CharOnLeft(*this, __c); }
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //append
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BStrOnLeft append (const _BString& __s)
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _BStrOnLeft(*this, __s); }
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& append(const _BString& __s, size_type __pos, size_type __n)
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().append(__s, __pos, __n); }
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _CStrOnLeft append(const _CharT* __s) {
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const size_type __n = _Traits::length(__s);
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _CStrOnLeft(*this, __cstr_wrapper<_CharT>(__s, __n));
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _CStrOnLeft append(const _CharT* __s, size_type __n)
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _CStrOnLeft(*this, __cstr_wrapper<_CharT>(__s, __n)); }
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& append(size_type __n, _CharT __c)
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {return _M_get_storage().append(__n, __c);}
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& append(_InputIter __first, _InputIter __last)
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {return _M_get_storage().append(__first, __last);}
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //assign
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& assign(const _BString& __s) {return _M_get_storage().assign(__s);}
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& assign(const _BString& __s, size_type __pos, size_type __n) {return _M_get_storage().assign(__s, __pos, __n);}
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& assign(const _CharT* __s, size_type __n) {return _M_get_storage().assign(__s, __n);}
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& assign(const _CharT* __s) {return _M_get_storage().assign(__s); }
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& assign(size_type __n, _CharT __c) {return _M_get_storage().assign(__n, __c);}
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //insert
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& insert(size_type __pos, const _BString& __s) {return _M_get_storage().insert(__pos, __s);}
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& insert(size_type __pos, const _BString& __s, size_type __beg, size_type __n)
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {return _M_get_storage().insert(__pos, __s, __beg, __n);}
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& insert(size_type __pos, const _CharT* __s, size_type __n) {return _M_get_storage().insert(__pos, __s, __n);}
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& insert(size_type __pos, const _CharT* __s) {return _M_get_storage().insert(__pos, __s);}
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& insert(size_type __pos, size_type __n, _CharT __c) {return _M_get_storage().insert(__pos, __n, __c);}
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //erase
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& erase(size_type __pos = 0, size_type __n =_BString::npos) {return _M_get_storage().erase(__pos, __n);}
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //replace
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& replace(size_type __pos, size_type __n, const _BString& __s)
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {return _M_get_storage().replace(__pos, __n, __s);}
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& replace(size_type __pos1, size_type __n1, const _BString& __s, size_type __pos2, size_type __n2)
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {return _M_get_storage().replace(__pos1, __n1, __s, __pos2, __n2);}
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& replace(size_type __pos, size_type __n1, const _CharT* __s, size_type __n2)
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {return _M_get_storage().replace(__pos, __n1, __s, __n2);}
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& replace(size_type __pos, size_type __n1, const _CharT* __s)
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {return _M_get_storage().replace(__pos, __n1, __s);}
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {return _M_get_storage().replace(__pos, __n1, __n2, __c);}
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {return _M_get_storage().copy(__s, __n, __pos);}
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void swap(_BString& __s)
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {_M_get_storage().swap(__s);}
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _CharT* c_str() const { return _M_get_storage().c_str(); }
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _CharT* data()  const { return _M_get_storage().data(); }
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //find family
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find(const _BString& __s, size_type __pos = 0) const { return _M_get_storage().find(__s, __pos); }
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find(const _CharT* __s, size_type __pos = 0) const { return _M_get_storage().find(__s, __pos); }
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find(const _CharT* __s, size_type __pos, size_type __n) const { return _M_get_storage().find(__s, __pos, __n); }
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find(_CharT __c, size_type __pos = 0) const { return _M_get_storage().find(__c, __pos); }
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type rfind(const _BString& __s, size_type __pos = _BString::npos) const { return _M_get_storage().rfind(__s, __pos); }
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type rfind(const _CharT* __s, size_type __pos = _BString::npos) const { return _M_get_storage().rfind(__s, __pos); }
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const { return _M_get_storage().rfind(__s, __pos, __n); }
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type rfind(_CharT __c, size_type __pos = _BString::npos) const { return _M_get_storage().rfind(__c, __pos); }
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_first_of(const _BString& __s, size_type __pos = 0) const
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_first_of(__s, __pos); }
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_first_of(const _CharT* __s, size_type __pos = 0) const
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_first_of(__s, __pos); }
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_first_of(__s, __pos, __n); }
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_first_of(_CharT __c, size_type __pos = 0) const
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find(__c, __pos); }
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_last_of(const _BString& __s, size_type __pos = _BString::npos) const
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_last_of(__s, __pos); }
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_last_of(const _CharT* __s, size_type __pos = _BString::npos) const
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_last_of(__s, __pos); }
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_last_of(__s, __pos, __n); }
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_last_of(_CharT __c, size_type __pos = _BString::npos) const
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().rfind(__c, __pos); }
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_first_not_of(const _BString& __s, size_type __pos = 0) const
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_first_not_of(__s, __pos); }
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_first_not_of(const _CharT* __s, size_type __pos = 0) const
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_first_not_of(__s, __pos); }
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_first_not_of(__s, __pos, __n); }
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_first_not_of(_CharT __c, size_type __pos = 0) const
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_first_not_of(__c, __pos); }
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_last_not_of(const _BString& __s, size_type __pos = _BString::npos) const
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_last_not_of(__s, __pos); }
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_last_not_of(const _CharT* __s, size_type __pos =_BString:: npos) const
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_last_not_of(__s, __pos); }
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_last_not_of(__s, __pos, __n); }
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type find_last_not_of(_CharT __c, size_type __pos = _BString::npos) const
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().find_last_not_of(__c, __pos); }
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString substr(size_type __pos = 0, size_type __n = _BString::npos) const
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().substr(__pos, __n); }
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //compare
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int compare(const _BString& __s) const
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().compare(__s); }
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int compare(size_type __pos1, size_type __n1, const _Self& __s) const
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().compare(__pos1, __n1, __s); }
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int compare(size_type __pos1, size_type __n1, const _Self& __s, size_type __pos2, size_type __n2) const
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().compare(__pos1, __n1, __s, __pos2, __n2); }
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int compare(const _CharT* __s) const
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().compare(__s); }
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int compare(size_type __pos1, size_type __n1, const _CharT* __s) const
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().compare(__pos1, __n1, __s); }
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int compare(size_type __pos1, size_type __n1, const _CharT* __s, size_type __n2) const
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage().compare(__pos1, __n1, __s, __n2); }
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //Returns the underlying basic_string representation of the template expression
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //The non const method will always initialise it.
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& _M_get_storage()
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _rhs._M_get_storage(*this, _StorageDirection()); }
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Lhs, class _Rhs, class _StorageDir>
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& _M_get_storage(__bstr_sum<_CharT, _Traits, _Alloc, _Lhs, _Rhs, _StorageDir>  const& __ref,
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           __on_left const& /*StorageDir*/)
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _lhs._M_get_storage(__ref); }
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Lhs, class _Rhs, class _StorageDir>
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& _M_get_storage(__bstr_sum<_CharT, _Traits, _Alloc, _Lhs, _Rhs, _StorageDir>  const& __ref,
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           __on_right const& /*StorageDir*/)
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _rhs._M_get_storage(__ref); }
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Lhs, class _Rhs, class _StorageDir>
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& _M_get_storage(__bstr_sum<_CharT, _Traits, _Alloc, _Lhs, _Rhs, _StorageDir>  const& __ref)
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage(__ref, _StorageDirection()); }
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //The const method can be invoked without initialising the basic_string so avoiding dynamic allocation.
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString const& _M_get_storage(bool __do_init = true) const
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage(*this, __do_init, _StorageDirection()); }
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Lhs, class _Rhs, class _StorageDir>
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString const& _M_get_storage(__bstr_sum<_CharT, _Traits, _Alloc, _Lhs, _Rhs, _StorageDir>  const& __ref,
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 bool __do_init, __on_left const& /*StorageDir*/) const
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _lhs._M_get_storage(__ref, __do_init); }
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Lhs, class _Rhs, class _StorageDir>
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString const& _M_get_storage(__bstr_sum<_CharT, _Traits, _Alloc, _Lhs, _Rhs, _StorageDir>  const& __ref,
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 bool __do_init, __on_right const& /*StorageDir*/) const
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _rhs._M_get_storage(__ref, __do_init); }
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Lhs, class _Rhs, class _StorageDir>
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString const& _M_get_storage(__bstr_sum<_CharT, _Traits, _Alloc, _Lhs, _Rhs, _StorageDir>  const& __ref,
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 bool __do_init) const
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_get_storage(__ref, __do_init, _StorageDirection()); }
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Left  _lhs;
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Right _rhs;
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * For this operator we choose to use the right part as the storage part
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc,
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh1, class _Rh1, class _StoreDir1,
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh2, class _Rh2, class _StoreDir2>
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline __bstr_sum<_CharT, _Traits, _Alloc,
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  __bstr_sum<_CharT, _Traits, _Alloc, _Lh1, _Rh1, _StoreDir1>,
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  __bstr_sum<_CharT, _Traits, _Alloc, _Lh2, _Rh2, _StoreDir2>,
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  __on_right> _STLP_CALL
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator + (const __bstr_sum<_CharT, _Traits, _Alloc, _Lh1, _Rh1, _StoreDir1> &__lhs,
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            const __bstr_sum<_CharT, _Traits, _Alloc, _Lh2, _Rh2, _StoreDir2> &__rhs) {
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __bstr_sum<_CharT, _Traits, _Alloc,
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    __bstr_sum<_CharT, _Traits, _Alloc, _Lh1, _Rh1, _StoreDir1>,
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    __bstr_sum<_CharT, _Traits, _Alloc, _Lh2, _Rh2, _StoreDir2>,
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    __on_right>(__lhs, __rhs);
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc,
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh1, class _Rh1, class _StoreDir1,
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh2, class _Rh2, class _StoreDir2>
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator == (const __bstr_sum<_CharT, _Traits, _Alloc, _Lh1, _Rh1, _StoreDir1> &__lhs,
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block             const __bstr_sum<_CharT, _Traits, _Alloc, _Lh2, _Rh2, _StoreDir2> &__rhs)
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return (__lhs.size() == __rhs.size()) && (__lhs._M_get_storage() == __rhs._M_get_storage()); }
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc,
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh1, class _Rh1, class _StoreDir1,
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh2, class _Rh2, class _StoreDir2>
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator < (const __bstr_sum<_CharT, _Traits, _Alloc, _Lh1, _Rh1, _StoreDir1> &__lhs,
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            const __bstr_sum<_CharT, _Traits, _Alloc, _Lh2, _Rh2, _StoreDir2> &__rhs)
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __lhs._M_get_storage() < __rhs._M_get_storage(); }
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc,
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh1, class _Rh1, class _StoreDir1,
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh2, class _Rh2, class _StoreDir2>
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator != (const __bstr_sum<_CharT, _Traits, _Alloc, _Lh1, _Rh1, _StoreDir1> &__lhs,
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block             const __bstr_sum<_CharT, _Traits, _Alloc, _Lh2, _Rh2, _StoreDir2> &__rhs)
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__lhs == __rhs); }
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc,
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh1, class _Rh1, class _StoreDir1,
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh2, class _Rh2, class _StoreDir2>
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator > (const __bstr_sum<_CharT, _Traits, _Alloc, _Lh1, _Rh1, _StoreDir1> &__lhs,
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            const __bstr_sum<_CharT, _Traits, _Alloc, _Lh2, _Rh2, _StoreDir2> &__rhs)
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __rhs < __lhs; }
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc,
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh1, class _Rh1, class _StoreDir1,
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh2, class _Rh2, class _StoreDir2>
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator <= (const __bstr_sum<_CharT, _Traits, _Alloc, _Lh1, _Rh1, _StoreDir1> &__lhs,
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block             const __bstr_sum<_CharT, _Traits, _Alloc, _Lh2, _Rh2, _StoreDir2> &__rhs)
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__rhs < __lhs); }
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc,
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh1, class _Rh1, class _StoreDir1,
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Lh2, class _Rh2, class _StoreDir2>
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator >= (const __bstr_sum<_CharT, _Traits, _Alloc, _Lh1, _Rh1, _StoreDir1> &__lhs,
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block             const __bstr_sum<_CharT, _Traits, _Alloc, _Lh2, _Rh2, _StoreDir2> &__rhs)
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__lhs < __rhs); }
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This class will be used to simulate a temporary string that is required for
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * a call to the c_str method on the __bstr_sum class.
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc>
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __sum_storage_elem {
373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef __sum_storage_elem<_CharT, _Traits, _Alloc> _Self;
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef basic_string<_CharT, _Traits, _Alloc> _BString;
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __sum_storage_elem(_Alloc __alloc) : _M_init(false), _M_storage(__alloc)
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {}
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Left, class _Right, class _StorageDir>
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_Init(__bstr_sum<_CharT, _Traits, _Alloc, _Left, _Right, _StorageDir>  const& __ref) const {
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!_M_init) {
382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_MUTABLE(_Self, _M_storage) = __ref;
383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_MUTABLE(_Self, _M_init) = true;
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Left, class _Right, class _StorageDir>
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString const& _M_get_storage(__bstr_sum<_CharT, _Traits, _Alloc, _Left, _Right, _StorageDir>  const& __ref,
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 bool __do_init) const {
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__do_init) {
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_Init(__ref);
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_storage;
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Left, class _Right, class _StorageDir>
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _BString& _M_get_storage(__bstr_sum<_CharT, _Traits, _Alloc, _Left, _Right, _StorageDir>  const& __ref) {
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_Init(__ref);
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_storage;
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t size() const { return 0; }
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _CharT const& operator[](size_t __n) const
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return __STATIC_CAST(_CharT*, 0)[__n]; }
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  mutable bool _M_init;
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  mutable basic_string<_CharT, _Traits, _Alloc> _M_storage;
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_STRING_SUM_H*/
415