Skip to content

Commit 7b78a28

Browse files
author
Michal Tichák
committed
data definition moved to inl file
1 parent e61e836 commit 7b78a28

File tree

5 files changed

+145
-96
lines changed

5 files changed

+145
-96
lines changed

Framework/include/QualityControl/Data.h

Lines changed: 9 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -39,90 +39,24 @@ class DataGeneric
3939
DataGeneric() = default;
4040

4141
template <typename Result>
42-
std::optional<std::reference_wrapper<const Result>> get(std::string_view key)
43-
{
44-
if (const auto foundIt = mObjects.find(key); foundIt != mObjects.end()) {
45-
if (auto* casted = std::any_cast<Result>(&foundIt->second); casted != nullptr) {
46-
return { *casted };
47-
}
48-
}
49-
return std::nullopt;
50-
}
42+
std::optional<std::reference_wrapper<const Result>> get(std::string_view key);
5143

5244
template <typename T, typename... Args>
53-
void emplace(std::string_view key, Args&&... args)
54-
{
55-
mObjects.emplace(key, std::any{ std::in_place_type<T>, std::forward<Args>(args)... });
56-
}
57-
58-
template <typename T>
59-
void insert(std::string_view key, const T& value)
60-
{
61-
mObjects.insert({ std::string{ key }, value });
62-
}
45+
void emplace(std::string_view key, Args&&... args);
6346

6447
template <typename T>
65-
static const T* any_cast_try_shared_ptr(const std::any& value)
66-
{
67-
// sadly it is necessary to check for any of these types if we want to test for
68-
// shared_ptr, raw ptr and a value
69-
if (auto* casted = std::any_cast<std::shared_ptr<T>>(&value); casted != nullptr) {
70-
return casted->get();
71-
}
72-
if (auto* casted = std::any_cast<std::shared_ptr<const T>>(&value); casted != nullptr) {
73-
return casted->get();
74-
}
75-
if (auto* casted = std::any_cast<T*>(&value); casted != nullptr) {
76-
return *casted;
77-
}
78-
if (auto* casted = std::any_cast<const T*>(&value); casted != nullptr) {
79-
return *casted;
80-
}
81-
return std::any_cast<T>(&value);
82-
}
48+
void insert(std::string_view key, const T& value);
8349

8450
template <typename T>
85-
static constexpr auto any_to_specific = std::views::transform([](const auto& pair) -> std::pair<std::string_view, const T*> { return { pair.first, any_cast_try_shared_ptr<T>(pair.second) }; });
86-
87-
static constexpr auto filter_nullptr_in_pair = std::views::filter([](const auto& pair) { return pair.second != nullptr; });
88-
89-
static constexpr auto filter_nullptr = std::views::filter([](const auto* ptr) -> bool { return ptr != nullptr; });
90-
91-
static constexpr auto pair_to_reference = std::views::transform([](const auto& pair) -> const auto& { return *pair.second; });
92-
93-
static constexpr auto pair_to_value = std::views::transform([](const auto& pair) { return pair.second; });
94-
95-
static constexpr auto pointer_to_reference = std::views::transform([](const auto* ptr) -> auto& { return *ptr; });
96-
97-
template <typename T>
98-
auto iterateByType() const
99-
{
100-
return mObjects | any_to_specific<T> | filter_nullptr_in_pair | pair_to_reference;
101-
}
51+
auto iterateByType() const;
10252

10353
template <typename T, std::predicate<const std::pair<std::string_view, const T*>&> Pred>
104-
auto iterateByTypeAndFilter(Pred&& filter) const
105-
{
106-
return mObjects | any_to_specific<T> | filter_nullptr_in_pair | std::views::filter(filter) | pair_to_reference;
107-
}
54+
auto iterateByTypeAndFilter(Pred&& filter) const;
10855

10956
template <typename StoredType, typename ResultingType, std::predicate<const std::pair<std::string_view, const StoredType*>&> Pred, invocable_r<const ResultingType*, const StoredType*> Transform>
110-
auto iterateByTypeFilterAndTransform(Pred&& filter, Transform&& transform) const
111-
{
112-
return mObjects |
113-
any_to_specific<StoredType> |
114-
filter_nullptr_in_pair |
115-
std::views::filter(filter) |
116-
pair_to_value |
117-
std::views::transform(transform) |
118-
filter_nullptr |
119-
pointer_to_reference;
120-
}
57+
auto iterateByTypeFilterAndTransform(Pred&& filter, Transform&& transform) const;
12158

122-
size_t size() const noexcept
123-
{
124-
return mObjects.size();
125-
}
59+
size_t size() const noexcept;
12660

12761
private:
12862
ContainerMap mObjects;
@@ -146,8 +80,8 @@ using transparent_unordered_map = std::unordered_map<std::string, std::any, Stri
14680

