diff --git a/Framework/Core/include/Framework/Expressions.h b/Framework/Core/include/Framework/Expressions.h index 9e00388ee5df8..18c930700a91d 100644 --- a/Framework/Core/include/Framework/Expressions.h +++ b/Framework/Core/include/Framework/Expressions.h @@ -12,13 +12,11 @@ #define O2_FRAMEWORK_EXPRESSIONS_H_ #include "Framework/BasicOps.h" -#include "Framework/CompilerBuiltins.h" #include "Framework/Pack.h" #include "Framework/Configurable.h" #include "Framework/Variant.h" #include "Framework/InitContext.h" #include "Framework/ConfigParamRegistry.h" -#include "Framework/RuntimeError.h" #include #include #include @@ -143,13 +141,17 @@ struct OpNode { /// A placeholder node for simple type configurable struct PlaceholderNode : LiteralNode { template + requires(variant_trait_v::type> != VariantType::Unknown) PlaceholderNode(Configurable const& v) : LiteralNode{v.value}, name{v.name} { - if constexpr (variant_trait_v::type> != VariantType::Unknown) { - retrieve = [](InitContext& context, char const* name) { return LiteralNode::var_t{context.options().get(name)}; }; - } else { - unknownParameterUsed(name.c_str()); - } + retrieve = [](InitContext& context, char const* name) { return LiteralNode::var_t{context.options().get(name)}; }; + } + + template + requires((std::convertible_to) && (variant_trait_v::type> != VariantType::Unknown)) + PlaceholderNode(Configurable const& v, AT*) : LiteralNode{static_cast(v.value)}, name{v.name} + { + retrieve = [](InitContext& context, char const* name) { return LiteralNode::var_t{static_cast(context.options().get(name))}; }; } PlaceholderNode(PlaceholderNode const& other) = default; @@ -163,6 +165,12 @@ struct PlaceholderNode : LiteralNode { LiteralNode::var_t (*retrieve)(InitContext&, char const*); }; +template +PlaceholderNode as(Configurable const& v) +{ + return PlaceholderNode(v, (AT*)nullptr); +} + /// A placeholder node for parameters taken from an array struct ParameterNode : LiteralNode { ParameterNode(int index_ = -1) diff --git a/Framework/Core/test/test_Expressions.cxx b/Framework/Core/test/test_Expressions.cxx index 2296b5dcbfbc4..6faa2fc352232 100644 --- a/Framework/Core/test/test_Expressions.cxx +++ b/Framework/Core/test/test_Expressions.cxx @@ -146,6 +146,15 @@ TEST_CASE("TestTreeParsing") REQUIRE(ptfilterspecs2[0].left == (DatumSpec{std::string{"fPt"}, typeid(o2::aod::track::Pt).hash_code(), atype::FLOAT})); REQUIRE(ptfilterspecs2[0].right == (DatumSpec{LiteralNode::var_t{1.0f}, atype::FLOAT})); REQUIRE(ptfilterspecs2[0].result == (DatumSpec{0u, atype::BOOL})); + + Configurable cvalue{"cvalue", 1, "test value"}; + Filter testFilter = o2::aod::track::tpcNClsShared < as(cvalue); + REQUIRE(testFilter.node->self.index() == 2); + REQUIRE(testFilter.node->left->self.index() == 1); + REQUIRE(testFilter.node->right->self.index() == 3); + REQUIRE(std::get(testFilter.node->right->self).name == "cvalue"); + auto testSpecs = createOperations(testFilter); + REQUIRE(testSpecs[0].right == (DatumSpec{LiteralNode::var_t{(uint8_t)1}, atype::UINT8})); } TEST_CASE("TestGandivaTreeCreation")