Home | History | Annotate | Download | only in 4.6.x-google
      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 noexcept
   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 noexcept
   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 */
   1579