5050#include < hydra/Parameter.h>
5151
5252#include < hydra/detail/CompositeBase.h>
53+ #include < hydra/detail/FunctorTraits.h>
54+ #include < hydra/detail/CompositeTraits.h>
5355#include < hydra/Parameter.h>
5456#include < hydra/Tuple.h>
5557
@@ -102,8 +104,8 @@ class Multiply: public detail::CompositeBase< F1,F2, Fs...>
102104// multiplication: * operator two functors
103105template <typename T1, typename T2>
104106inline typename std::enable_if<
105- (detail::is_hydra_functor<T1>::value || detail::is_hydra_lambda<T1>::value) &&
106- (detail::is_hydra_functor<T2>::value || detail::is_hydra_lambda<T2>::value),
107+ (detail::is_hydra_functor<T1>::value || detail::is_hydra_lambda<T1>::value || detail::is_hydra_composite_functor<T1>::value ) &&
108+ (detail::is_hydra_functor<T2>::value || detail::is_hydra_lambda<T2>::value || detail::is_hydra_composite_functor<T2>::value ),
107109Multiply<T1, T2> >::type
108110operator *(T1 const & F1, T2 const & F2)
109111{
@@ -112,7 +114,7 @@ operator*(T1 const& F1, T2 const& F2)
112114
113115template <typename T, typename U>
114116inline typename std::enable_if<
115- (detail::is_hydra_functor<T>::value || detail::is_hydra_lambda<T>::value) &&
117+ (detail::is_hydra_functor<T>::value || detail::is_hydra_lambda<T>::value || detail::is_hydra_composite_functor<T>::value ) &&
116118(std::is_arithmetic<U>::value),
117119Multiply< Constant<U>, T> >::type
118120operator *(U const cte, T const & F)
@@ -122,7 +124,7 @@ operator*(U const cte, T const& F)
122124
123125template <typename T, typename U>
124126inline typename std::enable_if<
125- (detail::is_hydra_functor<T>::value || detail::is_hydra_lambda<T>::value) &&
127+ (detail::is_hydra_functor<T>::value || detail::is_hydra_lambda<T>::value || detail::is_hydra_composite_functor<T>::value ) &&
126128(std::is_arithmetic<U>::value),
127129Multiply< Constant<U>, T> >::type
128130operator *( T const & F, U cte)
@@ -132,7 +134,7 @@ operator*( T const& F, U cte)
132134
133135template <typename T, typename U>
134136inline typename std::enable_if<
135- (detail::is_hydra_functor<T>::value || detail::is_hydra_lambda<T>::value) &&
137+ (detail::is_hydra_functor<T>::value || detail::is_hydra_lambda<T>::value || detail::is_hydra_composite_functor<T>::value ) &&
136138(std::is_arithmetic<U>::value),
137139Multiply< Constant<hydra::complex <U>>, T> >::type
138140operator *(hydra::complex <U> const & cte, T const & F)
@@ -142,7 +144,7 @@ operator*(hydra::complex<U> const& cte, T const& F)
142144
143145template <typename T, typename U>
144146inline typename std::enable_if<
145- (detail::is_hydra_functor<T>::value || detail::is_hydra_lambda<T>::value) &&
147+ (detail::is_hydra_functor<T>::value || detail::is_hydra_lambda<T>::value || detail::is_hydra_composite_functor<T>::value ) &&
146148(std::is_arithmetic<U>::value),
147149Multiply< Constant<U>, T> >::type
148150operator *( T const & F, hydra::complex <U> const & cte)
@@ -154,9 +156,10 @@ operator*( T const& F, hydra::complex<U> const& cte)
154156// Convenience function
155157template <typename F1, typename F2, typename ...Fs>
156158inline typename std::enable_if<
157- (detail::is_hydra_functor<F1>::value || detail::is_hydra_lambda<F1>::value) &&
158- (detail::is_hydra_functor<F2>::value || detail::is_hydra_lambda<F2>::value) &&
159- detail::all_true<(detail::is_hydra_functor<Fs>::value || detail::is_hydra_lambda<Fs>::value)...>::value,
159+ (detail::is_hydra_functor<F1>::value || detail::is_hydra_lambda<F1>::value || detail::is_hydra_composite_functor<F1>::value) &&
160+ (detail::is_hydra_functor<F2>::value || detail::is_hydra_lambda<F2>::value || detail::is_hydra_composite_functor<F2>::value) &&
161+ detail::all_true<
162+ (detail::is_hydra_functor<Fs>::value || detail::is_hydra_lambda<Fs>::value || detail::is_hydra_composite_functor<Fs>::value)...>::value,
160163Multiply<F1, F2,Fs...>>::type
161164multiply (F1 const & f1, F2 const & f2, Fs const &... functors )
162165{
0 commit comments