diff --git a/sprout/index_tuple.hpp b/sprout/index_tuple.hpp index aacc7053..356dd0bc 100644 --- a/sprout/index_tuple.hpp +++ b/sprout/index_tuple.hpp @@ -98,32 +98,70 @@ namespace sprout { // index_n // namespace detail { - template< - sprout::index_t I, - std::size_t N, - typename Acc, - bool Break = (N == 0) - > - struct index_n_impl { + template + struct index_n_next; + template + struct index_n_next> { public: - typedef Acc type; + typedef sprout::index_tuple type; }; - template< - sprout::index_t I, - std::size_t N, - sprout::index_t... Indexes + + template + struct index_n_next2; + template + struct index_n_next2, Tail> { + public: + typedef sprout::index_tuple type; + }; + + template + struct index_n_impl; + template + struct index_n_impl< + I, + N, + typename std::enable_if<(N == 0)>::type + > { + public: + typedef sprout::index_tuple<> type; + }; + template + struct index_n_impl< + I, + N, + typename std::enable_if<(N == 1)>::type + > { + public: + typedef sprout::index_tuple type; + }; + template + struct index_n_impl< + I, + N, + typename std::enable_if<(N > 1 && N % 2 == 0)>::type > - struct index_n_impl, false> - : public sprout::detail::index_n_impl > + : public sprout::detail::index_n_next< + typename sprout::detail::index_n_impl::type + > + {}; + template + struct index_n_impl< + I, + N, + typename std::enable_if<(N > 1 && N % 2 == 1)>::type + > + : public sprout::detail::index_n_next2< + typename sprout::detail::index_n_impl::type, + I + > {}; } // namespace detail template< sprout::index_t I, - std::size_t N, - typename Acc = sprout::index_tuple<> + std::size_t N > struct index_n - : public sprout::detail::index_n_impl + : public sprout::detail::index_n_impl {}; } // namespace sprout