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_COMPOSE_HH
00027 # define MLN_FUN_COMPOSE_HH
00028
00029 # include <mln/fun/binary.hh>
00030 # include <mln/fun/composition.hh>
00031 # include <mln/fun/param.hh>
00032
00033 namespace mln
00034 {
00035
00036 namespace fun
00037 {
00038 struct compose : binary<compose> {};
00039
00040 namespace internal
00041 {
00042
00043 template <template <class> class CatF, typename F, template <class> class CatG, typename G>
00044 struct compose_helper;
00045
00046 }
00047
00048 template <template <class> class CatF, typename F,
00049 template <class> class CatG, typename G>
00050 struct parameter< internal::compose_helper<CatF, F, CatG, G> >
00051 {
00052 typedef typename internal::composition<CatF, F, CatG, G>::exact_type result;
00053 typedef typename result::param param;
00054 };
00055
00056 namespace internal
00057 {
00058
00059 template <template <class> class CatF, typename F, template <class> class CatG, typename G>
00060 struct compose_helper
00061 {
00062 typedef F argument1;
00063 typedef G argument2;
00064
00065 typedef typename composition<CatF, F, CatG, G>::exact_type result;
00066 typedef mln_trait_fun_param(result) param;
00067
00068 static result read(const F& f, const G& g)
00069 {
00070 return result(param(f, g));
00071 }
00072 };
00073
00074 }
00075
00076 }
00077
00078 namespace trait
00079 {
00080
00081 namespace next
00082 {
00083
00084
00085 template <typename F, typename G>
00086 struct set_binary_< mln::fun::compose, mln::Meta_Function_v2v, F, mln::Meta_Function_v2v, G>
00087 {
00088 typedef mln::fun::internal::compose_helper<mln::Meta_Function_v2v, F, mln::Meta_Function_v2v, G> ret;
00089 };
00090
00091 template <typename F, typename G>
00092 struct set_binary_< mln::fun::compose, mln::Meta_Function_v2v, F, mln::Meta_Function_vv2v, G>
00093 {
00094 typedef mln::fun::internal::compose_helper<mln::Meta_Function_v2v, F, mln::Meta_Function_vv2v, G> ret;
00095 };
00096
00097 template <typename F, typename G>
00098 struct set_binary_< mln::fun::compose, mln::Meta_Function_v2v, F, mln::Function_v2v, G>
00099 {
00100 typedef mln::fun::internal::compose_helper<mln::Meta_Function_v2v, F, mln::Function_v2v, G> ret;
00101 };
00102
00103 template <typename F, typename G>
00104 struct set_binary_< mln::fun::compose, mln::Meta_Function_v2v, F, mln::Function_vv2v, G>
00105 {
00106 typedef mln::fun::internal::compose_helper<mln::Meta_Function_v2v, F, mln::Function_vv2v, G> ret;
00107 };
00108
00109 }
00110
00111 }
00112
00113 }
00114
00115 #endif // ! MLN_FUN_COMPOSE_HH