Skip to content

Commit 75518ff

Browse files
jensmaurertkoeppe
authored andcommitted
P2417R2 A more constexpr bitset
1 parent 61d18f3 commit 75518ff

File tree

2 files changed

+67
-66
lines changed

2 files changed

+67
-66
lines changed

source/support.tex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,7 @@
593593
#define @\defnlibxname{cpp_lib_complex_udls}@ 201309L // also in \libheader{complex}
594594
#define @\defnlibxname{cpp_lib_concepts}@ 202207L // also in \libheader{concepts}, \libheader{compare}
595595
#define @\defnlibxname{cpp_lib_constexpr_algorithms}@ 201806L // also in \libheader{algorithm}
596+
#define @\defnlibxname{cpp_lib_constexpr_bitset}@ 202202L // also in \libheader{bitset}
596597
#define @\defnlibxname{cpp_lib_constexpr_charconv}@ 202207L // also in \libheader{charconv}
597598
#define @\defnlibxname{cpp_lib_constexpr_cmath}@ 202202L // also in \libheader{cmath}, \libheader{cstdlib}
598599
#define @\defnlibxname{cpp_lib_constexpr_complex}@ 201711L // also in \libheader{complex}

source/utilities.tex

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8862,11 +8862,11 @@
88628862

88638863
// \ref{bitset.operators}, bitset operators
88648864
template<size_t N>
8865-
bitset<N> operator&(const bitset<N>&, const bitset<N>&) noexcept;
8865+
constexpr bitset<N> operator&(const bitset<N>&, const bitset<N>&) noexcept;
88668866
template<size_t N>
8867-
bitset<N> operator|(const bitset<N>&, const bitset<N>&) noexcept;
8867+
constexpr bitset<N> operator|(const bitset<N>&, const bitset<N>&) noexcept;
88688868
template<size_t N>
8869-
bitset<N> operator^(const bitset<N>&, const bitset<N>&) noexcept;
8869+
constexpr bitset<N> operator^(const bitset<N>&, const bitset<N>&) noexcept;
88708870
template<class charT, class traits, size_t N>
88718871
basic_istream<charT, traits>&
88728872
operator>>(basic_istream<charT, traits>& is, bitset<N>& x);
@@ -8887,71 +8887,71 @@
88878887
// bit reference
88888888
class reference {
88898889
friend class bitset;
8890-
reference() noexcept;
8890+
constexpr reference() noexcept;
88918891

88928892
public:
8893-
reference(const reference&) = default;
8894-
~reference();
8895-
reference& operator=(bool x) noexcept; // for \tcode{b[i] = x;}
8896-
reference& operator=(const reference&) noexcept; // for \tcode{b[i] = b[j];}
8897-
bool operator~() const noexcept; // flips the bit
8898-
operator bool() const noexcept; // for \tcode{x = b[i];}
8899-
reference& flip() noexcept; // for \tcode{b[i].flip();}
8893+
constexpr reference(const reference&) = default;
8894+
constexpr ~reference();
8895+
constexpr reference& operator=(bool x) noexcept; // for \tcode{b[i] = x;}
8896+
constexpr reference& operator=(const reference&) noexcept; // for \tcode{b[i] = b[j];}
8897+
constexpr bool operator~() const noexcept; // flips the bit
8898+
constexpr operator bool() const noexcept; // for \tcode{x = b[i];}
8899+
constexpr reference& flip() noexcept; // for \tcode{b[i].flip();}
89008900
};
89018901

