25#ifndef __JOIN_TRAITS_HPP__
26#define __JOIN_TRAITS_HPP__
31#include <bits/enable_special_members.h>
55 template <std::
size_t I>
79 template <
typename... Ts>
94 template <
typename First,
typename... Ts>
105 template <
typename... Ts>
108 using overload <Ts...> ::operator();
116 template <
typename T,
typename... Ts>
122 template <
typename T,
typename... Ts>
130 template <
typename T,
typename First,
typename... Ts>
131 struct find_index <T, First, Ts...> : std::integral_constant <std::size_t, std::is_same <T, First>::value ? 0 : find_index <T, Ts...>::value + 1>
138 template <std::size_t I,
typename T,
typename... Ts>
147 template <
typename T,
typename... Ts>
156 template <std::size_t I,
typename... Ts>
162 template <std::
size_t I,
typename T>
165 using type = std::add_const_t <find_element_t <I, T>>;
171 template <std::
size_t I,
typename T>
174 using type = std::add_volatile_t <find_element_t <I, T>>;
180 template <std::
size_t I,
typename T>
183 using type = std::add_cv_t <find_element_t <I, T>>;
189 template <
typename T,
typename... Ts>
197 template <
typename T,
typename First,
typename... Ts>
198 struct is_alternative <T, First, Ts...> : std::integral_constant <bool, std::is_same <T, First>::value || is_alternative <T, Ts...>::value>
205 template <std::size_t I,
typename... Ts>
206 struct is_index : std::integral_constant <bool, I < sizeof... (Ts)>
213 template <typename T, typename... Ts>
214 struct count : std::integral_constant <std::size_t, 0>
221 template <typename T, typename First, typename... Ts>
222 struct count <T, First, Ts...> : std::integral_constant <std::size_t, count <T, Ts...>::value + std::is_same <T, First>::value>
229 template <typename T, typename... Ts>
230 struct is_unique : std::integral_constant <bool, count <T, Ts...>::value == 1>
237 template <bool... Ts>
238 using all = std::is_same <std::integer_sequence <bool, true, Ts...>, std::integer_sequence <bool, Ts..., true>>;
243 template <typename... Ts>
244 struct are_copy_constructible : std::integral_constant <bool, all <std::is_copy_constructible <Ts>::value...>::value>
251 template <typename... Ts>
252 struct are_move_constructible : std::integral_constant <bool, all <std::is_move_constructible <Ts>::value...>::value>
259 template <typename... Ts>
260 struct are_copy_assignable : std::integral_constant <bool, are_copy_constructible <Ts...>::value &&
261 are_move_constructible <Ts...>::value && all <std::is_copy_assignable <Ts>::value...>::value>
268 template <typename... Ts>
269 struct are_move_assignable : std::integral_constant <bool, are_move_constructible <Ts...>::value &&
270 all <std::is_move_assignable <Ts>::value...>::value>
277 struct EnableDefaultTag
279 explicit constexpr EnableDefaultTag () = default;
285 template <bool _Switch, typename _Tag = void>
288 constexpr EnableDefault () noexcept = default;
289 constexpr EnableDefault (EnableDefault const&) noexcept = default;
290 constexpr EnableDefault (EnableDefault&&) noexcept = default;
291 constexpr explicit EnableDefault (EnableDefaultTag) {}
292 EnableDefault& operator= (EnableDefault const&) noexcept = default;
293 EnableDefault& operator= (EnableDefault&&) noexcept = default;
299 template <typename _Tag>
300 struct EnableDefault <false, _Tag>
302 constexpr EnableDefault () noexcept = delete;
303 constexpr EnableDefault (EnableDefault const&) noexcept = default;
304 constexpr EnableDefault (EnableDefault&&) noexcept = default;
305 constexpr explicit EnableDefault (EnableDefaultTag) {}
306 EnableDefault& operator= (EnableDefault const&) noexcept = default;
307 EnableDefault& operator= (EnableDefault&&) noexcept = default;
Definition acceptor.hpp:32
typename identity< T >::type identity_t
return type unchanged.
Definition traits.hpp:74
typename find_element< I, Ts... >::type find_element_t
get element type in a parameter pack according its position.
Definition traits.hpp:157
typename std::result_of_t< overload< Ts... >(T)>::type match_t
find a type that match one of the alternatives of a parameter pack.
Definition traits.hpp:117
T type
Definition traits.hpp:150
std::add_const_t< find_element_t< I, T > > type
Definition traits.hpp:165
std::add_cv_t< find_element_t< I, T > > type
Definition traits.hpp:183
std::add_volatile_t< find_element_t< I, T > > type
Definition traits.hpp:174
get element type in a parameter pack according its position.
Definition traits.hpp:140
typename find_element< I - 1, Ts... >::type type
Definition traits.hpp:141
get element position in a parameter pack according its type.
Definition traits.hpp:124
return type unchanged.
Definition traits.hpp:66
T type
Definition traits.hpp:67
disambiguation tag to indicate that the contained object should be constructed in-place.
Definition traits.hpp:57
in_place_index_t()=default
disambiguation tag to indicate that the contained object should be constructed in-place.
Definition traits.hpp:39
disambiguation tag to indicate that the contained object should be constructed in-place.
Definition traits.hpp:48
in_place_type_t()=default
check if a type exists in a parameter pack.
Definition traits.hpp:191
identity< First > operator()(First) const
identity< void > operator()() const
overload resolution.
Definition traits.hpp:80