Make build_number_seq with O(logN) instantiations instead of O(N)

This commit is contained in:
Ion Gaztañaga
2016-11-12 19:07:34 +01:00
parent 0a719901b6
commit 1f3174baa7

View File

@@ -136,21 +136,25 @@ typename get_impl<I, tuple<Values...> >::const_type get(const tuple<Values...>&
// in a function call. // in a function call.
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
template<std::size_t ... Indexes> template<std::size_t...> struct index_tuple{ typedef index_tuple type; };
struct index_tuple{};
template<std::size_t Num, typename Tuple = index_tuple<> > template<class S1, class S2> struct concat_index_tuple;
struct build_number_seq;
template<std::size_t Num, std::size_t ... Indexes> template<std::size_t... I1, std::size_t... I2>
struct build_number_seq<Num, index_tuple<Indexes...> > struct concat_index_tuple<index_tuple<I1...>, index_tuple<I2...>>
: build_number_seq<Num - 1, index_tuple<Indexes..., sizeof...(Indexes)> > : index_tuple<I1..., (sizeof...(I1)+I2)...>{};
template<std::size_t N> struct build_number_seq;
template<std::size_t N>
struct build_number_seq
: concat_index_tuple<typename build_number_seq<N/2>::type
,typename build_number_seq<N - N/2 >::type
>::type
{}; {};
template<std::size_t ... Indexes> template<> struct build_number_seq<0> : index_tuple<>{};
struct build_number_seq<0, index_tuple<Indexes...> > template<> struct build_number_seq<1> : index_tuple<0>{};
{ typedef index_tuple<Indexes...> type; };
}}} //namespace boost { namespace container { namespace container_detail { }}} //namespace boost { namespace container { namespace container_detail {