Add static_assert checks on zip difference_type

This commit is contained in:
Kp 2022-12-31 16:21:47 +00:00
parent 4071cd0cbf
commit 23551716b3
2 changed files with 33 additions and 0 deletions

View file

@ -121,6 +121,11 @@ index_type range_index_type(std::tuple<range_type...> *);
*/
template <typename range_index_type, typename range0_iterator_type, typename... rangeN_iterator_type>
requires(
requires {
typename std::iterator_traits<range0_iterator_type>::difference_type;
}
)
class zip_iterator : std::tuple<range0_iterator_type, rangeN_iterator_type...>
{
using base_type = std::tuple<range0_iterator_type, rangeN_iterator_type...>;

View file

@ -99,6 +99,12 @@ static_assert(assert_same_type<std::nullptr_t, decltype(d_zip::detail::get_stati
static_assert(assert_same_type<std::integral_constant<std::size_t, 5>, decltype(d_zip::detail::get_static_size(std::declval<int (&)[5]>()))>::value);
static_assert(assert_same_type<std::integral_constant<std::size_t, 6>, decltype(d_zip::detail::get_static_size(std::declval<std::array<int, 6> &>()))>::value);
template <typename T>
requires(std::ranges::range<T>)
struct check_is_range : std::true_type
{
};
template <typename T>
requires(std::ranges::borrowed_range<T>)
struct check_is_borrowed_range : std::true_type
@ -106,3 +112,25 @@ struct check_is_borrowed_range : std::true_type
};
static_assert(check_is_borrowed_range<decltype(zip(std::declval<int (&)[1]>()))>::value);
struct difference_range
{
struct iterator {
int *operator *() const;
iterator &operator++();
iterator operator++(int);
constexpr auto operator<=>(const iterator &) const = default;
using difference_type = short;
using value_type = int;
using pointer = value_type *;
using reference = value_type &;
using iterator_category = std::forward_iterator_tag;
};
struct index_type {};
iterator begin();
iterator end();
};
static_assert(check_is_range<decltype(std::declval<difference_range &>())>::value);
static_assert(check_is_borrowed_range<decltype(std::declval<difference_range &>())>::value);
static_assert(assert_same_type<difference_range::iterator::difference_type, decltype(zip(std::declval<difference_range &>()).begin())::difference_type>::value);