Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / zypp / LanguageCode.h
index 3840052..d9f984d 100644 (file)
 #include <iosfwd>
 #include <string>
 
-#include "zypp/IdStringType.h"
+#include "zypp/base/PtrTypes.h"
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
-{
-  ///////////////////////////////////////////////////////////////////
-  /// \class LanguageCode
-  /// \brief Language codes (iso639_2/iso639_1).
-  ///
-  /// In fact the class will not prevent to use a non iso language code.
-  /// Just a warning will appear in the log.
+{ /////////////////////////////////////////////////////////////////
+
+  class LanguageCode;
+  inline bool operator==( const LanguageCode & lhs, const LanguageCode & rhs );
+  inline bool operator!=( const LanguageCode & lhs, const LanguageCode & rhs );
+
   ///////////////////////////////////////////////////////////////////
-  class LanguageCode : public IdStringType<LanguageCode>
+  //
+  //   CLASS NAME : LanguageCode
+  //
+  /** Language codes (iso639_2/iso639_1).
+   *
+   * In fact the class will not prevent to use a non iso language code.
+   * Just a warning will appear in the log.
+  */
+  class LanguageCode
   {
-  public:
-    /** Default Ctor: \ref noCode */
-    LanguageCode();
+    friend std::ostream & operator<<( std::ostream & str, const LanguageCode & obj );
 
-    /** Ctor from string. */
-    explicit LanguageCode( IdString str_r );
+  public:
+    /** Implementation  */
+    class Impl;
 
-    /** Ctor from string. */
-    explicit LanguageCode( const std::string & str_r );
+  public:
+    /** Default ctor */
+    LanguageCode();
 
-    /** Ctor from string. */
-    explicit LanguageCode( const char * str_r );
+    /** Ctor taking a string. */
+    explicit
+    LanguageCode( const std::string & code_r );
 
-     /** Dtor */
+    /** Dtor */
     ~LanguageCode();
 
   public:
     /** \name LanguageCode constants. */
     //@{
-    /** Empty code. */
+    /** No or empty code. */
     static const LanguageCode noCode;
-    /** Last resort "en". */
-    static const LanguageCode enCode;
     //@}
 
   public:
-    /** Return the language code asString. */
-    std::string code() const
-    { return std::string(_str); }
+    /** Return the language code. */
+    std::string code() const;
 
-    /** Return the translated language name; if unknown the language code. */
+    /** Return the language name; if not available the language code. */
     std::string name() const;
 
+    /** <tt>*this != noCode</tt>. */
+    inline bool hasCode() const
+    { return *this != noCode; }
+
   private:
-    friend class IdStringType<LanguageCode>;
-    IdString _str;
+    /** Pointer to implementation */
+    RW_pointer<Impl> _pimpl;
   };
+  ///////////////////////////////////////////////////////////////////
+
+  /** \relates LanguageCode Stream output */
+  inline std::ostream & operator<<( std::ostream & str, const LanguageCode & obj )
+  { return str << obj.code(); }
+
+  /** Comparison based on string value. */
+  //@{
+  /** \relates LanguageCode */
+  inline bool operator==( const LanguageCode & lhs, const LanguageCode & rhs ) {
+    return( lhs.code() == rhs.code() );
+  }
+  /** \relates LanguageCode */
+  inline bool operator==( const std::string & lhs, const LanguageCode & rhs ) {
+    return( lhs == rhs.code() );
+  }
+  /** \relates LanguageCode */
+  inline bool operator==( const LanguageCode & lhs, const std::string & rhs ) {
+    return( lhs.code() == rhs );
+  }
+
+  /** \relates LanguageCode */
+  inline bool operator!=( const LanguageCode & lhs, const LanguageCode & rhs ) {
+    return( ! operator==( lhs, rhs ) );
+  }
+  /** \relates LanguageCode */
+  inline bool operator!=( const std::string & lhs, const LanguageCode & rhs ) {
+    return( ! operator==( lhs, rhs ) );
+  }
+  /** \relates LanguageCode */
+  inline bool operator!=( const LanguageCode & lhs, const std::string & rhs ) {
+    return( ! operator==( lhs, rhs ) );
+  }
+  //@}
+
+  /////////////////////////////////////////////////////////////////
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////
 
-ZYPP_DEFINE_ID_HASHABLE( ::zypp::LanguageCode );
-
+///////////////////////////////////////////////////////////////////
+namespace std
+{ /////////////////////////////////////////////////////////////////
+  /** \relates zypp::LanguageCode Default order for std::container based on code string value.*/
+  template<>
+    inline bool less<zypp::LanguageCode>::operator()( const zypp::LanguageCode & lhs, const zypp::LanguageCode & rhs ) const
+    { return lhs.code() < rhs.code(); }
+  /////////////////////////////////////////////////////////////////
+} // namespace std
+///////////////////////////////////////////////////////////////////
 #endif // ZYPP_LANGUAGECODE_H