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