bcc46bc14a78be1fbe03b8c3680f0f7973e15a64
[platform/upstream/libzypp.git] / zypp / Locale.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/Locale.h
10  *
11 */
12 #ifndef ZYPP_LOCALE_H
13 #define ZYPP_LOCALE_H
14
15 #include <iosfwd>
16
17 #include "zypp/base/PtrTypes.h"
18 #include "zypp/base/Tr1hash.h"
19
20 #include "zypp/IdString.h"
21 #include "zypp/LanguageCode.h"
22 #include "zypp/CountryCode.h"
23
24 ///////////////////////////////////////////////////////////////////
25 namespace zypp
26 { /////////////////////////////////////////////////////////////////
27
28   class Locale;
29   typedef std::tr1::unordered_set<Locale> LocaleSet;
30
31   ///////////////////////////////////////////////////////////////////
32   //
33   //    CLASS NAME : Locale
34   //
35   /**
36    * \todo migrate to IdString
37   */
38   class Locale
39   {
40     friend std::ostream & operator<<( std::ostream & str, const Locale & obj );
41
42   public:
43     /** Implementation  */
44     class Impl;
45
46   public:
47     /** Default ctor */
48     Locale();
49
50     /** Ctor taking a string. */
51     explicit
52     Locale( IdString code_r );
53
54     explicit
55     Locale( const std::string & code_r );
56
57     explicit
58     Locale( const char * code_r );
59
60     /** Ctor taking LanguageCode and optional CountryCode. */
61     Locale( const LanguageCode & language_r,
62             const CountryCode & country_r = CountryCode() );
63
64     /** Dtor */
65     ~Locale();
66
67   public:
68     /** \name Locale constants. */
69     //@{
70     /** No or empty code. */
71     static const Locale noCode;
72     //@}
73
74   public:
75     /** */
76     const LanguageCode & language() const;
77     /** */
78     const CountryCode & country() const;
79
80     /** Return the locale code. */
81     std::string code() const;
82
83     /** Return the name made of language and country name. */
84     std::string name() const;
85
86     /** Return a fallback locale for this locale, when giving up, returns empty Locale() */
87     Locale fallback() const;
88
89   public:
90
91     /** Return the best match for \ref Locale \c requested_r within the available \c avLocales_r.
92      *
93      * If \c requested_r is nor specified or equals \ref Locale::noCode,
94      * \ref ZConfig::textLocale is assumed.
95      *
96      * If neither \c requested_r nor any of it's \ref fallback locales
97      * are available, \ref Locale::noCode is returned.
98     */
99     static Locale bestMatch( const LocaleSet & avLocales_r, const Locale & requested_r = Locale() );
100
101   private:
102     /** Pointer to implementation */
103     RW_pointer<Impl> _pimpl;
104   };
105   ///////////////////////////////////////////////////////////////////
106
107   /** \relates Locale Stream output */
108   inline std::ostream & operator<<( std::ostream & str, const Locale & obj )
109   { return str << obj.code(); }
110
111   /** Comparison based on string value. */
112   //@{
113   /** \relates Locale */
114   inline bool operator==( const Locale & lhs, const Locale & rhs ) {
115     return( lhs.code() == rhs.code() );
116   }
117   /** \relates Locale */
118   inline bool operator==( const std::string & lhs, const Locale & rhs ) {
119     return( lhs == rhs.code() );
120   }
121   /** \relates Locale */
122   inline bool operator==( const Locale & lhs, const std::string & rhs ) {
123     return( lhs.code() == rhs );
124   }
125
126   /** \relates Locale */
127   inline bool operator!=( const Locale & lhs, const Locale & rhs ) {
128     return( ! operator==( lhs, rhs ) );
129   }
130   /** \relates Locale */
131   inline bool operator!=( const std::string & lhs, const Locale & rhs ) {
132     return( ! operator==( lhs, rhs ) );
133   }
134   /** \relates Locale */
135   inline bool operator!=( const Locale & lhs, const std::string & rhs ) {
136     return( ! operator==( lhs, rhs ) );
137   }
138   //@}
139
140   /////////////////////////////////////////////////////////////////
141 } // namespace zypp
142 ///////////////////////////////////////////////////////////////////
143
144 namespace std { namespace tr1 {
145   /** \relates ::zypp::Locale hash function */
146   template<> struct hash< ::zypp::Locale>
147   {
148     size_t operator()( const ::zypp::Locale & __s ) const
149     { return hash<std::string>()(__s.code()); }
150   };
151 }}
152
153 ///////////////////////////////////////////////////////////////////
154 namespace std
155 { /////////////////////////////////////////////////////////////////
156   /** \relates zypp::Locale Default order for std::container based on code string value.*/
157   template<>
158     inline bool less<zypp::Locale>::operator()( const zypp::Locale & lhs, const zypp::Locale & rhs ) const
159     { return lhs.code() < rhs.code(); }
160   /////////////////////////////////////////////////////////////////
161 } // namespace std
162 ///////////////////////////////////////////////////////////////////
163 #endif // ZYPP_LOCALE_H