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_FUN_V2I_INDEX_OF_VALUE_HH
00027 # define MLN_FUN_V2I_INDEX_OF_VALUE_HH
00028
00032
00033 # include <mln/core/concept/function.hh>
00034 # include <mln/trait/value_.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040 namespace fun
00041 {
00042
00043 namespace v2i
00044 {
00045
00046 template <typename T>
00047 struct index_of_value : Function_v2v< index_of_value<T> >,
00048 private metal::bool_<(mln_dim(T) == 1)>::check_t
00049 {
00050 typedef unsigned result;
00051 unsigned operator()(const T& v) const;
00052 };
00053
00054 template <>
00055 struct index_of_value<bool> : Function_v2v< index_of_value<bool> >
00056 {
00057 typedef unsigned result;
00058 unsigned operator()(bool b) const;
00059 };
00060
00061 template <typename T>
00062 unsigned
00063 meta_index_of_value(const T& v);
00064
00065
00066 # ifndef MLN_INCLUDE_ONLY
00067
00068 template <typename T>
00069 inline
00070 unsigned
00071 index_of_value<T>::operator()(const T& v) const
00072 {
00073 return unsigned( int(v) - int(mln_min(T)) );
00074 }
00075
00076 inline
00077 unsigned index_of_value<bool>::operator()(bool b) const
00078 {
00079 return b ? 1u : 0u;
00080 }
00081
00082 template <typename T>
00083 inline
00084 unsigned
00085 meta_index_of_value(const T& v)
00086 {
00087 index_of_value<T> f;
00088 return f(v);
00089 }
00090
00091 # endif // ! MLN_INCLUDE_ONLY
00092
00093 }
00094
00095 }
00096
00097 }
00098
00099 #endif // ! MLN_FUN_V2I_INDEX_OF_VALUE_HH