Line data Source code
1 : // <bitset> -*- C++ -*-
2 :
3 : // Copyright (C) 2001-2023 Free Software Foundation, Inc.
4 : //
5 : // This file is part of the GNU ISO C++ Library. This library is free
6 : // software; you can redistribute it and/or modify it under the
7 : // terms of the GNU General Public License as published by the
8 : // Free Software Foundation; either version 3, or (at your option)
9 : // any later version.
10 :
11 : // This library is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 :
16 : // Under Section 7 of GPL version 3, you are granted additional
17 : // permissions described in the GCC Runtime Library Exception, version
18 : // 3.1, as published by the Free Software Foundation.
19 :
20 : // You should have received a copy of the GNU General Public License and
21 : // a copy of the GCC Runtime Library Exception along with this program;
22 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 : // <http://www.gnu.org/licenses/>.
24 :
25 : /*
26 : * Copyright (c) 1998
27 : * Silicon Graphics Computer Systems, Inc.
28 : *
29 : * Permission to use, copy, modify, distribute and sell this software
30 : * and its documentation for any purpose is hereby granted without fee,
31 : * provided that the above copyright notice appear in all copies and
32 : * that both that copyright notice and this permission notice appear
33 : * in supporting documentation. Silicon Graphics makes no
34 : * representations about the suitability of this software for any
35 : * purpose. It is provided "as is" without express or implied warranty.
36 : */
37 :
38 : /** @file include/bitset
39 : * This is a Standard C++ Library header.
40 : */
41 :
42 : #ifndef _GLIBCXX_BITSET
43 : #define _GLIBCXX_BITSET 1
44 :
45 : #pragma GCC system_header
46 :
47 : #include <bits/functexcept.h> // For invalid_argument, out_of_range,
48 : // overflow_error
49 : #include <bits/stl_algobase.h> // For std::fill
50 :
51 : #if _GLIBCXX_HOSTED
52 : # include <string>
53 : # include <iosfwd>
54 : # include <bits/cxxabi_forced.h>
55 : #endif
56 :
57 : #if __cplusplus >= 201103L
58 : # include <bits/functional_hash.h>
59 : #endif
60 :
61 : #define _GLIBCXX_BITSET_BITS_PER_WORD (__CHAR_BIT__ * __SIZEOF_LONG__)
62 : #define _GLIBCXX_BITSET_WORDS(__n) \
63 : ((__n) / _GLIBCXX_BITSET_BITS_PER_WORD + \
64 : ((__n) % _GLIBCXX_BITSET_BITS_PER_WORD == 0 ? 0 : 1))
65 :
66 : #define _GLIBCXX_BITSET_BITS_PER_ULL (__CHAR_BIT__ * __SIZEOF_LONG_LONG__)
67 :
68 : namespace std _GLIBCXX_VISIBILITY(default)
69 : {
70 : _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
71 :
72 : #if __cplusplus > 202002L && _GLIBCXX_HOSTED
73 : # define __cpp_lib_constexpr_bitset 202202L
74 : #endif
75 :
76 : /**
77 : * Base class, general case. It is a class invariant that _Nw will be
78 : * nonnegative.
79 : *
80 : * See documentation for bitset.
81 : */
82 : template<size_t _Nw>
83 : struct _Base_bitset
84 : {
85 : typedef unsigned long _WordT;
86 :
87 : /// 0 is the least significant word.
88 : _WordT _M_w[_Nw];
89 :
90 0 : _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
91 0 : : _M_w() { }
92 :
93 : #if __cplusplus >= 201103L
94 : constexpr _Base_bitset(unsigned long long __val) noexcept
95 : : _M_w{ _WordT(__val)
96 : #if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__
97 : , _WordT(__val >> _GLIBCXX_BITSET_BITS_PER_WORD)
98 : #endif
99 : } { }
100 : #else
101 : _Base_bitset(unsigned long __val)
102 : : _M_w()
103 : { _M_w[0] = __val; }
104 : #endif
105 :
106 : static _GLIBCXX_CONSTEXPR size_t
107 0 : _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
108 0 : { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
109 :
110 : static _GLIBCXX_CONSTEXPR size_t
111 : _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
112 : { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
113 :
114 : static _GLIBCXX_CONSTEXPR size_t
115 0 : _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
116 0 : { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
117 :
118 : static _GLIBCXX_CONSTEXPR _WordT
119 0 : _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
120 0 : { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
121 :
122 : _GLIBCXX14_CONSTEXPR _WordT&
123 0 : _M_getword(size_t __pos) _GLIBCXX_NOEXCEPT
124 0 : { return _M_w[_S_whichword(__pos)]; }
125 :
126 : _GLIBCXX_CONSTEXPR _WordT
127 0 : _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT
128 0 : { return _M_w[_S_whichword(__pos)]; }
129 :
130 : #if __cplusplus >= 201103L
131 : constexpr const _WordT*
132 : _M_getdata() const noexcept
133 : { return _M_w; }
134 : #endif
135 :
136 : _GLIBCXX23_CONSTEXPR _WordT&
137 : _M_hiword() _GLIBCXX_NOEXCEPT
138 : { return _M_w[_Nw - 1]; }
139 :
140 : _GLIBCXX_CONSTEXPR _WordT
141 : _M_hiword() const _GLIBCXX_NOEXCEPT
142 : { return _M_w[_Nw - 1]; }
143 :
144 : _GLIBCXX23_CONSTEXPR void
145 : _M_do_and(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
146 : {
147 : for (size_t __i = 0; __i < _Nw; __i++)
148 : _M_w[__i] &= __x._M_w[__i];
149 : }
150 :
151 : _GLIBCXX14_CONSTEXPR void
152 : _M_do_or(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
153 : {
154 : for (size_t __i = 0; __i < _Nw; __i++)
155 : _M_w[__i] |= __x._M_w[__i];
156 : }
157 :
158 : _GLIBCXX14_CONSTEXPR void
159 : _M_do_xor(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
160 : {
161 : for (size_t __i = 0; __i < _Nw; __i++)
162 : _M_w[__i] ^= __x._M_w[__i];
163 : }
164 :
165 : _GLIBCXX14_CONSTEXPR void
166 : _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT;
167 :
168 : _GLIBCXX14_CONSTEXPR void
169 : _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT;
170 :
171 : _GLIBCXX14_CONSTEXPR void
172 : _M_do_flip() _GLIBCXX_NOEXCEPT
173 : {
174 : for (size_t __i = 0; __i < _Nw; __i++)
175 : _M_w[__i] = ~_M_w[__i];
176 : }
177 :
178 : _GLIBCXX14_CONSTEXPR void
179 : _M_do_set() _GLIBCXX_NOEXCEPT
180 : {
181 : for (size_t __i = 0; __i < _Nw; __i++)
182 : _M_w[__i] = ~static_cast<_WordT>(0);
183 : }
184 :
185 : _GLIBCXX14_CONSTEXPR void
186 : _M_do_reset() _GLIBCXX_NOEXCEPT
187 : {
188 : #if __cplusplus >= 201402L
189 : if (__builtin_is_constant_evaluated())
190 : {
191 : for (_WordT& __w : _M_w)
192 : __w = 0;
193 : return;
194 : }
195 : #endif
196 : __builtin_memset(_M_w, 0, _Nw * sizeof(_WordT));
197 : }
198 :
199 : _GLIBCXX14_CONSTEXPR bool
200 : _M_is_equal(const _Base_bitset<_Nw>& __x) const _GLIBCXX_NOEXCEPT
201 : {
202 : for (size_t __i = 0; __i < _Nw; ++__i)
203 : if (_M_w[__i] != __x._M_w[__i])
204 : return false;
205 : return true;
206 : }
207 :
208 : template<size_t _Nb>
209 : _GLIBCXX14_CONSTEXPR bool
210 : _M_are_all() const _GLIBCXX_NOEXCEPT
211 : {
212 : for (size_t __i = 0; __i < _Nw - 1; __i++)
213 : if (_M_w[__i] != ~static_cast<_WordT>(0))
214 : return false;
215 : return _M_hiword() == (~static_cast<_WordT>(0)
216 : >> (_Nw * _GLIBCXX_BITSET_BITS_PER_WORD
217 : - _Nb));
218 : }
219 :
220 : _GLIBCXX14_CONSTEXPR bool
221 : _M_is_any() const _GLIBCXX_NOEXCEPT
222 : {
223 : for (size_t __i = 0; __i < _Nw; __i++)
224 : if (_M_w[__i] != static_cast<_WordT>(0))
225 : return true;
226 : return false;
227 : }
228 :
229 : _GLIBCXX14_CONSTEXPR size_t
230 : _M_do_count() const _GLIBCXX_NOEXCEPT
231 : {
232 : size_t __result = 0;
233 : for (size_t __i = 0; __i < _Nw; __i++)
234 : __result += __builtin_popcountl(_M_w[__i]);
235 : return __result;
236 : }
237 :
238 : _GLIBCXX14_CONSTEXPR unsigned long
239 : _M_do_to_ulong() const;
240 :
241 : #if __cplusplus >= 201103L
242 : _GLIBCXX14_CONSTEXPR unsigned long long
243 : _M_do_to_ullong() const;
244 : #endif
245 :
246 : // find first "on" bit
247 : _GLIBCXX14_CONSTEXPR size_t
248 : _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT;
249 :
250 : // find the next "on" bit that follows "prev"
251 : _GLIBCXX14_CONSTEXPR size_t
252 : _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT;
253 : };
254 :
255 : // Definitions of non-inline functions from _Base_bitset.
256 : template<size_t _Nw>
257 : _GLIBCXX14_CONSTEXPR void
258 : _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT
259 : {
260 : if (__builtin_expect(__shift != 0, 1))
261 : {
262 : const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD;
263 : const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD;
264 :
265 : if (__offset == 0)
266 : for (size_t __n = _Nw - 1; __n >= __wshift; --__n)
267 : _M_w[__n] = _M_w[__n - __wshift];
268 : else
269 : {
270 : const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD
271 : - __offset);
272 : for (size_t __n = _Nw - 1; __n > __wshift; --__n)
273 : _M_w[__n] = ((_M_w[__n - __wshift] << __offset)
274 : | (_M_w[__n - __wshift - 1] >> __sub_offset));
275 : _M_w[__wshift] = _M_w[0] << __offset;
276 : }
277 :
278 : std::fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0));
279 : }
280 : }
281 :
282 : template<size_t _Nw>
283 : _GLIBCXX14_CONSTEXPR void
284 : _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT
285 : {
286 : if (__builtin_expect(__shift != 0, 1))
287 : {
288 : const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD;
289 : const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD;
290 : const size_t __limit = _Nw - __wshift - 1;
291 :
292 : if (__offset == 0)
293 : for (size_t __n = 0; __n <= __limit; ++__n)
294 : _M_w[__n] = _M_w[__n + __wshift];
295 : else
296 : {
297 : const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD
298 : - __offset);
299 : for (size_t __n = 0; __n < __limit; ++__n)
300 : _M_w[__n] = ((_M_w[__n + __wshift] >> __offset)
301 : | (_M_w[__n + __wshift + 1] << __sub_offset));
302 : _M_w[__limit] = _M_w[_Nw-1] >> __offset;
303 : }
304 :
305 : std::fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0));
306 : }
307 : }
308 :
309 : template<size_t _Nw>
310 : _GLIBCXX14_CONSTEXPR unsigned long
311 : _Base_bitset<_Nw>::_M_do_to_ulong() const
312 : {
313 : for (size_t __i = 1; __i < _Nw; ++__i)
314 : if (_M_w[__i])
315 : __throw_overflow_error(__N("_Base_bitset::_M_do_to_ulong"));
316 : return _M_w[0];
317 : }
318 :
319 : #if __cplusplus >= 201103L
320 : template<size_t _Nw>
321 : _GLIBCXX14_CONSTEXPR unsigned long long
322 : _Base_bitset<_Nw>::_M_do_to_ullong() const
323 : {
324 : const bool __dw = sizeof(unsigned long long) > sizeof(unsigned long);
325 : for (size_t __i = 1 + __dw; __i < _Nw; ++__i)
326 : if (_M_w[__i])
327 : __throw_overflow_error(__N("_Base_bitset::_M_do_to_ullong"));
328 :
329 : if (__dw)
330 : return _M_w[0] + (static_cast<unsigned long long>(_M_w[1])
331 : << _GLIBCXX_BITSET_BITS_PER_WORD);
332 : return _M_w[0];
333 : }
334 : #endif
335 :
336 : template<size_t _Nw>
337 : _GLIBCXX14_CONSTEXPR size_t
338 : _Base_bitset<_Nw>::
339 : _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT
340 : {
341 : for (size_t __i = 0; __i < _Nw; __i++)
342 : {
343 : _WordT __thisword = _M_w[__i];
344 : if (__thisword != static_cast<_WordT>(0))
345 : return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
346 : + __builtin_ctzl(__thisword));
347 : }
348 : // not found, so return an indication of failure.
349 : return __not_found;
350 : }
351 :
352 : template<size_t _Nw>
353 : _GLIBCXX14_CONSTEXPR size_t
354 : _Base_bitset<_Nw>::
355 : _M_do_find_next(size_t __prev, size_t __not_found) const _GLIBCXX_NOEXCEPT
356 : {
357 : // make bound inclusive
358 : ++__prev;
359 :
360 : // check out of bounds
361 : if (__prev >= _Nw * _GLIBCXX_BITSET_BITS_PER_WORD)
362 : return __not_found;
363 :
364 : // search first word
365 : size_t __i = _S_whichword(__prev);
366 : _WordT __thisword = _M_w[__i];
367 :
368 : // mask off bits below bound
369 : __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev);
370 :
371 : if (__thisword != static_cast<_WordT>(0))
372 : return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
373 : + __builtin_ctzl(__thisword));
374 :
375 : // check subsequent words
376 : __i++;
377 : for (; __i < _Nw; __i++)
378 : {
379 : __thisword = _M_w[__i];
380 : if (__thisword != static_cast<_WordT>(0))
381 : return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
382 : + __builtin_ctzl(__thisword));
383 : }
384 : // not found, so return an indication of failure.
385 : return __not_found;
386 : } // end _M_do_find_next
387 :
388 : /**
389 : * Base class, specialization for a single word.
390 : *
391 : * See documentation for bitset.
392 : */
393 : template<>
394 : struct _Base_bitset<1>
395 : {
396 : typedef unsigned long _WordT;
397 : _WordT _M_w;
398 :
399 : _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
400 : : _M_w(0)
401 : { }
402 :
403 : #if __cplusplus >= 201103L
404 : constexpr _Base_bitset(unsigned long long __val) noexcept
405 : #else
406 : _Base_bitset(unsigned long __val)
407 : #endif
408 : : _M_w(__val)
409 : { }
410 :
411 : static _GLIBCXX_CONSTEXPR size_t
412 : _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
413 : { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
414 :
415 : static _GLIBCXX_CONSTEXPR size_t
416 : _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
417 : { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
418 :
419 : static _GLIBCXX_CONSTEXPR size_t
420 : _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
421 : { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
422 :
423 : static _GLIBCXX_CONSTEXPR _WordT
424 : _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
425 : { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
426 :
427 : _GLIBCXX14_CONSTEXPR _WordT&
428 : _M_getword(size_t) _GLIBCXX_NOEXCEPT
429 : { return _M_w; }
430 :
431 : _GLIBCXX_CONSTEXPR _WordT
432 : _M_getword(size_t) const _GLIBCXX_NOEXCEPT
433 : { return _M_w; }
434 :
435 : #if __cplusplus >= 201103L
436 : constexpr const _WordT*
437 : _M_getdata() const noexcept
438 : { return &_M_w; }
439 : #endif
440 :
441 : _GLIBCXX14_CONSTEXPR _WordT&
442 : _M_hiword() _GLIBCXX_NOEXCEPT
443 : { return _M_w; }
444 :
445 : _GLIBCXX_CONSTEXPR _WordT
446 : _M_hiword() const _GLIBCXX_NOEXCEPT
447 : { return _M_w; }
448 :
449 : _GLIBCXX14_CONSTEXPR void
450 : _M_do_and(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
451 : { _M_w &= __x._M_w; }
452 :
453 : _GLIBCXX14_CONSTEXPR void
454 : _M_do_or(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
455 : { _M_w |= __x._M_w; }
456 :
457 : _GLIBCXX14_CONSTEXPR void
458 : _M_do_xor(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
459 : { _M_w ^= __x._M_w; }
460 :
461 : _GLIBCXX14_CONSTEXPR void
462 : _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT
463 : { _M_w <<= __shift; }
464 :
465 : _GLIBCXX14_CONSTEXPR void
466 : _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT
467 : { _M_w >>= __shift; }
468 :
469 : _GLIBCXX14_CONSTEXPR void
470 : _M_do_flip() _GLIBCXX_NOEXCEPT
471 : { _M_w = ~_M_w; }
472 :
473 : _GLIBCXX14_CONSTEXPR void
474 : _M_do_set() _GLIBCXX_NOEXCEPT
475 : { _M_w = ~static_cast<_WordT>(0); }
476 :
477 : _GLIBCXX14_CONSTEXPR void
478 : _M_do_reset() _GLIBCXX_NOEXCEPT
479 : { _M_w = 0; }
480 :
481 : _GLIBCXX14_CONSTEXPR bool
482 : _M_is_equal(const _Base_bitset<1>& __x) const _GLIBCXX_NOEXCEPT
483 : { return _M_w == __x._M_w; }
484 :
485 : template<size_t _Nb>
486 : _GLIBCXX14_CONSTEXPR bool
487 : _M_are_all() const _GLIBCXX_NOEXCEPT
488 : { return _M_w == (~static_cast<_WordT>(0)
489 : >> (_GLIBCXX_BITSET_BITS_PER_WORD - _Nb)); }
490 :
491 : _GLIBCXX14_CONSTEXPR bool
492 : _M_is_any() const _GLIBCXX_NOEXCEPT
493 : { return _M_w != 0; }
494 :
495 : _GLIBCXX14_CONSTEXPR size_t
496 : _M_do_count() const _GLIBCXX_NOEXCEPT
497 : { return __builtin_popcountl(_M_w); }
498 :
499 : _GLIBCXX14_CONSTEXPR unsigned long
500 : _M_do_to_ulong() const _GLIBCXX_NOEXCEPT
501 : { return _M_w; }
502 :
503 : #if __cplusplus >= 201103L
504 : constexpr unsigned long long
505 : _M_do_to_ullong() const noexcept
506 : { return _M_w; }
507 : #endif
508 :
509 : _GLIBCXX14_CONSTEXPR size_t
510 : _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT
511 : {
512 : if (_M_w != 0)
513 : return __builtin_ctzl(_M_w);
514 : else
515 : return __not_found;
516 : }
517 :
518 : // find the next "on" bit that follows "prev"
519 : _GLIBCXX14_CONSTEXPR size_t
520 : _M_do_find_next(size_t __prev, size_t __not_found) const
521 : _GLIBCXX_NOEXCEPT
522 : {
523 : ++__prev;
524 : if (__prev >= ((size_t) _GLIBCXX_BITSET_BITS_PER_WORD))
525 : return __not_found;
526 :
527 : _WordT __x = _M_w >> __prev;
528 : if (__x != 0)
529 : return __builtin_ctzl(__x) + __prev;
530 : else
531 : return __not_found;
532 : }
533 : };
534 :
535 : /**
536 : * Base class, specialization for no storage (zero-length %bitset).
537 : *
538 : * See documentation for bitset.
539 : */
540 : template<>
541 : struct _Base_bitset<0>
542 : {
543 : typedef unsigned long _WordT;
544 :
545 : _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
546 : { }
547 :
548 : #if __cplusplus >= 201103L
549 : constexpr _Base_bitset(unsigned long long) noexcept
550 : #else
551 : _Base_bitset(unsigned long)
552 : #endif
553 : { }
554 :
555 : static _GLIBCXX_CONSTEXPR size_t
556 : _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
557 : { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
558 :
559 : static _GLIBCXX_CONSTEXPR size_t
560 : _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
561 : { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
562 :
563 : static _GLIBCXX_CONSTEXPR size_t
564 : _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
565 : { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
566 :
567 : static _GLIBCXX_CONSTEXPR _WordT
568 : _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
569 : { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
570 :
571 : // This would normally give access to the data. The bounds-checking
572 : // in the bitset class will prevent the user from getting this far,
573 : // but this must fail if the user calls _Unchecked_set directly.
574 : // Let's not penalize zero-length users unless they actually
575 : // make an unchecked call; all the memory ugliness is therefore
576 : // localized to this single should-never-get-this-far function.
577 : __attribute__((__noreturn__))
578 : _WordT&
579 : _M_getword(size_t) _GLIBCXX_NOEXCEPT
580 : { __throw_out_of_range(__N("_Base_bitset::_M_getword")); }
581 :
582 : _GLIBCXX_CONSTEXPR _WordT
583 : _M_getword(size_t) const _GLIBCXX_NOEXCEPT
584 : { return 0; }
585 :
586 : _GLIBCXX_CONSTEXPR _WordT
587 : _M_hiword() const _GLIBCXX_NOEXCEPT
588 : { return 0; }
589 :
590 : _GLIBCXX14_CONSTEXPR void
591 : _M_do_and(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
592 : { }
593 :
594 : _GLIBCXX14_CONSTEXPR void
595 : _M_do_or(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
596 : { }
597 :
598 : _GLIBCXX14_CONSTEXPR void
599 : _M_do_xor(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
600 : { }
601 :
602 : _GLIBCXX14_CONSTEXPR void
603 : _M_do_left_shift(size_t) _GLIBCXX_NOEXCEPT
604 : { }
605 :
606 : _GLIBCXX14_CONSTEXPR void
607 : _M_do_right_shift(size_t) _GLIBCXX_NOEXCEPT
608 : { }
609 :
610 : _GLIBCXX14_CONSTEXPR void
611 : _M_do_flip() _GLIBCXX_NOEXCEPT
612 : { }
613 :
614 : _GLIBCXX14_CONSTEXPR void
615 : _M_do_set() _GLIBCXX_NOEXCEPT
616 : { }
617 :
618 : _GLIBCXX14_CONSTEXPR void
619 : _M_do_reset() _GLIBCXX_NOEXCEPT
620 : { }
621 :
622 : // Are all empty bitsets equal to each other? Are they equal to
623 : // themselves? How to compare a thing which has no state? What is
624 : // the sound of one zero-length bitset clapping?
625 : _GLIBCXX_CONSTEXPR bool
626 : _M_is_equal(const _Base_bitset<0>&) const _GLIBCXX_NOEXCEPT
627 : { return true; }
628 :
629 : template<size_t _Nb>
630 : _GLIBCXX_CONSTEXPR bool
631 : _M_are_all() const _GLIBCXX_NOEXCEPT
632 : { return true; }
633 :
634 : _GLIBCXX_CONSTEXPR bool
635 : _M_is_any() const _GLIBCXX_NOEXCEPT
636 : { return false; }
637 :
638 : _GLIBCXX_CONSTEXPR size_t
639 : _M_do_count() const _GLIBCXX_NOEXCEPT
640 : { return 0; }
641 :
642 : _GLIBCXX_CONSTEXPR unsigned long
643 : _M_do_to_ulong() const _GLIBCXX_NOEXCEPT
644 : { return 0; }
645 :
646 : #if __cplusplus >= 201103L
647 : constexpr unsigned long long
648 : _M_do_to_ullong() const noexcept
649 : { return 0; }
650 : #endif
651 :
652 : // Normally "not found" is the size, but that could also be
653 : // misinterpreted as an index in this corner case. Oh well.
654 : _GLIBCXX_CONSTEXPR size_t
655 : _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT
656 : { return 0; }
657 :
658 : _GLIBCXX_CONSTEXPR size_t
659 : _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT
660 : { return 0; }
661 : };
662 :
663 :
664 : // Helper class to zero out the unused high-order bits in the highest word.
665 : template<size_t _Extrabits>
666 : struct _Sanitize
667 : {
668 : typedef unsigned long _WordT;
669 :
670 : static _GLIBCXX14_CONSTEXPR void
671 : _S_do_sanitize(_WordT& __val) _GLIBCXX_NOEXCEPT
672 : { __val &= ~((~static_cast<_WordT>(0)) << _Extrabits); }
673 : };
674 :
675 : template<>
676 : struct _Sanitize<0>
677 : {
678 : typedef unsigned long _WordT;
679 :
680 : static _GLIBCXX14_CONSTEXPR void
681 : _S_do_sanitize(_WordT) _GLIBCXX_NOEXCEPT { }
682 : };
683 :
684 : #if __cplusplus >= 201103L
685 : template<size_t _Nb, bool = (_Nb < _GLIBCXX_BITSET_BITS_PER_ULL)>
686 : struct _Sanitize_val
687 : {
688 : static constexpr unsigned long long
689 : _S_do_sanitize_val(unsigned long long __val)
690 : { return __val; }
691 : };
692 :
693 : template<size_t _Nb>
694 : struct _Sanitize_val<_Nb, true>
695 : {
696 : static constexpr unsigned long long
697 : _S_do_sanitize_val(unsigned long long __val)
698 : { return __val & ~((~static_cast<unsigned long long>(0)) << _Nb); }
699 : };
700 :
701 : namespace __bitset
702 : {
703 : #if _GLIBCXX_HOSTED
704 : template<typename _CharT>
705 : using __string = std::basic_string<_CharT>;
706 : #else
707 : template<typename _CharT>
708 : struct __string
709 : {
710 : using size_type = size_t;
711 : static constexpr size_type npos = size_type(-1);
712 :
713 : struct traits_type
714 : {
715 : static _GLIBCXX14_CONSTEXPR size_t
716 : length(const _CharT* __s) noexcept
717 : {
718 : size_t __n = 0;
719 : while (__s[__n])
720 : __n++;
721 : return __n;
722 : }
723 :
724 : static constexpr bool
725 : eq(_CharT __l, _CharT __r) noexcept
726 : { return __l == __r; }
727 : };
728 : };
729 : #endif // HOSTED
730 : } // namespace __bitset
731 : #endif // C++11
732 :
733 : /**
734 : * @brief The %bitset class represents a @e fixed-size sequence of bits.
735 : * @ingroup utilities
736 : *
737 : * (Note that %bitset does @e not meet the formal requirements of a
738 : * <a href="tables.html#65">container</a>. Mainly, it lacks iterators.)
739 : *
740 : * The template argument, @a Nb, may be any non-negative number,
741 : * specifying the number of bits (e.g., "0", "12", "1024*1024").
742 : *
743 : * In the general unoptimized case, storage is allocated in word-sized
744 : * blocks. Let B be the number of bits in a word, then (Nb+(B-1))/B
745 : * words will be used for storage. B - Nb%B bits are unused. (They are
746 : * the high-order bits in the highest word.) It is a class invariant
747 : * that those unused bits are always zero.
748 : *
749 : * If you think of %bitset as <em>a simple array of bits</em>, be
750 : * aware that your mental picture is reversed: a %bitset behaves
751 : * the same way as bits in integers do, with the bit at index 0 in
752 : * the <em>least significant / right-hand</em> position, and the bit at
753 : * index Nb-1 in the <em>most significant / left-hand</em> position.
754 : * Thus, unlike other containers, a %bitset's index <em>counts from
755 : * right to left</em>, to put it very loosely.
756 : *
757 : * This behavior is preserved when translating to and from strings. For
758 : * example, the first line of the following program probably prints
759 : * <em>b('a') is 0001100001</em> on a modern ASCII system.
760 : *
761 : * @code
762 : * #include <bitset>
763 : * #include <iostream>
764 : * #include <sstream>
765 : *
766 : * using namespace std;
767 : *
768 : * int main()
769 : * {
770 : * long a = 'a';
771 : * bitset<10> b(a);
772 : *
773 : * cout << "b('a') is " << b << endl;
774 : *
775 : * ostringstream s;
776 : * s << b;
777 : * string str = s.str();
778 : * cout << "index 3 in the string is " << str[3] << " but\n"
779 : * << "index 3 in the bitset is " << b[3] << endl;
780 : * }
781 : * @endcode
782 : *
783 : * Also see:
784 : * https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_containers.html
785 : * for a description of extensions.
786 : *
787 : * Most of the actual code isn't contained in %bitset<> itself, but in the
788 : * base class _Base_bitset. The base class works with whole words, not with
789 : * individual bits. This allows us to specialize _Base_bitset for the
790 : * important special case where the %bitset is only a single word.
791 : *
792 : * Extra confusion can result due to the fact that the storage for
793 : * _Base_bitset @e is a regular array, and is indexed as such. This is
794 : * carefully encapsulated.
795 : */
796 : template<size_t _Nb>
797 : class bitset
798 : : private _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)>
799 : {
800 : private:
801 : typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base;
802 : typedef unsigned long _WordT;
803 :
804 : #if _GLIBCXX_HOSTED
805 : template<class _CharT, class _Traits, class _Alloc>
806 : _GLIBCXX23_CONSTEXPR
807 : void
808 : _M_check_initial_position(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
809 : size_t __position) const
810 : {
811 : if (__position > __s.size())
812 : __throw_out_of_range_fmt(__N("bitset::bitset: __position "
813 : "(which is %zu) > __s.size() "
814 : "(which is %zu)"),
815 : __position, __s.size());
816 : }
817 : #endif // HOSTED
818 :
819 : _GLIBCXX23_CONSTEXPR
820 : void _M_check(size_t __position, const char *__s) const
821 : {
822 : if (__position >= _Nb)
823 : __throw_out_of_range_fmt(__N("%s: __position (which is %zu) "
824 : ">= _Nb (which is %zu)"),
825 : __s, __position, _Nb);
826 : }
827 :
828 : _GLIBCXX23_CONSTEXPR
829 : void
830 : _M_do_sanitize() _GLIBCXX_NOEXCEPT
831 : {
832 : typedef _Sanitize<_Nb % _GLIBCXX_BITSET_BITS_PER_WORD> __sanitize_type;
833 : __sanitize_type::_S_do_sanitize(this->_M_hiword());
834 : }
835 :
836 : #if __cplusplus >= 201103L
837 : friend struct std::hash<bitset>;
838 : #endif
839 :
840 : public:
841 : /**
842 : * This encapsulates the concept of a single bit. An instance of this
843 : * class is a proxy for an actual bit; this way the individual bit
844 : * operations are done as faster word-size bitwise instructions.
845 : *
846 : * Most users will never need to use this class directly; conversions
847 : * to and from bool are automatic and should be transparent. Overloaded
848 : * operators help to preserve the illusion.
849 : *
850 : * (On a typical system, this <em>bit %reference</em> is 64
851 : * times the size of an actual bit. Ha.)
852 : */
853 : class reference
854 : {
855 : friend class bitset;
856 :
857 : _WordT* _M_wp;
858 : size_t _M_bpos;
859 :
860 : // left undefined
861 : reference();
862 :
863 : public:
864 : _GLIBCXX23_CONSTEXPR
865 0 : reference(bitset& __b, size_t __pos) _GLIBCXX_NOEXCEPT
866 : {
867 0 : _M_wp = &__b._M_getword(__pos);
868 0 : _M_bpos = _Base::_S_whichbit(__pos);
869 0 : }
870 :
871 : #if __cplusplus >= 201103L
872 : reference(const reference&) = default;
873 : #endif
874 :
875 : #if __cplusplus > 202002L && __cpp_constexpr_dynamic_alloc
876 : constexpr
877 : #endif
878 0 : ~reference() _GLIBCXX_NOEXCEPT
879 0 : { }
880 :
881 : // For b[i] = __x;
882 : _GLIBCXX23_CONSTEXPR
883 : reference&
884 0 : operator=(bool __x) _GLIBCXX_NOEXCEPT
885 : {
886 0 : if (__x)
887 0 : *_M_wp |= _Base::_S_maskbit(_M_bpos);
888 : else
889 0 : *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
890 0 : return *this;
891 : }
892 :
893 : // For b[i] = b[__j];
894 : _GLIBCXX23_CONSTEXPR
895 : reference&
896 : operator=(const reference& __j) _GLIBCXX_NOEXCEPT
897 : {
898 : if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos)))
899 : *_M_wp |= _Base::_S_maskbit(_M_bpos);
900 : else
901 : *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
902 : return *this;
903 : }
904 :
905 : // Flips the bit
906 : _GLIBCXX23_CONSTEXPR
907 : bool
908 : operator~() const _GLIBCXX_NOEXCEPT
909 : { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; }
910 :
911 : // For __x = b[i];
912 : _GLIBCXX23_CONSTEXPR
913 : operator bool() const _GLIBCXX_NOEXCEPT
914 : { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; }
915 :
916 : // For b[i].flip();
917 : _GLIBCXX23_CONSTEXPR
918 : reference&
919 : flip() _GLIBCXX_NOEXCEPT
920 : {
921 : *_M_wp ^= _Base::_S_maskbit(_M_bpos);
922 : return *this;
923 : }
924 : };
925 : friend class reference;
926 :
927 : // 23.3.5.1 constructors:
928 : /// All bits set to zero.
929 0 : _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT
930 0 : { }
931 :
932 : /// Initial bits bitwise-copied from a single word (others set to zero).
933 : #if __cplusplus >= 201103L
934 : constexpr bitset(unsigned long long __val) noexcept
935 : : _Base(_Sanitize_val<_Nb>::_S_do_sanitize_val(__val)) { }
936 : #else
937 : bitset(unsigned long __val)
938 : : _Base(__val)
939 : { _M_do_sanitize(); }
940 : #endif
941 :
942 : #if _GLIBCXX_HOSTED
943 : /**
944 : * Use a subset of a string.
945 : * @param __s A string of @a 0 and @a 1 characters.
946 : * @param __position Index of the first character in @a __s to use;
947 : * defaults to zero.
948 : * @throw std::out_of_range If @a pos is bigger the size of @a __s.
949 : * @throw std::invalid_argument If a character appears in the string
950 : * which is neither @a 0 nor @a 1.
951 : */
952 : template<class _CharT, class _Traits, class _Alloc>
953 : _GLIBCXX23_CONSTEXPR
954 : explicit
955 : bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
956 : size_t __position = 0)
957 : : _Base()
958 : {
959 : _M_check_initial_position(__s, __position);
960 : _M_copy_from_string(__s, __position,
961 : std::basic_string<_CharT, _Traits, _Alloc>::npos,
962 : _CharT('0'), _CharT('1'));
963 : }
964 :
965 : /**
966 : * Use a subset of a string.
967 : * @param __s A string of @a 0 and @a 1 characters.
968 : * @param __position Index of the first character in @a __s to use.
969 : * @param __n The number of characters to copy.
970 : * @throw std::out_of_range If @a __position is bigger the size
971 : * of @a __s.
972 : * @throw std::invalid_argument If a character appears in the string
973 : * which is neither @a 0 nor @a 1.
974 : */
975 : template<class _CharT, class _Traits, class _Alloc>
976 : _GLIBCXX23_CONSTEXPR
977 : bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
978 : size_t __position, size_t __n)
979 : : _Base()
980 : {
981 : _M_check_initial_position(__s, __position);
982 : _M_copy_from_string(__s, __position, __n, _CharT('0'), _CharT('1'));
983 : }
984 :
985 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
986 : // 396. what are characters zero and one.
987 : template<class _CharT, class _Traits, class _Alloc>
988 : _GLIBCXX23_CONSTEXPR
989 : bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
990 : size_t __position, size_t __n,
991 : _CharT __zero, _CharT __one = _CharT('1'))
992 : : _Base()
993 : {
994 : _M_check_initial_position(__s, __position);
995 : _M_copy_from_string(__s, __position, __n, __zero, __one);
996 : }
997 : #endif // HOSTED
998 :
999 : #if __cplusplus >= 201103L
1000 : /**
1001 : * Construct from a character %array.
1002 : * @param __str An %array of characters @a zero and @a one.
1003 : * @param __n The number of characters to use.
1004 : * @param __zero The character corresponding to the value 0.
1005 : * @param __one The character corresponding to the value 1.
1006 : * @throw std::invalid_argument If a character appears in the string
1007 : * which is neither @a __zero nor @a __one.
1008 : */
1009 : template<typename _CharT>
1010 : [[__gnu__::__nonnull__]]
1011 : _GLIBCXX23_CONSTEXPR
1012 : explicit
1013 : bitset(const _CharT* __str,
1014 : typename __bitset::__string<_CharT>::size_type __n
1015 : = __bitset::__string<_CharT>::npos,
1016 : _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
1017 : : _Base()
1018 : {
1019 : #if _GLIBCXX_HOSTED
1020 : if (!__str)
1021 : __throw_logic_error(__N("bitset::bitset(const _CharT*, ...)"));
1022 : #endif
1023 : using _Traits = typename __bitset::__string<_CharT>::traits_type;
1024 :
1025 : if (__n == __bitset::__string<_CharT>::npos)
1026 : __n = _Traits::length(__str);
1027 : _M_copy_from_ptr<_CharT, _Traits>(__str, __n, 0, __n, __zero, __one);
1028 : }
1029 : #endif // C++11
1030 :
1031 : // 23.3.5.2 bitset operations:
1032 : ///@{
1033 : /**
1034 : * Operations on bitsets.
1035 : * @param __rhs A same-sized bitset.
1036 : *
1037 : * These should be self-explanatory.
1038 : */
1039 : _GLIBCXX23_CONSTEXPR
1040 : bitset<_Nb>&
1041 : operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
1042 : {
1043 : this->_M_do_and(__rhs);
1044 : return *this;
1045 : }
1046 :
1047 : _GLIBCXX23_CONSTEXPR
1048 : bitset<_Nb>&
1049 : operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
1050 : {
1051 : this->_M_do_or(__rhs);
1052 : return *this;
1053 : }
1054 :
1055 : _GLIBCXX23_CONSTEXPR
1056 : bitset<_Nb>&
1057 : operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
1058 : {
1059 : this->_M_do_xor(__rhs);
1060 : return *this;
1061 : }
1062 : ///@}
1063 :
1064 : ///@{
1065 : /**
1066 : * Operations on bitsets.
1067 : * @param __position The number of places to shift.
1068 : *
1069 : * These should be self-explanatory.
1070 : */
1071 : _GLIBCXX23_CONSTEXPR
1072 : bitset<_Nb>&
1073 : operator<<=(size_t __position) _GLIBCXX_NOEXCEPT
1074 : {
1075 : if (__builtin_expect(__position < _Nb, 1))
1076 : {
1077 : this->_M_do_left_shift(__position);
1078 : this->_M_do_sanitize();
1079 : }
1080 : else
1081 : this->_M_do_reset();
1082 : return *this;
1083 : }
1084 :
1085 : _GLIBCXX23_CONSTEXPR
1086 : bitset<_Nb>&
1087 : operator>>=(size_t __position) _GLIBCXX_NOEXCEPT
1088 : {
1089 : if (__builtin_expect(__position < _Nb, 1))
1090 : {
1091 : this->_M_do_right_shift(__position);
1092 : this->_M_do_sanitize();
1093 : }
1094 : else
1095 : this->_M_do_reset();
1096 : return *this;
1097 : }
1098 : ///@}
1099 :
1100 : ///@{
1101 : /**
1102 : * These versions of single-bit set, reset, flip, and test are
1103 : * extensions from the SGI version. They do no range checking.
1104 : * @ingroup SGIextensions
1105 : */
1106 : _GLIBCXX23_CONSTEXPR
1107 : bitset<_Nb>&
1108 : _Unchecked_set(size_t __pos) _GLIBCXX_NOEXCEPT
1109 : {
1110 : this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
1111 : return *this;
1112 : }
1113 :
1114 : _GLIBCXX23_CONSTEXPR
1115 : bitset<_Nb>&
1116 : _Unchecked_set(size_t __pos, int __val) _GLIBCXX_NOEXCEPT
1117 : {
1118 : if (__val)
1119 : this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
1120 : else
1121 : this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
1122 : return *this;
1123 : }
1124 :
1125 : _GLIBCXX23_CONSTEXPR
1126 : bitset<_Nb>&
1127 : _Unchecked_reset(size_t __pos) _GLIBCXX_NOEXCEPT
1128 : {
1129 : this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
1130 : return *this;
1131 : }
1132 :
1133 : _GLIBCXX23_CONSTEXPR
1134 : bitset<_Nb>&
1135 : _Unchecked_flip(size_t __pos) _GLIBCXX_NOEXCEPT
1136 : {
1137 : this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos);
1138 : return *this;
1139 : }
1140 :
1141 : _GLIBCXX_CONSTEXPR bool
1142 0 : _Unchecked_test(size_t __pos) const _GLIBCXX_NOEXCEPT
1143 0 : { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos))
1144 0 : != static_cast<_WordT>(0)); }
1145 : ///@}
1146 :
1147 : // Set, reset, and flip.
1148 : /**
1149 : * @brief Sets every bit to true.
1150 : */
1151 : _GLIBCXX23_CONSTEXPR
1152 : bitset<_Nb>&
1153 : set() _GLIBCXX_NOEXCEPT
1154 : {
1155 : this->_M_do_set();
1156 : this->_M_do_sanitize();
1157 : return *this;
1158 : }
1159 :
1160 : /**
1161 : * @brief Sets a given bit to a particular value.
1162 : * @param __position The index of the bit.
1163 : * @param __val Either true or false, defaults to true.
1164 : * @throw std::out_of_range If @a pos is bigger the size of the %set.
1165 : */
1166 : _GLIBCXX23_CONSTEXPR
1167 : bitset<_Nb>&
1168 : set(size_t __position, bool __val = true)
1169 : {
1170 : this->_M_check(__position, __N("bitset::set"));
1171 : return _Unchecked_set(__position, __val);
1172 : }
1173 :
1174 : /**
1175 : * @brief Sets every bit to false.
1176 : */
1177 : _GLIBCXX23_CONSTEXPR
1178 : bitset<_Nb>&
1179 : reset() _GLIBCXX_NOEXCEPT
1180 : {
1181 : this->_M_do_reset();
1182 : return *this;
1183 : }
1184 :
1185 : /**
1186 : * @brief Sets a given bit to false.
1187 : * @param __position The index of the bit.
1188 : * @throw std::out_of_range If @a pos is bigger the size of the %set.
1189 : *
1190 : * Same as writing @c set(pos,false).
1191 : */
1192 : _GLIBCXX23_CONSTEXPR
1193 : bitset<_Nb>&
1194 : reset(size_t __position)
1195 : {
1196 : this->_M_check(__position, __N("bitset::reset"));
1197 : return _Unchecked_reset(__position);
1198 : }
1199 :
1200 : /**
1201 : * @brief Toggles every bit to its opposite value.
1202 : */
1203 : _GLIBCXX23_CONSTEXPR
1204 : bitset<_Nb>&
1205 : flip() _GLIBCXX_NOEXCEPT
1206 : {
1207 : this->_M_do_flip();
1208 : this->_M_do_sanitize();
1209 : return *this;
1210 : }
1211 :
1212 : /**
1213 : * @brief Toggles a given bit to its opposite value.
1214 : * @param __position The index of the bit.
1215 : * @throw std::out_of_range If @a pos is bigger the size of the %set.
1216 : */
1217 : _GLIBCXX23_CONSTEXPR
1218 : bitset<_Nb>&
1219 : flip(size_t __position)
1220 : {
1221 : this->_M_check(__position, __N("bitset::flip"));
1222 : return _Unchecked_flip(__position);
1223 : }
1224 :
1225 : /// See the no-argument flip().
1226 : _GLIBCXX23_CONSTEXPR
1227 : bitset<_Nb>
1228 : operator~() const _GLIBCXX_NOEXCEPT
1229 : { return bitset<_Nb>(*this).flip(); }
1230 :
1231 : ///@{
1232 : /**
1233 : * @brief Array-indexing support.
1234 : * @param __position Index into the %bitset.
1235 : * @return A bool for a <em>const %bitset</em>. For non-const
1236 : * bitsets, an instance of the reference proxy class.
1237 : * @note These operators do no range checking and throw no exceptions,
1238 : * as required by DR 11 to the standard.
1239 : *
1240 : * _GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already
1241 : * resolves DR 11 (items 1 and 2), but does not do the range-checking
1242 : * required by that DR's resolution. -pme
1243 : * The DR has since been changed: range-checking is a precondition
1244 : * (users' responsibility), and these functions must not throw. -pme
1245 : */
1246 : _GLIBCXX23_CONSTEXPR
1247 : reference
1248 0 : operator[](size_t __position)
1249 0 : { return reference(*this, __position); }
1250 :
1251 : _GLIBCXX_CONSTEXPR bool
1252 0 : operator[](size_t __position) const
1253 0 : { return _Unchecked_test(__position); }
1254 : ///@}
1255 :
1256 : /**
1257 : * @brief Returns a numerical interpretation of the %bitset.
1258 : * @return The integral equivalent of the bits.
1259 : * @throw std::overflow_error If there are too many bits to be
1260 : * represented in an @c unsigned @c long.
1261 : */
1262 : _GLIBCXX23_CONSTEXPR
1263 : unsigned long
1264 : to_ulong() const
1265 : { return this->_M_do_to_ulong(); }
1266 :
1267 : #if __cplusplus >= 201103L
1268 : _GLIBCXX23_CONSTEXPR
1269 : unsigned long long
1270 : to_ullong() const
1271 : { return this->_M_do_to_ullong(); }
1272 : #endif
1273 :
1274 : #if _GLIBCXX_HOSTED
1275 : /**
1276 : * @brief Returns a character interpretation of the %bitset.
1277 : * @return The string equivalent of the bits.
1278 : *
1279 : * Note the ordering of the bits: decreasing character positions
1280 : * correspond to increasing bit positions (see the main class notes for
1281 : * an example).
1282 : */
1283 : template<class _CharT, class _Traits, class _Alloc>
1284 : _GLIBCXX23_CONSTEXPR
1285 : std::basic_string<_CharT, _Traits, _Alloc>
1286 : to_string() const
1287 : {
1288 : std::basic_string<_CharT, _Traits, _Alloc> __result;
1289 : _M_copy_to_string(__result, _CharT('0'), _CharT('1'));
1290 : return __result;
1291 : }
1292 :
1293 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1294 : // 396. what are characters zero and one.
1295 : template<class _CharT, class _Traits, class _Alloc>
1296 : _GLIBCXX23_CONSTEXPR
1297 : std::basic_string<_CharT, _Traits, _Alloc>
1298 : to_string(_CharT __zero, _CharT __one = _CharT('1')) const
1299 : {
1300 : std::basic_string<_CharT, _Traits, _Alloc> __result;
1301 : _M_copy_to_string(__result, __zero, __one);
1302 : return __result;
1303 : }
1304 :
1305 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1306 : // 434. bitset::to_string() hard to use.
1307 : template<class _CharT, class _Traits>
1308 : _GLIBCXX23_CONSTEXPR
1309 : std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
1310 : to_string() const
1311 : { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }
1312 :
1313 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1314 : // 853. to_string needs updating with zero and one.
1315 : template<class _CharT, class _Traits>
1316 : _GLIBCXX23_CONSTEXPR
1317 : std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
1318 : to_string(_CharT __zero, _CharT __one = _CharT('1')) const
1319 : { return to_string<_CharT, _Traits,
1320 : std::allocator<_CharT> >(__zero, __one); }
1321 :
1322 : template<class _CharT>
1323 : _GLIBCXX23_CONSTEXPR
1324 : std::basic_string<_CharT, std::char_traits<_CharT>,
1325 : std::allocator<_CharT> >
1326 : to_string() const
1327 : {
1328 : return to_string<_CharT, std::char_traits<_CharT>,
1329 : std::allocator<_CharT> >();
1330 : }
1331 :
1332 : template<class _CharT>
1333 : _GLIBCXX23_CONSTEXPR
1334 : std::basic_string<_CharT, std::char_traits<_CharT>,
1335 : std::allocator<_CharT> >
1336 : to_string(_CharT __zero, _CharT __one = _CharT('1')) const
1337 : {
1338 : return to_string<_CharT, std::char_traits<_CharT>,
1339 : std::allocator<_CharT> >(__zero, __one);
1340 : }
1341 :
1342 : _GLIBCXX23_CONSTEXPR
1343 : std::basic_string<char, std::char_traits<char>, std::allocator<char> >
1344 : to_string() const
1345 : {
1346 : return to_string<char, std::char_traits<char>,
1347 : std::allocator<char> >();
1348 : }
1349 :
1350 : _GLIBCXX23_CONSTEXPR
1351 : std::basic_string<char, std::char_traits<char>, std::allocator<char> >
1352 : to_string(char __zero, char __one = '1') const
1353 : {
1354 : return to_string<char, std::char_traits<char>,
1355 : std::allocator<char> >(__zero, __one);
1356 : }
1357 : #endif // HOSTED
1358 :
1359 : /// Returns the number of bits which are set.
1360 : _GLIBCXX23_CONSTEXPR
1361 : size_t
1362 : count() const _GLIBCXX_NOEXCEPT
1363 : { return this->_M_do_count(); }
1364 :
1365 : /// Returns the total number of bits.
1366 : _GLIBCXX_CONSTEXPR size_t
1367 0 : size() const _GLIBCXX_NOEXCEPT
1368 0 : { return _Nb; }
1369 :
1370 : ///@{
1371 : /// These comparisons for equality/inequality are, well, @e bitwise.
1372 : _GLIBCXX23_CONSTEXPR
1373 : bool
1374 : operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
1375 : { return this->_M_is_equal(__rhs); }
1376 :
1377 : #if __cpp_impl_three_way_comparison < 201907L
1378 : _GLIBCXX23_CONSTEXPR
1379 : bool
1380 : operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
1381 : { return !this->_M_is_equal(__rhs); }
1382 : #endif
1383 : ///@}
1384 :
1385 : /**
1386 : * @brief Tests the value of a bit.
1387 : * @param __position The index of a bit.
1388 : * @return The value at @a pos.
1389 : * @throw std::out_of_range If @a pos is bigger the size of the %set.
1390 : */
1391 : _GLIBCXX23_CONSTEXPR
1392 : bool
1393 : test(size_t __position) const
1394 : {
1395 : this->_M_check(__position, __N("bitset::test"));
1396 : return _Unchecked_test(__position);
1397 : }
1398 :
1399 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1400 : // DR 693. std::bitset::all() missing.
1401 : /**
1402 : * @brief Tests whether all the bits are on.
1403 : * @return True if all the bits are set.
1404 : */
1405 : _GLIBCXX23_CONSTEXPR
1406 : bool
1407 : all() const _GLIBCXX_NOEXCEPT
1408 : { return this->template _M_are_all<_Nb>(); }
1409 :
1410 : /**
1411 : * @brief Tests whether any of the bits are on.
1412 : * @return True if at least one bit is set.
1413 : */
1414 : _GLIBCXX23_CONSTEXPR
1415 : bool
1416 : any() const _GLIBCXX_NOEXCEPT
1417 : { return this->_M_is_any(); }
1418 :
1419 : /**
1420 : * @brief Tests whether any of the bits are on.
1421 : * @return True if none of the bits are set.
1422 : */
1423 : _GLIBCXX23_CONSTEXPR
1424 : bool
1425 : none() const _GLIBCXX_NOEXCEPT
1426 : { return !this->_M_is_any(); }
1427 :
1428 : ///@{
1429 : /// Self-explanatory.
1430 : _GLIBCXX23_CONSTEXPR
1431 : bitset<_Nb>
1432 : operator<<(size_t __position) const _GLIBCXX_NOEXCEPT
1433 : { return bitset<_Nb>(*this) <<= __position; }
1434 :
1435 : _GLIBCXX23_CONSTEXPR
1436 : bitset<_Nb>
1437 : operator>>(size_t __position) const _GLIBCXX_NOEXCEPT
1438 : { return bitset<_Nb>(*this) >>= __position; }
1439 : ///@}
1440 :
1441 : /**
1442 : * @brief Finds the index of the first "on" bit.
1443 : * @return The index of the first bit set, or size() if not found.
1444 : * @ingroup SGIextensions
1445 : * @sa _Find_next
1446 : */
1447 : _GLIBCXX23_CONSTEXPR
1448 : size_t
1449 : _Find_first() const _GLIBCXX_NOEXCEPT
1450 : { return this->_M_do_find_first(_Nb); }
1451 :
1452 : /**
1453 : * @brief Finds the index of the next "on" bit after prev.
1454 : * @return The index of the next bit set, or size() if not found.
1455 : * @param __prev Where to start searching.
1456 : * @ingroup SGIextensions
1457 : * @sa _Find_first
1458 : */
1459 : _GLIBCXX23_CONSTEXPR
1460 : size_t
1461 : _Find_next(size_t __prev) const _GLIBCXX_NOEXCEPT
1462 : { return this->_M_do_find_next(__prev, _Nb); }
1463 :
1464 : private:
1465 : // Helper functions for string operations.
1466 : template<class _CharT, class _Traits>
1467 : _GLIBCXX23_CONSTEXPR
1468 : void
1469 : _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t,
1470 : _CharT, _CharT);
1471 :
1472 : #if _GLIBCXX_HOSTED
1473 : template<class _CharT, class _Traits, class _Alloc>
1474 : _GLIBCXX23_CONSTEXPR
1475 : void
1476 : _M_copy_from_string(const std::basic_string<_CharT,
1477 : _Traits, _Alloc>& __s, size_t __pos, size_t __n,
1478 : _CharT __zero, _CharT __one)
1479 : { _M_copy_from_ptr<_CharT, _Traits>(__s.data(), __s.size(), __pos, __n,
1480 : __zero, __one); }
1481 :
1482 : template<class _CharT, class _Traits, class _Alloc>
1483 : _GLIBCXX23_CONSTEXPR
1484 : void
1485 : _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>&,
1486 : _CharT, _CharT) const;
1487 :
1488 : template<class _CharT, class _Traits, size_t _Nb2>
1489 : friend std::basic_istream<_CharT, _Traits>&
1490 : operator>>(std::basic_istream<_CharT, _Traits>&, bitset<_Nb2>&);
1491 :
1492 : template <class _CharT, class _Traits, size_t _Nb2>
1493 : friend std::basic_ostream<_CharT, _Traits>&
1494 : operator<<(std::basic_ostream<_CharT, _Traits>&, const bitset<_Nb2>&);
1495 : #endif
1496 : };
1497 :
1498 : // Definitions of non-inline member functions.
1499 : template<size_t _Nb>
1500 : template<class _CharT, class _Traits>
1501 : _GLIBCXX23_CONSTEXPR
1502 : void
1503 : bitset<_Nb>::
1504 : _M_copy_from_ptr(const _CharT* __s, size_t __len,
1505 : size_t __pos, size_t __n, _CharT __zero, _CharT __one)
1506 : {
1507 : reset();
1508 : const size_t __nbits = std::min(_Nb, std::min(__n, size_t(__len - __pos)));
1509 : for (size_t __i = __nbits; __i > 0; --__i)
1510 : {
1511 : const _CharT __c = __s[__pos + __nbits - __i];
1512 : if (_Traits::eq(__c, __zero))
1513 : ;
1514 : else if (_Traits::eq(__c, __one))
1515 : _Unchecked_set(__i - 1);
1516 : else
1517 : __throw_invalid_argument(__N("bitset::_M_copy_from_ptr"));
1518 : }
1519 : }
1520 :
1521 : #if _GLIBCXX_HOSTED
1522 : template<size_t _Nb>
1523 : template<class _CharT, class _Traits, class _Alloc>
1524 : _GLIBCXX23_CONSTEXPR
1525 : void
1526 : bitset<_Nb>::
1527 : _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>& __s,
1528 : _CharT __zero, _CharT __one) const
1529 : {
1530 : __s.assign(_Nb, __zero);
1531 : size_t __n = this->_Find_first();
1532 : while (__n < _Nb)
1533 : {
1534 : __s[_Nb - __n - 1] = __one;
1535 : __n = _Find_next(__n);
1536 : }
1537 : }
1538 : #endif // HOSTED
1539 :
1540 : // 23.3.5.3 bitset operations:
1541 : ///@{
1542 : /**
1543 : * @brief Global bitwise operations on bitsets.
1544 : * @param __x A bitset.
1545 : * @param __y A bitset of the same size as @a __x.
1546 : * @return A new bitset.
1547 : *
1548 : * These should be self-explanatory.
1549 : */
1550 : template<size_t _Nb>
1551 : _GLIBCXX23_CONSTEXPR
1552 : inline bitset<_Nb>
1553 : operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
1554 : {
1555 : bitset<_Nb> __result(__x);
1556 : __result &= __y;
1557 : return __result;
1558 : }
1559 :
1560 : template<size_t _Nb>
1561 : _GLIBCXX23_CONSTEXPR
1562 : inline bitset<_Nb>
1563 : operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
1564 : {
1565 : bitset<_Nb> __result(__x);
1566 : __result |= __y;
1567 : return __result;
1568 : }
1569 :
1570 : template <size_t _Nb>
1571 : _GLIBCXX23_CONSTEXPR
1572 : inline bitset<_Nb>
1573 : operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
1574 : {
1575 : bitset<_Nb> __result(__x);
1576 : __result ^= __y;
1577 : return __result;
1578 : }
1579 : ///@}
1580 :
1581 : #if _GLIBCXX_HOSTED
1582 : ///@{
1583 : /**
1584 : * @brief Global I/O operators for bitsets.
1585 : *
1586 : * Direct I/O between streams and bitsets is supported. Output is
1587 : * straightforward. Input will skip whitespace, only accept @a 0 and @a 1
1588 : * characters, and will only extract as many digits as the %bitset will
1589 : * hold.
1590 : */
1591 : template<class _CharT, class _Traits, size_t _Nb>
1592 : std::basic_istream<_CharT, _Traits>&
1593 : operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
1594 : {
1595 : typedef typename _Traits::char_type char_type;
1596 : typedef std::basic_istream<_CharT, _Traits> __istream_type;
1597 : typedef typename __istream_type::ios_base __ios_base;
1598 :
1599 : struct _Buffer
1600 : {
1601 : static _GLIBCXX_CONSTEXPR bool _S_use_alloca() { return _Nb <= 256; }
1602 :
1603 : explicit _Buffer(_CharT* __p) : _M_ptr(__p) { }
1604 :
1605 : ~_Buffer()
1606 : {
1607 : if _GLIBCXX17_CONSTEXPR (!_S_use_alloca())
1608 : delete[] _M_ptr;
1609 : }
1610 :
1611 : _CharT* const _M_ptr;
1612 : };
1613 : _CharT* __ptr;
1614 : if _GLIBCXX17_CONSTEXPR (_Buffer::_S_use_alloca())
1615 : __ptr = (_CharT*)__builtin_alloca(_Nb);
1616 : else
1617 : __ptr = new _CharT[_Nb];
1618 : const _Buffer __buf(__ptr);
1619 :
1620 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1621 : // 303. Bitset input operator underspecified
1622 : const char_type __zero = __is.widen('0');
1623 : const char_type __one = __is.widen('1');
1624 :
1625 : typename __ios_base::iostate __state = __ios_base::goodbit;
1626 : typename __istream_type::sentry __sentry(__is);
1627 : if (__sentry)
1628 : {
1629 : __try
1630 : {
1631 : for (size_t __i = _Nb; __i > 0; --__i)
1632 : {
1633 : static typename _Traits::int_type __eof = _Traits::eof();
1634 :
1635 : typename _Traits::int_type __c1 = __is.rdbuf()->sbumpc();
1636 : if (_Traits::eq_int_type(__c1, __eof))
1637 : {
1638 : __state |= __ios_base::eofbit;
1639 : break;
1640 : }
1641 : else
1642 : {
1643 : const char_type __c2 = _Traits::to_char_type(__c1);
1644 : if (_Traits::eq(__c2, __zero))
1645 : *__ptr++ = __zero;
1646 : else if (_Traits::eq(__c2, __one))
1647 : *__ptr++ = __one;
1648 : else if (_Traits::
1649 : eq_int_type(__is.rdbuf()->sputbackc(__c2),
1650 : __eof))
1651 : {
1652 : __state |= __ios_base::failbit;
1653 : break;
1654 : }
1655 : }
1656 : }
1657 : }
1658 : __catch(__cxxabiv1::__forced_unwind&)
1659 : {
1660 : __is._M_setstate(__ios_base::badbit);
1661 : __throw_exception_again;
1662 : }
1663 : __catch(...)
1664 : { __is._M_setstate(__ios_base::badbit); }
1665 : }
1666 :
1667 : if _GLIBCXX17_CONSTEXPR (_Nb)
1668 : {
1669 : if (size_t __len = __ptr - __buf._M_ptr)
1670 : __x.template _M_copy_from_ptr<_CharT, _Traits>(__buf._M_ptr, __len,
1671 : 0, __len,
1672 : __zero, __one);
1673 : else
1674 : __state |= __ios_base::failbit;
1675 : }
1676 : if (__state)
1677 : __is.setstate(__state);
1678 : return __is;
1679 : }
1680 :
1681 : template <class _CharT, class _Traits, size_t _Nb>
1682 : std::basic_ostream<_CharT, _Traits>&
1683 : operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1684 : const bitset<_Nb>& __x)
1685 : {
1686 : std::basic_string<_CharT, _Traits> __tmp;
1687 :
1688 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1689 : // 396. what are characters zero and one.
1690 : const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__os.getloc());
1691 : __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1'));
1692 : return __os << __tmp;
1693 : }
1694 : ///@}
1695 : #endif // HOSTED
1696 :
1697 : _GLIBCXX_END_NAMESPACE_CONTAINER
1698 : } // namespace std
1699 :
1700 : #undef _GLIBCXX_BITSET_WORDS
1701 : #undef _GLIBCXX_BITSET_BITS_PER_WORD
1702 : #undef _GLIBCXX_BITSET_BITS_PER_ULL
1703 :
1704 : #if __cplusplus >= 201103L
1705 :
1706 : namespace std _GLIBCXX_VISIBILITY(default)
1707 : {
1708 : _GLIBCXX_BEGIN_NAMESPACE_VERSION
1709 :
1710 : // DR 1182.
1711 : /// std::hash specialization for bitset.
1712 : template<size_t _Nb>
1713 : struct hash<_GLIBCXX_STD_C::bitset<_Nb>>
1714 : : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<_Nb>>
1715 : {
1716 : size_t
1717 : operator()(const _GLIBCXX_STD_C::bitset<_Nb>& __b) const noexcept
1718 : {
1719 : const size_t __clength = (_Nb + __CHAR_BIT__ - 1) / __CHAR_BIT__;
1720 : return std::_Hash_impl::hash(__b._M_getdata(), __clength);
1721 : }
1722 : };
1723 :
1724 : template<>
1725 : struct hash<_GLIBCXX_STD_C::bitset<0>>
1726 : : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<0>>
1727 : {
1728 : size_t
1729 : operator()(const _GLIBCXX_STD_C::bitset<0>&) const noexcept
1730 : { return 0; }
1731 : };
1732 :
1733 : _GLIBCXX_END_NAMESPACE_VERSION
1734 : } // namespace
1735 :
1736 : #endif // C++11
1737 :
1738 : #if defined _GLIBCXX_DEBUG && _GLIBCXX_HOSTED
1739 : # include <debug/bitset>
1740 : #endif
1741 :
1742 : #endif /* _GLIBCXX_BITSET */
|