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