19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_CHAR_TRAITS_H
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_CHAR_TRAITS_H
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Define char_traits
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CSTDDEF
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cstddef.h>
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CSTRING
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cstring.h>
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__unix)
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <sys/types.h>         // For off_t
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* __unix */
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__BORLANDC__)
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <mem.h>
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <string.h>
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <_stddef.h>
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <sys/types.h>
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CONSTRUCT_H
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_construct.h>
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CWCHAR
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cwchar.h>
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> class allocator;
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_NULL_CHAR_INIT(_ChT) _STLP_DEFAULT_CONSTRUCTED(_ChT)
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined(_STLP_WCE)
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef long streamoff;
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#elif defined (_STLP_WIN32)
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_LONG_LONG) && !defined (__CYGWIN__)
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//The Win32 file io API support 64 bits access so streamoff and streamsize
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//has to reflect that. Do not change the stringbuf behavior.
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef _STLP_LONG_LONG streamoff;
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef ptrdiff_t streamoff;
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else // __unix
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  ifdef _STLP_USE_DEFAULT_FILE_OFFSET
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef off_t streamoff;
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  elif defined(_LARGEFILE_SOURCE) || defined(_LARGEFILE64_SOURCE) /* || defined(__USE_FILE_OFFSET64) */ \
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block       /* || (defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS == 64)) */ /* || defined (__sgi) && defined (_STLP_HAS_NO_NEW_C_HEADERS) */
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef off64_t streamoff;
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef off_t streamoff;
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* __unix */
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_WIN32)
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef streamoff streamsize;
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef ptrdiff_t streamsize;
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Class fpos, which represents a position within a file.  (The C++
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// standard calls for it to be defined in <ios>.  This implementation
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// moves it to <iosfwd>, which is included by <ios>.)
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _StateT> class fpos {
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // From table 88 of the C++ standard.
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  fpos(streamoff __pos) : _M_pos(__pos), _M_st(_STLP_NULL_CHAR_INIT(_StateT)) {}
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  fpos() : _M_pos(0), _M_st(_STLP_NULL_CHAR_INIT(_StateT)) {}
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  operator streamoff() const { return _M_pos; }
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator==(const fpos& __y) const
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_pos == __y._M_pos; }
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator!=(const fpos& __y) const
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _M_pos != __y._M_pos; }
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  fpos& operator+=(streamoff __off) {
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_pos += __off;
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  fpos& operator-=(streamoff __off) {
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_pos -= __off;
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  fpos operator+(streamoff __off) {
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    fpos __tmp(*this);
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __tmp += __off;
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __tmp;
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  fpos operator-(streamoff __off) {
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    fpos __tmp(*this);
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __tmp -= __off;
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __tmp;
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Manipulation of the state member.
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StateT state() const { return _M_st; }
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void state(_StateT __st) { _M_st = __st; }
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamoff _M_pos;
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StateT _M_st;
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef fpos<mbstate_t> streampos;
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef fpos<mbstate_t> wstreampos;
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Class __char_traits_base.
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _IntT>
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass __char_traits_base {
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _CharT char_type;
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _IntT int_type;
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef streamoff off_type;
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef streampos pos_type;
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef mbstate_t state_type;
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL assign(char_type& __c1, const char_type& __c2) { __c1 = __c2; }
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static bool _STLP_CALL eq(const char_type& __c1, const char_type& __c2)
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return __c1 == __c2; }
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static bool _STLP_CALL lt(const char_type& __c1, const char_type& __c2)
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return __c1 < __c2; }
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static int _STLP_CALL compare(const char_type* __s1, const char_type* __s2, size_t __n) {
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (size_t __i = 0; __i < __n; ++__i)
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (!eq(__s1[__i], __s2[__i]))
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return __s1[__i] < __s2[__i] ? -1 : 1;
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return 0;
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static size_t _STLP_CALL length(const char_type* __s) {
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const char_type _NullChar = _STLP_DEFAULT_CONSTRUCTED(char_type);
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_t __i(0);
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; !eq(__s[__i], _NullChar); ++__i) {}
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __i;
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static const char_type* _STLP_CALL find(const char_type* __s, size_t __n, const char_type& __c) {
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __n > 0 ; ++__s, --__n)
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (eq(*__s, __c))
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return __s;
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return 0;
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static char_type* _STLP_CALL move(char_type* __s1, const char_type* __s2, size_t _Sz)
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return (_Sz == 0 ? __s1 : (char_type*)memmove(__s1, __s2, _Sz * sizeof(char_type))); }
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static char_type* _STLP_CALL copy(char_type* __s1, const char_type* __s2, size_t __n) {
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return (__n == 0 ? __s1 :
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      (char_type*)memcpy(__s1, __s2, __n * sizeof(char_type)));
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static char_type* _STLP_CALL assign(char_type* __s, size_t __n, char_type __c) {
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (size_t __i = 0; __i < __n; ++__i)
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __s[__i] = __c;
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __s;
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static int_type _STLP_CALL not_eof(const int_type& __c)
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return !eq_int_type(__c, eof()) ? __c : __STATIC_CAST(int_type, 0); }
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static char_type _STLP_CALL to_char_type(const int_type& __c)
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return (char_type)__c; }
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static int_type _STLP_CALL to_int_type(const char_type& __c)
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return (int_type)__c; }
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static bool _STLP_CALL eq_int_type(const int_type& __c1, const int_type& __c2)
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return __c1 == __c2; }
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static int_type _STLP_CALL eof()
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return (int_type)-1; }
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Generic char_traits class.  Note that this class is provided only
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  as a base for explicit specialization; it is unlikely to be useful
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  as is for any particular user-defined type.  In particular, it
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  *will not work* for a non-POD type.
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT>
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass char_traits
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public __char_traits_base<_CharT, _CharT> {};
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Specialization for char.
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _STLP_CLASS_DECLSPEC char_traits<char>
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  : public __char_traits_base<char, int>,
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    public __stlport_class<char_traits<char> > {
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char char_type;
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef int int_type;
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef streamoff off_type;
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef streampos pos_type;
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef mbstate_t state_type;
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static char _STLP_CALL to_char_type(const int& __c)
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return (char)(unsigned char)__c; }
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static int _STLP_CALL to_int_type(const char& __c)
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return (unsigned char)__c; }
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static int _STLP_CALL compare(const char* __s1, const char* __s2, size_t __n)
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return memcmp(__s1, __s2, __n); }
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static size_t _STLP_CALL length(const char* __s)
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return strlen(__s); }
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL assign(char& __c1, const char& __c2)
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { __c1 = __c2; }
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static char* _STLP_CALL assign(char* __s, size_t __n, char __c) {
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    memset(__s, __c, __n);
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __s;
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_HAS_WCHAR_T)
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Specialization for wchar_t.
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _STLP_CLASS_DECLSPEC char_traits<wchar_t>
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public __char_traits_base<wchar_t, wint_t> {
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_NO_NATIVE_WIDE_FUNCTIONS) && !defined (_STLP_WCHAR_HPACC_EXCLUDE)
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    if !defined (__BORLANDC__)
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static wchar_t* _STLP_CALL move(wchar_t* __dest, const wchar_t* __src, size_t __n)
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return wmemmove(__dest, __src, __n); }
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static wchar_t* _STLP_CALL copy(wchar_t* __dest, const wchar_t* __src, size_t __n)
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return wmemcpy(__dest, __src, __n); }
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    if !defined (__DMC__) && !defined (__BORLANDC__)
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static int _STLP_CALL compare(const wchar_t* __s1, const wchar_t* __s2, size_t __n)
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return wmemcmp(__s1, __s2, __n); }
258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static wchar_t* _STLP_CALL assign(wchar_t* __s, size_t __n, wchar_t __c)
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return wmemset(__s, __c, __n); }
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static size_t _STLP_CALL length(const wchar_t* __s)
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return wcslen(__s); }
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL assign(wchar_t& __c1, const wchar_t& __c2)
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { __c1 = __c2; }
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_CHAR_TRAITS_H */
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
279