mirror of
https://github.com/boostorg/iterator.git
synced 2025-05-11 13:33:56 +00:00
Use variadic template expansion in min category deduction in zip_iterator.
This results in marginally faster compile times in modern code bases where tuples are variadic.
This commit is contained in:
parent
aadd90df45
commit
8c2fdf6053
@ -107,15 +107,6 @@ struct is_trailing_null_type< tuples::null_type > : std::true_type {};
|
|||||||
template< >
|
template< >
|
||||||
struct is_trailing_null_type< fusion::void_ > : std::true_type {};
|
struct is_trailing_null_type< fusion::void_ > : std::true_type {};
|
||||||
|
|
||||||
// The trait checks if the tail is either an empty type list or begins with a "null" type, which indicates that the rest
|
|
||||||
// of the types in the tail are unused
|
|
||||||
template< typename... Tail >
|
|
||||||
struct is_tail_empty;
|
|
||||||
template< >
|
|
||||||
struct is_tail_empty< > : std::true_type {};
|
|
||||||
template< typename Front, typename... Tail >
|
|
||||||
struct is_tail_empty< Front, Tail... > : detail::is_trailing_null_type< Front > {};
|
|
||||||
|
|
||||||
// Metafunction to obtain the type of the tuple whose element types
|
// Metafunction to obtain the type of the tuple whose element types
|
||||||
// are the reference types of an iterator tuple.
|
// are the reference types of an iterator tuple.
|
||||||
template< typename IteratorTuple >
|
template< typename IteratorTuple >
|
||||||
@ -161,30 +152,28 @@ struct minimum_traversal_category_in_iterator_list;
|
|||||||
template< typename IteratorList >
|
template< typename IteratorList >
|
||||||
using minimum_traversal_category_in_iterator_list_t = typename minimum_traversal_category_in_iterator_list< IteratorList >::type;
|
using minimum_traversal_category_in_iterator_list_t = typename minimum_traversal_category_in_iterator_list< IteratorList >::type;
|
||||||
|
|
||||||
|
template< template< typename... > class List, typename... Iterators >
|
||||||
|
struct minimum_traversal_category_in_iterator_list< List< Iterators... > >
|
||||||
|
{
|
||||||
|
// Note: non-variadic Boost.Tuple and Boost.Fusion need special handling
|
||||||
|
// to avoid instantiating iterator traits on the trailing "null" types.
|
||||||
|
// For such types just use random_access_traversal_tag, which will not
|
||||||
|
// affect the result of min_category.
|
||||||
|
using type = min_category_t<
|
||||||
|
mp11::mp_eval_if<
|
||||||
|
detail::is_trailing_null_type< Iterators >,
|
||||||
|
random_access_traversal_tag,
|
||||||
|
pure_iterator_traversal_t, Iterators
|
||||||
|
>...
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
template< typename FrontTraversal, typename Tail >
|
template< typename FrontTraversal, typename Tail >
|
||||||
using minimum_traversal_category_in_tail_t = min_category_t<
|
using minimum_traversal_category_in_tail_t = min_category_t<
|
||||||
FrontTraversal,
|
FrontTraversal,
|
||||||
minimum_traversal_category_in_iterator_list_t< Tail >
|
minimum_traversal_category_in_iterator_list_t< Tail >
|
||||||
>;
|
>;
|
||||||
|
|
||||||
template< template< typename... > class List, typename Front, typename... Tail >
|
|
||||||
struct minimum_traversal_category_in_iterator_list< List< Front, Tail... > >
|
|
||||||
{
|
|
||||||
using front_traversal = pure_iterator_traversal_t< Front >;
|
|
||||||
|
|
||||||
// Note: non-variadic Boost.Tuple and Boost.Fusion need special handling
|
|
||||||
// to avoid instantiating iterator traits on the trailing "null" types.
|
|
||||||
// Note 2: we rename the List to mp_list in the process of iteration to
|
|
||||||
// avoid specifying one template parameter to std::pair, if List is std::pair.
|
|
||||||
using type = mp11::mp_eval_if<
|
|
||||||
detail::is_tail_empty< Tail... >,
|
|
||||||
front_traversal,
|
|
||||||
minimum_traversal_category_in_tail_t,
|
|
||||||
front_traversal,
|
|
||||||
mp11::mp_list< Tail... >
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
|
|
||||||
template< typename Front, typename Tail >
|
template< typename Front, typename Tail >
|
||||||
struct minimum_traversal_category_in_iterator_list< tuples::cons< Front, Tail > >
|
struct minimum_traversal_category_in_iterator_list< tuples::cons< Front, Tail > >
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user