14781
using Data = DataGeneric<transparent_unordered_map>;
14882

149-
// using Data = DataGeneric<std::map<std::string, std::any, std::less<>>>;
150-
15183
} // namespace o2::quality_control::core
15284

85+
#include "Data.inl"
86+
15387
#endif
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
// Copyright 2025 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
///
13+
/// \file Data.inl
14+
/// \author Michal Tichak
15+
///
16+
17+
#include <optional>
18+
#include <string_view>
19+
20+
namespace o2::quality_control::core
21+
{
22+
23+
template <typename ContainerMap>
24+
template <typename Result>
25+
std::optional<std::reference_wrapper<const Result>> DataGeneric<ContainerMap>::get(std::string_view key)
26+
{
27+
if (const auto foundIt = mObjects.find(key); foundIt != mObjects.end()) {
28+
if (auto* casted = std::any_cast<Result>(&foundIt->second); casted != nullptr) {
29+
return { *casted };
30+
}
31+
}
32+
return std::nullopt;
33+
}
34+
35+
template <typename ContainerMap>
36+
template <typename T, typename... Args>
37+
void DataGeneric<ContainerMap>::emplace(std::string_view key, Args&&... args)
38+
{
39+
mObjects.emplace(key, std::any{ std::in_place_type<T>, std::forward<Args>(args)... });
40+
}
41+
42+
template <typename ContainerMap>
43+
template <typename T>
44+
void DataGeneric<ContainerMap>::insert(std::string_view key, const T& value)
45+
{
46+
mObjects.insert({ std::string{ key }, value });
47+
}
48+
49+
namespace internal
50+
{
51+
52+
template <typename T>
53+
static const T* any_cast_try_shared_raw_ptr(const std::any& value)
54+
{
55+
// sadly it is necessary to check for any of these types if we want to test for
56+
// shared_ptr, raw ptr and a value
57+
if (auto* casted = std::any_cast<std::shared_ptr<T>>(&value); casted != nullptr) {
58+
return casted->get();
59+
}
60+
if (auto* casted = std::any_cast<std::shared_ptr<const T>>(&value); casted != nullptr) {
61+
return casted->get();
62+
}
63+
if (auto* casted = std::any_cast<T*>(&value); casted != nullptr) {
64+
return *casted;
65+
}
66+
if (auto* casted = std::any_cast<const T*>(&value); casted != nullptr) {
67+
return *casted;
68+
}
69+
return std::any_cast<T>(&value);
70+
}
71+
72+
template <typename T>
73+
static constexpr auto any_to_specific = std::views::transform([](const auto& pair) -> std::pair<std::string_view, const T*> { return { pair.first, any_cast_try_shared_raw_ptr<T>(pair.second) }; });
74+
75+
static constexpr auto filter_nullptr_in_pair = std::views::filter([](const auto& pair) -> bool { return pair.second != nullptr; });
76+
77+
static constexpr auto filter_nullptr = std::views::filter([](const auto* ptr) -> bool { return ptr != nullptr; });
78+
79+
static constexpr auto pair_to_reference = std::views::transform([](const auto& pair) -> const auto& { return *pair.second; });
80+
81+
static constexpr auto pair_to_value = std::views::transform([](const auto& pair) -> const auto* { return pair.second; });
82+
83+
static constexpr auto pointer_to_reference = std::views::transform([](const auto* ptr) -> const auto& { return *ptr; });
84+
85+
} // namespace internal
86+
87+
template <typename ContainerMap>
88+
template <typename T>
89+
auto DataGeneric<ContainerMap>::iterateByType() const
90+
{
91+
using namespace internal;
92+
return mObjects | any_to_specific<T> | filter_nullptr_in_pair | pair_to_reference;
93+
}
94+
95+
template <typename ContainerMap>
96+
template <typename T, std::predicate<const std::pair<std::string_view, const T*>&> Pred>
97+
auto DataGeneric<ContainerMap>::iterateByTypeAndFilter(Pred&& filter) const
98+
{
99+
using namespace internal;
100+
return mObjects | any_to_specific<T> | filter_nullptr_in_pair | std::views::filter(filter) | pair_to_reference;
101+
}
102+
103+
template <typename ContainerMap>
104+
template <typename StoredType, typename ResultingType, std::predicate<const std::pair<std::string_view, const StoredType*>&> Pred, invocable_r<const ResultingType*, const StoredType*> Transform>
105+
auto DataGeneric<ContainerMap>::iterateByTypeFilterAndTransform(Pred&& filter, Transform&& transform) const
106+
{
107+
using namespace internal;
108+
return mObjects |
109+
any_to_specific<StoredType> |
110+
filter_nullptr_in_pair |
111+
std::views::filter(filter) |
112+
pair_to_value |
113+
std::views::transform(transform) |
114+
filter_nullptr |
115+
pointer_to_reference;
116+
}
117+
118+
template <typename ContainerMap>
119+
size_t DataGeneric<ContainerMap>::size() const noexcept
120+
{
121+
return mObjects.size();
122+
}
123+
124+
} // namespace o2::quality_control::core

