Type safe enum (workaround SWIG not supporting enum class)
authorMichael Andres <ma@suse.de>
Wed, 12 Feb 2014 11:28:26 +0000 (12:28 +0100)
committerMichael Andres <ma@suse.de>
Wed, 12 Feb 2014 11:28:26 +0000 (12:28 +0100)
zypp/CMakeLists.txt
zypp/base/EnumClass.h [new file with mode: 0644]

index 96c8332..33dc7af 100644 (file)
@@ -230,6 +230,7 @@ SET( zypp_base_HEADERS
   base/DtorReset.h
   base/Exception.h
   base/UserRequestException.h
+  base/EnumClass.h
   base/ExternalDataSource.h
   base/Fd.h
   base/Flags.h
diff --git a/zypp/base/EnumClass.h b/zypp/base/EnumClass.h
new file mode 100644 (file)
index 0000000..9122c61
--- /dev/null
@@ -0,0 +1,65 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/EnumClass.h
+ */
+#ifndef ZYPP_BASE_ENUMCLASS_H
+#define ZYPP_BASE_ENUMCLASS_H
+
+#include <iosfwd>
+
+#include "zypp/base/PtrTypes.h"
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{
+  ///////////////////////////////////////////////////////////////////
+  namespace base
+  {
+    ///////////////////////////////////////////////////////////////////
+    /// \class EnumClass
+    /// \brief Type safe enum (workaround SWIG not supporting enum class)
+    /// \code
+    /// struct _ColorDef { enum Enum { R, G ,B }; }
+    /// typedef EnumClass<_ColorDef> Color;
+    /// \endcode
+    ///////////////////////////////////////////////////////////////////
+    template<typename _EnumDef>
+    class EnumClass : public _EnumDef
+    {
+    public:
+      typedef typename _EnumDef::Enum Enum;    ///< The underlying enum type
+
+      EnumClass( Enum val_r ) : _val( val_r ) {}
+
+      /** For use in switch
+       * \code
+       * struct _ColorDef { enum Enum { R, G ,B }; }
+       * typedef EnumClass<_ColorDef> Color;
+       *
+       * Color a;
+       * switch ( a.inSwitch() )
+       * \endcode
+       */
+      Enum inSwitch() const { return _val; }
+
+      friend bool operator==( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val == rhs._val; }
+      friend bool operator!=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val != rhs._val; }
+      friend bool operator< ( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val <  rhs._val; }
+      friend bool operator<=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val <= rhs._val; }
+      friend bool operator> ( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val >  rhs._val; }
+      friend bool operator>=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val >= rhs._val; }
+
+    private:
+      Enum _val;
+    };
+  } // namespace base
+  ///////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_ENUMCLASS_H