19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 2004 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 /* 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This is an internal string for the STLport own iostream implementation. 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * The only diference rely on the allocator used to instanciate the basic_string. 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Its goals is to improve performance limitating the number of dynamic allocation 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * that could occur when requesting a big float ouput for instance. This allocator 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * is not standard conformant as it has an internal state (the static buffer) 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_IOSTREAM_STRING_H 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_IOSTREAM_STRING_H 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALLOC_H 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_alloc.h> 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_ALLOC_H */ 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_STRING_H 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_string.h> 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_STRING_H */ 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT> 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass __iostring_allocator : public allocator<_CharT> { 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum { _STR_SIZE = 256 }; 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum { _BUF_SIZE = _STR_SIZE + 1 }; 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef allocator<_CharT> _Base; 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT _M_static_buf[_BUF_SIZE]; 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Base::size_type size_type; 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Base::pointer pointer; 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATE_CLASSES) 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _Tp1> struct rebind { 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if !defined (_STLP_MSVC) || (_STLP_MSVC >= 1300) 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef __iostring_allocator<_Tp1> other; 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLP_PRIV __iostring_allocator<_Tp1> other; 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block }; 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT* allocate(size_type __n, const void* __ptr = 0) { 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n > _BUF_SIZE) { 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Base::allocate(__n, __ptr); 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_static_buf; 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void deallocate(pointer __p, size_type __n) { 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__p != _M_static_buf) _Base::deallocate(__p, __n); 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE) || !defined (_STLP_MEMBER_TEMPLATES) 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * As the __iostring_allocator allocator will only be used in the basic_string implementation 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * we known that it is never going to be bound to another type that the one used to instantiate 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * the basic_string. This is why the associated __stl_alloc_rebind has only one template 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * parameter. 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _STLP_PRIV __iostring_allocator<_Tp>& _STLP_CALL 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__stl_alloc_rebind(_STLP_PRIV __iostring_allocator<_Tp>& __a, const _Tp*) 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __a; } 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _STLP_PRIV __iostring_allocator<_Tp> _STLP_CALL 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__stl_alloc_create(const _STLP_PRIV __iostring_allocator<_Tp>&, const _Tp*) 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return _STLP_PRIV __iostring_allocator<_Tp>(); } 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE */ 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DEBUG) 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT> 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __basic_iostring : public basic_string<_CharT, char_traits<_CharT>, __iostring_allocator<_CharT> > { 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * A consequence of the non standard conformant allocator is that a string using it 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * must always be presized to the allocator static buffer size because the basic_string implementation 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * do not manage an allocator returning always the same memory adress as long as the 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * requested memory block size is under a certain value. 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef __basic_iostring<_CharT> _Self; 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef basic_string<_CharT, char_traits<_CharT>, __iostring_allocator<_CharT> > _Base; 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Base::_Reserve_t _Reserve_t; 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __basic_iostring() : _Base(_Reserve_t(), __iostring_allocator<_CharT>::_STR_SIZE) 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block {} 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator=(const _CharT* __s) { 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base::operator=(__s); 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef __basic_iostring<char> __iostring; 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if !defined (_STLP_NO_WCHAR_T) 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef __basic_iostring<wchar_t> __iowstring; 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define _STLP_BASIC_IOSTRING(_CharT) _STLP_PRIV __basic_iostring<_CharT> 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef string __iostring; 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if !defined (_STLP_NO_WCHAR_T) 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef wstring __iowstring; 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define _STLP_BASIC_IOSTRING(_CharT) basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_IOSTREAM_STRING_H */ 141