1717// / \par Example
1818// / \code{.cpp}
1919// / QCInputs data;
20- // / data.insert("count", 42u);
21- // / if (auto opt = data.get<unsigned>("count")) {
22- // / std::cout << "Count: " << opt->get() << std::endl;
20+ // / auto* h1 = new TH1F("th11", "th11", 100, 0, 99);
21+ // / data.insert("mo", std::make_shared<MonitorObject>(h1, "taskname", "class1", "TST"));
22+ // / if (auto opt = data.get<MonitorObject>("mo")) {
23+ // / MonitorObject& moObject = opt.value();
24+ // / std::cout << "mo name: " << moObject.getName() << std::endl;
2325// / }
24- // / for (const auto& v : data.iterateByType<unsigned >()) {
26+ // / for (const auto& mo : data.iterateByType<MonitorObject >()) {
2527// / // process each value
2628// / }
2729// / \endcode
@@ -52,22 +54,20 @@ concept invocable_r = std::invocable<Function, Args...> &&
5254
5355// / \brief Heterogeneous storage for named QC input objects.
5456// /
55- // / Stores values in an std::any-based container keyed by strings,
57+ // / Stores values in an std::unordered_map<std::string, std:: any> while
5658// / offering type-safe get, iteration, filtering, and transformation.
57- // / Example of such container is transparent_unordered_map at the end of this file
58- template <typename ContainerMap>
59- class QCInputsGeneric
59+ class QCInputs
6060{
6161 public:
62- QCInputsGeneric () = default ;
62+ QCInputs () = default ;
6363
6464 // / \brief Retrieve the object stored under the given key with matching type.
6565 // / \tparam Result Expected stored type.
6666 // / \param key Identifier for the stored object.
6767 // / \returns Optional reference to const Result if found desired item of type Result.
6868 // / \par Example
6969 // / \code{.cpp}
70- // / if (auto opt = data.get<unsigned >("count ")) {
70+ // / if (auto opt = data.get<MonitorObject >("mo ")) {
7171 // / if (opt.has_value()){
7272 // / const unsigned& value = opt.value(); // careful about using auto here as we want to invoke implicit conversion operator of reference_wrapper
7373 // / }
@@ -82,7 +82,8 @@ class QCInputsGeneric
8282 // / \param args Arguments forwarded to T's constructor.
8383 // / \par Example
8484 // / \code{.cpp}
85- // / data.emplace<std::string>("greeting", "hello");
85+ // / auto* h1 = new TH1F("th11", "th11", 100, 0, 99);
86+ // / data.emplace<MonitorObject>("mo", h1, "taskname", "class1", "TST");
8687 // / \endcode
8788 template <typename T, typename ... Args>
8889 void emplace (std::string_view key, Args&&... args);
@@ -93,7 +94,8 @@ class QCInputsGeneric
9394 // / \param value Const reference to the value to insert.
9495 // / \par Example
9596 // / \code{.cpp}
96- // / data.insert("count", 10u);
97+ // / auto* h1 = new TH1F("th11", "th11", 100, 0, 99);
98+ // / data.insert("mo", std::make_shared<MonitorObject>(h1, "taskname", "class1", "TST"));
9799 // / \endcode
98100 template <typename T>
99101 void insert (std::string_view key, const T& value);
@@ -103,7 +105,7 @@ class QCInputsGeneric
103105 // / \returns Range of const references to stored Result instances.
104106 // / \par Example
105107 // / \code{.cpp}
106- // / for (auto& val : data.iterateByResultype<unsigned >()) {
108+ // / for (auto& mo : data.iterateByType<MonitorObject >()) {
107109 // / // use val
108110 // / }
109111 // / \endcode
@@ -117,9 +119,9 @@ class QCInputsGeneric
117119 // / \returns Range of const references to Result passing the filter.
118120 // / \par Example
119121 // / \code{.cpp}
120- // / auto even = [](auto const& pair) { return pair.second % 2 == 0 ; };
121- // / for (auto& val : data.iterateByTypeAndFilter<unsigned>(even )) {
122- // / // use val
122+ // / auto nameFilter = [](auto const& pair) { return pair.second->getName() == "name" ; };
123+ // / for (auto& mo : data.iterateByTypeAndFilter<MonitorObject>(nameFilter )) {
124+ // / // use mo
123125 // / }
124126 // / \endcode
125127 template <typename Result, std::predicate<const std::pair<std::string_view, const Result*>&> Pred>
@@ -138,8 +140,9 @@ class QCInputsGeneric
138140 // / \par Example
139141 // / \code{.cpp}
140142 // / // if we stored some MOs that are not TH1F, these will be filtered out of results
141- // / auto toHistogram = [](auto const& p) { return dynamic_cast<TH1F*>(p.second->getObject()); };
142- // / for (auto& h : data.iterateByTypeFilterAndTransform<MonitorObject, TH1F>([](auto const& p){ return p.first=="histo"; }, toHistogram)) {
143+ // / auto toHistogram = [](auto const& p) -> const auto* { return dynamic_cast<TH1F*>(p.second->getObject()); };
144+ // / auto nameFilter = [](auto const& p){ return p.first == "histo"; };
145+ // / for (auto& h : data.iterateByTypeFilterAndTransform<MonitorObject, TH1F>(nameFilter, toHistogram)) {
143146 // / // use histogram h
144147 // / }
145148 // / \endcode
@@ -155,33 +158,26 @@ class QCInputsGeneric
155158 size_t size () const noexcept ;
156159
157160 private:
158- ContainerMap mObjects ;
159- };
160-
161- // / \brief Transparent hash functor for string and string_view.
162- // /
163- // / Enables heterogeneous lookup in unordered maps keyed by std::string.
164- struct StringHash {
165- using is_transparent = void ; // Required for heterogeneous lookup
166-
167- std:: size_t operator ()( const std::string& str) const
168- {
169- return std::hash< std::string>{}(str);
170- }
171-
172- std:: size_t operator ()(std::string_view sv) const
173- {
174- return std::hash<std::string_view>{}(sv);
175- }
161+ // / \brief Transparent hash functor for string and string_view.
162+ // /
163+ // / Enables heterogeneous lookup in unordered maps keyed by std::string.
164+ struct StringHash {
165+ using is_transparent = void ; // Required for heterogeneous lookup
166+
167+ std:: size_t operator ()( const std::string& str) const
168+ {
169+ return std::hash<std::string>{}(str);
170+ }
171+
172+ std::size_t operator ()( std::string_view sv) const
173+ {
174+ return std::hash<std::string_view>{}(sv);
175+ }
176+ };
177+
178+ std::unordered_map<std::string, std::any, StringHash, std::equal_to<>> mObjects ;
176179};
177180
178- // / \brief Unordered map storing std::any values with heterogeneous key lookup. It was chosen based on benchmark
179- // / in testQCInputs.cxx
180- using transparent_unordered_map = std::unordered_map<std::string, std::any, StringHash, std::equal_to<>>;
181-
182- // / \brief Default alias for QC inputs using transparent_unordered_map container.
183- using QCInputs = QCInputsGeneric<transparent_unordered_map>;
184-
185181} // namespace o2::quality_control::core
186182
187183#include " QCInputs.inl"
0 commit comments