5 #ifndef LODESTAR_ANY_HPP
6 #define LODESTAR_ANY_HPP
11 #include "DynamicDataTypes.hpp"
12 #include "TemplateTraits.hpp"
24 template<
typename... TTypes>
27 static constexpr T max(
const T &a,
const T &b)
33 template<
typename T,
typename... Ts>
35 static const size_t value = max(
sizeof(T),
36 max_size<Ts...>::value);
41 static const size_t value =
sizeof(T);
45 char data[max_size<TTypes...>::value];
48 template<
typename T,
typename... Ts>
51 template<
typename T,
typename... Ts>
52 struct get_index<T, T, Ts...>
53 : std::integral_constant<std::size_t, 0> {
54 static constexpr
bool conclusive =
true;
57 template<
typename T,
typename Tail,
typename... Ts>
58 struct get_index<T, Tail, Ts...>
59 : std::integral_constant<std::size_t,
60 1 + get_index<T, Ts...>::value> {
61 static constexpr
bool conclusive =
true;
65 struct get_index<T> : std::integral_constant<std::size_t, 0> {
66 static constexpr
bool conclusive =
false;
72 : currentType(), data(),
76 DynamicDataTypes::Types tags[
sizeof...(TTypes)];
78 DynamicDataTypes::Types tag()
const
80 return tags[currentType];
86 template<
typename TType,
typename std::enable_if<get_index<TType, TTypes...>::conclusive,
bool>::type =
true>
88 currentType(get_index<TType, TTypes...>::value)
90 auto ptr =
reinterpret_cast<const char *
>(&x);
91 std::copy(ptr, ptr +
sizeof(TType), data);
94 template<
typename TType,
typename std::enable_if<!get_index<TType, TTypes...>::conclusive,
bool>::type =
true>
96 currentType(get_index<TType, TTypes...>::value)
98 static_assert(get_index<TType, TTypes...>::conclusive,
102 template<
typename TType,
typename std::enable_if<get_index<TType, TTypes...>::conclusive,
bool>::type =
true>
103 const TType &operator=(
const TType &x)
105 currentType = get_index<TType, TTypes...>::value;
106 auto ptr =
reinterpret_cast<const char *
>(&x);
107 std::copy(ptr, ptr +
sizeof(TType), data);
111 template<
typename TType,
typename std::enable_if<!get_index<TType, TTypes...>::conclusive,
bool>::type =
true>
112 const TType &operator=(
const TType &x)
114 static_assert(get_index<TType, TTypes...>::conclusive,
119 template<
typename TType>
122 auto res = get_index<TType, TTypes...>{};
124 return currentType == res.value;
129 template<
typename TType>
134 throw std::runtime_error(
"Requested type is not contained");
136 return *
reinterpret_cast<TType *
>(data);
139 template<
typename TType>
140 const TType &as()
const
144 throw std::runtime_error(
"Requested type is not contained");
146 return *
reinterpret_cast<const TType *
>(data);
149 template<
typename TType>
154 x = *
reinterpret_cast<TType *
>(data);
158 template<
typename TType>
159 bool anyConvertible()
161 return TemplateTraits::anyConvertible<TType, TTypes...>::value;
167 #endif //LODESTAR_ANY_HPP