Project
Loading...
Searching...
No Matches
DataSpecUtils.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11#ifndef FRAMEWORK_DATASPECUTILS_H
12#define FRAMEWORK_DATASPECUTILS_H
13
15#include "Framework/InputSpec.h"
16#include "Headers/DataHeader.h"
17#include "Framework/Output.h"
18
19#include <optional>
20
21namespace o2::framework
22{
23
24template <typename T>
25concept HasMatcher = requires(T& t) { t.matcher; };
26
29 static bool match(InputSpec const& spec, ConcreteDataMatcher const& target);
30
32 static bool match(InputSpec const& spec, ConcreteDataTypeMatcher const& target);
33
37 static bool match(OutputSpec const& left, OutputSpec const& right);
38
40 static bool match(OutputSpec const& spec, ConcreteDataMatcher const& target);
41
43 static bool match(InputSpec const& input, OutputSpec const& output);
44
45 static bool match(const InputSpec& spec,
46 const o2::header::DataOrigin& origin,
47 const o2::header::DataDescription& description,
49
50 static bool match(const OutputSpec& spec,
51 const o2::header::DataOrigin& origin,
52 const o2::header::DataDescription& description,
54
55 static bool match(const InputSpec& spec, o2::header::DataHeader const& dh)
56 {
58 }
59
60 static bool match(const OutputSpec& spec, o2::header::DataHeader const& dh)
61 {
63 }
64
67 template <typename ContainerT>
68 static std::optional<typename ContainerT::value_type> find(ContainerT const& container,
69 const o2::header::DataOrigin& origin,
70 const o2::header::DataDescription& description,
72 {
73 for (auto const& spec : container) {
74 if (match(spec, origin, description, subSpec)) {
75 return std::make_optional<typename ContainerT::value_type>(spec);
76 }
77 }
78 return std::nullopt;
79 }
80
82 static bool partialMatch(InputSpec const& spec, o2::header::DataOrigin const& origin);
83
85 template <size_t N>
86 static bool partialMatch(InputSpec const& spec, std::array<header::DataOrigin, N> const& origins)
87 {
88 return std::find_if(origins.begin(), origins.end(), [&](auto const& o) { return DataSpecUtils::asConcreteOrigin(spec) == o; }) != origins.end();
89 }
90
92 static bool partialMatch(OutputSpec const& spec, o2::header::DataOrigin const& origin);
93
95 template <size_t N>
96 static bool partialMatch(OutputSpec const& spec, std::array<header::DataOrigin, N> const& origins)
97 {
98 auto dataType = DataSpecUtils::asConcreteDataTypeMatcher(spec);
99 return std::find_if(origins.begin(), origins.end(), [&](auto const& o) { return dataType.origin == o; }) != origins.end();
100 }
101
103 static bool partialMatch(InputSpec const& spec, o2::header::DataDescription const& description);
104
106 static bool partialMatch(OutputSpec const& spec, o2::header::DataDescription const& description);
107
108 template <typename T>
109 static bool match(const T& spec, const o2::header::DataHeader& header)
110 {
111 return DataSpecUtils::match(spec,
112 header.dataOrigin,
113 header.dataDescription,
114 header.subSpecification);
115 }
116
121 static std::string describe(InputSpec const& spec);
122
128 static std::string describe(OutputSpec const& spec);
129
132 static std::string label(InputSpec const& spec);
133
136 static std::string label(OutputSpec const& spec);
137
140 static std::string restEndpoint(InputSpec const& spec);
141
148
150 static bool validate(InputSpec const& input);
151
153 static bool validate(OutputSpec const& output);
154
156 template <HasMatcher T>
157 static size_t describe(char* buffer, size_t size, T const& spec);
158
163
169
173 static std::optional<ConcreteDataMatcher> asOptionalConcreteDataMatcher(OutputSpec const& spec);
174
180
186
192
198
205 static OutputSpec asOutputSpec(InputSpec const& spec);
206
209 static InputSpec matchingInput(OutputSpec const& spec);
210
212 static InputSpec fromMetadataString(std::string s);
213
215 static std::optional<header::DataOrigin> getOptionalOrigin(InputSpec const& spec);
216
218 static std::optional<header::DataDescription> getOptionalDescription(InputSpec const& spec);
219
221 static std::optional<header::DataHeader::SubSpecificationType> getOptionalSubSpec(OutputSpec const& spec);
222
224 static std::optional<header::DataHeader::SubSpecificationType> getOptionalSubSpec(InputSpec const& spec);
225
228
231
234
237
240 static std::optional<framework::ConcreteDataMatcher> optionalConcreteDataMatcherFrom(data_matcher::DataDescriptorMatcher const& matcher);
241
243 static bool includes(const InputSpec& left, const InputSpec& right);
244
246 static void updateInputList(std::vector<InputSpec>& list, InputSpec&& input);
247
249 static void updateOutputList(std::vector<OutputSpec>& list, OutputSpec&& input);
250};
251
252} // namespace o2::framework
253
254#endif // FRAMEWORK_DATASPECUTILS_H
bool o
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
GLuint buffer
Definition glcorearb.h:655
GLsizeiptr size
Definition glcorearb.h:659
GLdouble GLdouble right
Definition glcorearb.h:4077
GLenum target
Definition glcorearb.h:1641
GLuint GLsizei const GLchar * label
Definition glcorearb.h:2519
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
Definition list.h:40
static std::optional< ConcreteDataMatcher > asOptionalConcreteDataMatcher(OutputSpec const &spec)
static bool partialMatch(InputSpec const &spec, o2::header::DataOrigin const &origin)
static InputSpec fromMetadataString(std::string s)
Create an InputSpec from metadata string.
static std::string describe(InputSpec const &spec)
static void updateOutputList(std::vector< OutputSpec > &list, OutputSpec &&input)
Updates list of OutputSpecs by merging metadata (or adding output).
static bool match(const T &spec, const o2::header::DataHeader &header)
static ConcreteDataTypeMatcher asConcreteDataTypeMatcher(OutputSpec const &spec)
static bool validate(InputSpec const &input)
static bool partialMatch(OutputSpec const &spec, std::array< header::DataOrigin, N > const &origins)
static std::optional< typename ContainerT::value_type > find(ContainerT const &container, const o2::header::DataOrigin &origin, const o2::header::DataDescription &description, const o2::header::DataHeader::SubSpecificationType &subSpec)
static bool match(const InputSpec &spec, o2::header::DataHeader const &dh)
static ConcreteDataMatcher asConcreteDataMatcher(InputSpec const &input)
static std::optional< header::DataHeader::SubSpecificationType > getOptionalSubSpec(OutputSpec const &spec)
Get the subspec, if available.
static InputSpec matchingInput(OutputSpec const &spec)
static data_matcher::DataDescriptorMatcher dataDescriptorMatcherFrom(ConcreteDataMatcher const &concrete)
Build a DataDescriptMatcher which does not care about the subSpec.
static std::optional< framework::ConcreteDataMatcher > optionalConcreteDataMatcherFrom(data_matcher::DataDescriptorMatcher const &matcher)
static std::string restEndpoint(InputSpec const &spec)
static bool match(const OutputSpec &spec, o2::header::DataHeader const &dh)
static std::optional< header::DataDescription > getOptionalDescription(InputSpec const &spec)
Get the description, if available.
static std::optional< header::DataOrigin > getOptionalOrigin(InputSpec const &spec)
Get the origin, if available.
static void updateMatchingSubspec(InputSpec &in, header::DataHeader::SubSpecificationType subSpec)
static bool includes(const InputSpec &left, const InputSpec &right)
Checks if left includes right (or is equal to)
static header::DataOrigin asConcreteOrigin(InputSpec const &spec)
static void updateInputList(std::vector< InputSpec > &list, InputSpec &&input)
Updates list of InputSpecs by merging metadata.
static header::DataDescription asConcreteDataDescription(InputSpec const &spec)
static bool partialMatch(InputSpec const &spec, std::array< header::DataOrigin, N > const &origins)
static OutputSpec asOutputSpec(InputSpec const &spec)
static bool match(InputSpec const &spec, ConcreteDataMatcher const &target)
the main header struct
Definition DataHeader.h:618
DataDescription dataDescription
Definition DataHeader.h:636
SubSpecificationType subSpecification
Definition DataHeader.h:656
uint32_t SubSpecificationType
Definition DataHeader.h:620