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