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 #include "unary.hh"
00027
00028 #ifndef MLN_FUN_BINARY_PARAM_HH
00029 # define MLN_FUN_BINARY_PARAM_HH
00030
00031 # include <mln/fun/binary.hh>
00032 # include <mln/fun/param.hh>
00033
00034 namespace mln
00035 {
00036
00037 namespace fun
00038 {
00039
00040 template <typename F, typename Param, typename Storage = void, typename E = F>
00041 struct binary_param: binary<binary_param<F,Param,Storage>, E>
00042 {
00043 typedef F flag;
00044 typedef Param param;
00045 typedef Storage storage;
00046
00047 binary_param()
00048 {
00049 }
00050
00051 template <typename U>
00052 binary_param(const U& param)
00053 {
00054 this->init(param);
00055 }
00056
00057 };
00058
00059 template <typename F, typename Param, typename E>
00060 struct parameter< binary_param<F,Param,void,E> >
00061 {
00062 typedef Param param;
00063 typedef void storage;
00064 };
00065
00066 template <typename F, typename Param, typename Storage, typename E>
00067 struct parameter< binary_param<F,Param,Storage,E> >
00068 {
00069 typedef Param param;
00070 typedef Storage storage;
00071
00072 template <typename U>
00073 storage compute(const U& u)
00074 {
00075 return F::compute_param(u);
00076 }
00077 };
00078
00079 }
00080
00081 namespace trait
00082 {
00083
00084 namespace next
00085 {
00086
00087 template <typename F, typename Param, typename Storage, typename E, typename T1, typename T2>
00088 struct set_precise_binary_<mln::fun::binary_param<F,Param,Storage,E>, T1, T2>
00089 {
00090 typedef mln_trait_nbinary(F, T1, T2) ret;
00091 };
00092
00093 }
00094
00095 }
00096
00097
00098 }
00099
00100 #endif // ! MLN_FUN_BINARY_PARAM_HH