00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_VALUE_INTERNAL_CONVERT_HH
00027 # define MLN_VALUE_INTERNAL_CONVERT_HH
00028
00032
00033 # include <mln/core/contract.hh>
00034 # include <mln/trait/value_.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040 namespace value
00041 {
00042
00043 namespace internal
00044 {
00046 template <typename T>
00047 struct convert_
00048 {
00049
00050
00051 static T value_at_index(unsigned i);
00052 static unsigned index_of_value(const T& v);
00053 };
00054
00056 template <>
00057 struct convert_<bool>
00058 {
00059 static bool value_at_index(unsigned i);
00060 static unsigned index_of_value(bool v);
00061 };
00062
00063
00064 # ifndef MLN_INCLUDE_ONLY
00065
00066 template <typename T>
00067 inline
00068 T
00069 convert_<T>::value_at_index(unsigned i)
00070 {
00071 return T( int(mln_min(T)) + int(i) );
00072 }
00073
00074 template <typename T>
00075 inline
00076 unsigned
00077 convert_<T>::index_of_value(const T& v)
00078 {
00079 return unsigned( int(v) - int(mln_min(T)) );
00080 }
00081
00082
00083
00084 inline
00085 bool
00086 convert_<bool>::value_at_index(unsigned i)
00087 {
00088 mln_precondition(i < 2);
00089 return i == 1 ? true : false;
00090 }
00091
00092 inline
00093 unsigned
00094 convert_<bool>::index_of_value(bool v)
00095 {
00096 return v ? 1 : 0;
00097 }
00098
00099 # endif // ! MLN_INCLUDE_ONLY
00100
00101 }
00102
00103 }
00104
00105 }
00106
00107
00108 #endif // ! MLN_VALUE_INTERNAL_CONVERT_HH