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/types.hpp>
18 #include <common/visibility_control.hpp>
19 
20 #include <cstdint>
21 #include <tuple>
22 #include <type_traits>
23 
24 #ifndef COMMON__TYPE_TRAITS_HPP_
25 #define COMMON__TYPE_TRAITS_HPP_
26 
27 namespace autoware
28 {
29 namespace common
30 {
31 namespace type_traits
32 {
33 
44 template<typename T>
45 constexpr inline autoware::common::types::bool8_t COMMON_PUBLIC impossible_branch() noexcept
46 {
47  return sizeof(T) == 0;
48 }
49 
51 template<class QueryT, class TupleT>
52 struct COMMON_PUBLIC index
53 {
54  static_assert(!std::is_same<TupleT, std::tuple<>>::value, "Could not find QueryT in given tuple");
55 };
56 
58 template<class HeadT, class ... Tail>
59 struct COMMON_PUBLIC index<HeadT, std::tuple<HeadT, Tail...>>
60  : std::integral_constant<std::int32_t, 0> {};
61 
63 template<class QueryT, class HeadT, class ... Tail>
64 struct COMMON_PUBLIC index<QueryT, std::tuple<HeadT, Tail...>>
65  : std::integral_constant<std::int32_t, 1 + index<QueryT, std::tuple<Tail...>>::value> {};
66 
78 template<std::size_t I = 0UL, typename Callable, typename ... TypesT>
79 COMMON_PUBLIC inline constexpr typename std::enable_if_t<I == sizeof...(TypesT)>
80 visit(std::tuple<TypesT...> &, Callable) noexcept {}
82 template<std::size_t I = 0UL, typename Callable, typename ... TypesT>
83 COMMON_PUBLIC inline constexpr typename std::enable_if_t<I == sizeof...(TypesT)>
84 visit(const std::tuple<TypesT...> &, Callable) noexcept {}
85 
101 template<std::size_t I = 0UL, typename Callable, typename ... TypesT>
102 COMMON_PUBLIC inline constexpr typename std::enable_if_t<I != sizeof...(TypesT)>
103 visit(std::tuple<TypesT...> & tuple, Callable callable) noexcept
104 {
105  callable(std::get<I>(tuple));
106  visit<I + 1UL, Callable, TypesT...>(tuple, callable);
107 }
109 template<std::size_t I = 0UL, typename Callable, typename ... TypesT>
110 COMMON_PUBLIC inline constexpr typename std::enable_if_t<I != sizeof...(TypesT)>
111 visit(const std::tuple<TypesT...> & tuple, Callable callable) noexcept
112 {
113  callable(std::get<I>(tuple));
114  visit<I + 1UL, Callable, TypesT...>(tuple, callable);
115 }
116 
118 template<class ...>
119 struct COMMON_PUBLIC conjunction : std::true_type {};
121 template<class TraitT>
122 struct COMMON_PUBLIC conjunction<TraitT>: TraitT {};
123 template<class TraitT, class ... TraitsTs>
124 struct COMMON_PUBLIC conjunction<TraitT, TraitsTs...>
125  : std::conditional_t<static_cast<bool>(TraitT::value), conjunction<TraitsTs...>, TraitT> {};
126 
127 
136 template<typename QueryT, typename TupleT>
137 struct has_type;
138 
145 template<typename QueryT>
146 struct has_type<QueryT, std::tuple<>>: std::false_type {};
147 
155 template<typename QueryT, typename HeadT, typename ... TailTs>
156 struct has_type<QueryT, std::tuple<HeadT, TailTs...>>: has_type<QueryT, std::tuple<TailTs...>> {};
157 
165 template<typename QueryT, typename ... TailTs>
166 struct has_type<QueryT, std::tuple<QueryT, TailTs...>>: std::true_type {};
167 
168 
179 template<typename TupleT1, typename TupleT2>
180 struct intersect
181 {
188  template<std::size_t... Indices>
189  static constexpr auto make_intersection(std::index_sequence<Indices...>)
190  {
191  return std::tuple_cat(
192  std::conditional_t<
193  has_type<std::tuple_element_t<Indices, TupleT1>, TupleT2>::value,
194  std::tuple<std::tuple_element_t<Indices, TupleT1>>,
195  std::tuple<>>{} ...);
196  }
198  using type =
199  decltype(make_intersection(std::make_index_sequence<std::tuple_size<TupleT1>::value> {}));
200 };
201 
202 } // namespace type_traits
203 } // namespace common
204 } // namespace autoware
205 
206 #endif // COMMON__TYPE_TRAITS_HPP_
I
OnlineData I
Definition: linear_tire.snippet.hpp:36
types.hpp
This file includes common type definition.
autoware::common::type_traits::conjunction
A class to compute a conjunction over given traits.
Definition: type_traits.hpp:119
autoware::common::type_traits::intersect::make_intersection
static constexpr auto make_intersection(std::index_sequence< Indices... >)
Intersect the types.
Definition: type_traits.hpp:189
autoware::common::types::bool8_t
bool bool8_t
Definition: types.hpp:39
autoware::common::type_traits::conjunction< TraitT >
A conjunction of another type shall derive from that type.
Definition: type_traits.hpp:122
autoware
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24
autoware::common::type_traits::index
Find an index of a type in a tuple.
Definition: type_traits.hpp:52
autoware::common::type_traits::impossible_branch
constexpr autoware::common::types::bool8_t COMMON_PUBLIC impossible_branch() noexcept
A helper function to be used in static_assert to indicate an impossible branch.
Definition: type_traits.hpp:45
autoware::common::type_traits::intersect::type
decltype(make_intersection(std::make_index_sequence< std::tuple_size< TupleT1 >::value > {})) type
The resulting tuple type.
Definition: type_traits.hpp:199
autoware::common::type_traits::has_type
A trait to check if a tuple has a type.
Definition: type_traits.hpp:137
autoware::common::type_traits::intersect
A trait used to intersect types stored in tuples at compile time. The resulting typedef type will hol...
Definition: type_traits.hpp:180
autoware::common::type_traits::visit
constexpr COMMON_PUBLIC std::enable_if_t< I==sizeof...(TypesT)> visit(std::tuple< TypesT... > &, Callable) noexcept
Visit every element in a tuple.
Definition: type_traits.hpp:80