|
15 | 15 | #include "Framework/RuntimeError.h" |
16 | 16 | #include "Headers/DataHeaderHelpers.h" |
17 | 17 |
|
| 18 | +#include <fmt/base.h> |
18 | 19 | #include <fmt/format.h> |
19 | 20 | #include <sstream> |
20 | 21 | #include <cstring> |
21 | 22 | #include <cinttypes> |
22 | 23 | #include <regex> |
| 24 | +#include <stdexcept> |
23 | 25 |
|
24 | 26 | namespace o2::framework |
25 | 27 | { |
@@ -87,39 +89,29 @@ std::string DataSpecUtils::describe(OutputSpec const& spec) |
87 | 89 | spec.matcher); |
88 | 90 | } |
89 | 91 |
|
90 | | -void DataSpecUtils::describe(char* buffer, size_t size, InputSpec const& spec) |
| 92 | +template <HasMatcher T> |
| 93 | +size_t DataSpecUtils::describe(char* buffer, size_t size, T const& spec) |
91 | 94 | { |
92 | | - if (auto concrete = std::get_if<ConcreteDataMatcher>(&spec.matcher)) { |
93 | | - char origin[5]; |
94 | | - origin[4] = 0; |
95 | | - char description[17]; |
96 | | - description[16] = 0; |
97 | | - snprintf(buffer, size, "%s/%s/%" PRIu32, (strncpy(origin, concrete->origin.str, 4), origin), |
98 | | - (strncpy(description, concrete->description.str, 16), description), concrete->subSpec); |
99 | | - } else if (auto matcher = std::get_if<DataDescriptorMatcher>(&spec.matcher)) { |
100 | | - std::ostringstream ss; |
101 | | - ss << "<matcher query: " << *matcher << ">"; |
102 | | - strncpy(buffer, ss.str().c_str(), size - 1); |
103 | | - } else { |
104 | | - throw runtime_error("Unsupported InputSpec"); |
105 | | - } |
| 95 | + auto result = std::visit(overloaded{ |
| 96 | + [buffer, size](ConcreteDataMatcher const& concrete) -> fmt::format_to_n_result<char*> { |
| 97 | + return fmt::format_to_n(buffer, size - 1, "{:.4}/{:.16}/{}", concrete.origin.str, concrete.description.str, concrete.subSpec); |
| 98 | + }, |
| 99 | + [buffer, size](ConcreteDataTypeMatcher const& concrete) -> fmt::format_to_n_result<char*> { |
| 100 | + return fmt::format_to_n(buffer, size - 1, "<matcher query: {}/{}>", concrete.origin, concrete.description); |
| 101 | + }, |
| 102 | + [buffer, size](DataDescriptorMatcher const& matcher) -> fmt::format_to_n_result<char*> { |
| 103 | + std::ostringstream ss; |
| 104 | + ss << "<matcher query: " << matcher << ">"; |
| 105 | + return fmt::format_to_n(buffer, size - 1, "{}", ss.str()); |
| 106 | + }, |
| 107 | + [](...) -> fmt::format_to_n_result<char*> { throw std::runtime_error("Unsupported Input / Output Spec"); } |
| 108 | + }, spec.matcher); |
| 109 | + *result.out = '\0'; |
| 110 | + return result.out - buffer; |
106 | 111 | } |
107 | 112 |
|
108 | | -void DataSpecUtils::describe(char* buffer, size_t size, OutputSpec const& spec) |
109 | | -{ |
110 | | - if (auto concrete = std::get_if<ConcreteDataMatcher>(&spec.matcher)) { |
111 | | - char origin[5]; |
112 | | - origin[4] = 0; |
113 | | - char description[17]; |
114 | | - description[16] = 0; |
115 | | - snprintf(buffer, size, "%s/%s/%" PRIu32, (strncpy(origin, concrete->origin.str, 4), origin), |
116 | | - (strncpy(description, concrete->description.str, 16), description), concrete->subSpec); |
117 | | - } else if (auto concrete = std::get_if<ConcreteDataTypeMatcher>(&spec.matcher)) { |
118 | | - fmt::format_to(buffer, "<matcher query: {}/{}>", concrete->origin, concrete->description); |
119 | | - } else { |
120 | | - throw runtime_error("Unsupported OutputSpec"); |
121 | | - } |
122 | | -} |
| 113 | +template size_t DataSpecUtils::describe(char* buffer, size_t size, InputSpec const& spec); |
| 114 | +template size_t DataSpecUtils::describe(char* buffer, size_t size, OutputSpec const& spec); |
123 | 115 |
|
124 | 116 | std::string DataSpecUtils::label(InputSpec const& spec) |
125 | 117 | { |
|
0 commit comments