Skip to content

Commit 3649f80

Browse files
jensmaurerzygoloid
authored andcommitted
P1024R3 Usability Enhancements for std::span
Moved the declaration of the undefined partial specialization tuple_size<span<ElementType, dynamic_extent>> to the header synopsis. Fixed missing I template parameter in definition of get<I>. Replaced ptrdiff_t parameters with size_t parameters to match changes made by LWG Motion 15.
1 parent 03515b4 commit 3649f80

File tree

2 files changed

+120
-7
lines changed

2 files changed

+120
-7
lines changed

source/containers.tex

Lines changed: 116 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10292,6 +10292,18 @@
1029210292
template<class ElementType, size_t Extent>
1029310293
span<byte, Extent == dynamic_extent ? dynamic_extent : sizeof(ElementType) * Extent>
1029410294
as_writable_bytes(span<ElementType, Extent> s) noexcept;
10295+
10296+
// \ref{span.tuple}, tuple interface
10297+
template<class T> class tuple_size;
10298+
template<size_t I, class T> class tuple_element;
10299+
template<class ElementType, size_t Extent>
10300+
struct tuple_size<span<ElementType, Extent>>;
10301+
template<class ElementType>
10302+
struct tuple_size<span<ElementType, dynamic_extent>>; // not defined
10303+
template<size_t I, class ElementType, size_t Extent>
10304+
struct tuple_element<I, span<ElementType, Extent>>;
10305+
template<size_t I, class ElementType, size_t Extent>
10306+
constexpr ElementType& get(span<ElementType, Extent>) noexcept;
1029510307
}
1029610308
\end{codeblock}
1029710309

@@ -10377,11 +10389,12 @@
1037710389
// \ref{span.obs}, observers
1037810390
constexpr index_type size() const noexcept;
1037910391
constexpr index_type size_bytes() const noexcept;
10380-
constexpr bool empty() const noexcept;
10392+
[[nodiscard]] constexpr bool empty() const noexcept;
1038110393

1038210394
// \ref{span.elem}, element access
1038310395
constexpr reference operator[](index_type idx) const;
10384-
constexpr reference operator()(index_type idx) const;
10396+
constexpr reference front() const;
10397+
constexpr reference back() const;
1038510398
constexpr pointer data() const noexcept;
1038610399

