12 #ifndef ROOT_TExecutor
13 #define ROOT_TExecutor
63 explicit TExecutor() =
default;
64 explicit TExecutor(
size_t ){};
66 template<
class F,
class... T>
67 using noReferenceCond =
typename std::enable_if<
"Function can't return a reference" && !(std::is_reference<
typename std::result_of<F(T...)>::type>::value)>::type;
72 template<
class F,
class Cond = noReferenceCond<F>>
73 auto Map(F func,
unsigned nTimes) -> std::vector<typename std::result_of<F()>::type>;
74 template<
class F,
class INTEGER,
class Cond = noReferenceCond<F, INTEGER>>
75 auto Map(F func, ROOT::TSeq<INTEGER> args) -> std::vector<typename std::result_of<F(INTEGER)>::type>;
77 template<
class F,
class T,
class Cond = noReferenceCond<F, T>>
78 auto Map(F func, std::initializer_list<T> args) -> std::vector<typename std::result_of<F(T)>::type>;
80 template<
class F,
class T,
class Cond = noReferenceCond<F, T>>
81 auto Map(F func, std::vector<T> &args) -> std::vector<typename std::result_of<F(T)>::type>;
87 template<
class F,
class INTEGER,
class R,
class Cond = noReferenceCond<F, INTEGER>>
88 auto MapReduce(F func, ROOT::TSeq<INTEGER> args, R redfunc) ->
typename std::result_of<F(INTEGER)>::type;
90 template<
class F,
class T,
class R,
class Cond = noReferenceCond<F, T>>
91 auto MapReduce(F func, std::initializer_list<T> args, R redfunc) ->
typename std::result_of<F(T)>::type;
93 template<
class F,
class T,
class Cond = noReferenceCond<F, T>>
94 T* MapReduce(F func, std::vector<T*> &args);
96 template<
class T> T* Reduce(
const std::vector<T*> &mergeObjs);
99 inline subc & Derived()
101 return *
static_cast<subc*
>(
this);
110 template<
class subc>
template<
class F,
class Cond>
111 auto TExecutor<subc>::Map(F func,
unsigned nTimes) -> std::vector<typename std::result_of<F()>::type>
113 return Derived().Map(func, nTimes);
120 template<
class subc>
template<
class F,
class INTEGER,
class Cond>
121 auto TExecutor<subc>::Map(F func, ROOT::TSeq<INTEGER> args) -> std::vector<typename std::result_of<F(INTEGER)>::type>
123 return Derived().Map(func, args);
130 template<
class subc>
template<
class F,
class T,
class Cond>
131 auto TExecutor<subc>::Map(F func, std::initializer_list<T> args) -> std::vector<typename std::result_of<F(T)>::type>
133 std::vector<T> vargs(std::move(args));
134 return Map(func, vargs);
143 template<
class subc>
template<
class F,
class T,
class Cond>
144 auto TExecutor<subc>::Map(F func, std::vector<T> &args) -> std::vector<typename std::result_of<F(T)>::type>
146 return Derived().Map(func, args);
155 template<
class subc>
template<
class F,
class INTEGER,
class R,
class Cond>
156 auto TExecutor<subc>::MapReduce(F func, ROOT::TSeq<INTEGER> args, R redfunc) ->
typename std::result_of<F(INTEGER)>::type
158 std::vector<INTEGER> vargs(args.size());
159 std::copy(args.begin(), args.end(), vargs.begin());
160 return Derived().MapReduce(func, vargs, redfunc);
163 template<
class subc>
template<
class F,
class T,
class R,
class Cond>
164 auto TExecutor<subc>::MapReduce(F func, std::initializer_list<T> args, R redfunc) ->
typename std::result_of<F(T)>::type
166 std::vector<T> vargs(std::move(args));
167 return Derived().MapReduce(func, vargs, redfunc);
170 template<
class subc>
template<
class F,
class T,
class Cond>
171 T* TExecutor<subc>::MapReduce(F func, std::vector<T*> &args)
173 return Derived().Reduce(Map(func, args));
179 template<
class subc>
template<
class T>
180 T* TExecutor<subc>::Reduce(
const std::vector<T*> &mergeObjs)
183 for(
unsigned i =1; i<mergeObjs.size(); i++){
187 auto retHist =
dynamic_cast<T*
>((mergeObjs.front())->Clone());
188 if (retHist) retHist->Merge(&l);