11 #ifndef ROOT_RRESULTPTR
12 #define ROOT_RRESULTPTR
25 class GraphCreatorHelper;
40 using ROOT::RDF::RResultPtr;
43 RResultPtr<T> MakeResultPtr(
const std::shared_ptr<T> &r, RLoopManager &df,
44 std::shared_ptr<ROOT::Internal::RDF::RActionBase> actionPtr);
48 namespace RDFInternal = ROOT::Internal::RDF;
49 namespace RDFDetail = ROOT::Detail::RDF;
50 namespace TTraits = ROOT::TypeTraits;
74 using SPT_t = std::shared_ptr<T>;
77 template <
typename T1>
78 friend class RResultPtr;
80 template <
typename T1>
81 friend RResultPtr<T1> RDFDetail::MakeResultPtr(
const std::shared_ptr<T1> &, ::ROOT::Detail::RDF::RLoopManager &,
82 std::shared_ptr<RDFInternal::RActionBase>);
83 template <
class T1,
class T2>
84 friend bool operator==(
const RResultPtr<T1> &lhs,
const RResultPtr<T2> &rhs);
85 template <
class T1,
class T2>
86 friend bool operator!=(
const RResultPtr<T1> &lhs,
const RResultPtr<T2> &rhs);
88 friend bool operator==(
const RResultPtr<T1> &lhs, std::nullptr_t rhs);
90 friend bool operator==(std::nullptr_t lhs,
const RResultPtr<T1> &rhs);
92 friend bool operator!=(
const RResultPtr<T1> &lhs, std::nullptr_t rhs);
94 friend bool operator!=(std::nullptr_t lhs,
const RResultPtr<T1> &rhs);
96 friend class ROOT::Internal::RDF::GraphDrawing::GraphCreatorHelper;
99 template <typename V, bool hasBeginEnd = TTraits::HasBeginAndEnd<V>::value>
100 struct RIterationHelper {
101 using Iterator_t = void;
102 void GetBegin(
const V &) { static_assert(
sizeof(V) == 0,
"It does not make sense to ask begin for this class."); }
103 void GetEnd(
const V &) { static_assert(
sizeof(V) == 0,
"It does not make sense to ask end for this class."); }
106 template <
typename V>
107 struct RIterationHelper<V, true> {
108 using Iterator_t = decltype(std::begin(std::declval<V>()));
109 static Iterator_t GetBegin(
const V &v) {
return std::begin(v); };
110 static Iterator_t GetEnd(
const V &v) {
return std::end(v); };
116 RDFDetail::RLoopManager *fLoopManager =
nullptr;
120 std::shared_ptr<RDFInternal::RActionBase> fActionPtr;
130 if (!fActionPtr->HasRun())
132 return fObjPtr.get();
135 RResultPtr(std::shared_ptr<T> objPtr, RDFDetail::RLoopManager *lm,
136 std::shared_ptr<RDFInternal::RActionBase> actionPtr)
137 : fLoopManager(lm), fObjPtr(std::move(objPtr)), fActionPtr(std::move(actionPtr))
143 static constexpr ULong64_t kOnce = 0ull;
145 RResultPtr() =
default;
146 RResultPtr(
const RResultPtr &) =
default;
147 RResultPtr(RResultPtr &&) =
default;
148 RResultPtr &operator=(
const RResultPtr &) =
default;
149 RResultPtr &operator=(RResultPtr &&) =
default;
150 explicit operator bool()
const {
return bool(fObjPtr); }
151 template<typename TO, typename std::enable_if<std::is_convertible<T, TO>::value,
int>::type = 0 >
152 operator RResultPtr<TO>()
const
155 rp.fLoopManager = fLoopManager;
156 rp.fObjPtr = fObjPtr;
157 rp.fActionPtr = fActionPtr;
163 const T &GetValue() {
return *Get(); }
167 T *GetPtr() {
return Get(); }
171 T &operator*() {
return *Get(); }
176 T *operator->() {
return Get(); }
180 typename RIterationHelper<T>::Iterator_t begin()
182 if (!fActionPtr->HasRun())
184 return RIterationHelper<T>::GetBegin(*fObjPtr);
189 typename RIterationHelper<T>::Iterator_t end()
191 if (!fActionPtr->HasRun())
193 return RIterationHelper<T>::GetEnd(*fObjPtr);
239 RResultPtr<T> &OnPartialResult(ULong64_t everyNEvents, std::function<
void(T &)> callback)
241 const auto nSlots = fLoopManager->GetNSlots();
242 auto actionPtr = fActionPtr;
243 auto c = [nSlots, actionPtr, callback](
unsigned int slot) {
244 if (slot != nSlots - 1)
246 auto partialResult =
static_cast<Value_t *
>(actionPtr->PartialUpdate(slot));
247 callback(*partialResult);
249 fLoopManager->RegisterCallback(everyNEvents, std::move(c));
284 RResultPtr<T> &OnPartialResultSlot(ULong64_t everyNEvents, std::function<
void(
unsigned int, T &)> callback)
286 auto actionPtr = fActionPtr;
287 auto c = [actionPtr, callback](
unsigned int slot) {
288 auto partialResult =
static_cast<Value_t *
>(actionPtr->PartialUpdate(slot));
289 callback(slot, *partialResult);
291 fLoopManager->RegisterCallback(everyNEvents, std::move(c));
296 template <
typename T>
297 void RResultPtr<T>::TriggerRun()
302 template <
class T1,
class T2>
303 bool operator==(
const RResultPtr<T1> &lhs,
const RResultPtr<T2> &rhs)
305 return lhs.fObjPtr == rhs.fObjPtr;
308 template <
class T1,
class T2>
309 bool operator!=(
const RResultPtr<T1> &lhs,
const RResultPtr<T2> &rhs)
311 return lhs.fObjPtr != rhs.fObjPtr;
315 bool operator==(
const RResultPtr<T1> &lhs, std::nullptr_t rhs)
317 return lhs.fObjPtr == rhs;
321 bool operator==(std::nullptr_t lhs,
const RResultPtr<T1> &rhs)
323 return lhs == rhs.fObjPtr;
327 bool operator!=(
const RResultPtr<T1> &lhs, std::nullptr_t rhs)
329 return lhs.fObjPtr != rhs;
333 bool operator!=(std::nullptr_t lhs,
const RResultPtr<T1> &rhs)
335 return lhs != rhs.fObjPtr;
344 template <
typename T>
346 MakeResultPtr(
const std::shared_ptr<T> &r, RLoopManager &lm, std::shared_ptr<RDFInternal::RActionBase> actionPtr)
348 return RResultPtr<T>(r, &lm, std::move(actionPtr));
354 #endif // ROOT_TRESULTPROXY