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>
153concept is_filtered_table = requires(T t) { t.isFilteredBase(); };
154
156template <typename T>
158
160template <typename T>
162
164template <typename T>
165concept is_join = requires(T t) { t.isJoin(); };
166
168template <typename T>
169concept is_enumerated_iterator = requires(T t) { t.globalIndex(); };
170
173template <typename T>
174concept with_originals = requires {
175 T::originals.size();
176};
177
179template <typename T>
180concept with_sources = requires {
181 T::sources.size();
182};
183
185template <typename T>
186concept with_sources_generator = requires(T t) {
187 t.generateSources();
188};
189
191template <typename T>
192concept with_ccdb_urls = requires(T t) {
193 t.ccdb_urls.size();
194};
195
197template <typename T>
198concept with_base_table = with_originals<T> && has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>> && requires {
199 typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata::base_table_t;
200};
201
202template <typename T>
203concept with_base_table_ng = not_void<typename T::base_table_t>; // redicrection should be done at the check site
204
206template <typename T>
207concept with_expression_pack = requires {
208 typename T::expression_pack_t{};
209};
210
212template <typename T>
213concept with_index_pack = requires {
214 typename T::index_pack_t{};
215};
216
218template <typename T>
219concept is_smallgroups = requires(T t) { t.isSmallGroups(); };
220} // namespace o2::soa
221
222namespace o2::framework
223{
226template <typename T>
227concept is_preslice_policy = requires(T t) { t.isPreslicePolicy(); };
228
230template <typename T>
231concept is_preslice = requires(T t) { t.isPresliceContainer(); };
232
234template <typename T>
235concept is_preslice_group = requires(T t) { t.isPresliceGroup(); };
236
238template <typename T>
239concept 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>>>;
240
242template <typename T>
243concept is_produces = requires(T t) { typename T::cursor_t; typename T::persistent_table_t; &T::cursor; };
244
246template <typename T>
247concept is_produces_group = requires(T t) { t.isProducesGroup(); };
248
250template <typename T>
251concept 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>;
252
254template <typename T>
255concept 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>;
256
258template <typename T>
259concept is_spawns = requires(T t) {
260 typename T::metadata;
261 typename T::expression_pack_t;
262 t.projector.get();
263};
264
266template <typename T>
267concept is_defines = requires(T t) {
268 typename T::metadata;
269 typename T::placeholders_pack_t;
270 t.projector.get();
271 requires std::same_as<decltype(t.needRecompilation), bool>;
272 t.recompile();
273};
274
276template <typename T>
277concept is_builds = requires(T t) {
278 typename T::metadata;
279 typename T::Key;
280 t.map.size();
281};
282
284template <typename T>
285concept is_outputobj = requires(T t) {
286 &T::setHash;
287 &T::spec;
288 &T::ref;
289 requires std::same_as<decltype(t.operator->()), typename T::obj_t*>;
290 requires std::same_as<decltype(t.object.get()), typename T::obj_t*>;
291};
292
294template <typename T>
295concept is_service = requires(T t) {
296 requires std::same_as<decltype(t.service), typename T::service_t*>;
297 &T::operator->;
298};
299
301template <typename T>
302concept is_partition = requires(T t) {
303 &T::updatePlaceholders;
304 t.mFiltered.get();
305 &T::operator->;
306 requires std::same_as<decltype(t.dataframeChanged), bool>;
307 t.begin();
308 t.end();
309 t.size();
310};
311} // namespace o2::framework
312
313#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