00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __HOM_EnumValue_h__
00019 #define __HOM_EnumValue_h__
00020
00021 #include "HOM_API.h"
00022 #include "HOM_Defines.h"
00023 #include "HOM_PtrOrNull.h"
00024 #include <SYS/SYS_Math.h>
00025 #include <string>
00026 #include <typeinfo>
00027
00028 SWIGOUT(%rename(EnumValue) HOM_EnumValue;)
00029
00030 class HOM_API HOM_EnumValue
00031 {
00032 public:
00033 SWIGOUT(%ignore HOM_EnumValue;)
00034 SWIGOUT(%ignore ~HOM_EnumValue;)
00035
00036
00037
00038
00039
00040
00041
00042
00043 HOM_EnumValue(const std::type_info& enum_class, const char *repr,
00044 const char *name, int id)
00045 : myEnumClass(enum_class), myRepr(repr), myName(name), myId(id)
00046 {}
00047
00048
00049
00050 bool __eq__(HOM_PtrOrNull<HOM_EnumValue> value)
00051 { return value.myPointer && *this == *value.myPointer; }
00052
00053 bool __ne__(HOM_PtrOrNull<HOM_EnumValue> value)
00054 { return !__eq__(value); }
00055
00056 std::string __repr__()
00057 { return myRepr; }
00058
00059 int __hash__()
00060 { return (int)SYSmultiplicative_inthash(myId); }
00061
00062 std::string name()
00063 { return myName; }
00064
00065
00066
00067 SWIGOUT(%ignore operator==;)
00068 bool operator==(const HOM_EnumValue &value) const
00069 { return myEnumClass == value.myEnumClass && myId == value.myId; }
00070
00071 SWIGOUT(%ignore operator!=;)
00072 bool operator!=(const HOM_EnumValue &value) const
00073 { return myEnumClass != value.myEnumClass || myId != value.myId; }
00074
00075 SWIGOUT(%ignore enumClass;)
00076 const std::type_info &enumClass()
00077 { return myEnumClass; }
00078
00079 SWIGOUT(%ignore id;)
00080 int id()
00081 { return myId; }
00082
00083 private:
00084 HOM_EnumValue(const HOM_EnumValue &);
00085 HOM_EnumValue &operator=(const HOM_EnumValue &);
00086
00087 const std::type_info &myEnumClass;
00088 const char *myRepr;
00089 const char *myName;
00090 const int myId;
00091 };
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 #define HOM_DECLARE_ENUM_MODULE_START(enum_module) \
00107 SWIGOUT(%nodefaultctor HOM_ ## enum_module;) \
00108 SWIGOUT(%rename(enum_module) HOM_ ## enum_module;) \
00109 class HOM_API HOM_ ## enum_module \
00110 { \
00111 public:
00112 #define HOM_DECLARE_ENUM_MODULE_END \
00113 }; \
00114
00115 #ifndef SWIG
00116 #include <boost/preprocessor/cat.hpp>
00117 #include <boost/preprocessor/arithmetic/dec.hpp>
00118 #include <boost/preprocessor/tuple/to_seq.hpp>
00119 #include <boost/preprocessor/tuple/rem.hpp>
00120 #include <boost/preprocessor/seq/transform.hpp>
00121 #include <boost/preprocessor/seq/for_each.hpp>
00122 #include <boost/preprocessor/stringize.hpp>
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 #define HOM_DECLARE_ENUM_VALUE(r, unused_data, elem) \
00134 static HOM_EnumValue elem; \
00135 static const int BOOST_PP_CAT(elem, _Id) = BOOST_PP_DEC(r);
00136
00137
00138
00139 #define HOM_DECLARE_ENUM_MODULE_FROM_SEQ(enum_module, values_seq) \
00140 HOM_DECLARE_ENUM_MODULE_START(enum_module) \
00141 BOOST_PP_SEQ_FOR_EACH(HOM_DECLARE_ENUM_VALUE, _, values_seq) \
00142 HOM_DECLARE_ENUM_MODULE_END
00143
00144
00145
00146
00147
00148
00149 #define HOM_DECLARE_ENUM_MODULE(enum_module, num_values, values_tuple) \
00150 HOM_DECLARE_ENUM_MODULE_FROM_SEQ(enum_module, \
00151 BOOST_PP_TUPLE_TO_SEQ(num_values, (values_tuple)))
00152
00153
00154
00155
00156
00157 #define HOM_DEFINE_ENUM_VALUE(r, enum_module, elem) \
00158 HOM_EnumValue BOOST_PP_CAT(HOM_, enum_module)::elem \
00159 (typeid(BOOST_PP_CAT(HOM_, enum_module)), \
00160 BOOST_PP_STRINGIZE(enum_module) "." BOOST_PP_STRINGIZE(elem), \
00161 BOOST_PP_STRINGIZE(elem), \
00162 BOOST_PP_DEC(r));
00163
00164
00165 #define HOM_DEFINE_ENUM_MODULE_FROM_SEQ(enum_module, values_seq) \
00166 BOOST_PP_SEQ_FOR_EACH(HOM_DEFINE_ENUM_VALUE, enum_module, values_seq)
00167
00168 #define HOM_DEFINE_ENUM_MODULE(enum_module, num_values, values_tuple) \
00169 HOM_DEFINE_ENUM_MODULE_FROM_SEQ(enum_module, \
00170 BOOST_PP_TUPLE_TO_SEQ(num_values, (values_tuple)))
00171
00172 #else // SWIG
00173
00174
00175
00176
00177
00178 #define HOM_DECLARE_ENUM_MODULE(enum_module, num_values, values_tuple) \
00179 HOM_DECLARE_ENUM_MODULE_START(enum_module) \
00180 static const HOM_EnumValue values_tuple; \
00181 HOM_DECLARE_ENUM_MODULE_END
00182
00183 #endif // SWIG
00184
00185 #endif