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