@@ -669,16 +669,39 @@ InputSpec DataSpecUtils::fromMetadataString(std::string s)
669669 if (std::distance (words, std::sregex_iterator ()) != 4 ) {
670670 throw runtime_error_f (" Malformed input spec metadata: %s" , s.c_str ());
671671 }
672- std::vector<std::string> data;
672+ std::array<std::string, 4 > data;
673+ auto pos = 0 ;
673674 for (auto i = words; i != std::sregex_iterator (); ++i) {
674- data.emplace_back (i->str ());
675+ data[pos] = i->str ();
676+ ++pos;
675677 }
676678 char origin[4 ];
677679 char description[16 ];
678680 std::memcpy (&origin, data[1 ].c_str (), 4 );
679681 std::memcpy (&description, data[2 ].c_str (), 16 );
680682 auto version = static_cast <o2::header::DataHeader::SubSpecificationType>(std::atoi (data[3 ].c_str ()));
681- return InputSpec{data[0 ], header::DataOrigin{origin}, header::DataDescription{description}, version, Lifetime::Timeframe};
683+ return {data[0 ], header::DataOrigin{origin}, header::DataDescription{description}, version, Lifetime::Timeframe};
684+ }
685+
686+ ConcreteDataMatcher DataSpecUtils::fromString (std::string s)
687+ {
688+ std::regex word_regex (" (\\ w+)" );
689+ auto words = std::sregex_iterator (s.begin (), s.end (), word_regex);
690+ if (std::distance (words, std::sregex_iterator ()) != 3 ) {
691+ throw runtime_error_f (" Malformed serialized matcher: %s" , s.c_str ());
692+ }
693+ std::array<std::string, 3 > data;
694+ auto pos = 0 ;
695+ for (auto i = words; i != std::sregex_iterator (); ++i) {
696+ data[pos] = i->str ();
697+ ++pos;
698+ }
699+ char origin[4 ];
700+ char description[16 ];
701+ std::memcpy (&origin, data[0 ].c_str (), 4 );
702+ std::memcpy (&description, data[1 ].c_str (), 16 );
703+ auto version = static_cast <o2::header::DataHeader::SubSpecificationType>(std::atoi (data[2 ].c_str ()));
704+ return {header::DataOrigin{origin}, header::DataDescription{description}, version};
682705}
683706
684707std::optional<header::DataOrigin> DataSpecUtils::getOptionalOrigin (InputSpec const & spec)
0 commit comments