PageRenderTime 60ms CodeModel.GetById 47ms app.highlight 9ms RepoModel.GetById 2ms app.codeStats 0ms

/project/jni/stlport/src/message_facets.h

https://github.com/aichunyu/FFPlayer
C Header | 168 lines | 100 code | 29 blank | 39 comment | 3 complexity | 05880c74bce53efe64a76100d1dd4b50 MD5 | raw file
  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#ifndef MESSAGE_FACETS_H
 19#define MESSAGE_FACETS_H
 20
 21#include <string>
 22#include <locale>
 23#include <typeinfo>
 24#include <hash_map>
 25
 26#include "c_locale.h"
 27#include "acquire_release.h"
 28
 29_STLP_BEGIN_NAMESPACE
 30_STLP_MOVE_TO_PRIV_NAMESPACE
 31
 32// Class _Catalog_locale_map.  The reason for this is that, internally,
 33// a message string is always a char*.  We need a ctype facet to convert
 34// a string to and from wchar_t, and the user is permitted to provide such
 35// a facet when calling open().
 36
 37struct _Catalog_locale_map {
 38  _Catalog_locale_map() : M(0) {}
 39  ~_Catalog_locale_map() { if (M) delete M; }
 40
 41  void insert(nl_catd_type key, const locale& L);
 42  locale lookup(nl_catd_type key) const;
 43  void erase(nl_catd_type key);
 44
 45  typedef hash_map<nl_catd_type, locale, hash<nl_catd_type>, equal_to<nl_catd_type> > map_type;
 46  map_type *M;
 47
 48private:                        // Invalidate copy constructor and assignment
 49  _Catalog_locale_map(const _Catalog_locale_map&);
 50  void operator=(const _Catalog_locale_map&);
 51};
 52
 53/*
 54 * In glibc nl_catd type is void *, but messages_base::catalog is defined as int
 55 * by ISO/IEC 14882; The int may be too short to store pointer on 64-bit platforms;
 56 * Another problem, is that do_open() may return negative value to indicate that no
 57 * catalog open---this case can't be represented with pointers.
 58 * The class _Catalog_nl_catd_map intended to make relation between
 59 * messages_base::catalog and nl_catd handler.
 60 *
 61 */
 62
 63#if defined (_STLP_REAL_LOCALE_IMPLEMENTED) && (defined (_STLP_USE_GLIBC) && !defined (__CYGWIN__))
 64#  define _STLP_USE_NL_CATD_MAPPING
 65#else
 66/* If no mapping a message_base::catalog entry, int typedef according C++ Standard 22.2.7.1,
 67 * has to be large enough to contain a nl_catd_type value.
 68 */
 69_STLP_STATIC_ASSERT(sizeof(nl_catd_type) <= sizeof(int))
 70#endif
 71
 72class _STLP_CLASS_DECLSPEC _Catalog_nl_catd_map {
 73public:
 74  _Catalog_nl_catd_map()
 75  {}
 76  ~_Catalog_nl_catd_map()
 77  {}
 78
 79  typedef hash_map<messages_base::catalog, nl_catd_type, hash<messages_base::catalog>, equal_to<messages_base::catalog> > map_type;
 80  typedef hash_map<nl_catd_type, messages_base::catalog, hash<nl_catd_type>, equal_to<nl_catd_type> > rmap_type;
 81  // typedef map<messages_base::catalog,nl_catd_type> map_type;
 82  // typedef map<nl_catd_type,messages_base::catalog> rmap_type;
 83
 84  messages_base::catalog insert(nl_catd_type cat)
 85#if !defined (_STLP_USE_NL_CATD_MAPPING)
 86  { return (messages_base::catalog)cat; }
 87#else
 88  ;
 89#endif
 90
 91  void erase(messages_base::catalog)
 92#if !defined (_STLP_USE_NL_CATD_MAPPING)
 93  {}
 94#else
 95  ;
 96#endif
 97
 98  nl_catd_type operator [] ( messages_base::catalog cat ) const
 99#if !defined (_STLP_USE_NL_CATD_MAPPING)
100  { return cat; }
101#else
102  { return cat < 0 ? 0 : M[cat]; }
103#endif
104
105private:
106  _Catalog_nl_catd_map(const _Catalog_nl_catd_map&);
107  _Catalog_nl_catd_map& operator =(const _Catalog_nl_catd_map&);
108
109#if defined (_STLP_USE_NL_CATD_MAPPING)
110  mutable map_type M;
111  mutable rmap_type Mr;
112  static _STLP_VOLATILE __stl_atomic_t _count;
113#endif
114};
115
116class _STLP_CLASS_DECLSPEC _Messages {
117public:
118  typedef messages_base::catalog catalog;
119
120  _Messages();
121
122  virtual catalog do_open(const string& __fn, const locale& __loc) const;
123  virtual string do_get(catalog __c, int __set, int __msgid,
124                        const string& __dfault) const;
125#if !defined (_STLP_NO_WCHAR_T)
126  virtual wstring do_get(catalog __c, int __set, int __msgid,
127                         const wstring& __dfault) const;
128#endif
129  virtual void do_close(catalog __c) const;
130  virtual ~_Messages();
131  bool _M_delete;
132};
133
134class _STLP_CLASS_DECLSPEC _Messages_impl : public _Messages {
135public:
136  _Messages_impl(bool, _Locale_name_hint* hint = 0);
137  _Messages_impl(bool, _Locale_messages*);
138
139  catalog do_open(const string& __fn, const locale& __loc) const;
140  string do_get(catalog __c, int __set, int __msgid,
141                const string& __dfault) const;
142#if !defined (_STLP_NO_WCHAR_T)
143  wstring do_get(catalog __c, int __set, int __msgid,
144                 const wstring& __dfault) const;
145#endif
146  void do_close(catalog __c) const;
147
148  ~_Messages_impl();
149
150private:
151  _Locale_messages* _M_message_obj;
152  _Catalog_locale_map* _M_map;
153  mutable _Catalog_nl_catd_map _M_cat;
154
155  //private definition to avoid warning (with ICL)
156  _Messages_impl(const _Messages_impl&);
157  _Messages_impl& operator=(const _Messages_impl&);
158};
159
160_STLP_MOVE_TO_STD_NAMESPACE
161
162_STLP_END_NAMESPACE
163
164#endif
165
166// Local Variables:
167// mode:C++
168// End: