Add static_assert checks on zip difference_type
This commit is contained in:
parent
4071cd0cbf
commit
23551716b3
|
@ -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>
|
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...>
|
class zip_iterator : std::tuple<range0_iterator_type, rangeN_iterator_type...>
|
||||||
{
|
{
|
||||||
using base_type = std::tuple<range0_iterator_type, rangeN_iterator_type...>;
|
using base_type = std::tuple<range0_iterator_type, rangeN_iterator_type...>;
|
||||||
|
|
|
@ -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, 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);
|
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>
|
template <typename T>
|
||||||
requires(std::ranges::borrowed_range<T>)
|
requires(std::ranges::borrowed_range<T>)
|
||||||
struct check_is_borrowed_range : std::true_type
|
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);
|
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);
|
||||||
|
|
Loading…
Reference in a new issue