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