1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc.
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk.
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies.
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted,
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice.
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef LOCALE_IMPL_H
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define LOCALE_IMPL_H
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <clocale>             // C locale header file.
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <vector>
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <string>
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <locale>
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "c_locale.h"
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_TEMPLATE_EXPORT)
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//Export of _Locale_impl facets container:
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (_STLP_USE_PTR_SPECIALIZATIONS)
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//If we are using pointer specialization, vector<locale::facet*> will use
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//the already exported vector<void*> implementation.
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_EXPORT_TEMPLATE_CLASS allocator<locale::facet*>;
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<locale::facet**, locale::facet*, allocator<locale::facet*> >;
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_EXPORT_TEMPLATE_CLASS _Vector_base<locale::facet*, allocator<locale::facet*> >;
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (_STLP_DEBUG)
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_NON_DBG_VECTOR _STLP_NON_DBG_NAME(vector)
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_EXPORT_TEMPLATE_CLASS __construct_checker<_STLP_NON_DBG_VECTOR<locale::facet*, allocator<locale::facet*> > >;
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_EXPORT_TEMPLATE_CLASS _STLP_NON_DBG_VECTOR<locale::facet*, allocator<locale::facet*> >;
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    undef _STLP_NON_DBG_VECTOR
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_EXPORT_TEMPLATE_CLASS vector<locale::facet*, allocator<locale::facet*> >;
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//----------------------------------------------------------------------
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Class _Locale_impl
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// This is the base class which implements access only and is supposed to
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// be used for classic locale only
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass _STLP_CLASS_DECLSPEC _Locale_impl : public _Refcount_Base {
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  public:
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_impl(const char* s);
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_impl(const _Locale_impl&);
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_impl(size_t n, const char* s);
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  private:
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ~_Locale_impl();
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  public:
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_t size() const { return facets_vec.size(); }
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    basic_string<char, char_traits<char>, allocator<char> > name;
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    static void _STLP_FUNCTION_THROWS _STLP_CALL _M_throw_bad_cast();
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  private:
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    void operator=(const _Locale_impl&);
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  public:
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    class _STLP_CLASS_DECLSPEC Init {
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      public:
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        Init();
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        ~Init();
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      private:
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _Refcount_Base& _M_count() const;
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    };
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    static void _STLP_CALL _S_initialize();
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    static void _STLP_CALL _S_uninitialize();
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    static void make_classic_locale();
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    static void free_classic_locale();
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    friend class Init;
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  public:
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // void remove(size_t index);
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::facet* insert(locale::facet*, const locale::id& n);
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    void insert(_Locale_impl* from, const locale::id& n);
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // Helper functions for byname construction of locales.
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_name_hint* insert_ctype_facets(const char* &name, char *buf, _Locale_name_hint* hint);
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_name_hint* insert_numeric_facets(const char* &name, char *buf, _Locale_name_hint* hint);
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_name_hint* insert_time_facets(const char* &name, char *buf, _Locale_name_hint* hint);
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_name_hint* insert_collate_facets(const char* &name, char *buf, _Locale_name_hint* hint);
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_name_hint* insert_monetary_facets(const char* &name, char *buf, _Locale_name_hint* hint);
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_name_hint* insert_messages_facets(const char* &name, char *buf, _Locale_name_hint* hint);
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    bool operator != (const locale& __loc) const { return __loc._M_impl != this; }
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  private:
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<locale::facet*> facets_vec;
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  private:
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    friend _Locale_impl * _STLP_CALL _copy_Nameless_Locale_impl( _Locale_impl * );
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    friend void _STLP_CALL _release_Locale_impl( _Locale_impl *& loc );
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND) || \
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    defined (_STLP_SIGNAL_RUNTIME_COMPATIBILITY) || defined (_STLP_CHECK_RUNTIME_COMPATIBILITY)
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    friend class _STLP_NO_MEM_T_NAME(loc);
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    friend class locale;
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL _release_Locale_impl( _Locale_impl *& loc );
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Local Variables:
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// mode:C++
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// End:
134