Project
Loading...
Searching...
No Matches
CheckTypes.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 O2_FRAMEWORK_CHECKTYPES_H_
12#define O2_FRAMEWORK_CHECKTYPES_H_
13
14#include <algorithm>
15#include <type_traits>
16#include "CompilerBuiltins.h"
17
18namespace o2::framework
19{
20
23template <typename, typename = void>
24constexpr bool is_type_complete_v = false;
25
26template <typename T>
27constexpr bool is_type_complete_v<T, std::void_t<decltype(sizeof(T))>> = true;
28
32template <typename T, typename TDefined, typename TUndefined>
33void call_if_defined_full(TDefined&& onDefined, TUndefined&& onUndefined)
34{
35 if constexpr (is_type_complete_v<T>) {
36 onDefined(static_cast<T*>(nullptr));
37 } else {
38 onUndefined();
39 }
40}
41
45template <typename T, typename TDefined, typename TUndefined>
46T call_if_defined_full_forward(TDefined&& onDefined, TUndefined&& onUndefined)
47{
48 if constexpr (is_type_complete_v<T>) {
49 return std::move(onDefined(static_cast<T*>(nullptr)));
50 } else {
51 return onUndefined();
52 }
53}
54
55template <typename T, typename TDefined>
56void call_if_defined(TDefined&& onDefined)
57{
58 call_if_defined_full<T>(onDefined, []() -> void {});
59}
60
61template <typename T, typename TDefined>
62T call_if_defined_forward(TDefined&& onDefined)
63{
64 return std::move(call_if_defined_full_forward<T>(onDefined, []() -> T&& { O2_BUILTIN_UNREACHABLE(); }));
65}
66
67} // namespace o2::framework
68
69#endif // O2_FRAMEWORK_CHECKTYPES_H_
#define O2_BUILTIN_UNREACHABLE
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
void call_if_defined_full(TDefined &&onDefined, TUndefined &&onUndefined)
Definition CheckTypes.h:33
T call_if_defined_forward(TDefined &&onDefined)
Definition CheckTypes.h:62
constexpr bool is_type_complete_v
Definition CheckTypes.h:24
T call_if_defined_full_forward(TDefined &&onDefined, TUndefined &&onUndefined)
Definition CheckTypes.h:46
void call_if_defined(TDefined &&onDefined)
Definition CheckTypes.h:56