Framework/include/QualityControl/DataAdapters.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ namespace o2::quality_control::core
2727
Data createData(const std::map<std::string, std::shared_ptr<MonitorObject>>& moMap);
2828
Data createData(const QualityObjectsMapType& moMap);
2929

30-
template <typename Result, typename DataContainer>
31-
auto iterateMonitorObjects(const DataGeneric<DataContainer>& data, std::string_view moName);
3230
inline auto iterateMonitorObjects(const Data& data);
3331
inline auto iterateMonitorObjects(const Data& data, std::string_view taskName);
3432

Framework/include/QualityControl/DataAdapters.inl

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,6 @@
3030
namespace o2::quality_control::core
3131
{
3232

33-
namespace helpers
34-
{
35-
36-
}
37-
38-
template <typename Result, typename DataContainer>
39-
auto iterateMonitorObjects(const DataGeneric<DataContainer>& data, std::string_view moName)
40-
{
41-
return data.template iterateByTypeFilterAndTransform<MonitorObject, Result>(
42-
[name = std::string{ moName }](const std::pair<std::string_view, const MonitorObject*>& pair) -> bool { return std::string_view{ pair.second->GetName() } == name; },
43-
[](const MonitorObject* ptr) -> const Result* { return dynamic_cast<const Result*>(ptr->getObject()); });
44-
}
45-
4633
inline auto iterateMonitorObjects(const o2::quality_control::core::Data& data)
4734
{
4835
return data.iterateByType<o2::quality_control::core::MonitorObject>();
@@ -71,19 +58,18 @@ std::optional<std::reference_wrapper<const StoredType>> getMonitorObjectCommon(c
7158
const auto getInternalObject = [](const MonitorObject* ptr) -> const auto* {
7259
return dynamic_cast<const StoredType*>(ptr->getObject());
7360
};
74-
for (const auto& v : data.template iterateByTypeFilterAndTransform<MonitorObject, StoredType>(filter, getInternalObject)) {
61+
for (const auto& v : data.iterateByTypeFilterAndTransform<MonitorObject, StoredType>(filter, getInternalObject)) {
7562
return { v };
7663
}
7764
}
7865
return std::nullopt;
7966
}
8067

81-
}; // namespace helpers
68+
} // namespace helpers
8269

8370
template <typename StoredType>
8471
std::optional<std::reference_wrapper<const StoredType>> getMonitorObject(const Data& data, std::string_view objectName, std::string_view taskName)
8572
{
86-
8773
const auto filterMOByNameAndTaskName = [objectName, taskName](const auto& pair) {
8874
return std::tuple{ std::string_view{ pair.second->GetName() }, pair.second->getTaskName() } == std::tuple{ objectName, taskName };
8975
};

Framework/test/testData.cxx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ TEMPLATE_TEST_CASE("Data - inserting fundamental types", "[.Data-benchmark]", st
149149
};
150150
}
151151

152-
TEMPLATE_TEST_CASE("Data - iterating fundamental types", "[Data-benchmark]", stdmap, boostflatmap, transparent_unordered_map)
152+
TEMPLATE_TEST_CASE("Data - iterating fundamental types", "[.Data-benchmark]", stdmap, boostflatmap, transparent_unordered_map)
153153
{
154154
constexpr size_t iterations = 20000;
155155
DataGeneric<TestType> data;
@@ -226,11 +226,18 @@ TEMPLATE_TEST_CASE("Data - inserting and iterating MOs", "[.Data-benchmark]", st
226226
data.insert(mo->getFullName(), mo);
227227
}
228228

229-
REQUIRE(iterateMonitorObjects<TH1F>(data, "notimportantname").empty());
229+
const auto filterMOByName = [](const auto& pair) {
230+
return std::string_view(pair.second->GetName()) == "nonexistent";
231+
};
232+
233+
const auto getInternalObject = [](const MonitorObject* ptr) -> const auto* {
234+
return dynamic_cast<const TH1F*>(ptr->getObject());
235+
};
236+
REQUIRE(data.template iterateByTypeFilterAndTransform<MonitorObject, TH1F>(filterMOByName, getInternalObject).empty());
230237
};
231238
}
232239

233-
TEST_CASE("Data adapters - helper functions")
240+
TEST_CASE("Data adapters - helper functions", "[Data]")
234241
{
235242

236243
Data data;

0 commit comments

Comments
 (0)