types.hpp 1018 B

123456789101112131415161718192021222324252627282930313233
  1. #pragma once
  2. namespace variant { namespace detail {
  3. // Max of a list of values
  4. template <size_t T, size_t... Ts> struct static_max;
  5. template <size_t T> struct static_max<T> {
  6. static const constexpr size_t value = T;
  7. };
  8. template <size_t T1, size_t T2, size_t... Ts>
  9. struct static_max<T1, T2, Ts...> {
  10. static const constexpr size_t value =
  11. T1 > T2 ? static_max<T1, Ts...>::value : static_max<T2, Ts...>::value;
  12. };
  13. // Given a typelist of size N, type_index<F>::value will return the inverted
  14. // offset (i.e. the number of elements that remain after F in the typelist).
  15. template <typename F, typename... Ts> struct type_index;
  16. template <typename F> struct type_index<F> {};
  17. template <typename F, typename T, typename... Ts>
  18. struct type_index<F, T, Ts...> {
  19. static const constexpr size_t value = type_index<F, Ts...>::value;
  20. };
  21. template <typename F, typename... Ts> struct type_index<F, F, Ts...> {
  22. static const constexpr size_t value = sizeof...(Ts);
  23. };
  24. }}