Skip to content

Commit 384a2aa

Browse files
committed
P1227R2 Signed ssize() functions, unsigned size() functions
1 parent 6f34b05 commit 384a2aa

File tree

2 files changed

+52
-41
lines changed

2 files changed

+52
-41
lines changed

source/containers.tex

Lines changed: 27 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10250,23 +10250,19 @@
1025010250
\begin{codeblock}
1025110251
namespace std {
1025210252
// constants
10253-
inline constexpr ptrdiff_t dynamic_extent = -1;
10253+
inline constexpr size_t dynamic_extent = numeric_limits<size_t>::max();
1025410254

1025510255
// \ref{views.span}, class template span
10256-
template<class ElementType, ptrdiff_t Extent = dynamic_extent>
10256+
template<class ElementType, size_t Extent = dynamic_extent>
1025710257
class span;
1025810258

1025910259
// \ref{span.objectrep}, views of object representation
10260-
template<class ElementType, ptrdiff_t Extent>
10261-
span<const byte,
10262-
Extent == dynamic_extent ? dynamic_extent
10263-
: static_cast<ptrdiff_t>(sizeof(ElementType)) * Extent>
10260+
template<class ElementType, size_t Extent>
10261+
span<const byte, Extent == dynamic_extent ? dynamic_extent : sizeof(ElementType) * Extent>
1026410262
as_bytes(span<ElementType, Extent> s) noexcept;
1026510263

10266-
template<class ElementType, ptrdiff_t Extent>
10267-
span<byte,
10268-
Extent == dynamic_extent ? dynamic_extent
10269-
: static_cast<ptrdiff_t>(sizeof(ElementType)) * Extent>
10264+
template<class ElementType, size_t Extent>
10265+
span<byte, Extent == dynamic_extent ? dynamic_extent : sizeof(ElementType) * Extent>
1027010266
as_writable_bytes(span<ElementType, Extent> s) noexcept;
1027110267
}
1027210268
\end{codeblock}
@@ -10297,13 +10293,13 @@
1029710293
\indexlibrary{\idxcode{span}}%
1029810294
\begin{codeblock}
1029910295
namespace std {
10300-
template<class ElementType, ptrdiff_t Extent = dynamic_extent>
10296+
template<class ElementType, size_t Extent = dynamic_extent>
1030110297
class span {
1030210298
public:
1030310299
// constants and types
1030410300
using element_type = ElementType;
1030510301
using value_type = remove_cv_t<ElementType>;
10306-
using index_type = ptrdiff_t;
10302+
using index_type = size_t;
1030710303
using difference_type = ptrdiff_t;
1030810304
using pointer = element_type*;
1030910305
using reference = element_type&;
@@ -10328,19 +10324,19 @@
1032810324
template<class Container>
1032910325
constexpr span(const Container& cont);
1033010326
constexpr span(const span& other) noexcept = default;
10331-
template<class OtherElementType, ptrdiff_t OtherExtent>
10327+
template<class OtherElementType, size_t OtherExtent>
1033210328
constexpr span(const span<OtherElementType, OtherExtent>& s) noexcept;
1033310329

1033410330
~span() noexcept = default;
1033510331

1033610332
constexpr span& operator=(const span& other) noexcept = default;
1033710333

1033810334
// \ref{span.sub}, subviews
10339-
template<ptrdiff_t Count>
10335+
template<size_t Count>
1034010336
constexpr span<element_type, Count> first() const;
10341-
template<ptrdiff_t Count>
10337+
template<size_t Count>
1034210338
constexpr span<element_type, Count> last() const;
10343-
template<ptrdiff_t Offset, ptrdiff_t Count = dynamic_extent>
10339+
template<size_t Offset, size_t Count = dynamic_extent>
1034410340
constexpr span<element_type, @\seebelow@> subspan() const;
1034510341

1034610342
constexpr span<element_type, dynamic_extent> first(index_type count) const;
@@ -10393,10 +10389,6 @@
1039310389
\tcode{ElementType} is required to be
1039410390
a complete object type that is not an abstract class type.
1039510391

10396-
\pnum
10397-
If \tcode{Extent} is negative and not equal to \tcode{dynamic_extent},
10398-
the program is ill-formed.
10399-
1040010392
\rSec3[span.cons]{Constructors, copy, and assignment}
1040110393

1040210394
\indexlibrary{\idxcode{span}!constructor}%
@@ -10533,7 +10525,7 @@
1053310525

1053410526
\indexlibrary{\idxcode{span}!constructor}%
1053510527
\begin{itemdecl}
10536-
template<class OtherElementType, ptrdiff_t OtherExtent>
10528+
template<class OtherElementType, size_t OtherExtent>
1053710529
constexpr span(const span<OtherElementType, OtherExtent>& s) noexcept;
1053810530
\end{itemdecl}
1053910531
\begin{itemdescr}
@@ -10569,12 +10561,12 @@
1056910561

1057010562
\indexlibrarymember{span}{first}%
1057110563
\begin{itemdecl}
10572-
template<ptrdiff_t Count> constexpr span<element_type, Count> first() const;
10564+
template<size_t Count> constexpr span<element_type, Count> first() const;
1057310565
\end{itemdecl}
1057410566
\begin{itemdescr}
1057510567
\pnum
1057610568
\requires
10577-
\tcode{0 <= Count \&\& Count <= size()}.
10569+
\tcode{Count <= size()}.
1057810570

1057910571
\pnum
1058010572
\effects
@@ -10583,12 +10575,12 @@
1058310575

1058410576
\indexlibrarymember{span}{last}%
1058510577
\begin{itemdecl}
10586-
template<ptrdiff_t Count> constexpr span<element_type, Count> last() const;
10578+
template<size_t Count> constexpr span<element_type, Count> last() const;
1058710579
\end{itemdecl}
1058810580
\begin{itemdescr}
1058910581
\pnum
1059010582
\requires
10591-
\tcode{0 <= Count \&\& Count <= size()}.
10583+
\tcode{Count <= size()}.
1059210584

1059310585
\pnum
1059410586
\effects
@@ -10597,15 +10589,14 @@
1059710589

1059810590
\indexlibrarymember{span}{subspan}%
1059910591
\begin{itemdecl}
10600-
template<ptrdiff_t Offset, ptrdiff_t Count = dynamic_extent>
10592+
template<size_t Offset, size_t Count = dynamic_extent>
1060110593
constexpr span<element_type, @\seebelow@> subspan() const;
1060210594
\end{itemdecl}
1060310595
\begin{itemdescr}
1060410596
\pnum
1060510597
\requires
1060610598
\begin{codeblock}
10607-
(0 <= Offset && Offset <= size())
10608-
&& (Count == dynamic_extent || Count >= 0 && Offset + Count <= size())
10599+
Offset <= size() && (Count == dynamic_extent || Offset + Count <= size())
1060910600
\end{codeblock}
1061010601

1061110602
\pnum
@@ -10633,7 +10624,7 @@
1063310624
\begin{itemdescr}
1063410625
\pnum
1063510626
\requires
10636-
\tcode{0 <= count \&\& count <= size()}.
10627+
\tcode{count <= size()}.
1063710628

1063810629
\pnum
1063910630
\effects
@@ -10647,7 +10638,7 @@
1064710638
\begin{itemdescr}
1064810639
\pnum
1064910640
\requires
10650-
\tcode{0 <= count 0 \&\& count <= size()}.
10641+
\tcode{count <= size()}.
1065110642

1065210643
\pnum
1065310644
\effects
@@ -10663,8 +10654,7 @@
1066310654
\pnum
1066410655
\requires
1066510656
\begin{codeblock}
10666-
(0 <= offset && offset <= size())
10667-
&& (count == dynamic_extent || count >= 0 && offset + count <= size())
10657+
offset <= size() && (count == dynamic_extent || offset + count <= size())
1066810658
\end{codeblock}
1066910659

1067010660
\pnum
@@ -10718,7 +10708,7 @@
1071810708
\begin{itemdescr}
1071910709
\pnum
1072010710
\requires
10721-
\tcode{0 <= idx \&\& idx < size()}.
10711+
\tcode{idx < size()}.
1072210712

1072310713
\pnum
1072410714
\effects
@@ -10826,10 +10816,8 @@
1082610816

1082710817
\indexlibrary{\idxcode{as_bytes}}%
1082810818
\begin{itemdecl}
10829-
template<class ElementType, ptrdiff_t Extent>
10830-
span<const byte,
10831-
Extent == dynamic_extent ? dynamic_extent
10832-
: static_cast<ptrdiff_t>(sizeof(ElementType)) * Extent>
10819+
template<class ElementType, size_t Extent>
10820+
span<const byte, Extent == dynamic_extent ? dynamic_extent : sizeof(ElementType) * Extent>
1083310821
as_bytes(span<ElementType, Extent> s) noexcept;
1083410822
\end{itemdecl}
1083510823
\begin{itemdescr}
@@ -10840,10 +10828,8 @@
1084010828

1084110829
\indexlibrary{\idxcode{as_writable_bytes}}%
1084210830
\begin{itemdecl}
10843-
template<class ElementType, ptrdiff_t Extent>
10844-
span<byte,
10845-
Extent == dynamic_extent ? dynamic_extent
10846-
: static_cast<ptrdiff_t>(sizeof(ElementType)) * Extent>
10831+
template<class ElementType, size_t Extent>
10832+
span<byte, Extent == dynamic_extent ? dynamic_extent : sizeof(ElementType) * Extent>
1084710833
as_writable_bytes(span<ElementType, Extent> s) noexcept;
1084810834
\end{itemdecl}
1084910835
\begin{itemdescr}

source/iterators.tex

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,9 @@
438438

439439
template<class C> constexpr auto size(const C& c) -> decltype(c.size());
440440
template<class T, size_t N> constexpr size_t size(const T (&array)[N]) noexcept;
441+
template<class C> constexpr auto ssize(const C& c)
442+
-> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>;
443+
template<class T, ptrdiff_t N> constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept;
441444
template<class C> [[nodiscard]] constexpr auto empty(const C& c) -> decltype(c.empty());
442445
template<class T, size_t N> [[nodiscard]] constexpr bool empty(const T (&array)[N]) noexcept;
443446
template<class E> [[nodiscard]] constexpr bool empty(initializer_list<E> il) noexcept;
@@ -6520,6 +6523,28 @@
65206523
\pnum \returns \tcode{N}.
65216524
\end{itemdescr}
65226525

6526+
\indexlibrary{\idxcode{ssize(C\& c)}}%
6527+
\begin{itemdecl}
6528+
template <class C>
6529+
constexpr auto ssize(const C& c)
6530+
-> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>;
6531+
\end{itemdecl}
6532+
\begin{itemdescr}
6533+
\pnum \returns
6534+
\begin{codeblock}
6535+
static_cast<common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>>(c.size())
6536+
\end{codeblock}
6537+
\end{itemdescr}
6538+
6539+
\indexlibrary{\idxcode{ssize(T (\&array)[N])}}%
6540+
\begin{itemdecl}
6541+
template <class T, ptrdiff_t N>
6542+
constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept;
6543+
\end{itemdecl}
6544+
\begin{itemdescr}
6545+
\pnum \returns \tcode{N}.
6546+
\end{itemdescr}
6547+
65236548
\indexlibrary{\idxcode{empty(C\& c)}}%
65246549
\begin{itemdecl}
65256550
template<class C> [[nodiscard]] constexpr auto empty(const C& c) -> decltype(c.empty());

0 commit comments

Comments
 (0)