Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / zypp / CountryCode.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/CountryCode.h
10  *
11 */
12 #ifndef ZYPP_COUNTRYCODE_H
13 #define ZYPP_COUNTRYCODE_H
14
15 #include <iosfwd>
16 #include <string>
17
18 #include "zypp/base/PtrTypes.h"
19
20 ///////////////////////////////////////////////////////////////////
21 namespace zypp
22 { /////////////////////////////////////////////////////////////////
23
24   class CountryCode;
25   inline bool operator==( const CountryCode & lhs, const CountryCode & rhs );
26   inline bool operator!=( const CountryCode & lhs, const CountryCode & rhs );
27
28   ///////////////////////////////////////////////////////////////////
29   //
30   //    CLASS NAME : CountryCode
31   //
32   /** Country codes (iso3166-1-alpha-2).
33    *
34    * In fact the class will not prevent to use a non iso country code.
35    * Just a warning will appear in the log.
36   */
37   class CountryCode
38   {
39     friend std::ostream & operator<<( std::ostream & str, const CountryCode & obj );
40
41   public:
42     /** Implementation  */
43     class Impl;
44
45   public:
46     /** Default ctor */
47     CountryCode();
48
49     /** Ctor taking a string. */
50     explicit
51     CountryCode( const std::string & code_r );
52
53     /** Dtor */
54     ~CountryCode();
55
56   public:
57
58     /** \name CountryCode constants. */
59     //@{
60     /** No or empty code. */
61     static const CountryCode noCode;
62     //@}
63
64   public:
65     /** Return the country code. */
66     std::string code() const;
67
68     /** Return the country name; if not available the country code. */
69     std::string name() const;
70
71     /** <tt>*this != noCode</tt>. */
72     bool hasCode() const
73     { return *this != noCode; }
74
75   private:
76     /** Pointer to implementation */
77     RW_pointer<Impl> _pimpl;
78   };
79   ///////////////////////////////////////////////////////////////////
80
81   /** \relates CountryCode Stream output */
82   inline std::ostream & operator<<( std::ostream & str, const CountryCode & obj )
83   { return str << obj.code(); }
84
85   /** Comparison based on string value. */
86   //@{
87   /** \relates CountryCode */
88   inline bool operator==( const CountryCode & lhs, const CountryCode & rhs ) {
89     return( lhs.code() == rhs.code() );
90   }
91   /** \relates CountryCode */
92   inline bool operator==( const std::string & lhs, const CountryCode & rhs ) {
93     return( lhs == rhs.code() );
94   }
95   /** \relates CountryCode */
96   inline bool operator==( const CountryCode & lhs, const std::string & rhs ) {
97     return( lhs.code() == rhs );
98   }
99
100   /** \relates CountryCode */
101   inline bool operator!=( const CountryCode & lhs, const CountryCode & rhs ) {
102     return( ! operator==( lhs, rhs ) );
103   }
104   /** \relates CountryCode */
105   inline bool operator!=( const std::string & lhs, const CountryCode & rhs ) {
106     return( ! operator==( lhs, rhs ) );
107   }
108   /** \relates CountryCode */
109   inline bool operator!=( const CountryCode & lhs, const std::string & rhs ) {
110     return( ! operator==( lhs, rhs ) );
111   }
112   //@}
113
114   /////////////////////////////////////////////////////////////////
115 } // namespace zypp
116 ///////////////////////////////////////////////////////////////////
117
118 ///////////////////////////////////////////////////////////////////
119 namespace std
120 { /////////////////////////////////////////////////////////////////
121   /** \relates zypp::CountryCode Default order for std::container based on code string value.*/
122   template<>
123     inline bool less<zypp::CountryCode>::operator()( const zypp::CountryCode & lhs, const zypp::CountryCode & rhs ) const
124     { return lhs.code() < rhs.code(); }
125   /////////////////////////////////////////////////////////////////
126 } // namespace std
127 ///////////////////////////////////////////////////////////////////
128 #endif // ZYPP_COUNTRYCODE_H