Skip to content

Commit e9e63a1

Browse files
authored
Merge 2019-07 LWG Motion 30
P1523R1 Views and Size Types Fixes #3033.
2 parents 7c52e33 + 73a2047 commit e9e63a1

File tree

1 file changed

+31
-26
lines changed

1 file changed

+31
-26
lines changed

source/ranges.tex

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -589,10 +589,10 @@
589589
\end{itemize}
590590

591591
\item
592-
Otherwise, \tcode{(ranges::end(E) - ranges::begin(E))}
592+
Otherwise, \tcode{\placeholdernc{make-unsigned-like}(ranges::end(E) - ranges::begin(E))}\iref{range.subrange}
593593
if it is a valid expression and
594594
the types \tcode{I} and \tcode{S} of \tcode{ranges::begin(E)} and
595-
\tcode{ranges::end(E)} (respectively) model both
595+
\tcode{ranges::end(E)} (respectively) model both\hfill\break %avoid overfull
596596
\tcode{SizedSentinel<S, I>}\iref{iterator.concept.sizedsentinel} and
597597
\tcode{Forward\-Iterator<I>}.
598598
However, \tcode{E} is evaluated only once.
@@ -1209,7 +1209,7 @@
12091209
\begin{codeblock}
12101210
namespace std::ranges {
12111211
template<class T>
1212-
concept @\placeholdernc{pair-like}@ = // \expos
1212+
concept @\placeholdernc{pair-like}@ = // \expos
12131213
!is_reference_v<T> && requires(T t) {
12141214
typename tuple_size<T>::type; // ensures \tcode{tuple_size<T>} is complete
12151215
requires DerivedFrom<tuple_size<T>, integral_constant<size_t, 2>>;
@@ -1220,19 +1220,19 @@
12201220
};
12211221

12221222
template<class T, class U, class V>
1223-
concept @\placeholdernc{pair-like-convertible-to}@ = // \expos
1223+
concept @\placeholdernc{pair-like-convertible-to}@ = // \expos
12241224
!Range<T> && @\placeholder{pair-like}@<remove_reference_t<T>> &&
12251225
requires(T&& t) {
12261226
{ get<0>(std::forward<T>(t)) } -> ConvertibleTo<U>;
12271227
{ get<1>(std::forward<T>(t)) } -> ConvertibleTo<V>;
12281228
};
12291229

12301230
template<class T, class U, class V>
1231-
concept @\placeholdernc{pair-like-convertible-from}@ = // \expos
1231+
concept @\placeholdernc{pair-like-convertible-from}@ = // \expos
12321232
!Range<T> && @\placeholdernc{pair-like}@<T> && Constructible<T, U, V>;
12331233

12341234
template<class T>
1235-
concept @\placeholdernc{iterator-sentinel-pair}@ = // \expos
1235+
concept @\placeholdernc{iterator-sentinel-pair}@ = // \expos
12361236
!Range<T> && @\placeholdernc{pair-like}@<T> &&
12371237
Sentinel<tuple_element_t<1, T>, tuple_element_t<0, T>>;
12381238

@@ -1241,18 +1241,18 @@
12411241
requires (K == subrange_kind::sized || !SizedSentinel<S, I>)
12421242
class subrange : public view_interface<subrange<I, S, K>> {
12431243
private:
1244-
static constexpr bool StoreSize = // \expos
1244+
static constexpr bool StoreSize = // \expos
12451245
K == subrange_kind::sized && !SizedSentinel<S, I>;
1246-
I begin_ = I(); // \expos
1247-
S end_ = S(); // \expos
1248-
iter_difference_t<I> size_ = 0; // \expos; present only
1249-
// when \tcode{StoreSize} is \tcode{true}
1246+
I begin_ = I(); // \expos
1247+
S end_ = S(); // \expos
1248+
@\placeholdernc{make-unsigned-like-t}@(iter_difference_t<I>) size_ = 0; // \expos; present only
1249+
// when \tcode{StoreSize} is \tcode{true}
12501250
public:
12511251
subrange() = default;
12521252

12531253
constexpr subrange(I i, S s) requires (!StoreSize);
12541254

1255-
constexpr subrange(I i, S s, iter_difference_t<I> n)
1255+
constexpr subrange(I i, S s, @\placeholdernc{make-unsigned-like-t}@(iter_difference_t<I>) n)
12561256
requires (K == subrange_kind::sized);
12571257

12581258
template<@\placeholdernc{not-same-as}@<subrange> R>
@@ -1262,7 +1262,7 @@
12621262

12631263
template<@\placeholdernc{forwarding-range}@ R>
12641264
requires ConvertibleTo<iterator_t<R>, I> && ConvertibleTo<sentinel_t<R>, S>
1265-
constexpr subrange(R&& r, iter_difference_t<I> n)
1265+
constexpr subrange(R&& r, @\placeholdernc{make-unsigned-like-t}@(iter_difference_t<I>) n)
12661266
requires (K == subrange_kind::sized)
12671267
: subrange{ranges::begin(r), ranges::end(r), n}
12681268
{}
@@ -1275,7 +1275,7 @@
12751275
{}
12761276

12771277
template<@\placeholdernc{pair-like-convertible-to}@<I, S> PairLike>
1278-
constexpr subrange(PairLike&& r, iter_difference_t<I> n)
1278+
constexpr subrange(PairLike&& r, @\placeholdernc{make-unsigned-like-t}@(iter_difference_t<I>) n)
12791279
requires (K == subrange_kind::sized)
12801280
: subrange{std::get<0>(std::forward<PairLike>(r)),
12811281
std::get<1>(std::forward<PairLike>(r)), n}
@@ -1289,7 +1289,7 @@
12891289
constexpr S end() const;
12901290

12911291
constexpr bool empty() const;
1292-
constexpr iter_difference_t<I> size() const
1292+
constexpr @\placeholdernc{make-unsigned-like-t}@(iter_difference_t<I>) size() const
12931293
requires (K == subrange_kind::sized);
12941294

12951295
[[nodiscard]] constexpr subrange next(iter_difference_t<I> n = 1) const;
@@ -1302,13 +1302,14 @@
13021302
};
13031303

13041304
template<Iterator I, Sentinel<I> S>
1305-
subrange(I, S, iter_difference_t<I>) -> subrange<I, S, subrange_kind::sized>;
1305+
subrange(I, S, @\placeholdernc{make-unsigned-like-t}@(iter_difference_t<I>)) ->
1306+
subrange<I, S, subrange_kind::sized>;
13061307

13071308
template<@\placeholder{iterator-sentinel-pair}@ P>
13081309
subrange(P) -> subrange<tuple_element_t<0, P>, tuple_element_t<1, P>>;
13091310

13101311
template<@\placeholder{iterator-sentinel-pair}@ P>
1311-
subrange(P, iter_difference_t<tuple_element_t<0, P>>) ->
1312+
subrange(P, @\placeholdernc{make-unsigned-like-t}@(iter_difference_t<tuple_element_t<0, P>>)) ->
13121313
subrange<tuple_element_t<0, P>, tuple_element_t<1, P>, subrange_kind::sized>;
13131314

13141315
template<@\placeholder{forwarding-range}@ R>
@@ -1318,7 +1319,7 @@
13181319
? subrange_kind::sized : subrange_kind::unsized>;
13191320

13201321
template<@\placeholder{forwarding-range}@ R>
1321-
subrange(R&&, range_difference_t<R>) ->
1322+
subrange(R&&, @\placeholdernc{make-unsigned-like-t}@(range_difference_t<R>)) ->
13221323
subrange<iterator_t<R>, sentinel_t<R>, subrange_kind::sized>;
13231324

13241325
template<size_t N, class I, class S, subrange_kind K>
@@ -1349,14 +1350,14 @@
13491350

13501351
\indexlibrary{\idxcode{subrange}!\idxcode{subrange}}%
13511352
\begin{itemdecl}
1352-
constexpr subrange(I i, S s, iter_difference_t<I> n)
1353+
constexpr subrange(I i, S s, @\placeholdernc{make-unsigned-like-t}@(iter_difference_t<I>) n)
13531354
requires (K == subrange_kind::sized);
13541355
\end{itemdecl}
13551356

13561357
\begin{itemdescr}
13571358
\pnum
13581359
\expects \range{i}{s} is a valid range, and
1359-
\tcode{n == ranges::distance(i, s)}.
1360+
\tcode{n == \placeholdernc{make-unsigned-like}(ranges::distance(i, s))}.
13601361

13611362
\pnum
13621363
\effects Initializes \tcode{begin_} with \tcode{i} and \tcode{end_} with
@@ -1436,7 +1437,7 @@
14361437

14371438
\indexlibrary{\idxcode{size}!\idxcode{subrange}}%
14381439
\begin{itemdecl}
1439-
constexpr iter_difference_t<I> size() const
1440+
constexpr @\placeholdernc{make-unsigned-like-t}@(iter_difference_t<I>) size() const
14401441
requires (K == subrange_kind::sized);
14411442
\end{itemdecl}
14421443

@@ -1445,7 +1446,7 @@
14451446
\effects
14461447
\begin{itemize}
14471448
\item If \tcode{StoreSize} is \tcode{true}, equivalent to: \tcode{return size_;}
1448-
\item Otherwise, equivalent to: \tcode{return end_ - begin_;}
1449+
\item Otherwise, equivalent to: \tcode{return \placeholdernc{make-unsigned-like-t}(end_ - begin_);}
14491450
\end{itemize}
14501451
\end{itemdescr}
14511452

@@ -1497,7 +1498,11 @@
14971498
\begin{itemize}
14981499
\item If \tcode{StoreSize} is \tcode{true},
14991500
\begin{codeblock}
1500-
size_ -= n - ranges::advance(begin_, n, end_);
1501+
auto d = n - ranges::advance(begin_, n, end_);
1502+
if (d >= 0)
1503+
size_ -= @\placeholdernc{make-unsigned-like}@(d);
1504+
else
1505+
size_ += @\placeholdernc{make-unsigned-like}@(-d);
15011506
return *this;
15021507
\end{codeblock}
15031508
\item Otherwise,
@@ -1605,7 +1610,7 @@
16051610
static constexpr T* begin() noexcept { return nullptr; }
16061611
static constexpr T* end() noexcept { return nullptr; }
16071612
static constexpr T* data() noexcept { return nullptr; }
1608-
static constexpr ptrdiff_t size() noexcept { return 0; }
1613+
static constexpr size_t size() noexcept { return 0; }
16091614
static constexpr bool empty() noexcept { return true; }
16101615

16111616
friend constexpr T* begin(empty_view) noexcept { return nullptr; }
@@ -1652,7 +1657,7 @@
16521657
constexpr const T* begin() const noexcept;
16531658
constexpr T* end() noexcept;
16541659
constexpr const T* end() const noexcept;
1655-
static constexpr ptrdiff_t size() noexcept;
1660+
static constexpr size_t size() noexcept;
16561661
constexpr T* data() noexcept;
16571662
constexpr const T* data() const noexcept;
16581663
};
@@ -1715,7 +1720,7 @@
17151720

17161721
\indexlibrary{\idxcode{size}!\idxcode{single_view}}%
17171722
\begin{itemdecl}
1718-
static constexpr ptrdiff_t size() noexcept;
1723+
static constexpr size_t size() noexcept;
17191724
\end{itemdecl}
17201725

17211726
\begin{itemdescr}

0 commit comments

Comments
 (0)