Skip to content

Commit 88baea9

Browse files
authored
DPL Analysis: as<T>(cfg) for adjusting the types of configurables in expressions (#14276)
1 parent a6af317 commit 88baea9

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

Framework/Core/include/Framework/Expressions.h

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@
1212
#define O2_FRAMEWORK_EXPRESSIONS_H_
1313

1414
#include "Framework/BasicOps.h"
15-
#include "Framework/CompilerBuiltins.h"
1615
#include "Framework/Pack.h"
1716
#include "Framework/Configurable.h"
1817
#include "Framework/Variant.h"
1918
#include "Framework/InitContext.h"
2019
#include "Framework/ConfigParamRegistry.h"
21-
#include "Framework/RuntimeError.h"
2220
#include <arrow/type_fwd.h>
2321
#include <gandiva/gandiva_aliases.h>
2422
#include <arrow/type.h>
@@ -143,13 +141,17 @@ struct OpNode {
143141
/// A placeholder node for simple type configurable
144142
struct PlaceholderNode : LiteralNode {
145143
template <typename T>
144+
requires(variant_trait_v<typename std::decay<T>::type> != VariantType::Unknown)
146145
PlaceholderNode(Configurable<T> const& v) : LiteralNode{v.value}, name{v.name}
147146
{
148-
if constexpr (variant_trait_v<typename std::decay<T>::type> != VariantType::Unknown) {
149-
retrieve = [](InitContext& context, char const* name) { return LiteralNode::var_t{context.options().get<T>(name)}; };
150-
} else {
151-
unknownParameterUsed(name.c_str());
152-
}
147+
retrieve = [](InitContext& context, char const* name) { return LiteralNode::var_t{context.options().get<T>(name)}; };
148+
}
149+
150+
template <typename T, typename AT>
151+
requires((std::convertible_to<T, AT>) && (variant_trait_v<typename std::decay<T>::type> != VariantType::Unknown))
152+
PlaceholderNode(Configurable<T> const& v, AT*) : LiteralNode{static_cast<AT>(v.value)}, name{v.name}
153+
{
154+
retrieve = [](InitContext& context, char const* name) { return LiteralNode::var_t{static_cast<AT>(context.options().get<T>(name))}; };
153155
}
154156

155157
PlaceholderNode(PlaceholderNode const& other) = default;
@@ -163,6 +165,12 @@ struct PlaceholderNode : LiteralNode {
163165
LiteralNode::var_t (*retrieve)(InitContext&, char const*);
164166
};
165167

168+
template <typename AT, typename T>
169+
PlaceholderNode as(Configurable<T> const& v)
170+
{
171+
return PlaceholderNode(v, (AT*)nullptr);
172+
}
173+
166174
/// A placeholder node for parameters taken from an array
167175
struct ParameterNode : LiteralNode {
168176
ParameterNode(int index_ = -1)

Framework/Core/test/test_Expressions.cxx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,15 @@ TEST_CASE("TestTreeParsing")
146146
REQUIRE(ptfilterspecs2[0].left == (DatumSpec{std::string{"fPt"}, typeid(o2::aod::track::Pt).hash_code(), atype::FLOAT}));
147147
REQUIRE(ptfilterspecs2[0].right == (DatumSpec{LiteralNode::var_t{1.0f}, atype::FLOAT}));
148148
REQUIRE(ptfilterspecs2[0].result == (DatumSpec{0u, atype::BOOL}));
149+
150+
Configurable<int> cvalue{"cvalue", 1, "test value"};
151+
Filter testFilter = o2::aod::track::tpcNClsShared < as<uint8_t>(cvalue);
152+
REQUIRE(testFilter.node->self.index() == 2);
153+
REQUIRE(testFilter.node->left->self.index() == 1);
154+
REQUIRE(testFilter.node->right->self.index() == 3);
155+
REQUIRE(std::get<PlaceholderNode>(testFilter.node->right->self).name == "cvalue");
156+
auto testSpecs = createOperations(testFilter);
157+
REQUIRE(testSpecs[0].right == (DatumSpec{LiteralNode::var_t{(uint8_t)1}, atype::UINT8}));
149158
}
150159

151160
TEST_CASE("TestGandivaTreeCreation")

0 commit comments

Comments
 (0)