Skip to content

Commit 1533f53

Browse files
committed
Improve DataSpecUtils::asConcreteDataMatcher(InputSpec)
Now supports some DataDescriptorMatcher
1 parent b1c7759 commit 1533f53

File tree

2 files changed

+35
-19
lines changed

2 files changed

+35
-19
lines changed

Framework/Core/src/DataSpecUtils.cxx

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -277,24 +277,6 @@ bool DataSpecUtils::partialMatch(OutputSpec const& output, header::DataDescripti
277277
return dataType.description == description;
278278
}
279279

280-
ConcreteDataMatcher DataSpecUtils::asConcreteDataMatcher(InputSpec const& spec)
281-
{
282-
return std::get<ConcreteDataMatcher>(spec.matcher);
283-
}
284-
285-
ConcreteDataMatcher DataSpecUtils::asConcreteDataMatcher(OutputSpec const& spec)
286-
{
287-
return std::get<ConcreteDataMatcher>(spec.matcher);
288-
}
289-
290-
ConcreteDataTypeMatcher DataSpecUtils::asConcreteDataTypeMatcher(OutputSpec const& spec)
291-
{
292-
return std::visit([](auto const& concrete) {
293-
return ConcreteDataTypeMatcher{concrete.origin, concrete.description};
294-
},
295-
spec.matcher);
296-
}
297-
298280
struct MatcherInfo {
299281
header::DataOrigin origin = header::gDataOriginInvalid; // Whether or not we found an origins (should be a bad query!)
300282
header::DataDescription description = header::gDataDescriptionInvalid; // Whether or not we found a description
@@ -383,6 +365,36 @@ MatcherInfo extractMatcherInfo(DataDescriptorMatcher const& top)
383365
return state;
384366
}
385367

368+
ConcreteDataMatcher DataSpecUtils::asConcreteDataMatcher(InputSpec const& spec)
369+
{
370+
return std::visit(overloaded{[](ConcreteDataMatcher const& concrete) {
371+
return concrete;
372+
},
373+
[&binding = spec.binding](DataDescriptorMatcher const& matcher) {
374+
auto info = extractMatcherInfo(matcher);
375+
if (info.hasOrigin && info.hasUniqueOrigin &&
376+
info.hasDescription && info.hasDescription &&
377+
info.hasSubSpec && info.hasUniqueSubSpec) {
378+
return ConcreteDataMatcher{info.origin, info.description, info.subSpec};
379+
}
380+
throw std::runtime_error("Cannot convert " + binding + " to ConcreteDataMatcher");
381+
}},
382+
spec.matcher);
383+
}
384+
385+
ConcreteDataMatcher DataSpecUtils::asConcreteDataMatcher(OutputSpec const& spec)
386+
{
387+
return std::get<ConcreteDataMatcher>(spec.matcher);
388+
}
389+
390+
ConcreteDataTypeMatcher DataSpecUtils::asConcreteDataTypeMatcher(OutputSpec const& spec)
391+
{
392+
return std::visit([](auto const& concrete) {
393+
return ConcreteDataTypeMatcher{concrete.origin, concrete.description};
394+
},
395+
spec.matcher);
396+
}
397+
386398
ConcreteDataTypeMatcher DataSpecUtils::asConcreteDataTypeMatcher(InputSpec const& spec)
387399
{
388400
return std::visit(overloaded{

Framework/Core/test/unittest_DataSpecUtils.cxx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,11 @@ BOOST_AUTO_TEST_CASE(MatchingInputs)
125125
BOOST_CHECK(DataSpecUtils::match(matchingInput2, concreteExample3) == false);
126126
BOOST_CHECK(DataSpecUtils::match(matchingInput2, concreteExample4) == false);
127127

128-
BOOST_CHECK_THROW(DataSpecUtils::asConcreteDataMatcher(matchingInput2), std::bad_variant_access);
128+
BOOST_CHECK_THROW(DataSpecUtils::asConcreteDataMatcher(matchingInput2), std::runtime_error);
129+
auto concrete2 = DataSpecUtils::asConcreteDataMatcher(matchingInput1);
130+
BOOST_CHECK_EQUAL(concrete.origin.as<std::string>(), "TEST");
131+
BOOST_CHECK_EQUAL(concrete.description.as<std::string>(), "FOOO");
132+
BOOST_CHECK_EQUAL(concrete.subSpec, 1);
129133
}
130134

131135
BOOST_AUTO_TEST_CASE(MatchingOutputs)

0 commit comments

Comments
 (0)