1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1997-1999
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc.
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 2003
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Francois Dumont
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk.
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies.
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted,
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice.
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_STRING_BASE_H
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define _STLP_STRING_BASE_H
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// ------------------------------------------------------------
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Class _String_base.
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// _String_base is a helper class that makes it it easier to write an
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// exception-safe version of basic_string.  The constructor allocates,
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// but does not initialize, a block of memory.  The destructor
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// deallocates, but does not destroy elements within, a block of
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// memory.  The destructor assumes that _M_start either is null, or else
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// points to a block of memory that was allocated using _String_base's
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// allocator and whose size is _M_end_of_storage - _M_start_of_storage._M_data.
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp, class _Alloc>
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass _String_base {
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef _String_base<_Tp, _Alloc> _Self;
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected:
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic:
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //dums: Some compiler(MSVC6) require it to be public not simply protected!
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  enum {_DEFAULT_SIZE = 4 * sizeof( void * )};
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //This is needed by the full move framework
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef _Alloc allocator_type;
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef _STLP_alloc_proxy<_Tp*, _Tp, allocator_type> _AllocProxy;
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef size_t size_type;
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate:
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_SHORT_STRING_OPTIM)
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  union _Buffers {
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Tp*  _M_end_of_storage;
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Tp   _M_static_buf[_DEFAULT_SIZE];
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  } _M_buffers;
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp*    _M_end_of_storage;
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* _STLP_USE_SHORT_STRING_OPTIM */
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected:
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_SHORT_STRING_OPTIM)
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  bool _M_using_static_buf() const
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return (_M_start_of_storage._M_data == _M_buffers._M_static_buf); }
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp const* _M_Start() const { return _M_start_of_storage._M_data; }
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp* _M_Start() { return _M_start_of_storage._M_data; }
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp const* _M_End() const
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _M_using_static_buf() ? _M_buffers._M_static_buf + _DEFAULT_SIZE : _M_buffers._M_end_of_storage; }
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp* _M_End()
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _M_using_static_buf() ? _M_buffers._M_static_buf + _DEFAULT_SIZE : _M_buffers._M_end_of_storage; }
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_type _M_capacity() const
72869978fef2e44c248f7deb1b3d6a6987b63efc22Elliott Hughes  { return _M_using_static_buf() ? static_cast<size_type>(_DEFAULT_SIZE) : _M_buffers._M_end_of_storage - _M_start_of_storage._M_data; }
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_type _M_rest() const
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return  _M_using_static_buf() ? _DEFAULT_SIZE - (_M_finish - _M_buffers._M_static_buf) : _M_buffers._M_end_of_storage - _M_finish; }
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp const* _M_Start() const { return _M_start_of_storage._M_data; }
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp* _M_Start() { return _M_start_of_storage._M_data; }
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp const* _M_End() const { return _M_end_of_storage; }
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp* _M_End() { return _M_end_of_storage; }
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_type _M_capacity() const
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _M_end_of_storage - _M_start_of_storage._M_data; }
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_type _M_rest() const
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _M_end_of_storage - _M_finish; }
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* _STLP_USE_SHORT_STRING_OPTIM */
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp*    _M_finish;
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _AllocProxy _M_start_of_storage;
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp const* _M_Finish() const {return _M_finish;}
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Tp* _M_Finish() {return _M_finish;}
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Precondition: 0 < __n <= max_size().
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_allocate_block(size_t __n = _DEFAULT_SIZE);
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_deallocate_block() {
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_SHORT_STRING_OPTIM)
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!_M_using_static_buf() && (_M_start_of_storage._M_data != 0))
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_start_of_storage.deallocate(_M_start_of_storage._M_data, _M_buffers._M_end_of_storage - _M_start_of_storage._M_data);
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (_M_start_of_storage._M_data != 0)
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_start_of_storage.deallocate(_M_start_of_storage._M_data, _M_end_of_storage - _M_start_of_storage._M_data);
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* _STLP_USE_SHORT_STRING_OPTIM */
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t max_size() const {
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_type __string_max_size = size_type(-1) / sizeof(_Tp);
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typename allocator_type::size_type __alloc_max_size = _M_start_of_storage.max_size();
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return (min)(__alloc_max_size, __string_max_size) - 1;
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _String_base(const allocator_type& __a)
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_SHORT_STRING_OPTIM)
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _M_finish(_M_buffers._M_static_buf), _M_start_of_storage(__a, _M_buffers._M_static_buf)
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _M_end_of_storage(0), _M_finish(0), _M_start_of_storage(__a, (_Tp*)0)
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {}
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _String_base(const allocator_type& __a, size_t __n)
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_SHORT_STRING_OPTIM)
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _M_finish(_M_buffers._M_static_buf), _M_start_of_storage(__a, _M_buffers._M_static_buf) {
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _M_end_of_storage(0), _M_finish(0), _M_start_of_storage(__a, (_Tp*)0) {
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_allocate_block(__n);
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_SHORT_STRING_OPTIM)
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_move_src (_Self &src) {
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (src._M_using_static_buf()) {
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_buffers = src._M_buffers;
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_finish = _M_buffers._M_static_buf + (src._M_finish - src._M_start_of_storage._M_data);
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_start_of_storage._M_data = _M_buffers._M_static_buf;
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else {
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_start_of_storage._M_data = src._M_start_of_storage._M_data;
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_finish = src._M_finish;
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_buffers._M_end_of_storage = src._M_buffers._M_end_of_storage;
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      src._M_start_of_storage._M_data = 0;
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _String_base(__move_source<_Self> src)
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (_STLP_USE_SHORT_STRING_OPTIM)
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _M_start_of_storage(__move_source<_AllocProxy>(src.get()._M_start_of_storage)) {
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_move_src(src.get());
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _M_end_of_storage(src.get()._M_end_of_storage), _M_finish(src.get()._M_finish),
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_start_of_storage(__move_source<_AllocProxy>(src.get()._M_start_of_storage)) {
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      src.get()._M_start_of_storage._M_data = 0;
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ~_String_base() { _M_deallocate_block(); }
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_reset(_Tp *__start, _Tp *__finish, _Tp *__end_of_storage) {
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_SHORT_STRING_OPTIM)
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_buffers._M_end_of_storage = __end_of_storage;
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_end_of_storage = __end_of_storage;
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_finish = __finish;
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_start_of_storage._M_data = __start;
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_swap(_Self &__s) {
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_SHORT_STRING_OPTIM)
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (_M_using_static_buf()) {
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (__s._M_using_static_buf()) {
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::swap(_M_buffers, __s._M_buffers);
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _Tp *__tmp = _M_finish;
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _M_finish = _M_start_of_storage._M_data + (__s._M_finish - __s._M_start_of_storage._M_data);
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        __s._M_finish = __s._M_buffers._M_static_buf + (__tmp - _M_start_of_storage._M_data);
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        //We need to swap _M_start_of_storage for allocators with state:
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _M_start_of_storage.swap(__s._M_start_of_storage);
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _M_start_of_storage._M_data = _M_buffers._M_static_buf;
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        __s._M_start_of_storage._M_data = __s._M_buffers._M_static_buf;
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        __s._M_swap(*this);
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        return;
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else if (__s._M_using_static_buf()) {
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _Tp *__tmp = _M_start_of_storage._M_data;
187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _Tp *__tmp_finish = _M_finish;
188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _Tp *__tmp_end_data = _M_buffers._M_end_of_storage;
189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_buffers = __s._M_buffers;
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      //We need to swap _M_start_of_storage for allocators with state:
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_start_of_storage.swap(__s._M_start_of_storage);
192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_start_of_storage._M_data = _M_buffers._M_static_buf;
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_finish = _M_buffers._M_static_buf + (__s._M_finish - __s._M_buffers._M_static_buf);
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      __s._M_buffers._M_end_of_storage = __tmp_end_data;
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      __s._M_start_of_storage._M_data = __tmp;
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      __s._M_finish = __tmp_finish;
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else {
199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::swap(_M_buffers._M_end_of_storage, __s._M_buffers._M_end_of_storage);
200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_start_of_storage.swap(__s._M_start_of_storage);
201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::swap(_M_finish, __s._M_finish);
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STD::swap(_M_end_of_storage, __s._M_end_of_storage);
205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_start_of_storage.swap(__s._M_start_of_storage);
206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STD::swap(_M_finish, __s._M_finish);
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _STLP_FUNCTION_THROWS _M_throw_length_error() const;
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _STLP_FUNCTION_THROWS _M_throw_out_of_range() const;
212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_TEMPLATE_EXPORT)
215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_EXPORT_TEMPLATE_CLASS _String_base<char, allocator<char> >;
216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (_STLP_HAS_WCHAR_T)
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_EXPORT_TEMPLATE_CLASS _String_base<wchar_t, allocator<wchar_t> >;
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* _STLP_USE_TEMPLATE_EXPORT */
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* _STLP_STRING_BASE_H */
226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Local Variables:
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * mode:C++
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * End:
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
232