27 #ifndef MLN_VALUE_EQUIV_HH
28 # define MLN_VALUE_EQUIV_HH
39 # include <mln/core/concept/value.hh>
42 # define mln_value_equiv(V) typename mln::value::internal::equiv_<V>::ret
43 # define mln_value_equiv_(V) mln::value::internal::equiv_<V>::ret
54 namespace internal {
template <
typename T>
struct equiv_; }
60 typename internal::equiv_<V>::ret
65 # ifndef MLN_INCLUDE_ONLY
71 struct no_ {
char dummy[2]; };
81 template <
unsigned id,
typename T>
86 typename internal::equiv_<V>::ret
87 run_equiv_(
const V& v);
90 template <
typename V,
typename T>
92 typename internal::equiv_<V>::ret
93 run_equiv_(
const Value<V>* v,
const T*)
95 return run_equiv_(exact(v)->to_equiv());
101 run_equiv_(
const void*,
const V* v)
106 template <
typename V>
108 typename internal::equiv_<V>::ret
109 run_equiv_(
const V& v)
111 return run_equiv_(&v, &v);
115 template <
typename T>
116 struct equiv_ret_< 1, T >
118 typedef typename T::equiv V;
119 typedef typename equiv_<V>::ret ret;
122 template <
typename T>
123 struct equiv_ret_< 2, T >
128 template <
typename V>
129 yes_ equiv_selector_(Value<V>*);
131 no_ equiv_selector_(
void*);
133 template <
typename T>
136 enum {
id =
sizeof(equiv_selector_(make_<T>::ptr())) };
137 typedef typename equiv_ret_<id, T>::ret ret;
140 static ret run(
const T& t)
150 template <
typename V>
152 typename internal::equiv_<V>::ret
155 return internal::run_equiv_(exact(v));
159 # endif // ! MLN_INCLUDE_ONLY
165 # include <mln/value/cast.hh>
167 #endif // ! MLN_VALUE_EQUIV_HH