1038710400
// \ref{span.iterators}, iterator support
@@ -10425,6 +10438,7 @@
1042510438
\begin{itemdecl}
1042610439
constexpr span() noexcept;
1042710440
\end{itemdecl}
10441+
1042810442
\begin{itemdescr}
1042910443
\pnum
1043010444
\constraints
@@ -10439,6 +10453,7 @@
1043910453
\begin{itemdecl}
1044010454
constexpr span(pointer ptr, index_type count);
1044110455
\end{itemdecl}
10456+
1044210457
\begin{itemdescr}
1044310458
\pnum
1044410459
\expects \range{ptr}{ptr + count} is a valid range.
@@ -10462,6 +10477,7 @@
1046210477
\begin{itemdecl}
1046310478
constexpr span(pointer first, pointer last);
1046410479
\end{itemdecl}
10480+
1046510481
\begin{itemdescr}
1046610482
\pnum
1046710483
\expects
@@ -10488,6 +10504,7 @@
1048810504
template<size_t N> constexpr span(array<value_type, N>& arr) noexcept;
1048910505
template<size_t N> constexpr span(const array<value_type, N>& arr) noexcept;
1049010506
\end{itemdecl}
10507+
1049110508
\begin{itemdescr}
1049210509
\pnum
1049310510
\constraints
@@ -10510,6 +10527,7 @@
1051010527
template<class Container> constexpr span(Container& cont);
1051110528
template<class Container> constexpr span(const Container& cont);
1051210529
\end{itemdecl}
10530+
1051310531
\begin{itemdescr}
1051410532
\pnum
1051510533
\constraints
@@ -10543,6 +10561,7 @@
1054310561
\begin{itemdecl}
1054410562
constexpr span(const span& other) noexcept = default;
1054510563
\end{itemdecl}
10564+
1054610565
\begin{itemdescr}
1054710566
\pnum
1054810567
\ensures
@@ -10554,6 +10573,7 @@
1055410573
template<class OtherElementType, size_t OtherExtent>
1055510574
constexpr span(const span<OtherElementType, OtherExtent>& s) noexcept;
1055610575
\end{itemdecl}
10576+
1055710577
\begin{itemdescr}
1055810578
\pnum
1055910579
\constraints
@@ -10576,6 +10596,7 @@
1057610596
\begin{itemdecl}
1057710597
constexpr span& operator=(const span& other) noexcept = default;
1057810598
\end{itemdecl}
10599+
1057910600
\begin{itemdescr}
1058010601
\pnum
1058110602
\ensures
@@ -10588,6 +10609,7 @@
1058810609
\begin{itemdecl}
1058910610
template<size_t Count> constexpr span<element_type, Count> first() const;
1059010611
\end{itemdecl}
10612+
1059110613
\begin{itemdescr}
1059210614
\pnum
1059310615
\expects
@@ -10602,6 +10624,7 @@
1060210624
\begin{itemdecl}
1060310625
template<size_t Count> constexpr span<element_type, Count> last() const;
1060410626
\end{itemdecl}
10627+
1060510628
\begin{itemdescr}
1060610629
\pnum
1060710630
\expects
@@ -10617,6 +10640,7 @@
1061710640
template<size_t Offset, size_t Count = dynamic_extent>
1061810641
constexpr span<element_type, @\seebelow@> subspan() const;
1061910642
\end{itemdecl}
10643+
1062010644
\begin{itemdescr}
1062110645
\pnum
1062210646
\expects
@@ -10647,6 +10671,7 @@
1064710671
\begin{itemdecl}
1064810672
constexpr span<element_type, dynamic_extent> first(index_type count) const;
1064910673
\end{itemdecl}
10674+
1065010675
\begin{itemdescr}
1065110676
\pnum
1065210677
\expects
@@ -10661,6 +10686,7 @@
1066110686
\begin{itemdecl}
1066210687
constexpr span<element_type, dynamic_extent> last(index_type count) const;
1066310688
\end{itemdecl}
10689+
1066410690
\begin{itemdescr}
1066510691
\pnum
1066610692
\expects
@@ -10676,6 +10702,7 @@
1067610702
constexpr span<element_type, dynamic_extent> subspan(
1067710703
index_type offset, index_type count = dynamic_extent) const;
1067810704
\end{itemdecl}
10705+
1067910706
\begin{itemdescr}
1068010707
\pnum
1068110708
\expects
@@ -10698,6 +10725,7 @@
1069810725
\begin{itemdecl}
1069910726
constexpr index_type size() const noexcept;
1070010727
\end{itemdecl}
10728+
1070110729
\begin{itemdescr}
1070210730
\pnum
1070310731
\effects
@@ -10708,6 +10736,7 @@
1070810736
\begin{itemdecl}
1070910737
constexpr index_type size_bytes() const noexcept;
1071010738
\end{itemdecl}
10739+
1071110740
\begin{itemdescr}
1071210741
\pnum
1071310742
\effects
@@ -10716,8 +10745,9 @@
1071610745

1071710746
\indexlibrarymember{span}{empty}%
1071810747
\begin{itemdecl}
10719-
constexpr bool empty() const noexcept;
10748+
[[nodiscard]] constexpr bool empty() const noexcept;
1072010749
\end{itemdecl}
10750+
1072110751
\begin{itemdescr}
1072210752
\pnum
1072310753
\effects
@@ -10727,11 +10757,10 @@
1072710757
\rSec3[span.elem]{Element access}
1072810758

