Autoware.Auto
type_traits.hpp
Go to the documentation of this file.
1 // Copyright 2021 Apex.AI, Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // Developed by Apex.AI, Inc.
16 
17 #include <common/visibility_control.hpp>
18 
19 #include <cstdint>
20 #include <tuple>
21 #include <type_traits>
22 
23 #ifndef COMMON__TYPE_TRAITS_HPP_
24 #define COMMON__TYPE_TRAITS_HPP_
25 
26 namespace autoware
27 {
28 namespace common
29 {
30 namespace type_traits
31 {
33 template<class QueryT, class TupleT>
34 struct COMMON_PUBLIC index
35 {
36  static_assert(!std::is_same<TupleT, std::tuple<>>::value, "Could not find QueryT in given tuple");
37 };
38 
40 template<class HeadT, class ... Tail>
41 struct COMMON_PUBLIC index<HeadT, std::tuple<HeadT, Tail...>>
42  : std::integral_constant<std::int32_t, 0> {};
43 
45 template<class QueryT, class HeadT, class ... Tail>
46 struct COMMON_PUBLIC index<QueryT, std::tuple<HeadT, Tail...>>
47  : std::integral_constant<std::int32_t, 1 + index<QueryT, std::tuple<Tail...>>::value> {};
48 
60 template<std::size_t I = 0UL, typename Callable, typename ... TypesT>
61 COMMON_PUBLIC inline typename std::enable_if_t<I == sizeof...(TypesT)>
62 visit(std::tuple<TypesT...> &, Callable) {}
64 template<std::size_t I = 0UL, typename Callable, typename ... TypesT>
65 COMMON_PUBLIC inline typename std::enable_if_t<I == sizeof...(TypesT)>
66 visit(const std::tuple<TypesT...> &, Callable) {}
67 
83 template<std::size_t I = 0UL, typename Callable, typename ... TypesT>
84 COMMON_PUBLIC inline typename std::enable_if_t<I != sizeof...(TypesT)>
85 visit(std::tuple<TypesT...> & tuple, Callable callable)
86 {
87  callable(std::get<I>(tuple));
88  visit<I + 1UL, Callable, TypesT...>(tuple, callable);
89 }
91 template<std::size_t I = 0UL, typename Callable, typename ... TypesT>
92 COMMON_PUBLIC inline typename std::enable_if_t<I != sizeof...(TypesT)>
93 visit(const std::tuple<TypesT...> & tuple, Callable callable)
94 {
95  callable(std::get<I>(tuple));
96  visit<I + 1UL, Callable, TypesT...>(tuple, callable);
97 }
98 
100 template<class ...>
101 struct COMMON_PUBLIC conjunction : std::true_type {};
103 template<class TraitT>
104 struct COMMON_PUBLIC conjunction<TraitT>: TraitT {};
105 template<class TraitT, class ... TraitsTs>
106 struct COMMON_PUBLIC conjunction<TraitT, TraitsTs...>
107  : std::conditional_t<static_cast<bool>(TraitT::value), conjunction<TraitsTs...>, TraitT> {};
108 
109 } // namespace type_traits
110 } // namespace common
111 } // namespace autoware
112 
113 #endif // COMMON__TYPE_TRAITS_HPP_
A class to compute a conjunction over given traits.
Definition: type_traits.hpp:101
Find an index of a type in a tuple.
Definition: type_traits.hpp:34
OnlineData I
Definition: linear_tire.snippet.hpp:36
A conjunction of another type shall derive from that type.
Definition: type_traits.hpp:104
COMMON_PUBLIC std::enable_if_t< I==sizeof...(TypesT)> visit(std::tuple< TypesT... > &, Callable)
Visit every element in a tuple.
Definition: type_traits.hpp:62
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24