13 #ifndef ROOT_RDF_HELPERS
14 #define ROOT_RDF_HELPERS
23 #include <type_traits>
32 template <
typename... ArgTypes,
typename F>
33 std::function<bool(ArgTypes...)> NotHelper(ROOT::TypeTraits::TypeList<ArgTypes...>, F &&f)
35 return std::function<bool(ArgTypes...)>([=](ArgTypes... args)
mutable {
return !f(args...); });
38 template <
typename... ArgTypes,
typename Ret,
typename... Args>
39 std::function<bool(ArgTypes...)> NotHelper(ROOT::TypeTraits::TypeList<ArgTypes...>, Ret (*f)(Args...))
41 return std::function<bool(ArgTypes...)>([=](ArgTypes... args)
mutable {
return !f(args...); });
44 template <
typename I,
typename T,
typename F>
45 class PassAsVecHelper;
47 template <std::size_t... N,
typename T,
typename F>
48 class PassAsVecHelper<std::index_sequence<N...>, T, F> {
49 template <std::
size_t Idx>
54 PassAsVecHelper(F &&f) : fFunc(std::forward<F>(f)) {}
55 auto operator()(AlwaysT<N>... args) -> decltype(fFunc({args...})) {
return fFunc({args...}); }
58 template <std::
size_t N,
typename T,
typename F>
59 auto PassAsVec(F &&f) -> PassAsVecHelper<std::make_index_sequence<N>, T, F>
61 return PassAsVecHelper<std::make_index_sequence<N>, T, F>(std::forward<F>(f));
68 namespace RDFInternal = ROOT::Internal::RDF;
78 typename Args =
typename ROOT::TypeTraits::CallableTraits<typename std::decay<F>::type>::arg_types_nodecay,
79 typename Ret =
typename ROOT::TypeTraits::CallableTraits<typename std::decay<F>::type>::ret_type>
80 auto Not(F &&f) -> decltype(RDFInternal::NotHelper(Args(), std::forward<F>(f)))
82 static_assert(std::is_same<Ret, bool>::value,
"RDF::Not requires a callable that returns a bool.");
83 return RDFInternal::NotHelper(Args(), std::forward<F>(f));
99 template <std::
size_t N,
typename T,
typename F>
100 auto PassAsVec(F &&f) -> RDFInternal::PassAsVecHelper<std::make_index_sequence<N>, T, F>
102 return RDFInternal::PassAsVecHelper<std::make_index_sequence<N>, T, F>(std::forward<F>(f));
104 template <
typename Proxied,
typename DataSource>
112 template <
typename NodeType>
113 std::string SaveGraph(NodeType node)
115 ROOT::Internal::RDF::GraphDrawing::GraphCreatorHelper helper;
124 template <
typename NodeType>
125 void SaveGraph(NodeType node,
const std::string &outputFile)
127 ROOT::Internal::RDF::GraphDrawing::GraphCreatorHelper helper;
128 std::string dotGraph = helper(node);
130 std::ofstream out(outputFile);
131 if (!out.is_open()) {
132 throw std::runtime_error(
"Could not open output file \"" + outputFile +
"\"for reading");
143 template <
typename NodeType>
144 RNode AsRNode(NodeType node)