diff --git a/include/nanorange/views/subrange.hpp b/include/nanorange/views/subrange.hpp index a2282a9..faa7d49 100644 --- a/include/nanorange/views/subrange.hpp +++ b/include/nanorange/views/subrange.hpp @@ -124,7 +124,7 @@ struct subrange_data { : begin_(std::move(begin)), end_(std::move(end)) {} - constexpr subrange_data(I&& begin, S&& end, iter_difference_t /*unused*/) + constexpr subrange_data(I&& begin, S&& end, std::make_unsigned_t> /*unused*/) : begin_(std::move(begin)), end_(std::move(end)) {} @@ -136,13 +136,13 @@ template struct subrange_data { constexpr subrange_data() = default; - constexpr subrange_data(I&& begin, S&& end, iter_difference_t size) + constexpr subrange_data(I&& begin, S&& end, std::make_unsigned_t> size) : begin_(std::move(begin)), end_(std::move(end)), size_(size) {} I begin_{}; S end_{}; - iter_difference_t size_ = 0; + std::make_unsigned_t> size_ = 0; }; // MSVC gets confused if enable_if conditions in template param lists are too @@ -197,7 +197,7 @@ class subrange : public view_interface> { typename = std::enable_if_t< detail::convertible_to_non_slicing && KK == subrange_kind::sized>> - constexpr subrange(II i, S s, iter_difference_t n) + constexpr subrange(II i, S s, std::make_unsigned_t> n) : data_{std::move(i), std::move(s), n} {} template > { detail::convertible_to_non_slicing, I> && convertible_to, S> && KK == subrange_kind::sized, int> = 0> - constexpr subrange(R&& r, iter_difference_t n) + constexpr subrange(R&& r, std::make_unsigned_t> n) : subrange(ranges::begin(r), ranges::end(r), n) {} @@ -245,12 +245,15 @@ class subrange : public view_interface> { template constexpr auto size() const - -> std::enable_if_t> + -> std::enable_if_t>> { if constexpr (StoreSize) { return data_.size_; } else { - return data_.end_ - data_.begin_; + constexpr auto make_unsigned_like = [](auto i) { + return std::make_unsigned_t(i); + }; + return make_unsigned_like(data_.end_ - data_.begin_); } } @@ -286,13 +289,13 @@ template subrange; template && sentinel_for, int> = 0> -subrange(I, S, iter_difference_t) -> subrange; +subrange(I, S, std::make_unsigned_t>) -> subrange; template , int> = 0> subrange(P) -> subrange, std::tuple_element_t<1, P>>; template , int> = 0> -subrange(P, iter_difference_t>) -> +subrange(P, std::make_unsigned_t>>) -> subrange, std::tuple_element_t<1, P>, subrange_kind::sized>; template , int> = 0> @@ -301,7 +304,7 @@ subrange(R&&) -> detail::subrange_deduction_guide_helper()>; template , int> = 0> -subrange(R&&, iter_difference_t>) -> +subrange(R&&, std::make_unsigned_t>>) -> subrange, sentinel_t, subrange_kind::sized>; } // namespace subrange_