Browse Source

meta: Change complexity of typelist<>::times<> from O(N) to O(logN)

doc
Christos Houtouridis 5 years ago
parent
commit
899efcc2d6
1 changed files with 27 additions and 15 deletions
  1. +27
    -15
      include/utl/meta/typelist.h

+ 27
- 15
include/utl/meta/typelist.h View File

@@ -76,17 +76,29 @@ namespace meta {
} }
// ======= times utility ======= // ======= times utility =======
private: private:
template<size_t N, typename L, typename ...T>
struct times_ { };
template<size_t N, typename ...L>
struct times_<N, typelist<L...>, Ts...> {
// append one and recurse
using type = type_<
if_c <N != 0,
times_<N-1, typelist<L..., Ts...>, Ts...>,
typelist<L...>
>>;
template <typename... > struct cat_ { };
template <typename... L1, typename... L2>
struct cat_<typelist<L1...>, typelist<L2...>> {
using type = typelist<L1..., L2...>;
};
template <size_t N, typename ...T>
struct times_ {
//static_assert( N >= 0, "Cannot make typelist of negative length" );
using type = eval<
cat_<
eval<times_<N/2, T...>>,
eval<times_<N - N/2, T...>>
>
>;
};
template <typename ...T>
struct times_<1, T...> {
using type = typelist<T...>;
};
template <typename ...T>
struct times_<0, T...> {
using type = typelist<>;
}; };
public: public:
/*! /*!
@@ -98,11 +110,11 @@ namespace meta {
* typelist<int, char, int, char> * typelist<int, char, int, char>
* >, "" ); * >, "" );
* \endcode * \endcode
* complexity \f$ O(N) \f$
* complexity \f$ O(logN) \f$
*/ */
template<size_t N> template<size_t N>
using times = type_<
times_<N, typelist<>, Ts...>
using times = eval<
times_<N, Ts...>
>; >;
}; };
@@ -226,7 +238,7 @@ namespace meta {
/*! /*!
* Return the \p N th element in the \c meta::typelist \p List. * Return the \p N th element in the \c meta::typelist \p List.
* *
* Complexity \f$ O(N) \f$.
* Complexity \f$ O(logN) \f$.
*/ */
template <typename List, index_t N> template <typename List, index_t N>
using at_c = eval< using at_c = eval<


Loading…
Cancel
Save