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_I2V_VALUE_AT_INDEX_HH
00027 # define MLN_FUN_I2V_VALUE_AT_INDEX_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 i2v
00044 {
00045
00046 template <typename T>
00047 struct value_at_index : Function_v2v< value_at_index<T> >,
00048 private metal::bool_<(mln_dim(T) == 1)>::check_t
00049 {
00050 typedef T result;
00051 T operator()(unsigned i) const;
00052 };
00053
00054 template <>
00055 struct value_at_index<bool> : Function_v2v< value_at_index<bool> >
00056 {
00057 typedef bool result;
00058 bool operator()(unsigned i) const;
00059 };
00060
00061
00062 # ifndef MLN_INCLUDE_ONLY
00063
00064 template <typename T>
00065 inline
00066 T
00067 value_at_index<T>::operator()(unsigned i) const
00068 {
00069 return T( int(mln_min(T)) + int(i) );
00070 }
00071
00072 inline
00073 bool
00074 value_at_index<bool>::operator()(unsigned i) const
00075 {
00076 mln_precondition(i < 2);
00077 return i == 1u ? true : false;
00078 }
00079
00080 # endif // ! MLN_INCLUDE_ONLY
00081
00082 }
00083
00084 }
00085
00086 }
00087
00088 #endif // ! MLN_FUN_I2V_VALUE_AT_INDEX_HH