00001
00002
00014
00015
00016 #ifndef polybori_common_common_traits_h_
00017 #define polybori_common_common_traits_h_
00018
00019 #include <set>
00020 #include <vector>
00021
00022
00023 #include <polybori/pbori_defs.h>
00024 #include <polybori/common/tags.h>
00025
00026 #include <boost/preprocessor/cat.hpp>
00027 #include <boost/preprocessor/seq/for_each.hpp>
00028 #include <boost/preprocessor/facilities/expand.hpp>
00029 #include <boost/preprocessor/stringize.hpp>
00030
00031 BEGIN_NAMESPACE_PBORI
00032
00033 typedef PBORI_PREFIX(DdManager) DdManager;
00034
00040 template <class ValueType>
00041 class pbori_traits {
00042
00043 public:
00044
00045
00046
00047 typedef ValueType value_type;
00048
00049
00050
00051
00052
00054 typedef typename value_type::bool_type bool_type;
00055
00057 typedef typename value_type::size_type size_type;
00058
00060 typedef typename value_type::integer_type integer_type;
00061
00063 typedef typename value_type::idx_type idx_type;
00064
00066 typedef typename value_type::comp_type comp_type;
00067
00069 typedef typename value_type::hash_type hash_type;
00070
00072 typedef typename value_type::ostream_type ostream_type;
00073
00075 typedef typename value_type::easy_equality_property easy_equality_property;
00076 };
00077
00078
00079 template <>
00080 class pbori_traits<void>:
00081 public CTypes, public equality_property<valid_tag> {
00082 };
00083
00084 template <>
00085 class pbori_traits<int>:
00086 public CTypes, public equality_property<valid_tag> {
00087 };
00088
00089 template <>
00090 class pbori_traits<unsigned int>:
00091 public CTypes, public equality_property<valid_tag> {
00092 };
00093
00094 template <>
00095 class pbori_traits<long int>:
00096 public CTypes, public equality_property<valid_tag> {
00097 };
00098
00099
00100 template <class ValueType>
00101 class pbori_traits< std::set<ValueType> >:
00102 public CTypes, public equality_property<invalid_tag> {
00103 };
00104
00105 template <class ValueType>
00106 class pbori_traits< std::vector<ValueType> >:
00107 public CTypes, public equality_property<invalid_tag> {
00108 };
00109
00110
00116 template <class FirstType, class SecondType>
00117 class pbori_binary_traits;
00118
00119 template <class OnlyType>
00120 class pbori_binary_traits<OnlyType, OnlyType> {
00121 public:
00122 typedef typename OnlyType::easy_equality_property easy_equality_property;
00123 };
00124
00125 template <class FirstType, class SecondType>
00126 class pbori_binary_traits:
00127 public equality_property<invalid_tag>{
00128 };
00129
00130
00131
00132
00133 template <class MgrType>
00134 struct manager_traits;
00135
00136 template <class CuddLike>
00137 struct manager_traits {
00138
00139 typedef unsigned long large_size_type;
00140 typedef long int refcount_type;
00141
00142 typedef CTypes::idx_type idx_type;
00143 typedef CTypes::size_type size_type;
00144
00145 typedef DdNode* node_type;
00146 typedef DdManager* mgrcore_type;
00147
00148 typedef node_type (*unary_int_function)(mgrcore_type, int);
00149 typedef node_type (*void_function)(mgrcore_type);
00150
00151 typedef DD_CTFP binary_function;
00152 typedef node_type (*binary_int_function)(mgrcore_type, node_type, int);
00153 typedef
00154 node_type (*ternary_function)(mgrcore_type, node_type, node_type, node_type);
00155
00156 typedef int (*int_unary_function)(mgrcore_type, node_type);
00157 };
00158
00159
00160 #define PB_DECLARE_CUDD_TYPES(fromspace) \
00161 typedef fromspace::errorfunc_type errorfunc_type; \
00162 typedef fromspace::large_size_type large_size_type; \
00163 typedef fromspace::refcount_type refcount_type; \
00164 typedef fromspace::node_type node_type; \
00165 typedef fromspace::mgrcore_type mgrcore_type; \
00166 typedef fromspace::unary_int_function unary_int_function; \
00167 typedef fromspace::void_function void_function; \
00168 typedef fromspace::binary_function binary_function; \
00169 typedef fromspace::binary_int_function binary_int_function; \
00170 typedef fromspace::ternary_function ternary_function; \
00171 typedef fromspace::int_unary_function int_unary_function; \
00172 typedef fromspace::size_type size_type;\
00173 typedef fromspace::idx_type idx_type;
00174
00175
00176 #define PB_BINARY_FUNC_CALL(count, funcname, arg_pair) \
00177 BOOST_PP_EXPAND(funcname(BOOST_PP_SEQ_HEAD(arg_pair), \
00178 BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(arg_pair))))
00179
00180 template<unsigned ErrorNumber>
00181 struct cudd_error_traits {
00182 typedef const char* result_type;
00183
00184 result_type operator()() const;
00185 };
00186
00187
00188
00189
00190 #define PB_CUDD_ERROR_TRAITS(errcode, errstr) \
00191 template<> inline cudd_error_traits<errcode>::result_type \
00192 cudd_error_traits<errcode>::operator()() const { \
00193 return BOOST_PP_STRINGIZE(errstr); }
00194
00195 BOOST_PP_SEQ_FOR_EACH( PB_BINARY_FUNC_CALL, PB_CUDD_ERROR_TRAITS,
00196 ((CUDD_MEMORY_OUT)(Out of memory.))
00197 ((CUDD_TOO_MANY_NODES)(Too many nodes.))
00198 ((CUDD_MAX_MEM_EXCEEDED)(Maximum memory exceeded.))
00199 ((CUDD_INVALID_ARG)(Invalid argument.))
00200 ((CUDD_INTERNAL_ERROR)(Internal error.))
00201 ((CUDD_NO_ERROR)(Unexpected error.))
00202 )
00203
00204 #undef PB_CUDD_ERROR_TRAITS
00205
00206 END_NAMESPACE_PBORI
00207
00208 #endif