In my opinion, std::make_integer_seq should provide Ο(logN) order (template instantiation depth).
It becomes necessary for the generation of a "large integer sequence".
For example:
using t = make_integer_seq<int, 2000>;
In the simplest implementation of recursion Ο(N), which can not be compiled.
Because maximum depth defined by C++11 is 1024.
- make_integer_seq implementation Ο(N)
----
template<class T, T N, class Seq = integer_seq<T>, bool Break = N == 0>
struct make_integer_seq_impl {
using type = Seq;
};
template<class T, T N, T... I>
struct make_integer_seq_impl<T, N, integer_seq<T, I...>, false>
: make_integer_seq_impl<T, N - 1, integer_seq<T, N - 1, I...>>
{};
template<class T, T N>
using make_integer_seq = typename make_integer_seq_impl<T, N>::type;
----
If implementation of the Ο(logN), can be compiled.
- make_integer_seq implementation Ο(logN)
----
template<class T, typename Seq, T Next>
struct make_integer_seq_next_even;
template<class T, T... I, T Next>
struct make_integer_seq_next_even<T, integer_seq<T, I...>, Next> {
using type = integer_seq<T, I..., (I + Next)...>;
};
template<class T, typename Seq, T Next, T Last>
struct make_integer_seq_next_odd;
template<class T, T... I, T Next, T Last>
struct make_integer_seq_next_odd<T, integer_seq<T, I...>, Next, Last> {
using type = integer_seq<T, I..., (I + Next)..., Last>;
};
template<class T, T N, class Enable = void>
struct make_integer_seq_impl;
template<class T, T N>
struct make_integer_seq_impl<T, N, typename enable_if<(N == 0)>::type> {
using type = integer_seq<T>;
};
template<class T, T N>
struct make_integer_seq_impl<T, N, typename enable_if<(N == 1)>::type> {
using type = integer_seq<T, 0>;
};
template<class T, T N>
struct make_integer_seq_impl<T, N, typename enable_if<(N > 1 && N % 2 == 0)>::type>
: make_integer_seq_next_even<T, typename make_integer_seq_impl<T, N / 2>::type, N / 2>
{};
template<class T, T N>
struct make_integer_seq_impl<T, N, typename enable_if<(N > 1 && N % 2 == 1)>::type>
: make_integer_seq_next_odd<T, typename make_integer_seq_impl<T, N / 2>::type, N / 2, N - 1>
{};
template<class T, T N>
using make_integer_seq = typename make_integer_seq_impl<T, N>::type;
----
Therefore, std::make_integer_seq should be implemented in Ο(logN) order (template recursion depth).
And I think it should be defined as Ο(logN) order by the C++ standard.
It is the benefit for heavy users of template meta-programming, and it will not become to the detriment of other programmers.
My Sprout library provides Ο(logN) ordered index_tuple (the same as make_integer_seq).
The feature's order is very useful for large data computation.