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