177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 2004 377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Francois Dumont 477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed 677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk. 777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted 977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies. 1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted, 1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was 1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice. 1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* 1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This is an internal string for the STLport own iostream implementation. 1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * The only diference rely on the allocator used to instanciate the basic_string. 1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Its goals is to improve performance limitating the number of dynamic allocation 2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * that could occur when requesting a big float ouput for instance. This allocator 2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * is not standard conformant as it has an internal state (the static buffer) 2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_IOSTREAM_STRING_H 2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_INTERNAL_IOSTREAM_STRING_H 2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ALLOC_H 2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_alloc.h> 3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_INTERNAL_ALLOC_H */ 3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_STRING_H 3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_string.h> 3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_INTERNAL_STRING_H */ 3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE 3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE 3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT> 4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass __iostring_allocator : public allocator<_CharT> { 4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _STR_SIZE = 256 }; 4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate: 4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _BUF_SIZE = _STR_SIZE + 1 }; 4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef allocator<_CharT> _Base; 4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT _M_static_buf[_BUF_SIZE]; 4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Base::size_type size_type; 5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Base::pointer pointer; 5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MEMBER_TEMPLATE_CLASSES) 5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner template <class _Tp1> struct rebind { 5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined (_STLP_MSVC) || (_STLP_MSVC >= 1300) 5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __iostring_allocator<_Tp1> other; 5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _STLP_PRIV __iostring_allocator<_Tp1> other; 5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner }; 6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT* allocate(size_type __n, const void* __ptr = 0) { 6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__n > _BUF_SIZE) { 6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _Base::allocate(__n, __ptr); 6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _M_static_buf; 6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void deallocate(pointer __p, size_type __n) { 7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__p != _M_static_buf) _Base::deallocate(__p, __n); 7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE) || !defined (_STLP_MEMBER_TEMPLATES) 7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * As the __iostring_allocator allocator will only be used in the basic_string implementation 7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * we known that it is never going to be bound to another type that the one used to instantiate 7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * the basic_string. This is why the associated __stl_alloc_rebind has only one template 7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * parameter. 8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE 8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _STLP_PRIV __iostring_allocator<_Tp>& _STLP_CALL 8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__stl_alloc_rebind(_STLP_PRIV __iostring_allocator<_Tp>& __a, const _Tp*) 8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __a; } 8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _STLP_PRIV __iostring_allocator<_Tp> _STLP_CALL 8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__stl_alloc_create(const _STLP_PRIV __iostring_allocator<_Tp>&, const _Tp*) 9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _STLP_PRIV __iostring_allocator<_Tp>(); } 9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE 9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE */ 9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_DEBUG) 9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT> 9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __basic_iostring : public basic_string<_CharT, char_traits<_CharT>, __iostring_allocator<_CharT> > { 9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* 9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * A consequence of the non standard conformant allocator is that a string using it 10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * must always be presized to the allocator static buffer size because the basic_string implementation 10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * do not manage an allocator returning always the same memory adress as long as the 10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * requested memory block size is under a certain value. 10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __basic_iostring<_CharT> _Self; 10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef basic_string<_CharT, char_traits<_CharT>, __iostring_allocator<_CharT> > _Base; 10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Base::_Reserve_t _Reserve_t; 10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __basic_iostring() : _Base(_Reserve_t(), __iostring_allocator<_CharT>::_STR_SIZE) 10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner {} 11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Self& operator=(const _CharT* __s) { 11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Base::operator=(__s); 11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return *this; 11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __basic_iostring<char> __iostring; 11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined (_STLP_NO_WCHAR_T) 12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __basic_iostring<wchar_t> __iowstring; 12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _STLP_BASIC_IOSTRING(_CharT) _STLP_PRIV __basic_iostring<_CharT> 12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef string __iostring; 12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined (_STLP_NO_WCHAR_T) 12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef wstring __iowstring; 13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _STLP_BASIC_IOSTRING(_CharT) basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > 13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE 13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE 13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_INTERNAL_IOSTREAM_STRING_H */ 141