libstdc++
dynamic_bitset
1 // TR2 <dynamic_bitset> -*- C++ -*-
2 
3 // Copyright (C) 2009-2013 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 /** @file tr2/dynamic_bitset
26  * This is a TR2 C++ Library header.
27  */
28 
29 #ifndef _GLIBCXX_TR2_DYNAMIC_BITSET
30 #define _GLIBCXX_TR2_DYNAMIC_BITSET 1
31 
32 #pragma GCC system_header
33 
34 #include <limits>
35 #include <vector>
36 #include <string>
37 #include <memory> // For std::allocator
38 #include <bits/functexcept.h> // For invalid_argument, out_of_range,
39  // overflow_error
40 #include <iosfwd>
41 #include <bits/cxxabi_forced.h>
42 
43 namespace std _GLIBCXX_VISIBILITY(default)
44 {
45 namespace tr2
46 {
47 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 
49  /**
50  * Dynamic Bitset.
51  *
52  * See N2050,
53  * Proposal to Add a Dynamically Sizeable Bitset to the Standard Library.
54  */
55 namespace __detail
56 {
57 
58 template<typename T>
59 class _Bool2UChar
60 {
61  typedef T type;
62 };
63 
64 template<>
65 class _Bool2UChar<bool>
66 {
67 public:
68  typedef unsigned char type;
69 };
70 
71 }
72 
73  /**
74  * Base class, general case.
75  *
76  * See documentation for dynamic_bitset.
77  */
78  template<typename _WordT = unsigned long long,
79  typename _Alloc = std::allocator<_WordT>>
80  struct __dynamic_bitset_base
81  {
82  static_assert(std::is_unsigned<_WordT>::value, "template argument "
83  "_WordT not an unsigned integral type");
84 
85  typedef _WordT block_type;
86  typedef _Alloc allocator_type;
87  typedef size_t size_type;
88 
89  static const size_type _S_bits_per_block = __CHAR_BIT__ * sizeof(block_type);
90  static const size_type npos = static_cast<size_type>(-1);
91 
92  /// 0 is the least significant word.
93  std::vector<block_type, allocator_type> _M_w;
94 
95  explicit
96  __dynamic_bitset_base(const allocator_type& __alloc = allocator_type())
97  : _M_w(__alloc)
98  { }
99 
100  explicit
101  __dynamic_bitset_base(__dynamic_bitset_base&& __b)
102  { this->_M_w.swap(__b._M_w); }
103 
104  explicit
105  __dynamic_bitset_base(size_type __nbits, unsigned long long __val = 0ULL,
106  const allocator_type& __alloc = allocator_type())
107  : _M_w(__nbits / _S_bits_per_block
108  + (__nbits % _S_bits_per_block > 0),
109  __val, __alloc)
110  {
111  unsigned long long __mask = ~static_cast<block_type>(0);
112  size_t __n = std::min(this->_M_w.size(),
113  sizeof(unsigned long long) / sizeof(block_type));
114  for (size_t __i = 0; __i < __n; ++__i)
115  {
116  this->_M_w[__i] = (__val & __mask) >> (__i * _S_bits_per_block);
117  __mask <<= _S_bits_per_block;
118  }
119  }
120 
121  void
122  _M_assign(const __dynamic_bitset_base& __b)
123  { this->_M_w = __b._M_w; }
124 
125  void
126  _M_swap(__dynamic_bitset_base& __b)
127  { this->_M_w.swap(__b._M_w); }
128 
129  void
130  _M_clear()
131  { this->_M_w.clear(); }
132 
133  void
134  _M_resize(size_t __nbits, bool __value)
135  {
136  size_t __sz = __nbits / _S_bits_per_block;
137  if (__nbits % _S_bits_per_block > 0)
138  ++__sz;
139  if (__sz != this->_M_w.size())
140  this->_M_w.resize(__sz);
141  }
142 
143  allocator_type
144  _M_get_allocator() const
145  { return this->_M_w.get_allocator(); }
146 
147  static size_type
148  _S_whichword(size_type __pos) noexcept
149  { return __pos / _S_bits_per_block; }
150 
151  static size_type
152  _S_whichbyte(size_type __pos) noexcept
153  { return (__pos % _S_bits_per_block) / __CHAR_BIT__; }
154 
155  static size_type
156  _S_whichbit(size_type __pos) noexcept
157  { return __pos % _S_bits_per_block; }
158 
159  static block_type
160  _S_maskbit(size_type __pos) noexcept
161  { return (static_cast<block_type>(1)) << _S_whichbit(__pos); }
162 
163  block_type&
164  _M_getword(size_type __pos)
165  { return this->_M_w[_S_whichword(__pos)]; }
166 
167  block_type
168  _M_getword(size_type __pos) const
169  { return this->_M_w[_S_whichword(__pos)]; }
170 
171  block_type&
172  _M_hiword()
173  { return this->_M_w[_M_w.size() - 1]; }
174 
175  block_type
176  _M_hiword() const
177  { return this->_M_w[_M_w.size() - 1]; }
178 
179  void
180  _M_do_and(const __dynamic_bitset_base& __x)
181  {
182  if (__x._M_w.size() == this->_M_w.size())
183  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
184  this->_M_w[__i] &= __x._M_w[__i];
185  else
186  return;
187  }
188 
189  void
190  _M_do_or(const __dynamic_bitset_base& __x)
191  {
192  if (__x._M_w.size() == this->_M_w.size())
193  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
194  this->_M_w[__i] |= __x._M_w[__i];
195  else
196  return;
197  }
198 
199  void
200  _M_do_xor(const __dynamic_bitset_base& __x)
201  {
202  if (__x._M_w.size() == this->_M_w.size())
203  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
204  this->_M_w[__i] ^= __x._M_w[__i];
205  else
206  return;
207  }
208 
209  void
210  _M_do_dif(const __dynamic_bitset_base& __x)
211  {
212  if (__x._M_w.size() == this->_M_w.size())
213  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
214  this->_M_w[__i] &= ~__x._M_w[__i];
215  else
216  return;
217  }
218 
219  void
220  _M_do_left_shift(size_t __shift);
221 
222  void
223  _M_do_right_shift(size_t __shift);
224 
225  void
226  _M_do_flip()
227  {
228  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
229  this->_M_w[__i] = ~this->_M_w[__i];
230  }
231 
232  void
233  _M_do_set()
234  {
235  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
236  this->_M_w[__i] = ~static_cast<block_type>(0);
237  }
238 
239  void
240  _M_do_reset()
241  {
242  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
243  this->_M_w[__i] = static_cast<block_type>(0);
244  }
245 
246  bool
247  _M_is_equal(const __dynamic_bitset_base& __x) const
248  {
249  if (__x.size() == this->size())
250  {
251  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
252  if (this->_M_w[__i] != __x._M_w[__i])
253  return false;
254  return true;
255  }
256  else
257  return false;
258  }
259 
260  bool
261  _M_is_less(const __dynamic_bitset_base& __x) const
262  {
263  if (__x.size() == this->size())
264  {
265  for (size_t __i = this->_M_w.size(); __i > 0; --__i)
266  {
267  if (this->_M_w[__i-1] < __x._M_w[__i-1])
268  return true;
269  else if (this->_M_w[__i-1] > __x._M_w[__i-1])
270  return false;
271  }
272  return false;
273  }
274  else
275  return false;
276  }
277 
278  size_t
279  _M_are_all_aux() const
280  {
281  for (size_t __i = 0; __i < this->_M_w.size() - 1; ++__i)
282  if (_M_w[__i] != ~static_cast<block_type>(0))
283  return 0;
284  return ((this->_M_w.size() - 1) * _S_bits_per_block
285  + __builtin_popcountl(this->_M_hiword()));
286  }
287 
288  bool
289  _M_is_any() const
290  {
291  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
292  if (this->_M_w[__i] != static_cast<block_type>(0))
293  return true;
294  return false;
295  }
296 
297  bool
298  _M_is_subset_of(const __dynamic_bitset_base& __b)
299  {
300  if (__b.size() == this->size())
301  {
302  for (size_t __i = 0; __i < _M_w.size(); ++__i)
303  if (this->_M_w[__i] != (this->_M_w[__i] | __b._M_w[__i]))
304  return false;
305  return true;
306  }
307  else
308  return false;
309  }
310 
311  bool
312  _M_is_proper_subset_of(const __dynamic_bitset_base& __b) const
313  {
314  if (this->is_subset_of(__b))
315  {
316  if (*this == __b)
317  return false;
318  else
319  return true;
320  }
321  else
322  return false;
323  }
324 
325  size_t
326  _M_do_count() const
327  {
328  size_t __result = 0;
329  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
330  __result += __builtin_popcountl(this->_M_w[__i]);
331  return __result;
332  }
333 
334  size_type
335  _M_size() const noexcept
336  { return this->_M_w.size(); }
337 
338  unsigned long
339  _M_do_to_ulong() const;
340 
341  unsigned long long
342  _M_do_to_ullong() const;
343 
344  // find first "on" bit
345  size_type
346  _M_do_find_first(size_t __not_found) const;
347 
348  // find the next "on" bit that follows "prev"
349  size_type
350  _M_do_find_next(size_t __prev, size_t __not_found) const;
351 
352  // do append of block
353  void
354  _M_do_append_block(block_type __block, size_type __pos)
355  {
356  size_t __offset = __pos % _S_bits_per_block;
357  if (__offset == 0)
358  this->_M_w.push_back(__block);
359  else
360  {
361  this->_M_hiword() |= (__block << __offset);
362  this->_M_w.push_back(__block >> (_S_bits_per_block - __offset));
363  }
364  }
365  };
366 
367  // Definitions of non-inline functions from __dynamic_bitset_base.
368  template<typename _WordT, typename _Alloc>
369  void
370  __dynamic_bitset_base<_WordT, _Alloc>::_M_do_left_shift(size_t __shift)
371  {
372  if (__builtin_expect(__shift != 0, 1))
373  {
374  const size_t __wshift = __shift / _S_bits_per_block;
375  const size_t __offset = __shift % _S_bits_per_block;
376 
377  if (__offset == 0)
378  for (size_t __n = this->_M_w.size() - 1; __n >= __wshift; --__n)
379  this->_M_w[__n] = this->_M_w[__n - __wshift];
380  else
381  {
382  const size_t __sub_offset = _S_bits_per_block - __offset;
383  for (size_t __n = _M_w.size() - 1; __n > __wshift; --__n)
384  this->_M_w[__n] = ((this->_M_w[__n - __wshift] << __offset)
385  | (this->_M_w[__n - __wshift - 1] >> __sub_offset));
386  this->_M_w[__wshift] = this->_M_w[0] << __offset;
387  }
388 
389  //// std::fill(this->_M_w.begin(), this->_M_w.begin() + __wshift,
390  //// static_cast<_WordT>(0));
391  }
392  }
393 
394  template<typename _WordT, typename _Alloc>
395  void
396  __dynamic_bitset_base<_WordT, _Alloc>::_M_do_right_shift(size_t __shift)
397  {
398  if (__builtin_expect(__shift != 0, 1))
399  {
400  const size_t __wshift = __shift / _S_bits_per_block;
401  const size_t __offset = __shift % _S_bits_per_block;
402  const size_t __limit = this->_M_w.size() - __wshift - 1;
403 
404  if (__offset == 0)
405  for (size_t __n = 0; __n <= __limit; ++__n)
406  this->_M_w[__n] = this->_M_w[__n + __wshift];
407  else
408  {
409  const size_t __sub_offset = (_S_bits_per_block
410  - __offset);
411  for (size_t __n = 0; __n < __limit; ++__n)
412  this->_M_w[__n] = ((this->_M_w[__n + __wshift] >> __offset)
413  | (this->_M_w[__n + __wshift + 1] << __sub_offset));
414  this->_M_w[__limit] = this->_M_w[_M_w.size()-1] >> __offset;
415  }
416 
417  ////std::fill(this->_M_w.begin() + __limit + 1, this->_M_w.end(),
418  //// static_cast<_WordT>(0));
419  }
420  }
421 
422  template<typename _WordT, typename _Alloc>
423  unsigned long
424  __dynamic_bitset_base<_WordT, _Alloc>::_M_do_to_ulong() const
425  {
426  size_t __n = sizeof(unsigned long) / sizeof(block_type);
427  for (size_t __i = __n; __i < this->_M_w.size(); ++__i)
428  if (this->_M_w[__i])
429  __throw_overflow_error(__N("__dynamic_bitset_base::_M_do_to_ulong"));
430  unsigned long __res = 0UL;
431  for (size_t __i = 0; __i < __n && __i < this->_M_w.size(); ++__i)
432  __res += this->_M_w[__i] << (__i * _S_bits_per_block);
433  return __res;
434  }
435 
436  template<typename _WordT, typename _Alloc>
437  unsigned long long
438  __dynamic_bitset_base<_WordT, _Alloc>::_M_do_to_ullong() const
439  {
440  size_t __n = sizeof(unsigned long long) / sizeof(block_type);
441  for (size_t __i = __n; __i < this->_M_w.size(); ++__i)
442  if (this->_M_w[__i])
443  __throw_overflow_error(__N("__dynamic_bitset_base::_M_do_to_ullong"));
444  unsigned long long __res = 0ULL;
445  for (size_t __i = 0; __i < __n && __i < this->_M_w.size(); ++__i)
446  __res += this->_M_w[__i] << (__i * _S_bits_per_block);
447  return __res;
448  }
449 
450  template<typename _WordT, typename _Alloc>
451  size_t
452  __dynamic_bitset_base<_WordT, _Alloc>
453  ::_M_do_find_first(size_t __not_found) const
454  {
455  for (size_t __i = 0; __i < this->_M_w.size(); ++__i)
456  {
457  _WordT __thisword = this->_M_w[__i];
458  if (__thisword != static_cast<_WordT>(0))
459  return (__i * _S_bits_per_block
460  + __builtin_ctzl(__thisword));
461  }
462  // not found, so return an indication of failure.
463  return __not_found;
464  }
465 
466  template<typename _WordT, typename _Alloc>
467  size_t
468  __dynamic_bitset_base<_WordT, _Alloc>
469  ::_M_do_find_next(size_t __prev, size_t __not_found) const
470  {
471  // make bound inclusive
472  ++__prev;
473 
474  // check out of bounds
475  if (__prev >= this->_M_w.size() * _S_bits_per_block)
476  return __not_found;
477 
478  // search first word
479  size_t __i = _S_whichword(__prev);
480  _WordT __thisword = this->_M_w[__i];
481 
482  // mask off bits below bound
483  __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev);
484 
485  if (__thisword != static_cast<_WordT>(0))
486  return (__i * _S_bits_per_block
487  + __builtin_ctzl(__thisword));
488 
489  // check subsequent words
490  for (++__i; __i < this->_M_w.size(); ++__i)
491  {
492  __thisword = this->_M_w[__i];
493  if (__thisword != static_cast<_WordT>(0))
494  return (__i * _S_bits_per_block
495  + __builtin_ctzl(__thisword));
496  }
497  // not found, so return an indication of failure.
498  return __not_found;
499  } // end _M_do_find_next
500 
501  /**
502  * @brief The %dynamic_bitset class represents a sequence of bits.
503  *
504  * @ingroup containers
505  *
506  * (Note that %dynamic_bitset does @e not meet the formal
507  * requirements of a <a href="tables.html#65">container</a>.
508  * Mainly, it lacks iterators.)
509  *
510  * The template argument, @a Nb, may be any non-negative number,
511  * specifying the number of bits (e.g., "0", "12", "1024*1024").
512  *
513  * In the general unoptimized case, storage is allocated in
514  * word-sized blocks. Let B be the number of bits in a word, then
515  * (Nb+(B-1))/B words will be used for storage. B - Nb%B bits are
516  * unused. (They are the high-order bits in the highest word.) It
517  * is a class invariant that those unused bits are always zero.
518  *
519  * If you think of %dynamic_bitset as "a simple array of bits," be
520  * aware that your mental picture is reversed: a %dynamic_bitset
521  * behaves the same way as bits in integers do, with the bit at
522  * index 0 in the "least significant / right-hand" position, and
523  * the bit at index Nb-1 in the "most significant / left-hand"
524  * position. Thus, unlike other containers, a %dynamic_bitset's
525  * index "counts from right to left," to put it very loosely.
526  *
527  * This behavior is preserved when translating to and from strings.
528  * For example, the first line of the following program probably
529  * prints "b('a') is 0001100001" on a modern ASCII system.
530  *
531  * @code
532  * #include <dynamic_bitset>
533  * #include <iostream>
534  * #include <sstream>
535  *
536  * using namespace std;
537  *
538  * int main()
539  * {
540  * long a = 'a';
541  * dynamic_bitset b(a);
542  *
543  * cout << "b('a') is " << b << endl;
544  *
545  * ostringstream s;
546  * s << b;
547  * string str = s.str();
548  * cout << "index 3 in the string is " << str[3] << " but\n"
549  * << "index 3 in the bitset is " << b[3] << endl;
550  * }
551  * @endcode
552  *
553  * Also see:
554  * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt12ch33s02.html
555  * for a description of extensions.
556  *
557  * Most of the actual code isn't contained in %dynamic_bitset<>
558  * itself, but in the base class __dynamic_bitset_base. The base
559  * class works with whole words, not with individual bits. This
560  * allows us to specialize __dynamic_bitset_base for the important
561  * special case where the %dynamic_bitset is only a single word.
562  *
563  * Extra confusion can result due to the fact that the storage for
564  * __dynamic_bitset_base @e is a vector, and is indexed as such. This is
565  * carefully encapsulated.
566  */
567  template<typename _WordT = unsigned long long,
568  typename _Alloc = std::allocator<_WordT>>
569  class dynamic_bitset
570  : private __dynamic_bitset_base<_WordT, _Alloc>
571  {
572  static_assert(std::is_unsigned<_WordT>::value, "template argument "
573  "_WordT not an unsigned integral type");
574 
575  public:
576 
577  typedef __dynamic_bitset_base<_WordT, _Alloc> _Base;
578  typedef _WordT block_type;
579  typedef _Alloc allocator_type;
580  typedef size_t size_type;
581 
582  static const size_type bits_per_block = __CHAR_BIT__ * sizeof(block_type);
583  // Use this: constexpr size_type std::numeric_limits<size_type>::max().
584  static const size_type npos = static_cast<size_type>(-1);
585 
586  private:
587 
588  // Clear the unused bits in the uppermost word.
589  void
590  _M_do_sanitize()
591  {
592  size_type __shift = this->_M_Nb % bits_per_block;
593  if (__shift > 0)
594  this->_M_hiword() &= ~((~static_cast<block_type>(0)) << __shift);
595  }
596 
597  /**
598  * These versions of single-bit set, reset, flip, and test
599  * do no range checking.
600  */
601  dynamic_bitset<_WordT, _Alloc>&
602  _M_unchecked_set(size_type __pos)
603  {
604  this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
605  return *this;
606  }
607 
608  dynamic_bitset<_WordT, _Alloc>&
609  _M_unchecked_set(size_type __pos, int __val)
610  {
611  if (__val)
612  this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
613  else
614  this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
615  return *this;
616  }
617 
618  dynamic_bitset<_WordT, _Alloc>&
619  _M_unchecked_reset(size_type __pos)
620  {
621  this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
622  return *this;
623  }
624 
625  dynamic_bitset<_WordT, _Alloc>&
626  _M_unchecked_flip(size_type __pos)
627  {
628  this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos);
629  return *this;
630  }
631 
632  bool
633  _M_unchecked_test(size_type __pos) const
634  { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos))
635  != static_cast<_WordT>(0)); }
636 
637  size_type _M_Nb;
638 
639  public:
640  /**
641  * This encapsulates the concept of a single bit. An instance
642  * of this class is a proxy for an actual bit; this way the
643  * individual bit operations are done as faster word-size
644  * bitwise instructions.
645  *
646  * Most users will never need to use this class directly;
647  * conversions to and from bool are automatic and should be
648  * transparent. Overloaded operators help to preserve the
649  * illusion.
650  *
651  * (On a typical system, this "bit %reference" is 64 times the
652  * size of an actual bit. Ha.)
653  */
654  class reference
655  {
656  friend class dynamic_bitset;
657 
658  block_type *_M_wp;
659  size_type _M_bpos;
660 
661  // left undefined
662  reference();
663 
664  public:
665  reference(dynamic_bitset& __b, size_type __pos)
666  {
667  this->_M_wp = &__b._M_getword(__pos);
668  this->_M_bpos = _Base::_S_whichbit(__pos);
669  }
670 
671  ~reference()
672  { }
673 
674  // For b[i] = __x;
675  reference&
676  operator=(bool __x)
677  {
678  if (__x)
679  *this->_M_wp |= _Base::_S_maskbit(this->_M_bpos);
680  else
681  *this->_M_wp &= ~_Base::_S_maskbit(this->_M_bpos);
682  return *this;
683  }
684 
685  // For b[i] = b[__j];
686  reference&
687  operator=(const reference& __j)
688  {
689  if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos)))
690  *this->_M_wp |= _Base::_S_maskbit(this->_M_bpos);
691  else
692  *this->_M_wp &= ~_Base::_S_maskbit(this->_M_bpos);
693  return *this;
694  }
695 
696  // Flips the bit
697  bool
698  operator~() const
699  { return (*(_M_wp) & _Base::_S_maskbit(this->_M_bpos)) == 0; }
700 
701  // For __x = b[i];
702  operator bool() const
703  { return (*(this->_M_wp) & _Base::_S_maskbit(this->_M_bpos)) != 0; }
704 
705  // For b[i].flip();
706  reference&
707  flip()
708  {
709  *this->_M_wp ^= _Base::_S_maskbit(this->_M_bpos);
710  return *this;
711  }
712  };
713 
714  friend class reference;
715 
716  typedef bool const_reference;
717 
718  // 23.3.5.1 constructors:
719  /// All bits set to zero.
720  explicit
721  dynamic_bitset(const allocator_type& __alloc = allocator_type())
722  : _Base(__alloc), _M_Nb(0)
723  { }
724 
725  /// Initial bits bitwise-copied from a single word (others set to zero).
726  explicit
727  dynamic_bitset(size_type __nbits, unsigned long long __val = 0ULL,
728  const allocator_type& __alloc = allocator_type())
729  : _Base(__nbits, __val, __alloc),
730  _M_Nb(__nbits)
731  { }
732 
733  dynamic_bitset(initializer_list<block_type> __il,
734  const allocator_type& __alloc = allocator_type())
735  : _Base(__alloc), _M_Nb(0)
736  { this->append(__il); }
737 
738  /**
739  * @brief Use a subset of a string.
740  * @param __str A string of '0' and '1' characters.
741  * @param __pos Index of the first character in @p __str to use.
742  * @param __n The number of characters to copy.
743  * @throw std::out_of_range If @p __pos is bigger the size of @p __str.
744  * @throw std::invalid_argument If a character appears in the string
745  * which is neither '0' nor '1'.
746  */
747  template<typename _CharT, typename _Traits, typename _Alloc1>
748  explicit
749  dynamic_bitset(const std::basic_string<_CharT, _Traits, _Alloc1>& __str,
750  typename basic_string<_CharT,_Traits,_Alloc1>::size_type
751  __pos = 0,
752  typename basic_string<_CharT,_Traits,_Alloc1>::size_type
753  __n = std::basic_string<_CharT, _Traits, _Alloc1>::npos,
754  _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'),
755  const allocator_type& __alloc = allocator_type())
756  : _Base(__alloc),
757  _M_Nb(0) // Watch for npos.
758  {
759  if (__pos > __str.size())
760  __throw_out_of_range(__N("dynamic_bitset::bitset initial position "
761  "not valid"));
762 
763  // Watch for npos.
764  this->_M_Nb = (__n > __str.size() ? __str.size() - __pos : __n);
765  this->resize(this->_M_Nb);
766  this->_M_copy_from_string(__str, __pos, __n,
767  _CharT('0'), _CharT('1'));
768  }
769 
770  /**
771  * @brief Construct from a string.
772  * @param __str A string of '0' and '1' characters.
773  * @throw std::invalid_argument If a character appears in the string
774  * which is neither '0' nor '1'.
775  */
776  explicit
777  dynamic_bitset(const char* __str,
778  const allocator_type& __alloc = allocator_type())
779  : _Base(__alloc)
780  {
781  size_t __len = 0;
782  if (__str)
783  while (__str[__len] != '\0')
784  ++__len;
785  this->resize(__len);
786  this->_M_copy_from_ptr<char,std::char_traits<char>>
787  (__str, __len, 0, __len, '0', '1');
788  }
789 
790  /**
791  * @brief Copy constructor.
792  */
793  dynamic_bitset(const dynamic_bitset& __b)
794  : _Base(__b), _M_Nb(__b.size())
795  { }
796 
797  /**
798  * @brief Move constructor.
799  */
800  dynamic_bitset(dynamic_bitset&& __b)
801  : _Base(std::forward<_Base>(__b)), _M_Nb(__b.size())
802  { }
803 
804  /**
805  * @brief Swap with another bitset.
806  */
807  void
808  swap(dynamic_bitset& __b)
809  {
810  this->_M_swap(__b);
811  std::swap(this->_M_Nb, __b._M_Nb);
812  }
813 
814  /**
815  * @brief Assignment.
816  */
817  dynamic_bitset&
818  operator=(const dynamic_bitset& __b)
819  {
820  if (&__b != this)
821  {
822  this->_M_assign(__b);
823  this->_M_Nb = __b._M_Nb;
824  }
825  }
826 
827  /**
828  * @brief Move assignment.
829  */
830  dynamic_bitset&
831  operator=(dynamic_bitset&& __b)
832  {
833  this->swap(__b);
834  return *this;
835  }
836 
837  /**
838  * @brief Return the allocator for the bitset.
839  */
840  allocator_type
841  get_allocator() const
842  { return this->_M_get_allocator(); }
843 
844  /**
845  * @brief Resize the bitset.
846  */
847  void
848  resize(size_type __nbits, bool __value = false)
849  {
850  this->_M_resize(__nbits, __value);
851  this->_M_Nb = __nbits;
852  this->_M_do_sanitize();
853  }
854 
855  /**
856  * @brief Clear the bitset.
857  */
858  void
859  clear()
860  {
861  this->_M_clear();
862  this->_M_Nb = 0;
863  }
864 
865  /**
866  * @brief Push a bit onto the high end of the bitset.
867  */
868  void
869  push_back(bool __bit)
870  {
871  if (size_t __offset = this->size() % bits_per_block == 0)
872  this->_M_do_append_block(block_type(0), this->_M_Nb);
873  ++this->_M_Nb;
874  this->_M_unchecked_set(this->_M_Nb, __bit);
875  }
876 
877  /**
878  * @brief Append a block.
879  */
880  void
881  append(block_type __block)
882  {
883  this->_M_do_append_block(__block, this->_M_Nb);
884  this->_M_Nb += bits_per_block;
885  }
886 
887  /**
888  * @brief
889  */
890  void
891  append(initializer_list<block_type> __il)
892  { this->append(__il.begin(), __il.end()); }
893 
894  /**
895  * @brief Append an iterator range of blocks.
896  */
897  template <typename _BlockInputIterator>
898  void
899  append(_BlockInputIterator __first, _BlockInputIterator __last)
900  {
901  for (; __first != __last; ++__first)
902  this->append(*__first);
903  }
904 
905  // 23.3.5.2 dynamic_bitset operations:
906  //@{
907  /**
908  * @brief Operations on dynamic_bitsets.
909  * @param __rhs A same-sized dynamic_bitset.
910  *
911  * These should be self-explanatory.
912  */
913  dynamic_bitset<_WordT, _Alloc>&
914  operator&=(const dynamic_bitset<_WordT, _Alloc>& __rhs)
915  {
916  this->_M_do_and(__rhs);
917  return *this;
918  }
919 
920  dynamic_bitset<_WordT, _Alloc>&
921  operator&=(dynamic_bitset<_WordT, _Alloc>&& __rhs)
922  {
923  this->_M_do_and(std::move(__rhs));
924  return *this;
925  }
926 
927  dynamic_bitset<_WordT, _Alloc>&
928  operator|=(const dynamic_bitset<_WordT, _Alloc>& __rhs)
929  {
930  this->_M_do_or(__rhs);
931  return *this;
932  }
933 
934  dynamic_bitset<_WordT, _Alloc>&
935  operator^=(const dynamic_bitset<_WordT, _Alloc>& __rhs)
936  {
937  this->_M_do_xor(__rhs);
938  return *this;
939  }
940 
941  dynamic_bitset<_WordT, _Alloc>&
942  operator-=(const dynamic_bitset<_WordT, _Alloc>& __rhs)
943  {
944  this->_M_do_dif(__rhs);
945  return *this;
946  }
947  //@}
948 
949  //@{
950  /**
951  * @brief Operations on dynamic_bitsets.
952  * @param __pos The number of places to shift.
953  *
954  * These should be self-explanatory.
955  */
956  dynamic_bitset<_WordT, _Alloc>&
957  operator<<=(size_type __pos)
958  {
959  if (__builtin_expect(__pos < this->_M_Nb, 1))
960  {
961  this->_M_do_left_shift(__pos);
962  this->_M_do_sanitize();
963  }
964  else
965  this->_M_do_reset();
966  return *this;
967  }
968 
969  dynamic_bitset<_WordT, _Alloc>&
970  operator>>=(size_type __pos)
971  {
972  if (__builtin_expect(__pos < this->_M_Nb, 1))
973  {
974  this->_M_do_right_shift(__pos);
975  this->_M_do_sanitize();
976  }
977  else
978  this->_M_do_reset();
979  return *this;
980  }
981  //@}
982 
983  // Set, reset, and flip.
984  /**
985  * @brief Sets every bit to true.
986  */
987  dynamic_bitset<_WordT, _Alloc>&
988  set()
989  {
990  this->_M_do_set();
991  this->_M_do_sanitize();
992  return *this;
993  }
994 
995  /**
996  * @brief Sets a given bit to a particular value.
997  * @param __pos The index of the bit.
998  * @param __val Either true or false, defaults to true.
999  * @throw std::out_of_range If @a __pos is bigger the size of the %set.
1000  */
1001  dynamic_bitset<_WordT, _Alloc>&
1002  set(size_type __pos, bool __val = true)
1003  {
1004  if (__pos >= _M_Nb)
1005  __throw_out_of_range(__N("dynamic_bitset::set"));
1006  return this->_M_unchecked_set(__pos, __val);
1007  }
1008 
1009  /**
1010  * @brief Sets every bit to false.
1011  */
1012  dynamic_bitset<_WordT, _Alloc>&
1013  reset()
1014  {
1015  this->_M_do_reset();
1016  return *this;
1017  }
1018 
1019  /**
1020  * @brief Sets a given bit to false.
1021  * @param __pos The index of the bit.
1022  * @throw std::out_of_range If @a __pos is bigger the size of the %set.
1023  *
1024  * Same as writing @c set(__pos, false).
1025  */
1026  dynamic_bitset<_WordT, _Alloc>&
1027  reset(size_type __pos)
1028  {
1029  if (__pos >= _M_Nb)
1030  __throw_out_of_range(__N("dynamic_bitset::reset"));
1031  return this->_M_unchecked_reset(__pos);
1032  }
1033 
1034  /**
1035  * @brief Toggles every bit to its opposite value.
1036  */
1037  dynamic_bitset<_WordT, _Alloc>&
1038  flip()
1039  {
1040  this->_M_do_flip();
1041  this->_M_do_sanitize();
1042  return *this;
1043  }
1044 
1045  /**
1046  * @brief Toggles a given bit to its opposite value.
1047  * @param __pos The index of the bit.
1048  * @throw std::out_of_range If @a __pos is bigger the size of the %set.
1049  */
1050  dynamic_bitset<_WordT, _Alloc>&
1051  flip(size_type __pos)
1052  {
1053  if (__pos >= _M_Nb)
1054  __throw_out_of_range(__N("dynamic_bitset::flip"));
1055  return this->_M_unchecked_flip(__pos);
1056  }
1057 
1058  /// See the no-argument flip().
1059  dynamic_bitset<_WordT, _Alloc>
1060  operator~() const
1061  { return dynamic_bitset<_WordT, _Alloc>(*this).flip(); }
1062 
1063  //@{
1064  /**
1065  * @brief Array-indexing support.
1066  * @param __pos Index into the %dynamic_bitset.
1067  * @return A bool for a 'const %dynamic_bitset'. For non-const
1068  * bitsets, an instance of the reference proxy class.
1069  * @note These operators do no range checking and throw no
1070  * exceptions, as required by DR 11 to the standard.
1071  */
1072  reference
1073  operator[](size_type __pos)
1074  { return reference(*this,__pos); }
1075 
1076  const_reference
1077  operator[](size_type __pos) const
1078  { return _M_unchecked_test(__pos); }
1079  //@}
1080 
1081  /**
1082  * @brief Returns a numerical interpretation of the %dynamic_bitset.
1083  * @return The integral equivalent of the bits.
1084  * @throw std::overflow_error If there are too many bits to be
1085  * represented in an @c unsigned @c long.
1086  */
1087  unsigned long
1088  to_ulong() const
1089  { return this->_M_do_to_ulong(); }
1090 
1091  /**
1092  * @brief Returns a numerical interpretation of the %dynamic_bitset.
1093  * @return The integral equivalent of the bits.
1094  * @throw std::overflow_error If there are too many bits to be
1095  * represented in an @c unsigned @c long.
1096  */
1097  unsigned long long
1098  to_ullong() const
1099  { return this->_M_do_to_ullong(); }
1100 
1101  /**
1102  * @brief Returns a character interpretation of the %dynamic_bitset.
1103  * @return The string equivalent of the bits.
1104  *
1105  * Note the ordering of the bits: decreasing character positions
1106  * correspond to increasing bit positions (see the main class notes for
1107  * an example).
1108  */
1109  template<typename _CharT = char,
1110  typename _Traits = std::char_traits<_CharT>,
1111  typename _Alloc1 = std::allocator<_CharT>>
1112  std::basic_string<_CharT, _Traits, _Alloc1>
1113  to_string(_CharT __zero = _CharT('0'), _CharT __one = _CharT('1')) const
1114  {
1115  std::basic_string<_CharT, _Traits, _Alloc1> __result;
1116  _M_copy_to_string(__result, __zero, __one);
1117  return __result;
1118  }
1119 
1120  // Helper functions for string operations.
1121  template<typename _CharT, typename _Traits>
1122  void
1123  _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t,
1124  _CharT, _CharT);
1125 
1126  template<typename _CharT, typename _Traits, typename _Alloc1>
1127  void
1128  _M_copy_from_string(const std::basic_string<_CharT,
1129  _Traits, _Alloc1>& __str, size_t __pos, size_t __n,
1130  _CharT __zero = _CharT('0'),
1131  _CharT __one = _CharT('1'))
1132  { _M_copy_from_ptr<_CharT, _Traits>(__str.data(), __str.size(),
1133  __pos, __n, __zero, __one); }
1134 
1135  template<typename _CharT, typename _Traits, typename _Alloc1>
1136  void
1137  _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc1>& __str,
1138  _CharT __zero = _CharT('0'),
1139  _CharT __one = _CharT('1')) const;
1140 
1141  /// Returns the number of bits which are set.
1142  size_type
1143  count() const noexcept
1144  { return this->_M_do_count(); }
1145 
1146  /// Returns the total number of bits.
1147  size_type
1148  size() const noexcept
1149  { return this->_M_Nb; }
1150 
1151  /// Returns the total number of blocks.
1152  size_type
1153  num_blocks() const noexcept
1154  { return this->_M_size(); }
1155 
1156  /// Returns true if the dynamic_bitset is empty.
1157  bool
1158  empty() const noexcept
1159  { return (this->_M_Nb == 0); }
1160 
1161  /// Returns the maximum size of a dynamic_bitset object having the same
1162  /// type as *this.
1163  /// The real answer is max() * bits_per_block but is likely to overflow.
1164  constexpr size_type
1165  max_size() noexcept
1166  { return std::numeric_limits<block_type>::max(); }
1167 
1168  /**
1169  * @brief Tests the value of a bit.
1170  * @param __pos The index of a bit.
1171  * @return The value at @a __pos.
1172  * @throw std::out_of_range If @a __pos is bigger the size of the %set.
1173  */
1174  bool
1175  test(size_type __pos) const
1176  {
1177  if (__pos >= _M_Nb)
1178  __throw_out_of_range(__N("dynamic_bitset::test"));
1179  return _M_unchecked_test(__pos);
1180  }
1181 
1182  /**
1183  * @brief Tests whether all the bits are on.
1184  * @return True if all the bits are set.
1185  */
1186  bool
1187  all() const
1188  { return this->_M_are_all_aux() == _M_Nb; }
1189 
1190  /**
1191  * @brief Tests whether any of the bits are on.
1192  * @return True if at least one bit is set.
1193  */
1194  bool
1195  any() const
1196  { return this->_M_is_any(); }
1197 
1198  /**
1199  * @brief Tests whether any of the bits are on.
1200  * @return True if none of the bits are set.
1201  */
1202  bool
1203  none() const
1204  { return !this->_M_is_any(); }
1205 
1206  //@{
1207  /// Self-explanatory.
1208  dynamic_bitset<_WordT, _Alloc>
1209  operator<<(size_type __pos) const
1210  { return dynamic_bitset<_WordT, _Alloc>(*this) <<= __pos; }
1211 
1212  dynamic_bitset<_WordT, _Alloc>
1213  operator>>(size_type __pos) const
1214  { return dynamic_bitset<_WordT, _Alloc>(*this) >>= __pos; }
1215  //@}
1216 
1217  /**
1218  * @brief Finds the index of the first "on" bit.
1219  * @return The index of the first bit set, or size() if not found.
1220  * @sa find_next
1221  */
1222  size_type
1223  find_first() const
1224  { return this->_M_do_find_first(this->_M_Nb); }
1225 
1226  /**
1227  * @brief Finds the index of the next "on" bit after prev.
1228  * @return The index of the next bit set, or size() if not found.
1229  * @param __prev Where to start searching.
1230  * @sa find_first
1231  */
1232  size_type
1233  find_next(size_t __prev) const
1234  { return this->_M_do_find_next(__prev, this->_M_Nb); }
1235 
1236  bool
1237  is_subset_of(const dynamic_bitset& __b) const
1238  { return this->_M_is_subset_of(__b); }
1239 
1240  bool
1241  is_proper_subset_of(const dynamic_bitset& __b) const
1242  { return this->_M_is_proper_subset_of(__b); }
1243  };
1244 
1245  // Definitions of non-inline member functions.
1246  template<typename _WordT, typename _Alloc>
1247  template<typename _CharT, typename _Traits>
1248  void
1249  dynamic_bitset<_WordT, _Alloc>::
1250  _M_copy_from_ptr(const _CharT* __str, size_t __len,
1251  size_t __pos, size_t __n, _CharT __zero, _CharT __one)
1252  {
1253  reset();
1254  const size_t __nbits = std::min(_M_Nb, std::min(__n, __len - __pos));
1255  for (size_t __i = __nbits; __i > 0; --__i)
1256  {
1257  const _CharT __c = __str[__pos + __nbits - __i];
1258  if (_Traits::eq(__c, __zero))
1259  ;
1260  else if (_Traits::eq(__c, __one))
1261  _M_unchecked_set(__i - 1);
1262  else
1263  __throw_invalid_argument(__N("dynamic_bitset::_M_copy_from_ptr"));
1264  }
1265  }
1266 
1267  template<typename _WordT, typename _Alloc>
1268  template<typename _CharT, typename _Traits, typename _Alloc1>
1269  void
1270  dynamic_bitset<_WordT, _Alloc>::
1271  _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc1>& __str,
1272  _CharT __zero, _CharT __one) const
1273  {
1274  __str.assign(_M_Nb, __zero);
1275  for (size_t __i = _M_Nb; __i > 0; --__i)
1276  if (_M_unchecked_test(__i - 1))
1277  _Traits::assign(__str[_M_Nb - __i], __one);
1278  }
1279 
1280 
1281  //@{
1282  /// These comparisons for equality/inequality are, well, @e bitwise.
1283  template<typename _WordT, typename _Alloc>
1284  bool
1285  operator==(const dynamic_bitset<_WordT, _Alloc>& __lhs,
1286  const dynamic_bitset<_WordT, _Alloc>& __rhs)
1287  { return __lhs._M_is_equal(__rhs); }
1288 
1289  template<typename _WordT, typename _Alloc>
1290  bool
1291  operator!=(const dynamic_bitset<_WordT, _Alloc>& __lhs,
1292  const dynamic_bitset<_WordT, _Alloc>& __rhs)
1293  { return !__lhs._M_is_equal(__rhs); }
1294 
1295  template<typename _WordT, typename _Alloc>
1296  bool
1297  operator<(const dynamic_bitset<_WordT, _Alloc>& __lhs,
1298  const dynamic_bitset<_WordT, _Alloc>& __rhs)
1299  { return __lhs._M_is_less(__rhs); }
1300 
1301  template<typename _WordT, typename _Alloc>
1302  bool
1303  operator<=(const dynamic_bitset<_WordT, _Alloc>& __lhs,
1304  const dynamic_bitset<_WordT, _Alloc>& __rhs)
1305  { return !(__lhs > __rhs); }
1306 
1307  template<typename _WordT, typename _Alloc>
1308  bool
1309  operator>(const dynamic_bitset<_WordT, _Alloc>& __lhs,
1310  const dynamic_bitset<_WordT, _Alloc>& __rhs)
1311  { return __rhs < __lhs; }
1312 
1313  template<typename _WordT, typename _Alloc>
1314  bool
1315  operator>=(const dynamic_bitset<_WordT, _Alloc>& __lhs,
1316  const dynamic_bitset<_WordT, _Alloc>& __rhs)
1317  { return !(__lhs < __rhs); }
1318  //@}
1319 
1320  // 23.3.5.3 bitset operations:
1321  //@{
1322  /**
1323  * @brief Global bitwise operations on bitsets.
1324  * @param __x A bitset.
1325  * @param __y A bitset of the same size as @a __x.
1326  * @return A new bitset.
1327  *
1328  * These should be self-explanatory.
1329  */
1330  template<typename _WordT, typename _Alloc>
1331  inline dynamic_bitset<_WordT, _Alloc>
1332  operator&(const dynamic_bitset<_WordT, _Alloc>& __x,
1333  const dynamic_bitset<_WordT, _Alloc>& __y)
1334  {
1335  dynamic_bitset<_WordT, _Alloc> __result(__x);
1336  __result &= __y;
1337  return __result;
1338  }
1339 
1340  template<typename _WordT, typename _Alloc>
1341  inline dynamic_bitset<_WordT, _Alloc>
1342  operator|(const dynamic_bitset<_WordT, _Alloc>& __x,
1343  const dynamic_bitset<_WordT, _Alloc>& __y)
1344  {
1345  dynamic_bitset<_WordT, _Alloc> __result(__x);
1346  __result |= __y;
1347  return __result;
1348  }
1349 
1350  template <typename _WordT, typename _Alloc>
1351  inline dynamic_bitset<_WordT, _Alloc>
1352  operator^(const dynamic_bitset<_WordT, _Alloc>& __x,
1353  const dynamic_bitset<_WordT, _Alloc>& __y)
1354  {
1355  dynamic_bitset<_WordT, _Alloc> __result(__x);
1356  __result ^= __y;
1357  return __result;
1358  }
1359 
1360  template <typename _WordT, typename _Alloc>
1361  inline dynamic_bitset<_WordT, _Alloc>
1362  operator-(const dynamic_bitset<_WordT, _Alloc>& __x,
1363  const dynamic_bitset<_WordT, _Alloc>& __y)
1364  {
1365  dynamic_bitset<_WordT, _Alloc> __result(__x);
1366  __result -= __y;
1367  return __result;
1368  }
1369  //@}
1370 
1371  //@{
1372  /**
1373  * @brief Global I/O operators for bitsets.
1374  *
1375  * Direct I/O between streams and bitsets is supported. Output is
1376  * straightforward. Input will skip whitespace and only accept '0'
1377  * and '1' characters. The %dynamic_bitset will grow as necessary
1378  * to hold the string of bits.
1379  */
1380  template<typename _CharT, typename _Traits,
1381  typename _WordT, typename _Alloc>
1382  std::basic_istream<_CharT, _Traits>&
1383  operator>>(std::basic_istream<_CharT, _Traits>& __is,
1384  dynamic_bitset<_WordT, _Alloc>& __x)
1385  {
1386  typedef typename _Traits::char_type char_type;
1387  typedef std::basic_istream<_CharT, _Traits> __istream_type;
1388  typedef typename __istream_type::ios_base __ios_base;
1389 
1390  std::basic_string<_CharT, _Traits> __tmp;
1391  __tmp.reserve(__x.size());
1392 
1393  const char_type __zero = __is.widen('0');
1394  const char_type __one = __is.widen('1');
1395 
1396  typename __ios_base::iostate __state = __ios_base::goodbit;
1397  typename __istream_type::sentry __sentry(__is);
1398  if (__sentry)
1399  {
1400  __try
1401  {
1402  while (1)
1403  {
1404  static typename _Traits::int_type __eof = _Traits::eof();
1405 
1406  typename _Traits::int_type __c1 = __is.rdbuf()->sbumpc();
1407  if (_Traits::eq_int_type(__c1, __eof))
1408  {
1409  __state |= __ios_base::eofbit;
1410  break;
1411  }
1412  else
1413  {
1414  const char_type __c2 = _Traits::to_char_type(__c1);
1415  if (_Traits::eq(__c2, __zero))
1416  __tmp.push_back(__zero);
1417  else if (_Traits::eq(__c2, __one))
1418  __tmp.push_back(__one);
1419  else if (_Traits::
1420  eq_int_type(__is.rdbuf()->sputbackc(__c2),
1421  __eof))
1422  {
1423  __state |= __ios_base::failbit;
1424  break;
1425  }
1426  else
1427  break;
1428  }
1429  }
1430  }
1431  __catch(__cxxabiv1::__forced_unwind&)
1432  {
1433  __is._M_setstate(__ios_base::badbit);
1434  __throw_exception_again;
1435  }
1436  __catch(...)
1437  { __is._M_setstate(__ios_base::badbit); }
1438  }
1439 
1440  __x.resize(__tmp.size());
1441 
1442  if (__tmp.empty() && __x.size())
1443  __state |= __ios_base::failbit;
1444  else
1445  __x._M_copy_from_string(__tmp, static_cast<size_t>(0), __x.size(),
1446  __zero, __one);
1447  if (__state)
1448  __is.setstate(__state);
1449  return __is;
1450  }
1451 
1452  template <typename _CharT, typename _Traits,
1453  typename _WordT, typename _Alloc>
1454  std::basic_ostream<_CharT, _Traits>&
1455  operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1456  const dynamic_bitset<_WordT, _Alloc>& __x)
1457  {
1458  std::basic_string<_CharT, _Traits> __tmp;
1459 
1460  const ctype<_CharT>& __ct = use_facet<ctype<_CharT>>(__os.getloc());
1461  __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1'));
1462  return __os << __tmp;
1463  }
1464  //@}
1465 
1466 _GLIBCXX_END_NAMESPACE_VERSION
1467 } // tr2
1468 } // std
1469 
1470 #undef _GLIBCXX_BITSET_BITS_PER_WORD
1471 
1472 #endif /* _GLIBCXX_TR2_DYNAMIC_BITSET */