CbmRoot
Loading...
Searching...
No Matches
CbmStructLooper.h
Go to the documentation of this file.
1/* Copyright (C) 2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Sergei Zharko [committer] */
4
95
96#ifndef CbmStructLooper_h
97#define CbmStructLooper_h 1
98
99#include "CbmTypeTraits.h"
100
101#include <functional>
102#include <optional>
103#include <tuple>
104
105namespace cbm::util
106{
112 template<class Handler, class... Variables>
114 public:
117 constexpr StructLooper(Variables Handler::*... vars)
118 : fVariableTuple(std::make_tuple(std::forward<decltype(vars)>(vars)...))
119 {
120 }
121
127 template<typename HandlerPtr, class Visitor, std::enable_if_t<is_pointer_to_v<HandlerPtr, Handler>, bool> = true>
128 constexpr void ForEachValue(HandlerPtr handler, Visitor&& visitor) const
129 {
130 std::apply([&](auto&&... v) { ((VisitValue(handler, std::forward<Visitor>(visitor), v)), ...); }, fVariableTuple);
131 }
132
138 template<typename HandlerPtr, class Visitor, std::enable_if_t<is_pointer_to_v<HandlerPtr, Handler>, bool> = true>
139 constexpr void ForEachVariable(HandlerPtr handler, Visitor&& visitor) const
140 {
141 std::apply([&](auto&&... v) { ((std::invoke(std::forward<Visitor>(visitor), handler->*v)), ...); },
143 }
144
145 private:
146 const std::tuple<Variables Handler::*...> fVariableTuple;
147
155 template<class Visitor, class VarPtrType, typename HandlerPtr,
156 std::enable_if_t<is_pointer_to_v<HandlerPtr, Handler>, bool> = true>
157 constexpr void VisitValue(HandlerPtr handler, Visitor&& visitor, VarPtrType&& varAddr) const
158 {
159 using VarType = std::remove_const_t<std::remove_reference_t<decltype(handler->*varAddr)>>;
160 // TODO: add other single-value contain types
161 if constexpr (is_std_optional_v<VarType>) {
162 // Invoke a visitor, if the variable contains a value
163 if ((handler->*varAddr).has_value()) {
164 std::invoke(std::forward<Visitor>(visitor), *(handler->*varAddr));
165 }
166 }
167 else {
168 std::invoke(std::forward<Visitor>(visitor), handler->*varAddr);
169 }
170 }
171 };
172} // namespace cbm::util
173
174#endif // CbmStructLooper_h
Different metaprogramming utilities (type traits) for CBM experiment.
fscal v[fmask::Size]
Definition KfSimdPseudo.h:4
constexpr StructLooper(Variables Handler::*... vars)
Constructor.
constexpr void ForEachVariable(HandlerPtr handler, Visitor &&visitor) const
Applies a visitor callable to variables.
constexpr void ForEachValue(HandlerPtr handler, Visitor &&visitor) const
Applies a visitor callable to values, which are stored in registered variables.
constexpr void VisitValue(HandlerPtr handler, Visitor &&visitor, VarPtrType &&varAddr) const
A visit function for variables.
const std::tuple< Variables Handler::*... > fVariableTuple
A tuple, containing addresses of the class variables.
constexpr bool is_std_optional_v
Hash for CbmL1LinkKey.