mirror of
https://github.com/boostorg/container.git
synced 2025-08-03 06:24:26 +02:00
Make build_number_seq with O(logN) instantiations instead of O(N)
This commit is contained in:
@@ -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 {
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user