pfor/src/pfor/userop.h

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