19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
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// WARNING: This is an internal header file, included by other C++
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// standard library headers.  You should not attempt to use this header
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// file directly.
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_LOCALE_H
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_LOCALE_H
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CSTDLIB
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cstdlib.h>
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CWCHAR
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cwchar.h>
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_THREADS_H
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_threads.h>
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_STRING_FWD_H
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_string_fwd.h>
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
42a6290228d32fe17ff00412e56780a8b0e407e579Evgeniy Stepanov#include <stl/_string.h>
43a6290228d32fe17ff00412e56780a8b0e407e579Evgeniy Stepanov
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <stl/_facets_fwd.h>
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Locale_impl;        // Forward declaration of opaque type.
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass locale;
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc>
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool __locale_do_operator_call(const locale& __loc,
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                               const basic_string<_CharT, _Traits, _Alloc>& __x,
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                               const basic_string<_CharT, _Traits, _Alloc>& __y);
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC _Locale_impl * _STLP_CALL _get_Locale_impl( _Locale_impl *locimpl );
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLSPEC _Locale_impl * _STLP_CALL _copy_Nameless_Locale_impl( _Locale_impl *locimpl );
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Facet>
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _HasFacet(const locale& __loc, const _Facet* __facet) _STLP_NOTHROW;
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Facet>
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Facet* _UseFacet(const locale& __loc, const _Facet* __facet);
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Facet>
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _InsertFacet(locale& __loc, _Facet* __facet);
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND) || \
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    defined (_STLP_SIGNAL_RUNTIME_COMPATIBILITY) || defined (_STLP_CHECK_RUNTIME_COMPATIBILITY)
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define locale _STLP_NO_MEM_T_NAME(loc)
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _STLP_CLASS_DECLSPEC locale {
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // types:
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  class _STLP_CLASS_DECLSPEC facet : protected _Refcount_Base {
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  protected:
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    /* Here we filter __init_count user value to 0 or 1 because __init_count is a
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block     * size_t instance and _Refcount_Base use __stl_atomic_t instances that might
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block     * have lower sizeof and generate roll issues. 1 is enough to keep the facet
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * alive when required. */
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    explicit facet(size_t __init_count = 0) : _Refcount_Base( __init_count == 0 ? 0 : 1 ) {}
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    virtual ~facet();
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    friend class locale;
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    friend class _Locale_impl;
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    friend facet * _STLP_CALL _get_facet( facet * );
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    friend void _STLP_CALL _release_facet( facet *& );
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  private:                        // Invalidate assignment and copying.
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    facet(const facet& ) /* : _Refcount_Base(1) {} */;
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    void operator=(const facet&);
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  };
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (__MVS__) || defined (__OS400__)
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  struct
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  class
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CLASS_DECLSPEC id {
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  public:
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_t _M_index;
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    static size_t _S_max;
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  };
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef int category;
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(category, none = 0x000);
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(category, collate = 0x010);
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(category, ctype = 0x020);
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(category, monetary = 0x040);
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(category, numeric = 0x100);
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(category, time = 0x200);
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(category, messages = 0x400);
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(category, all = collate | ctype | monetary | numeric | time | messages);
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // construct/copy/destroy:
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale() _STLP_NOTHROW;
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(const locale&) _STLP_NOTHROW;
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit locale(const char *);
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(const locale&, const char*, category);
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) && !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Facet>
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(const locale& __loc, _Facet* __f) {
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if ( __f != 0 ) {
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_impl = _get_Locale_impl( _copy_Nameless_Locale_impl( __loc._M_impl ) );
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_PRIV _InsertFacet(*this, __f);
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } else {
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_impl = _get_Locale_impl( __loc._M_impl );
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // those are for internal use
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(_Locale_impl*);
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(const locale&, const locale&, category);
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const locale& operator=(const locale&) _STLP_NOTHROW;
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected:
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   ~locale() _STLP_NOTHROW;
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic:
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) && !defined (_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS) && \
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   !defined(_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Facet>
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale combine(const locale& __loc) const {
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Facet *__facet = 0;
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!_STLP_PRIV _HasFacet(__loc, __facet))
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_throw_on_combine_error(__loc.name());
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return locale(*this, _STLP_PRIV _UseFacet(__loc, __facet));
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // locale operations:
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  string name() const;
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator==(const locale&) const;
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator!=(const locale&) const;
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_MEMBER_TEMPLATES) || defined (_STLP_INLINE_MEMBER_TEMPLATES) || (defined(__MWERKS__) && __MWERKS__ <= 0x2301)
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator()(const string& __x, const string& __y) const;
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  ifndef _STLP_NO_WCHAR_T
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator()(const wstring& __x, const wstring& __y) const;
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#elif !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _CharT, class _Traits, class _Alloc>
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator()(const basic_string<_CharT, _Traits, _Alloc>& __x,
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  const basic_string<_CharT, _Traits, _Alloc>& __y) const
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return __locale_do_operator_call(*this, __x, __y); }
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // global locale objects:
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static locale _STLP_CALL global(const locale&);
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static _Locale_impl* _STLP_CALL global(const locale&);
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static const locale& _STLP_CALL classic();
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//protected:                         // Helper functions for locale globals.
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  facet* _M_get_facet(const id&) const;
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // same, but throws
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  facet* _M_use_facet(const id&) const;
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static void _STLP_FUNCTION_THROWS _STLP_CALL _M_throw_on_combine_error(const string& name);
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static void _STLP_FUNCTION_THROWS _STLP_CALL _M_throw_on_null_name();
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static void _STLP_FUNCTION_THROWS _STLP_CALL _M_throw_on_creation_failure(int __err_code,
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                                            const char* name, const char* facet);
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//protected:                        // More helper functions.
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert(facet* __f, id& __id);
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // friends:
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  friend class _Locale_impl;
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                        // Data members
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Locale_impl* _M_impl;
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Locale_impl* _M_get_impl() const { return _M_impl; }
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND) || \
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    defined (_STLP_SIGNAL_RUNTIME_COMPATIBILITY) || defined (_STLP_CHECK_RUNTIME_COMPATIBILITY)
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef locale
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _Locale _STLP_NO_MEM_T_NAME(loc)
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass locale : public _Locale {
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // construct/copy/destroy:
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  locale() _STLP_NOTHROW {
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_CHECK_RUNTIME_COMPATIBILITY)
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_CHECK_RUNTIME_COMPATIBILITY();
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(const locale& __loc) _STLP_NOTHROW : _Locale(__loc) {}
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit locale(const char *__str) : _Locale(__str) {}
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(const locale& __loc, const char* __str, category __cat)
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _Locale(__loc, __str, __cat) {}
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Facet>
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  locale(const locale& __loc, _Facet* __f)
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _Locale(__f != 0 ? _copy_Nameless_Locale_impl(__loc._M_impl) : __loc._M_impl) {
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if ( __f != 0 ) {
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_PRIV _InsertFacet(*this, __f);
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // those are for internal use
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(_Locale_impl* __impl) : _Locale(__impl) {}
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(const _Locale& __loc) : _Locale(__loc) {}
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale(const locale& __loc1, const locale& __loc2, category __cat)
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _Locale(__loc1, __loc2, __cat) {}
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const locale& operator=(const locale& __loc) _STLP_NOTHROW {
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Locale::operator=(__loc);
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Facet>
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale combine(const locale& __loc) const {
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Facet *__facet = 0;
254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (!_STLP_PRIV _HasFacet(__loc, __facet))
255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_throw_on_combine_error(__loc.name());
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return locale(*this, _STLP_PRIV _UseFacet(__loc, __facet));
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // locale operations:
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator==(const locale& __loc) const { return _Locale::operator==(__loc); }
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator!=(const locale& __loc) const { return _Locale::operator!=(__loc); }
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _CharT, class _Traits, class _Alloc>
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator()(const basic_string<_CharT, _Traits, _Alloc>& __x,
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  const basic_string<_CharT, _Traits, _Alloc>& __y) const
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return __locale_do_operator_call(*this, __x, __y); }
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // global locale objects:
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static locale _STLP_CALL global(const locale& __loc) {
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _Locale::global(__loc);
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static const locale& _STLP_CALL classic() {
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __STATIC_CAST(const locale&, _Locale::classic());
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // friends:
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  friend class _Locale_impl;
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  undef _Locale
282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//----------------------------------------------------------------------
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// locale globals
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Facet>
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline const _Facet&
289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Use_facet<_Facet>::operator *() const
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottuse_facet(const locale& __loc)
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Facet *__facet = 0;
296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return *(_STLP_PRIV _UseFacet(__loc, __facet));
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Facet>
300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct has_facet {
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const locale& __loc;
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  has_facet(const locale& __p_loc) : __loc(__p_loc) {}
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  operator bool() const _STLP_NOTHROW
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline bool has_facet(const locale& __loc) _STLP_NOTHROW
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Facet *__facet = 0;
310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_PRIV _HasFacet(__loc, __facet);
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; // close class definition
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE
318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* _GetFacetId is a helper function that allow delaying access to
320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * facet id static instance in the library source code to avoid
321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * the other static instances that many compilers are generating
322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * in all dynamic library or executable when instanciating facet
323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * template class.
324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Facet>
326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline locale::id& _GetFacetId(const _Facet*)
327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Facet::id; }
328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_get<char, istreambuf_iterator<char, char_traits<char> > >*);
330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_put<char, ostreambuf_iterator<char, char_traits<char> > >*);
331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_get<char, istreambuf_iterator<char, char_traits<char> > >*);
332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_put<char, ostreambuf_iterator<char, char_traits<char> > >*);
333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_get<char, istreambuf_iterator<char, char_traits<char> > >*);
334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_put<char, ostreambuf_iterator<char, char_traits<char> > >*);
335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T
337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >*);
338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >*);
339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >*);
340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >*);
341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >*);
342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >*);
343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Facet>
346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline bool _HasFacet(const locale& __loc, const _Facet* __facet) _STLP_NOTHROW
347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (__loc._M_get_facet(_GetFacetId(__facet)) != 0); }
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Facet>
350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline _Facet* _UseFacet(const locale& __loc, const _Facet* __facet)
351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return __STATIC_CAST(_Facet*, __loc._M_use_facet(_GetFacetId(__facet))); }
352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Facet>
354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void _InsertFacet(locale& __loc, _Facet* __facet)
355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ __loc._M_insert(__facet, _GetFacetId(__facet)); }
356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_LOCALE_H */
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
367