NGen
Loading...
Searching...
No Matches
traits.hpp
1#ifndef NGEN_UTILITIES_TRAITS_HPP
2#define NGEN_UTILITIES_TRAITS_HPP
3
4#include <type_traits>
5#include <boost/variant.hpp>
6
7namespace ngen {
8namespace traits {
9
10template<bool...>
12{};
13
14template<bool B>
15using bool_constant = std::integral_constant<bool, B>;
16
17// a C++17 conjunction impl
18template<bool... Bs>
19using conjunction = std::is_same<bool_pack<true, Bs...>, bool_pack<Bs..., true>>;
20
21// a C++17 disjunction impl
22template<bool... Bs>
23using disjunction = bool_constant<!conjunction<!Bs...>::value>;
24
31template<typename T, typename... Ts>
33
40template<typename To, typename... From>
42
49template<typename From, typename... To>
51
58template<typename T, typename... Ts>
60
61template<typename... Ts>
62struct type_list{
71 using variant_scalar = boost::variant<Ts...>;
72
83 template<template<typename> class Container>
84 using variant_container = boost::variant<Container<Ts>...>;
85
93 template<typename S>
95
102 template<typename S, typename Tp>
103 using enable_if_supports = std::enable_if_t<is_supported<S>::value, Tp>;
104};
105
106} // namespace traits
107} // namespace ngen
108
109#endif // NGEN_IO_TRAITS_HPP
disjunction< std::is_convertible< From, To >::value... > is_convertible_to_any
Checks that {From} is convertible to any types in {To}.
Definition traits.hpp:50
std::integral_constant< bool, B > bool_constant
Definition traits.hpp:15
bool_constant<!conjunction<!Bs... >::value > disjunction
Definition traits.hpp:23
disjunction< std::is_same< T, Ts >::value... > is_same_to_any
Checks that {T} is the same as at least one of {Ts}.
Definition traits.hpp:59
conjunction< std::is_same< Ts, T >::value... > all_is_same
Check that all types {Ts} are the same as {T}.
Definition traits.hpp:32
conjunction< std::is_convertible< From, To >::value... > all_is_convertible
Checks that all types {From} are convertible to {T}.
Definition traits.hpp:41
std::is_same< bool_pack< true, Bs... >, bool_pack< Bs..., true > > conjunction
Definition traits.hpp:19
Definition DomainLayer.hpp:9
Definition traits.hpp:12
Definition traits.hpp:62
boost::variant< Ts... > variant_scalar
Provides a type alias for a boost::variant containing the types of this type list.
Definition traits.hpp:71
boost::variant< Container< Ts >... > variant_container
Like variant_scalars, but for container types.
Definition traits.hpp:84
is_convertible_to_any< S, Ts... > is_supported
Semantically, we define that a type is supported if it's convertible to (not necessarily the same as)...
Definition traits.hpp:94
std::enable_if_t< is_supported< S >::value, Tp > enable_if_supports
Used for SFINAE.
Definition traits.hpp:103