Skip to content

Commit

Permalink
add helper variable templates are_*_iterators_v (kokkos#6312)
Browse files Browse the repository at this point in the history
* add shortcuts and test

* update based on comments
  • Loading branch information
fnrizzi committed Jul 27, 2023
1 parent 26cd6cc commit bc56d29
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 7 deletions.
24 changes: 17 additions & 7 deletions algorithms/src/std_algorithms/impl/Kokkos_Constraints.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ using iterator_category_t = typename T::iterator_category;
template <class T>
using is_iterator = Kokkos::is_detected<iterator_category_t, T>;

template <class T>
inline constexpr bool is_iterator_v = is_iterator<T>::value;

//
// are_iterators
//
Expand All @@ -63,15 +66,18 @@ struct are_iterators;

template <class T>
struct are_iterators<T> {
static constexpr bool value = is_iterator<T>::value;
static constexpr bool value = is_iterator_v<T>;
};

template <class Head, class... Tail>
struct are_iterators<Head, Tail...> {
static constexpr bool value =
are_iterators<Head>::value && are_iterators<Tail...>::value;
are_iterators<Head>::value && (are_iterators<Tail>::value && ... && true);
};

template <class... Ts>
inline constexpr bool are_iterators_v = are_iterators<Ts...>::value;

//
// are_random_access_iterators
//
Expand All @@ -81,17 +87,21 @@ struct are_random_access_iterators;
template <class T>
struct are_random_access_iterators<T> {
static constexpr bool value =
is_iterator<T>::value &&
std::is_base_of<std::random_access_iterator_tag,
typename T::iterator_category>::value;
is_iterator_v<T> && std::is_base_of<std::random_access_iterator_tag,
typename T::iterator_category>::value;
};

template <class Head, class... Tail>
struct are_random_access_iterators<Head, Tail...> {
static constexpr bool value = are_random_access_iterators<Head>::value &&
are_random_access_iterators<Tail...>::value;
static constexpr bool value =
are_random_access_iterators<Head>::value &&
(are_random_access_iterators<Tail>::value && ... && true);
};

template <class... Ts>
inline constexpr bool are_random_access_iterators_v =
are_random_access_iterators<Ts...>::value;

//
// iterators_are_accessible_from
//
Expand Down
11 changes: 11 additions & 0 deletions algorithms/unit_tests/TestRandomAccessIterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,5 +217,16 @@ TEST_F(random_access_iterator_test, distance) {
ASSERT_EQ(m_dynamic_view.extent(0), size_t(KE::distance(first, last)));
}

TEST_F(random_access_iterator_test, traits_helpers) {
using T1_t = KE::Impl::RandomAccessIterator<static_view_t>;
using T2_t = KE::Impl::RandomAccessIterator<dyn_view_t>;
using T3_t = KE::Impl::RandomAccessIterator<strided_view_t>;

namespace KE = Kokkos::Experimental;
static_assert(KE::Impl::are_iterators_v<T1_t, T2_t, T3_t>);
static_assert(KE::Impl::are_random_access_iterators_v<T1_t, T2_t, T3_t>);
static_assert(!KE::Impl::are_iterators_v<int, T2_t, T3_t>);
}

} // namespace stdalgos
} // namespace Test

0 comments on commit bc56d29

Please sign in to comment.