1072910759
\indexlibrary{\idxcode{operator[]}!\idxcode{span}}%
10730-
\indexlibrary{\idxcode{operator()}!\idxcode{span}}%
1073110760
\begin{itemdecl}
1073210761
constexpr reference operator[](index_type idx) const;
10733-
constexpr reference operator()(index_type idx) const;
1073410762
\end{itemdecl}
10763+
1073510764
\begin{itemdescr}
1073610765
\pnum
1073710766
\expects
@@ -10742,10 +10771,41 @@
1074210771
Equivalent to: \tcode{return *(data() + idx);}
1074310772
\end{itemdescr}
1074410773

10774+
\indexlibrarymember{span}{front}%
10775+
\begin{itemdecl}
10776+
constexpr reference front() const;
10777+
\end{itemdecl}
10778+
10779+
\begin{itemdescr}
10780+
\pnum
10781+
\expects
10782+
\tcode{empty()} is \tcode{false}.
10783+
10784+
\pnum
10785+
\effects
10786+
Equivalent to: \tcode{return *data();}
10787+
\end{itemdescr}
10788+
10789+
\indexlibrarymember{span}{back}%
10790+
\begin{itemdecl}
10791+
constexpr reference back() const;
10792+
\end{itemdecl}
10793+
10794+
\begin{itemdescr}
10795+
\pnum
10796+
\expects
10797+
\tcode{empty()} is \tcode{false}.
10798+
10799+
\pnum
10800+
\effects
10801+
Equivalent to: \tcode{return *(data() + (size() - 1));}
10802+
\end{itemdescr}
10803+
1074510804
\indexlibrarymember{span}{data}%
1074610805
\begin{itemdecl}
1074710806
constexpr pointer data() const noexcept;
1074810807
\end{itemdecl}
10808+
1074910809
\begin{itemdescr}
1075010810
\pnum
1075110811
\effects
@@ -10758,6 +10818,7 @@
1075810818
\begin{itemdecl}
1075910819
constexpr iterator begin() const noexcept;
1076010820
\end{itemdecl}
10821+
1076110822
\begin{itemdescr}
1076210823
\pnum
1076310824
\returns
@@ -10770,6 +10831,7 @@
1077010831
\begin{itemdecl}
1077110832
constexpr iterator end() const noexcept;
1077210833
\end{itemdecl}
10834+
1077310835
\begin{itemdescr}
1077410836
\pnum
1077510837
\returns
@@ -10780,6 +10842,7 @@
1078010842
\begin{itemdecl}
1078110843
constexpr reverse_iterator rbegin() const noexcept;
1078210844
\end{itemdecl}
10845+
1078310846
\begin{itemdescr}
1078410847
\pnum
1078510848
\effects
@@ -10790,6 +10853,7 @@
1079010853
\begin{itemdecl}
1079110854
constexpr reverse_iterator rend() const noexcept;
1079210855
\end{itemdecl}
10856+
1079310857
\begin{itemdescr}
1079410858
\pnum
1079510859
\returns
@@ -10800,6 +10864,7 @@
1080010864
\begin{itemdecl}
1080110865
constexpr const_iterator cbegin() const noexcept;
1080210866
\end{itemdecl}
10867+
1080310868
\begin{itemdescr}
1080410869
\pnum
1080510870
\returns
@@ -10812,6 +10877,7 @@
1081210877
\begin{itemdecl}
1081310878
constexpr const_iterator cend() const noexcept;
1081410879
\end{itemdecl}
10880+
1081510881
\begin{itemdescr}
1081610882
\pnum
1081710883
\returns
@@ -10822,6 +10888,7 @@
1082210888
\begin{itemdecl}
1082310889
constexpr const_reverse_iterator crbegin() const noexcept;
1082410890
\end{itemdecl}
10891+
1082510892
\begin{itemdescr}
1082610893
\pnum
1082710894
\effects
@@ -10832,6 +10899,7 @@
1083210899
\begin{itemdecl}
1083310900
constexpr const_reverse_iterator crend() const noexcept;
1083410901
\end{itemdecl}
10902+
1083510903
\begin{itemdescr}
1083610904
\pnum
1083710905
\effects
@@ -10847,6 +10915,7 @@
1084710915
span<const byte, Extent == dynamic_extent ? dynamic_extent : sizeof(ElementType) * Extent>
1084810916
as_bytes(span<ElementType, Extent> s) noexcept;
1084910917
\end{itemdecl}
10918+
1085010919
\begin{itemdescr}
1085110920
\pnum
1085210921
\effects
@@ -10859,6 +10928,7 @@
1085910928
span<byte, Extent == dynamic_extent ? dynamic_extent : sizeof(ElementType) * Extent>
1086010929
as_writable_bytes(span<ElementType, Extent> s) noexcept;
1086110930
\end{itemdecl}
10931+
1086210932
\begin{itemdescr}
1086310933
\pnum
1086410934
\constraints
@@ -10868,3 +10938,44 @@
1086810938
\effects
1086910939
Equivalent to: \tcode{return \{reinterpret_cast<byte*>(s.data()), s.size_bytes()\};}
1087010940
\end{itemdescr}
10941+
10942+
\rSec3[span.tuple]{Tuple interface}
10943+
10944+
\indexlibrary{\idxcode{tuple_size}}%
10945+
\begin{itemdecl}
10946+
template<class ElementType, size_t Extent>
10947+
struct tuple_size<span<ElementType, Extent>>
10948+
: integral_constant<size_t, Extent> { };
10949+
\end{itemdecl}
10950+
10951+
\indexlibrary{\idxcode{tuple_element}}%
10952+
\begin{itemdecl}
10953+
tuple_element<I, span<ElementType, Extent>>::type
10954+
\end{itemdecl}
10955+
10956+
\begin{itemdescr}
10957+
\pnum
10958+
\mandates
10959+
\tcode{Extent != dynamic_extent \&\& I < Extent} is \tcode{true}.
10960+
10961+
\pnum
10962+
\cvalue
10963+
The type \tcode{ElementType}.
10964+
\end{itemdescr}
10965+
10966+
\indexlibrary{\idxcode{get}}%
10967+
\begin{itemdecl}
10968+
template<size_t I, class ElementType, size_t Extent>
10969+
constexpr ElementType& get(span<ElementType, Extent> s) noexcept;
10970+
\end{itemdecl}
10971+
10972+
\begin{itemdescr}
10973+
\pnum
10974+
\mandates
10975+
\tcode{Extent != dynamic_extent \&\& I < Extent} is \tcode{true}.
10976+
10977+
\pnum
10978+
\returns
10979+
A reference to the $\tcode{I}^\text{th}$ element of \tcode{s},
10980+
where indexing is zero-based.
10981+
\end{itemdescr}

source/utilities.tex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1850,7 +1850,8 @@
18501850
\pnum
18511851
In addition to being available via inclusion of the \tcode{<tuple>} header,
18521852
the three templates are available
1853-
when any of the headers \tcode{<array>}, \tcode{<ranges>}, or \tcode{<utility>}
1853+
when any of the headers
1854+
\tcode{<array>}, \tcode{<ranges>}, \tcode{<span>}, or \tcode{<utility>}
18541855
are included.
18551856
\end{itemdescr}
18561857

@@ -1880,7 +1881,8 @@
18801881
\pnum
18811882
In addition to being available via inclusion of the \tcode{<tuple>} header,
18821883
the three templates are available
1883-
when any of the headers \tcode{<array>}, \tcode{<ranges>}, or \tcode{<utility>}
1884+
when any of the headers
1885+
\tcode{<array>}, \tcode{<ranges>}, \tcode{<span>}, or \tcode{<utility>}
18841886
are included.
18851887
\end{itemdescr}
18861888

0 commit comments

Comments
 (0)