51 lines
1.1 KiB
C++
51 lines
1.1 KiB
C++
#pragma once
|
|
#include <cstddef>
|
|
#include "dxxsconf.h"
|
|
|
|
#ifdef DXX_HAVE_CXX14_INTEGER_SEQUENCE
|
|
#include <utility>
|
|
using std::index_sequence;
|
|
#else
|
|
template <std::size_t...>
|
|
struct index_sequence {};
|
|
#endif
|
|
|
|
template <std::size_t, typename, std::size_t, typename>
|
|
struct cat_index_sequence;
|
|
|
|
template <std::size_t... N1, std::size_t A2, std::size_t... N2>
|
|
struct cat_index_sequence<0, index_sequence<N1...>, A2, index_sequence<N2...>>
|
|
{
|
|
typedef index_sequence<N1..., A2 + N2...> type;
|
|
};
|
|
|
|
/* Fan out to reduce template depth */
|
|
template <std::size_t N>
|
|
struct tree_index_sequence
|
|
{
|
|
typedef typename cat_index_sequence<0, typename tree_index_sequence<N / 2>::type, N / 2, typename tree_index_sequence<(N + 1) / 2>::type>::type type;
|
|
};
|
|
|
|
template <>
|
|
struct tree_index_sequence<0>
|
|
{
|
|
typedef index_sequence<> type;
|
|
};
|
|
|
|
template <>
|
|
struct tree_index_sequence<1>
|
|
{
|
|
typedef index_sequence<0> type;
|
|
};
|
|
|
|
#ifdef DXX_HAVE_CXX11_TEMPLATE_ALIAS
|
|
template <std::size_t N>
|
|
using make_tree_index_sequence = typename tree_index_sequence<N>::type;
|
|
#else
|
|
template <std::size_t N>
|
|
static inline constexpr typename tree_index_sequence<N>::type make_tree_index_sequence()
|
|
{
|
|
return {};
|
|
}
|
|
#endif
|