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_SPE_BINARY_HH
00027 # define MLN_FUN_SPE_BINARY_HH
00028
00029 # include <mln/core/concept/function.hh>
00030 # include <mln/trait/next/solve.hh>
00031 # include <mln/trait/functions.hh>
00032
00034
00035 namespace mln
00036 {
00037
00038 namespace fun
00039 {
00040
00041 namespace spe
00042 {
00043
00044
00045 template <typename Fun, typename T1, typename T2>
00046 struct binary;
00047
00048 namespace impl
00049 {
00050
00051 template <bool has_param, typename Fun, typename T1, typename T2>
00052 struct binary_impl;
00053
00054 template <typename Fun, typename T1, typename T2>
00055 struct binary_impl<false, Fun, T1, T2>
00056 : mln::Function_v2v< binary<Fun, T1, T2> >
00057 {
00058 typedef Fun flag;
00059 typedef mln_trait_nbinary(flag, T1, T2) def;
00060
00061 typedef typename def::argument1 argument1;
00062 typedef typename def::argument2 argument2;
00063 typedef typename def::result result;
00064
00065 result operator () (const argument1& a, const argument2& b) const
00066 {
00067 return def::read(a, b);
00068 }
00069
00070
00071 template <typename U>
00072 void init(const U& value)
00073 {
00074 }
00075
00076 };
00077
00078 template <typename Fun, typename T1, typename T2>
00079 struct binary_impl<true, Fun, T1, T2>
00080 : mln::Function_v2v< binary<Fun, T1, T2> >
00081 {
00082 typedef Fun flag;
00083 typedef mln_trait_nbinary(flag, T1, T2) def;
00084
00085 typedef typename def::argument1 argument1;
00086 typedef typename def::argument2 argument2;
00087 typedef typename def::result result;
00088
00089 typedef mln_trait_fun_param(def) param;
00090 typedef mln_trait_fun_storage(def) storage;
00091
00092 result operator () (const argument1& a, const argument2& b) const
00093 {
00094 return def::read(state_, a, b);
00095 }
00096
00097 template <typename U>
00098 void init(const U& value)
00099 {
00100 state_ = mln::trait::function::internal::introspect::has_storage_t<def, void>::compute(value);
00101 }
00102
00103 stored<storage>& state()
00104 {
00105 return state_;
00106 }
00107
00108 const stored<storage>& state() const
00109 {
00110 return state_;
00111 }
00112
00113 protected:
00114 mln::fun::stored<storage> state_;
00115 };
00116
00117 }
00118
00119 template <typename Fun, typename T1, typename T2>
00120 struct binary
00121 : impl::binary_impl<mln_trait_fun_is_parametrable_(Fun)::value, Fun, T1, T2>
00122 {
00123 typedef impl::binary_impl<mln_trait_fun_is_parametrable_(Fun)::value, Fun, T1, T2> super;
00124
00125 binary()
00126 {
00127 }
00128
00129 template <typename U>
00130 binary(const U& param)
00131 {
00132 this->super::init(param);
00133 }
00134
00135 using super::operator();
00136 };
00137
00138 }
00139
00140 }
00141
00142 }
00143
00144 #endif // ! MLN_FUN_SPE_BINARY_HH