repr 0.1
Reconstructable string representations and more
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
pack.h
Go to the documentation of this file.
#pragma once
#include <cstddef>
#include <utility>
#include "pack_generated.h"
namespace librepr::pack {
template <typename T, typename T2>
struct Merge;
template <template <typename...> class List, typename... T1, typename... T2>
struct Merge<List<T1...>, List<T2...>> {
using type = List<T1..., T2...>;
};
template <std::size_t Idx, typename T>
struct Split;
template <std::size_t Idx, template <typename...> class List, typename... Ts>
requires(Idx == sizeof...(Ts))
using head = List<Ts...>;
using tail = List<>;
};
template <std::size_t Idx, template <typename...> class List, typename... Ts>
requires(Idx > MAX_SPEC)
struct Split<Idx, List<Ts...>> {
#if LIBREPR_HAS_BUILTIN(__type_pack_element)
using type = __type_pack_element<Idx, Ts...>;
constexpr static auto do_slice(std::index_sequence<indices...>) noexcept
using tail = decltype(do_slice<Idx + 1>(std::make_index_sequence<sizeof...(Ts) - (Idx + 1)>{}));
#else
using first_page = Split<MAX_SPEC, List<Ts...>>;
using recurse = Split<Idx - (MAX_SPEC + 1), typename first_page::tail>;
using tail = typename recurse::tail;
using type = typename recurse::type;
#endif
};
namespace detail {
template <template <auto...> class List, typename T>
struct UnwrapValue;
template <template <auto...> class ValueList, template <typename...> class TypeList, typename... Ts>
using type = ValueList<Ts::value...>;
};
template <typename, template <typename...> class>
struct ReBoxImpl;
template <template <typename...> class From, typename... Args, template <typename...> class To>
struct ReBoxImpl<From<Args...>, To> {
using type = To<Args...>;
};
template <typename, template <auto...> class>
struct ReBoxVImpl;
template <template <auto...> class From, auto... Args, template <auto...> class To>
struct ReBoxVImpl<From<Args...>, To> {
using type = To<Args...>;
};
} // namespace detail
template <auto V>
struct ValueWrapper {
constexpr static decltype(V) value = V;
};
template <template <typename...> class List, auto... Vs>
template <template <auto...> class List, typename T>
template <typename T, template <typename...> class To>
template <typename T, template <auto...> class To>
template <std::size_t Idx, typename T>
using get = typename Split<Idx, T>::type;
} // namespace librepr::pack