Project
Loading...
Searching...
No Matches
Concepts.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
12#ifndef O2_FRAMEWORK_CONCEPTS_H
13#define O2_FRAMEWORK_CONCEPTS_H
14
15#include <Framework/Traits.h>
16#include <cstdint>
17#include <concepts>
18
19namespace o2::aod
20{
21template <uint32_t>
22struct Hash;
25template <typename T>
26concept is_aod_hash = requires(T t) { t.isHash(); };
28template <typename T>
29concept is_origin_hash = requires(T t) { t.isOriginHash(); };
30
31template <typename H>
32struct MetadataTrait;
33} // namespace o2::aod
34
35namespace o2::soa
36{
39template <typename T>
40concept not_void = requires { requires !std::same_as<T, void>; };
41
44template <typename C>
45concept is_persistent_column = requires(C c) { c.isIteratableColumn(); };
46
48template <typename C>
49concept is_self_index_column = requires(C c) {
50 typename C::compatible_signature;
51 // requires aod::is_aod_hash<typename C::compatible_signature>;
52 typename C::self_index_t;
53 requires std::same_as<typename C::self_index_t, std::true_type>;
54};
55
57template <typename C>
58concept is_index_column = requires(C c) {
59 typename C::binding_t;
61};
62
64template <typename T>
65concept is_spawnable_column = std::same_as<typename std::decay_t<T>::spawnable_t, std::true_type>;
66
68template <typename C>
69concept is_indexing_column = requires(C c) { c.isEnumeratingColumn(); };
70
72template <typename C>
73concept is_dynamic_column = requires(C c) { c.isDynamicColumn(); };
74
76template <typename C>
77concept is_marker_column = requires(C c) { c.isMarkingColumn(); };
78
80template <typename T>
82
84template <typename T, typename B>
85concept can_bind = requires(T&& t) {
86 { t.B::mColumnIterator };
87};
88
90template <typename... C>
92
94template <typename T>
95using is_dynamic_t = std::conditional_t<is_dynamic_column<T>, std::true_type, std::false_type>;
96
97template <typename T>
98using is_indexing_t = std::conditional_t<is_indexing_column<T>, std::true_type, std::false_type>;
99
102template <typename T>
104
106template <typename T>
107concept is_metadata_trait = requires(T t) { t.isMetadataTrait(); };
108
110template <typename T>
111concept is_metadata = requires(T t) { t.isTableMetadata(); };
112
114template <typename T>
116
118template <typename T>
120
122template <typename T>
123concept has_configurable_extension = has_extension<T> && requires(T t) { typename std::decay_t<T>::configurable_t; requires std::same_as<std::true_type, typename std::decay_t<T>::configurable_t>; };
124
126template <typename T>
127concept is_table = requires(T t) { t.isSOATable(); };
128
130template <typename T>
131concept is_iterator = requires(T t) { t.isTableIterator(); };
132
134template <typename T>
136
138template <typename T>
139concept is_index_table = requires(T t) {
140 t.isIndexTable();
141};
142
144template <typename T>
145concept has_filtered_policy = not_void<typename std::decay_t<T>::policy_t> && requires { std::decay_t<T>::policy_t::isFilteredIndexPolicy(); };
146
148template <typename T>
150
152template <typename T>
154
156template <typename T>
157concept is_filtered_table = requires(T t) { t.isFilteredBase(); };
158
160template <typename T>
162
164template <typename T>
166
168template <typename T>
169concept is_join = requires(T t) { t.isJoin(); };
170
172template <typename T>
173concept is_enumerated_iterator = requires(T t) { t.globalIndex(); };
174
177template <typename T>
178concept with_originals = requires {
179 T::originals.size();
180};
181
183template <typename T>
184concept with_sources = requires {
185 T::sources.size();
186};
187
189template <typename T>
190concept with_sources_generator = requires(T t) {
191 t.generateSources();
192};
193
195template <typename T>
196concept with_ccdb_urls = requires(T t) {
197 t.ccdb_urls.size();
198};
199
201template <typename T>
202concept with_base_table = with_originals<T> && has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>> && requires {
203 typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata::base_table_t;
204};
205
206template <typename T>
207concept with_base_table_ng = not_void<typename T::base_table_t>; // redicrection should be done at the check site
208
210template <typename T>
211concept with_expression_pack = requires {
212 typename T::expression_pack_t{};
213};
214
216template <typename T>
217concept with_index_pack = requires {
218 typename T::index_pack_t{};
219};
220
222template <typename T>
223concept is_smallgroups = requires(T t) { t.isSmallGroups(); };
224} // namespace o2::soa
225
226namespace o2::framework
227{
230template <typename T>
231concept is_preslice_policy = requires(T t) { t.isPreslicePolicy(); };
232
234template <typename T>
235concept is_preslice = requires(T t) { t.isPresliceContainer(); };
236
238template <typename T>
239concept is_preslice_group = requires(T t) { t.isPresliceGroup(); };
240
242template <typename T>
243concept is_producable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>> || soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::parent_t::ref.desc_hash>>>;
244
246template <typename T>
247concept is_produces = requires(T t) { typename T::cursor_t; typename T::persistent_table_t; &T::cursor; };
248
250template <typename T>
251concept is_produces_group = requires(T t) { t.isProducesGroup(); };
252
254template <typename T>
255concept is_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>> && soa::has_extension<typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata>;
256
258template <typename T>
259concept is_dynamically_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>> && soa::has_configurable_extension<typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata>;
260
262template <typename T>
263concept is_spawns = requires(T t) {
264 typename T::metadata;
265 typename T::expression_pack_t;
266 t.projector.get();
267};
268
270template <typename T>
271concept is_defines = requires(T t) {
272 typename T::metadata;
273 typename T::placeholders_pack_t;
274 t.projector.get();
275 requires std::same_as<decltype(t.needRecompilation), bool>;
276 t.recompile();
277};
278
280template <typename T>
281concept is_builds = requires(T t) {
282 typename T::metadata;
283 typename T::Key;
284 t.map.size();
285};
286
288template <typename T>
289concept is_outputobj = requires(T t) {
290 &T::setHash;
291 &T::spec;
292 &T::ref;
293 requires std::same_as<decltype(t.operator->()), typename T::obj_t*>;
294 requires std::same_as<decltype(t.object.get()), typename T::obj_t*>;
295};
296
298template <typename T>
299concept is_service = requires(T t) {
300 requires std::same_as<decltype(t.service), typename T::service_t*>;
301 &T::operator->;
302};
303
305template <typename T>
306concept is_partition = requires(T t) {
307 &T::updatePlaceholders;
308 t.mFiltered.get();
309 &T::operator->;
310 requires std::same_as<decltype(t.dataframeChanged), bool>;
311 t.begin();
312 t.end();
313 t.size();
314};
315} // namespace o2::framework
316
317#endif // O2_FRAMEWORK_CONCEPTS_H
uint32_t c
Definition RawData.h:2
Defining ITS Vertex explicitly as messageable.
Definition Cartesian.h:288
std::conditional_t< is_indexing_column< T >, std::true_type, std::false_type > is_indexing_t
Definition Concepts.h:98
std::conditional_t< is_dynamic_column< T >, std::true_type, std::false_type > is_dynamic_t
pack filtering helpers
Definition Concepts.h:95