89028902
// \ref{bitset.cons}, constructors
89038903
constexpr bitset() noexcept;
89048904
constexpr bitset(unsigned long long val) noexcept;
89058905
template<class charT, class traits, class Allocator>
8906-
explicit bitset(
8906+
constexpr explicit bitset(
89078907
const basic_string<charT, traits, Allocator>& str,
89088908
typename basic_string<charT, traits, Allocator>::size_type pos = 0,
89098909
typename basic_string<charT, traits, Allocator>::size_type n
89108910
= basic_string<charT, traits, Allocator>::npos,
89118911
charT zero = charT('0'),
89128912
charT one = charT('1'));
89138913
template<class charT>
8914-
explicit bitset(
8914+
constexpr explicit bitset(
89158915
const charT* str,
89168916
typename basic_string<charT>::size_type n = basic_string<charT>::npos,
89178917
charT zero = charT('0'),
89188918
charT one = charT('1'));
89198919

89208920
// \ref{bitset.members}, bitset operations
8921-
bitset& operator&=(const bitset& rhs) noexcept;
8922-
bitset& operator|=(const bitset& rhs) noexcept;
8923-
bitset& operator^=(const bitset& rhs) noexcept;
8924-
bitset& operator<<=(size_t pos) noexcept;
8925-
bitset& operator>>=(size_t pos) noexcept;
8926-
bitset& set() noexcept;
8927-
bitset& set(size_t pos, bool val = true);
8928-
bitset& reset() noexcept;
8929-
bitset& reset(size_t pos);
8930-
bitset operator~() const noexcept;
8931-
bitset& flip() noexcept;
8932-
bitset& flip(size_t pos);
8921+
constexpr bitset& operator&=(const bitset& rhs) noexcept;
8922+
constexpr bitset& operator|=(const bitset& rhs) noexcept;
8923+
constexpr bitset& operator^=(const bitset& rhs) noexcept;
8924+
constexpr bitset& operator<<=(size_t pos) noexcept;
8925+
constexpr bitset& operator>>=(size_t pos) noexcept;
8926+
constexpr bitset& set() noexcept;
8927+
constexpr bitset& set(size_t pos, bool val = true);
8928+
constexpr bitset& reset() noexcept;
8929+
constexpr bitset& reset(size_t pos);
8930+
constexpr bitset operator~() const noexcept;
8931+
constexpr bitset& flip() noexcept;
8932+
constexpr bitset& flip(size_t pos);
89338933

89348934
// element access
89358935
constexpr bool operator[](size_t pos) const; // for \tcode{b[i];}
8936-
reference operator[](size_t pos); // for \tcode{b[i];}
8936+
constexpr reference operator[](size_t pos); // for \tcode{b[i];}
89378937

8938-
unsigned long to_ulong() const;
8939-
unsigned long long to_ullong() const;
8938+
constexpr unsigned long to_ulong() const;
8939+
constexpr unsigned long long to_ullong() const;
89408940
template<class charT = char,
89418941
class traits = char_traits<charT>,
89428942
class Allocator = allocator<charT>>
8943-
basic_string<charT, traits, Allocator>
8943+
constexpr basic_string<charT, traits, Allocator>
89448944
to_string(charT zero = charT('0'), charT one = charT('1')) const;
89458945

8946-
size_t count() const noexcept;
8946+
constexpr size_t count() const noexcept;
89478947
constexpr size_t size() const noexcept;
8948-
bool operator==(const bitset& rhs) const noexcept;
8949-
bool test(size_t pos) const;
8950-
bool all() const noexcept;
8951-
bool any() const noexcept;
8952-
bool none() const noexcept;
8953-
bitset operator<<(size_t pos) const noexcept;
8954-
bitset operator>>(size_t pos) const noexcept;
8948+
constexpr bool operator==(const bitset& rhs) const noexcept;
8949+
constexpr bool test(size_t pos) const;
8950+
constexpr bool all() const noexcept;
8951+
constexpr bool any() const noexcept;
8952+
constexpr bool none() const noexcept;
8953+
constexpr bitset operator<<(size_t pos) const noexcept;
8954+
constexpr bitset operator>>(size_t pos) const noexcept;
89558955
};
89568956

89578957
// \ref{bitset.hash}, hash support
@@ -9038,7 +9038,7 @@
90389038
\indexlibraryctor{bitset}%
90399039
\begin{itemdecl}
90409040
template<class charT, class traits, class Allocator>
9041-
explicit bitset(
9041+
constexpr explicit bitset(
90429042
const basic_string<charT, traits, Allocator>& str,
90439043
typename basic_string<charT, traits, Allocator>::size_type pos = 0,
90449044
typename basic_string<charT, traits, Allocator>::size_type n
@@ -9089,7 +9089,7 @@
90899089
\indexlibraryctor{bitset}%
90909090
\begin{itemdecl}
90919091
template<class charT>
9092-
explicit bitset(
9092+
constexpr explicit bitset(
90939093
const charT* str,
90949094
typename basic_string<charT>::size_type n = basic_string<charT>::npos,
90959095
charT zero = charT('0'),
@@ -9113,7 +9113,7 @@
91139113

91149114
\indexlibrarymember{operator\&=}{bitset}%
91159115
\begin{itemdecl}
9116-
bitset& operator&=(const bitset& rhs) noexcept;
9116+
constexpr bitset& operator&=(const bitset& rhs) noexcept;
91179117
\end{itemdecl}
91189118

91199119
\begin{itemdescr}
@@ -9130,7 +9130,7 @@
91309130

91319131
\indexlibrarymember{operator"|=}{bitset}%
91329132
\begin{itemdecl}
9133-
bitset& operator|=(const bitset& rhs) noexcept;
9133+
constexpr bitset& operator|=(const bitset& rhs) noexcept;
91349134
\end{itemdecl}
91359135

91369136
\begin{itemdescr}
@@ -9147,7 +9147,7 @@
91479147

91489148
\indexlibrarymember{operator\caret=}{bitset}%
91499149
\begin{itemdecl}
9150-
bitset& operator^=(const bitset& rhs) noexcept;
9150+
constexpr bitset& operator^=(const bitset& rhs) noexcept;
91519151
\end{itemdecl}
91529152

91539153
\begin{itemdescr}
@@ -9164,7 +9164,7 @@
91649164

91659165
\indexlibrarymember{operator<<=}{bitset}%
91669166
\begin{itemdecl}
9167-
bitset& operator<<=(size_t pos) noexcept;
9167+
constexpr bitset& operator<<=(size_t pos) noexcept;
91689168
\end{itemdecl}
91699169

91709170
\begin{itemdescr}
@@ -9189,7 +9189,7 @@
91899189

91909190
\indexlibrarymember{operator>>=}{bitset}%
91919191
\begin{itemdecl}
9192-
bitset& operator>>=(size_t pos) noexcept;
9192+
constexpr bitset& operator>>=(size_t pos) noexcept;
91939193
\end{itemdecl}
91949194

91959195
\begin{itemdescr}
@@ -9215,7 +9215,7 @@
92159215
\indexlibrary{\idxcode{set} (member)!\idxcode{bitset}}%
92169216
\indexlibrary{\idxcode{bitset}!\idxcode{set}}%
92179217
\begin{itemdecl}
9218-
bitset& set() noexcept;
9218+
constexpr bitset& set() noexcept;
92199219
\end{itemdecl}
92209220

92219221
\begin{itemdescr}
@@ -9233,7 +9233,7 @@
92339233
\indexlibrary{\idxcode{set} (member)!\idxcode{bitset}}%
92349234
\indexlibrary{\idxcode{bitset}!\idxcode{set}}%
92359235
\begin{itemdecl}
9236-
bitset& set(size_t pos, bool val = true);
9236+
constexpr bitset& set(size_t pos, bool val = true);
92379237
\end{itemdecl}
92389238

92399239
\begin{itemdescr}
@@ -9255,7 +9255,7 @@
92559255

92569256
\indexlibrarymember{reset}{bitset}%
92579257
\begin{itemdecl}
9258-
bitset& reset() noexcept;
9258+
constexpr bitset& reset() noexcept;
92599259
\end{itemdecl}
92609260

92619261
\begin{itemdescr}
@@ -9271,7 +9271,7 @@
92719271

92729272
\indexlibrarymember{reset}{bitset}%
92739273
\begin{itemdecl}
9274-
bitset& reset(size_t pos);
9274+
constexpr bitset& reset(size_t pos);
92759275
\end{itemdecl}
92769276

92779277
\begin{itemdescr}
@@ -9292,7 +9292,7 @@
92929292

92939293
\indexlibrarymember{operator\~{}}{bitset}%
92949294
\begin{itemdecl}
9295-
bitset operator~() const noexcept;
9295+
constexpr bitset operator~() const noexcept;
92969296
\end{itemdecl}
92979297

92989298
\begin{itemdescr}
@@ -9310,7 +9310,7 @@
93109310

93119311
\indexlibrarymember{flip}{bitset}%
93129312
\begin{itemdecl}
9313-
bitset& flip() noexcept;
9313+
constexpr bitset& flip() noexcept;
93149314
\end{itemdecl}
93159315

93169316
\begin{itemdescr}
@@ -9326,7 +9326,7 @@
93269326

93279327
\indexlibrarymember{flip}{bitset}%
93289328
\begin{itemdecl}
9329-
bitset& flip(size_t pos);
9329+
constexpr bitset& flip(size_t pos);
93309330
\end{itemdecl}
93319331

93329332
\begin{itemdescr}
@@ -9347,7 +9347,7 @@
93479347

93489348
\indexlibrarymember{to_ulong}{bitset}%
93499349
\begin{itemdecl}
9350-
unsigned long to_ulong() const;
9350+
constexpr unsigned long to_ulong() const;
93519351
\end{itemdecl}
93529352

93539353
\begin{itemdescr}
@@ -9365,7 +9365,7 @@
93659365

93669366
\indexlibrarymember{to_ullong}{bitset}%
93679367
\begin{itemdecl}
9368-
unsigned long long to_ullong() const;
9368+
constexpr unsigned long long to_ullong() const;
93699369
\end{itemdecl}
93709370

93719371
\begin{itemdescr}
@@ -9386,7 +9386,7 @@
93869386
template<class charT = char,
93879387
class traits = char_traits<charT>,
93889388
class Allocator = allocator<charT>>
9389-
basic_string<charT, traits, Allocator>
9389+
constexpr basic_string<charT, traits, Allocator>
93909390
to_string(charT zero = charT('0'), charT one = charT('1')) const;
93919391
\end{itemdecl}
93929392

@@ -9411,7 +9411,7 @@
94119411

94129412
\indexlibrarymember{count}{bitset}%
94139413
\begin{itemdecl}
9414-
size_t count() const noexcept;
9414+
constexpr size_t count() const noexcept;
94159415
\end{itemdecl}
94169416

94179417
\begin{itemdescr}
@@ -9434,7 +9434,7 @@
94349434

94359435
\indexlibrarymember{operator==}{bitset}%
94369436
\begin{itemdecl}
9437-
bool operator==(const bitset& rhs) const noexcept;
9437+
constexpr bool operator==(const bitset& rhs) const noexcept;
94389438
\end{itemdecl}
94399439

94409440
\begin{itemdescr}
@@ -9447,7 +9447,7 @@
94479447

94489448
\indexlibrarymember{test}{bitset}%
94499449
\begin{itemdecl}
9450-
bool test(size_t pos) const;
9450+
constexpr bool test(size_t pos) const;
94519451
\end{itemdecl}
94529452

94539453
\begin{itemdescr}
@@ -9467,7 +9467,7 @@
94679467

94689468
\indexlibrarymember{all}{bitset}%
94699469
\begin{itemdecl}
9470-
bool all() const noexcept;
9470+
constexpr bool all() const noexcept;
94719471
\end{itemdecl}
94729472

94739473
\begin{itemdescr}
@@ -9480,7 +9480,7 @@
94809480
\indexlibrary{\idxcode{any} (member)!\idxcode{bitset}}%
94819481
\indexlibrary{\idxcode{bitset}!\idxcode{any}}%
94829482
\begin{itemdecl}
9483-
bool any() const noexcept;
9483+
constexpr bool any() const noexcept;
94849484
\end{itemdecl}
94859485

94869486
\begin{itemdescr}
@@ -9491,7 +9491,7 @@
94919491

94929492
\indexlibrarymember{none}{bitset}%
94939493
\begin{itemdecl}
9494-
bool none() const noexcept;
9494+
constexpr bool none() const noexcept;
94959495
\end{itemdecl}
94969496

94979497
\begin{itemdescr}
@@ -9502,7 +9502,7 @@
95029502

95039503
\indexlibrarymember{operator<<}{bitset}%
95049504
\begin{itemdecl}
9505-
bitset operator<<(size_t pos) const noexcept;
9505+
constexpr bitset operator<<(size_t pos) const noexcept;
95069506
\end{itemdecl}
95079507

95089508
\begin{itemdescr}
@@ -9513,7 +9513,7 @@
95139513

95149514
\indexlibrarymember{operator>>}{bitset}%
95159515
\begin{itemdecl}
9516-
bitset operator>>(size_t pos) const noexcept;
9516+
constexpr bitset operator>>(size_t pos) const noexcept;
95179517
\end{itemdecl}
95189518

95199519
\begin{itemdescr}
@@ -9544,7 +9544,7 @@
95449544

95459545
\indexlibrarymember{operator[]}{bitset}%
95469546
\begin{itemdecl}
9547-
bitset::reference operator[](size_t pos);
9547+
constexpr bitset::reference operator[](size_t pos);
95489548
\end{itemdecl}
95499549

95509550
\begin{itemdescr}
@@ -9593,7 +9593,7 @@
95939593
\indexlibrarymember{operator\&}{bitset}%
95949594
\begin{itemdecl}
95959595
template<size_t N>
9596-
bitset<N> operator&(const bitset<N>& lhs, const bitset<N>& rhs) noexcept;
9596+
constexpr bitset<N> operator&(const bitset<N>& lhs, const bitset<N>& rhs) noexcept;
95979597
\end{itemdecl}
95989598

95999599
\begin{itemdescr}
@@ -9605,7 +9605,7 @@
96059605
\indexlibrarymember{operator"|}{bitset}%
96069606
\begin{itemdecl}
96079607
template<size_t N>
9608-
bitset<N> operator|(const bitset<N>& lhs, const bitset<N>& rhs) noexcept;
9608+
constexpr bitset<N> operator|(const bitset<N>& lhs, const bitset<N>& rhs) noexcept;
96099609
\end{itemdecl}
96109610

96119611
\begin{itemdescr}
@@ -9617,7 +9617,7 @@
96179617
\indexlibrarymember{operator\caret}{bitset}%
96189618
\begin{itemdecl}
96199619
template<size_t N>
9620-
bitset<N> operator^(const bitset<N>& lhs, const bitset<N>& rhs) noexcept;
9620+
constexpr bitset<N> operator^(const bitset<N>& lhs, const bitset<N>& rhs) noexcept;
96219621
\end{itemdecl}
96229622

96239623
\begin{itemdescr}

0 commit comments

Comments
 (0)