42 lines
914 B
C
42 lines
914 B
C
|
#ifndef PFOR_PFOR_USEROP_H
|
||
|
#define PFOR_PFOR_USEROP_H
|
||
|
|
||
|
#include "expression/expression.h"
|
||
|
|
||
|
namespace pfor {
|
||
|
|
||
|
template<typename F>
|
||
|
struct UserOperator {
|
||
|
F f;
|
||
|
|
||
|
template<typename... Args, std::enable_if_t<expr::allExpression<Args...>>* = nullptr>
|
||
|
inline decltype(auto) eval(Args&&... args) {
|
||
|
return f(std::forward<Args>(args).eval()...);
|
||
|
}
|
||
|
|
||
|
template<typename... Args>
|
||
|
inline decltype(auto) eval(std::size_t i, Args&&... args) {
|
||
|
return f(std::forward<Args>(args)[i]...);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief make an operator from a function
|
||
|
*
|
||
|
* @param[in] f a function
|
||
|
*
|
||
|
* @return an operator (UserOperator)
|
||
|
*/
|
||
|
template<typename F>
|
||
|
auto makeOperator(F&& f) {
|
||
|
return [f = std::forward<F>(f)](auto&&... args) {
|
||
|
using Op = UserOperator<decltype(f)>;
|
||
|
using Expr = pfor::expr::Expression<Op, expr::AsExpression<std::remove_reference_t<decltype(args)>>...>;
|
||
|
return Expr{{f}, decltype(args)(args)...};
|
||
|
};
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif
|