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