110d565efSmrg// <bitset> -*- C++ -*-
210d565efSmrg
3*ec02198aSmrg// Copyright (C) 2001-2020 Free Software Foundation, Inc.
410d565efSmrg//
510d565efSmrg// This file is part of the GNU ISO C++ Library.  This library is free
610d565efSmrg// software; you can redistribute it and/or modify it under the
710d565efSmrg// terms of the GNU General Public License as published by the
810d565efSmrg// Free Software Foundation; either version 3, or (at your option)
910d565efSmrg// any later version.
1010d565efSmrg
1110d565efSmrg// This library is distributed in the hope that it will be useful,
1210d565efSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of
1310d565efSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1410d565efSmrg// GNU General Public License for more details.
1510d565efSmrg
1610d565efSmrg// Under Section 7 of GPL version 3, you are granted additional
1710d565efSmrg// permissions described in the GCC Runtime Library Exception, version
1810d565efSmrg// 3.1, as published by the Free Software Foundation.
1910d565efSmrg
2010d565efSmrg// You should have received a copy of the GNU General Public License and
2110d565efSmrg// a copy of the GCC Runtime Library Exception along with this program;
2210d565efSmrg// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2310d565efSmrg// <http://www.gnu.org/licenses/>.
2410d565efSmrg
2510d565efSmrg/*
2610d565efSmrg * Copyright (c) 1998
2710d565efSmrg * Silicon Graphics Computer Systems, Inc.
2810d565efSmrg *
2910d565efSmrg * Permission to use, copy, modify, distribute and sell this software
3010d565efSmrg * and its documentation for any purpose is hereby granted without fee,
3110d565efSmrg * provided that the above copyright notice appear in all copies and
3210d565efSmrg * that both that copyright notice and this permission notice appear
3310d565efSmrg * in supporting documentation.  Silicon Graphics makes no
3410d565efSmrg * representations about the suitability of this software for any
3510d565efSmrg * purpose.  It is provided "as is" without express or implied warranty.
3610d565efSmrg */
3710d565efSmrg
3810d565efSmrg/** @file include/bitset
3910d565efSmrg *  This is a Standard C++ Library header.
4010d565efSmrg */
4110d565efSmrg
4210d565efSmrg#ifndef _GLIBCXX_BITSET
4310d565efSmrg#define _GLIBCXX_BITSET 1
4410d565efSmrg
4510d565efSmrg#pragma GCC system_header
4610d565efSmrg
4710d565efSmrg#include <string>
4810d565efSmrg#include <bits/functexcept.h>   // For invalid_argument, out_of_range,
4910d565efSmrg                                // overflow_error
5010d565efSmrg#include <iosfwd>
5110d565efSmrg#include <bits/cxxabi_forced.h>
5210d565efSmrg
53c7a68eb7Smrg#if __cplusplus >= 201103L
54c7a68eb7Smrg# include <bits/functional_hash.h>
55c7a68eb7Smrg#endif
56c7a68eb7Smrg
5710d565efSmrg#define _GLIBCXX_BITSET_BITS_PER_WORD  (__CHAR_BIT__ * __SIZEOF_LONG__)
5810d565efSmrg#define _GLIBCXX_BITSET_WORDS(__n) \
5910d565efSmrg  ((__n) / _GLIBCXX_BITSET_BITS_PER_WORD + \
6010d565efSmrg   ((__n) % _GLIBCXX_BITSET_BITS_PER_WORD == 0 ? 0 : 1))
6110d565efSmrg
6210d565efSmrg#define _GLIBCXX_BITSET_BITS_PER_ULL (__CHAR_BIT__ * __SIZEOF_LONG_LONG__)
6310d565efSmrg
6410d565efSmrgnamespace std _GLIBCXX_VISIBILITY(default)
6510d565efSmrg{
6610d565efSmrg_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
6710d565efSmrg
6810d565efSmrg  /**
6910d565efSmrg   *  Base class, general case.  It is a class invariant that _Nw will be
7010d565efSmrg   *  nonnegative.
7110d565efSmrg   *
7210d565efSmrg   *  See documentation for bitset.
7310d565efSmrg  */
7410d565efSmrg  template<size_t _Nw>
7510d565efSmrg    struct _Base_bitset
7610d565efSmrg    {
7710d565efSmrg      typedef unsigned long _WordT;
7810d565efSmrg
7910d565efSmrg      /// 0 is the least significant word.
8010d565efSmrg      _WordT 		_M_w[_Nw];
8110d565efSmrg
8210d565efSmrg      _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
8310d565efSmrg      : _M_w() { }
8410d565efSmrg
8510d565efSmrg#if __cplusplus >= 201103L
8610d565efSmrg      constexpr _Base_bitset(unsigned long long __val) noexcept
8710d565efSmrg      : _M_w{ _WordT(__val)
8810d565efSmrg#if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__
8910d565efSmrg	       , _WordT(__val >> _GLIBCXX_BITSET_BITS_PER_WORD)
9010d565efSmrg#endif
9110d565efSmrg       } { }
9210d565efSmrg#else
9310d565efSmrg      _Base_bitset(unsigned long __val)
9410d565efSmrg      : _M_w()
9510d565efSmrg      { _M_w[0] = __val; }
9610d565efSmrg#endif
9710d565efSmrg
9810d565efSmrg      static _GLIBCXX_CONSTEXPR size_t
9910d565efSmrg      _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
10010d565efSmrg      { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
10110d565efSmrg
10210d565efSmrg      static _GLIBCXX_CONSTEXPR size_t
10310d565efSmrg      _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
10410d565efSmrg      { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
10510d565efSmrg
10610d565efSmrg      static _GLIBCXX_CONSTEXPR size_t
10710d565efSmrg      _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
10810d565efSmrg      { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
10910d565efSmrg
11010d565efSmrg      static _GLIBCXX_CONSTEXPR _WordT
11110d565efSmrg      _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
11210d565efSmrg      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
11310d565efSmrg
11410d565efSmrg      _WordT&
11510d565efSmrg      _M_getword(size_t __pos) _GLIBCXX_NOEXCEPT
11610d565efSmrg      { return _M_w[_S_whichword(__pos)]; }
11710d565efSmrg
11810d565efSmrg      _GLIBCXX_CONSTEXPR _WordT
11910d565efSmrg      _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT
12010d565efSmrg      { return _M_w[_S_whichword(__pos)]; }
12110d565efSmrg
12210d565efSmrg#if __cplusplus >= 201103L
12310d565efSmrg      const _WordT*
12410d565efSmrg      _M_getdata() const noexcept
12510d565efSmrg      { return _M_w; }
12610d565efSmrg#endif
12710d565efSmrg
12810d565efSmrg      _WordT&
12910d565efSmrg      _M_hiword() _GLIBCXX_NOEXCEPT
13010d565efSmrg      { return _M_w[_Nw - 1]; }
13110d565efSmrg
13210d565efSmrg      _GLIBCXX_CONSTEXPR _WordT
13310d565efSmrg      _M_hiword() const _GLIBCXX_NOEXCEPT
13410d565efSmrg      { return _M_w[_Nw - 1]; }
13510d565efSmrg
13610d565efSmrg      void
13710d565efSmrg      _M_do_and(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
13810d565efSmrg      {
13910d565efSmrg	for (size_t __i = 0; __i < _Nw; __i++)
14010d565efSmrg	  _M_w[__i] &= __x._M_w[__i];
14110d565efSmrg      }
14210d565efSmrg
14310d565efSmrg      void
14410d565efSmrg      _M_do_or(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
14510d565efSmrg      {
14610d565efSmrg	for (size_t __i = 0; __i < _Nw; __i++)
14710d565efSmrg	  _M_w[__i] |= __x._M_w[__i];
14810d565efSmrg      }
14910d565efSmrg
15010d565efSmrg      void
15110d565efSmrg      _M_do_xor(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
15210d565efSmrg      {
15310d565efSmrg	for (size_t __i = 0; __i < _Nw; __i++)
15410d565efSmrg	  _M_w[__i] ^= __x._M_w[__i];
15510d565efSmrg      }
15610d565efSmrg
15710d565efSmrg      void
15810d565efSmrg      _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT;
15910d565efSmrg
16010d565efSmrg      void
16110d565efSmrg      _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT;
16210d565efSmrg
16310d565efSmrg      void
16410d565efSmrg      _M_do_flip() _GLIBCXX_NOEXCEPT
16510d565efSmrg      {
16610d565efSmrg	for (size_t __i = 0; __i < _Nw; __i++)
16710d565efSmrg	  _M_w[__i] = ~_M_w[__i];
16810d565efSmrg      }
16910d565efSmrg
17010d565efSmrg      void
17110d565efSmrg      _M_do_set() _GLIBCXX_NOEXCEPT
17210d565efSmrg      {
17310d565efSmrg	for (size_t __i = 0; __i < _Nw; __i++)
17410d565efSmrg	  _M_w[__i] = ~static_cast<_WordT>(0);
17510d565efSmrg      }
17610d565efSmrg
17710d565efSmrg      void
17810d565efSmrg      _M_do_reset() _GLIBCXX_NOEXCEPT
17910d565efSmrg      { __builtin_memset(_M_w, 0, _Nw * sizeof(_WordT)); }
18010d565efSmrg
18110d565efSmrg      bool
18210d565efSmrg      _M_is_equal(const _Base_bitset<_Nw>& __x) const _GLIBCXX_NOEXCEPT
18310d565efSmrg      {
18410d565efSmrg	for (size_t __i = 0; __i < _Nw; ++__i)
18510d565efSmrg	  if (_M_w[__i] != __x._M_w[__i])
18610d565efSmrg	    return false;
18710d565efSmrg	return true;
18810d565efSmrg      }
18910d565efSmrg
19010d565efSmrg      template<size_t _Nb>
19110d565efSmrg        bool
19210d565efSmrg        _M_are_all() const _GLIBCXX_NOEXCEPT
19310d565efSmrg        {
19410d565efSmrg	  for (size_t __i = 0; __i < _Nw - 1; __i++)
19510d565efSmrg	    if (_M_w[__i] != ~static_cast<_WordT>(0))
19610d565efSmrg	      return false;
19710d565efSmrg	  return _M_hiword() == (~static_cast<_WordT>(0)
19810d565efSmrg				 >> (_Nw * _GLIBCXX_BITSET_BITS_PER_WORD
19910d565efSmrg				     - _Nb));
20010d565efSmrg	}
20110d565efSmrg
20210d565efSmrg      bool
20310d565efSmrg      _M_is_any() const _GLIBCXX_NOEXCEPT
20410d565efSmrg      {
20510d565efSmrg	for (size_t __i = 0; __i < _Nw; __i++)
20610d565efSmrg	  if (_M_w[__i] != static_cast<_WordT>(0))
20710d565efSmrg	    return true;
20810d565efSmrg	return false;
20910d565efSmrg      }
21010d565efSmrg
21110d565efSmrg      size_t
21210d565efSmrg      _M_do_count() const _GLIBCXX_NOEXCEPT
21310d565efSmrg      {
21410d565efSmrg	size_t __result = 0;
21510d565efSmrg	for (size_t __i = 0; __i < _Nw; __i++)
21610d565efSmrg	  __result += __builtin_popcountl(_M_w[__i]);
21710d565efSmrg	return __result;
21810d565efSmrg      }
21910d565efSmrg
22010d565efSmrg      unsigned long
22110d565efSmrg      _M_do_to_ulong() const;
22210d565efSmrg
22310d565efSmrg#if __cplusplus >= 201103L
22410d565efSmrg      unsigned long long
22510d565efSmrg      _M_do_to_ullong() const;
22610d565efSmrg#endif
22710d565efSmrg
22810d565efSmrg      // find first "on" bit
22910d565efSmrg      size_t
23010d565efSmrg      _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT;
23110d565efSmrg
23210d565efSmrg      // find the next "on" bit that follows "prev"
23310d565efSmrg      size_t
23410d565efSmrg      _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT;
23510d565efSmrg    };
23610d565efSmrg
23710d565efSmrg  // Definitions of non-inline functions from _Base_bitset.
23810d565efSmrg  template<size_t _Nw>
23910d565efSmrg    void
24010d565efSmrg    _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT
24110d565efSmrg    {
24210d565efSmrg      if (__builtin_expect(__shift != 0, 1))
24310d565efSmrg	{
24410d565efSmrg	  const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD;
24510d565efSmrg	  const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD;
24610d565efSmrg
24710d565efSmrg	  if (__offset == 0)
24810d565efSmrg	    for (size_t __n = _Nw - 1; __n >= __wshift; --__n)
24910d565efSmrg	      _M_w[__n] = _M_w[__n - __wshift];
25010d565efSmrg	  else
25110d565efSmrg	    {
25210d565efSmrg	      const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD
25310d565efSmrg					   - __offset);
25410d565efSmrg	      for (size_t __n = _Nw - 1; __n > __wshift; --__n)
25510d565efSmrg		_M_w[__n] = ((_M_w[__n - __wshift] << __offset)
25610d565efSmrg			     | (_M_w[__n - __wshift - 1] >> __sub_offset));
25710d565efSmrg	      _M_w[__wshift] = _M_w[0] << __offset;
25810d565efSmrg	    }
25910d565efSmrg
26010d565efSmrg	  std::fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0));
26110d565efSmrg	}
26210d565efSmrg    }
26310d565efSmrg
26410d565efSmrg  template<size_t _Nw>
26510d565efSmrg    void
26610d565efSmrg    _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT
26710d565efSmrg    {
26810d565efSmrg      if (__builtin_expect(__shift != 0, 1))
26910d565efSmrg	{
27010d565efSmrg	  const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD;
27110d565efSmrg	  const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD;
27210d565efSmrg	  const size_t __limit = _Nw - __wshift - 1;
27310d565efSmrg
27410d565efSmrg	  if (__offset == 0)
27510d565efSmrg	    for (size_t __n = 0; __n <= __limit; ++__n)
27610d565efSmrg	      _M_w[__n] = _M_w[__n + __wshift];
27710d565efSmrg	  else
27810d565efSmrg	    {
27910d565efSmrg	      const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD
28010d565efSmrg					   - __offset);
28110d565efSmrg	      for (size_t __n = 0; __n < __limit; ++__n)
28210d565efSmrg		_M_w[__n] = ((_M_w[__n + __wshift] >> __offset)
28310d565efSmrg			     | (_M_w[__n + __wshift + 1] << __sub_offset));
28410d565efSmrg	      _M_w[__limit] = _M_w[_Nw-1] >> __offset;
28510d565efSmrg	    }
28610d565efSmrg
28710d565efSmrg	  std::fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0));
28810d565efSmrg	}
28910d565efSmrg    }
29010d565efSmrg
29110d565efSmrg  template<size_t _Nw>
29210d565efSmrg    unsigned long
29310d565efSmrg    _Base_bitset<_Nw>::_M_do_to_ulong() const
29410d565efSmrg    {
29510d565efSmrg      for (size_t __i = 1; __i < _Nw; ++__i)
29610d565efSmrg	if (_M_w[__i])
29710d565efSmrg	  __throw_overflow_error(__N("_Base_bitset::_M_do_to_ulong"));
29810d565efSmrg      return _M_w[0];
29910d565efSmrg    }
30010d565efSmrg
30110d565efSmrg#if __cplusplus >= 201103L
30210d565efSmrg  template<size_t _Nw>
30310d565efSmrg    unsigned long long
30410d565efSmrg    _Base_bitset<_Nw>::_M_do_to_ullong() const
30510d565efSmrg    {
30610d565efSmrg      const bool __dw = sizeof(unsigned long long) > sizeof(unsigned long);
30710d565efSmrg      for (size_t __i = 1 + __dw; __i < _Nw; ++__i)
30810d565efSmrg	if (_M_w[__i])
30910d565efSmrg	  __throw_overflow_error(__N("_Base_bitset::_M_do_to_ullong"));
31010d565efSmrg
31110d565efSmrg      if (__dw)
31210d565efSmrg	return _M_w[0] + (static_cast<unsigned long long>(_M_w[1])
31310d565efSmrg			  << _GLIBCXX_BITSET_BITS_PER_WORD);
31410d565efSmrg      return _M_w[0];
31510d565efSmrg    }
31610d565efSmrg#endif
31710d565efSmrg
31810d565efSmrg  template<size_t _Nw>
31910d565efSmrg    size_t
32010d565efSmrg    _Base_bitset<_Nw>::
32110d565efSmrg    _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT
32210d565efSmrg    {
32310d565efSmrg      for (size_t __i = 0; __i < _Nw; __i++)
32410d565efSmrg	{
32510d565efSmrg	  _WordT __thisword = _M_w[__i];
32610d565efSmrg	  if (__thisword != static_cast<_WordT>(0))
32710d565efSmrg	    return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
32810d565efSmrg		    + __builtin_ctzl(__thisword));
32910d565efSmrg	}
33010d565efSmrg      // not found, so return an indication of failure.
33110d565efSmrg      return __not_found;
33210d565efSmrg    }
33310d565efSmrg
33410d565efSmrg  template<size_t _Nw>
33510d565efSmrg    size_t
33610d565efSmrg    _Base_bitset<_Nw>::
33710d565efSmrg    _M_do_find_next(size_t __prev, size_t __not_found) const _GLIBCXX_NOEXCEPT
33810d565efSmrg    {
33910d565efSmrg      // make bound inclusive
34010d565efSmrg      ++__prev;
34110d565efSmrg
34210d565efSmrg      // check out of bounds
34310d565efSmrg      if (__prev >= _Nw * _GLIBCXX_BITSET_BITS_PER_WORD)
34410d565efSmrg	return __not_found;
34510d565efSmrg
34610d565efSmrg      // search first word
34710d565efSmrg      size_t __i = _S_whichword(__prev);
34810d565efSmrg      _WordT __thisword = _M_w[__i];
34910d565efSmrg
35010d565efSmrg      // mask off bits below bound
35110d565efSmrg      __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev);
35210d565efSmrg
35310d565efSmrg      if (__thisword != static_cast<_WordT>(0))
35410d565efSmrg	return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
35510d565efSmrg		+ __builtin_ctzl(__thisword));
35610d565efSmrg
35710d565efSmrg      // check subsequent words
35810d565efSmrg      __i++;
35910d565efSmrg      for (; __i < _Nw; __i++)
36010d565efSmrg	{
36110d565efSmrg	  __thisword = _M_w[__i];
36210d565efSmrg	  if (__thisword != static_cast<_WordT>(0))
36310d565efSmrg	    return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
36410d565efSmrg		    + __builtin_ctzl(__thisword));
36510d565efSmrg	}
36610d565efSmrg      // not found, so return an indication of failure.
36710d565efSmrg      return __not_found;
36810d565efSmrg    } // end _M_do_find_next
36910d565efSmrg
37010d565efSmrg  /**
37110d565efSmrg   *  Base class, specialization for a single word.
37210d565efSmrg   *
37310d565efSmrg   *  See documentation for bitset.
37410d565efSmrg  */
37510d565efSmrg  template<>
37610d565efSmrg    struct _Base_bitset<1>
37710d565efSmrg    {
37810d565efSmrg      typedef unsigned long _WordT;
37910d565efSmrg      _WordT _M_w;
38010d565efSmrg
38110d565efSmrg      _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
38210d565efSmrg      : _M_w(0)
38310d565efSmrg      { }
38410d565efSmrg
38510d565efSmrg#if __cplusplus >= 201103L
38610d565efSmrg      constexpr _Base_bitset(unsigned long long __val) noexcept
38710d565efSmrg#else
38810d565efSmrg      _Base_bitset(unsigned long __val)
38910d565efSmrg#endif
39010d565efSmrg      : _M_w(__val)
39110d565efSmrg      { }
39210d565efSmrg
39310d565efSmrg      static _GLIBCXX_CONSTEXPR size_t
39410d565efSmrg      _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
39510d565efSmrg      { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
39610d565efSmrg
39710d565efSmrg      static _GLIBCXX_CONSTEXPR size_t
39810d565efSmrg      _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
39910d565efSmrg      { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
40010d565efSmrg
40110d565efSmrg      static _GLIBCXX_CONSTEXPR size_t
40210d565efSmrg      _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
40310d565efSmrg      {  return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
40410d565efSmrg
40510d565efSmrg      static _GLIBCXX_CONSTEXPR _WordT
40610d565efSmrg      _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
40710d565efSmrg      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
40810d565efSmrg
40910d565efSmrg      _WordT&
41010d565efSmrg      _M_getword(size_t) _GLIBCXX_NOEXCEPT
41110d565efSmrg      { return _M_w; }
41210d565efSmrg
41310d565efSmrg      _GLIBCXX_CONSTEXPR _WordT
41410d565efSmrg      _M_getword(size_t) const _GLIBCXX_NOEXCEPT
41510d565efSmrg      { return _M_w; }
41610d565efSmrg
41710d565efSmrg#if __cplusplus >= 201103L
41810d565efSmrg      const _WordT*
41910d565efSmrg      _M_getdata() const noexcept
42010d565efSmrg      { return &_M_w; }
42110d565efSmrg#endif
42210d565efSmrg
42310d565efSmrg      _WordT&
42410d565efSmrg      _M_hiword() _GLIBCXX_NOEXCEPT
42510d565efSmrg      { return _M_w; }
42610d565efSmrg
42710d565efSmrg      _GLIBCXX_CONSTEXPR _WordT
42810d565efSmrg      _M_hiword() const _GLIBCXX_NOEXCEPT
42910d565efSmrg      { return _M_w; }
43010d565efSmrg
43110d565efSmrg      void
43210d565efSmrg      _M_do_and(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
43310d565efSmrg      { _M_w &= __x._M_w; }
43410d565efSmrg
43510d565efSmrg      void
43610d565efSmrg      _M_do_or(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
43710d565efSmrg      { _M_w |= __x._M_w; }
43810d565efSmrg
43910d565efSmrg      void
44010d565efSmrg      _M_do_xor(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
44110d565efSmrg      { _M_w ^= __x._M_w; }
44210d565efSmrg
44310d565efSmrg      void
44410d565efSmrg      _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT
44510d565efSmrg      { _M_w <<= __shift; }
44610d565efSmrg
44710d565efSmrg      void
44810d565efSmrg      _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT
44910d565efSmrg      { _M_w >>= __shift; }
45010d565efSmrg
45110d565efSmrg      void
45210d565efSmrg      _M_do_flip() _GLIBCXX_NOEXCEPT
45310d565efSmrg      { _M_w = ~_M_w; }
45410d565efSmrg
45510d565efSmrg      void
45610d565efSmrg      _M_do_set() _GLIBCXX_NOEXCEPT
45710d565efSmrg      { _M_w = ~static_cast<_WordT>(0); }
45810d565efSmrg
45910d565efSmrg      void
46010d565efSmrg      _M_do_reset() _GLIBCXX_NOEXCEPT
46110d565efSmrg      { _M_w = 0; }
46210d565efSmrg
46310d565efSmrg      bool
46410d565efSmrg      _M_is_equal(const _Base_bitset<1>& __x) const _GLIBCXX_NOEXCEPT
46510d565efSmrg      { return _M_w == __x._M_w; }
46610d565efSmrg
46710d565efSmrg      template<size_t _Nb>
46810d565efSmrg        bool
46910d565efSmrg        _M_are_all() const _GLIBCXX_NOEXCEPT
47010d565efSmrg        { return _M_w == (~static_cast<_WordT>(0)
47110d565efSmrg			  >> (_GLIBCXX_BITSET_BITS_PER_WORD - _Nb)); }
47210d565efSmrg
47310d565efSmrg      bool
47410d565efSmrg      _M_is_any() const _GLIBCXX_NOEXCEPT
47510d565efSmrg      { return _M_w != 0; }
47610d565efSmrg
47710d565efSmrg      size_t
47810d565efSmrg      _M_do_count() const _GLIBCXX_NOEXCEPT
47910d565efSmrg      { return __builtin_popcountl(_M_w); }
48010d565efSmrg
48110d565efSmrg      unsigned long
48210d565efSmrg      _M_do_to_ulong() const _GLIBCXX_NOEXCEPT
48310d565efSmrg      { return _M_w; }
48410d565efSmrg
48510d565efSmrg#if __cplusplus >= 201103L
48610d565efSmrg      unsigned long long
48710d565efSmrg      _M_do_to_ullong() const noexcept
48810d565efSmrg      { return _M_w; }
48910d565efSmrg#endif
49010d565efSmrg
49110d565efSmrg      size_t
49210d565efSmrg      _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT
49310d565efSmrg      {
49410d565efSmrg        if (_M_w != 0)
49510d565efSmrg          return __builtin_ctzl(_M_w);
49610d565efSmrg        else
49710d565efSmrg          return __not_found;
49810d565efSmrg      }
49910d565efSmrg
50010d565efSmrg      // find the next "on" bit that follows "prev"
50110d565efSmrg      size_t
50210d565efSmrg      _M_do_find_next(size_t __prev, size_t __not_found) const
50310d565efSmrg	_GLIBCXX_NOEXCEPT
50410d565efSmrg      {
50510d565efSmrg	++__prev;
50610d565efSmrg	if (__prev >= ((size_t) _GLIBCXX_BITSET_BITS_PER_WORD))
50710d565efSmrg	  return __not_found;
50810d565efSmrg
50910d565efSmrg	_WordT __x = _M_w >> __prev;
51010d565efSmrg	if (__x != 0)
51110d565efSmrg	  return __builtin_ctzl(__x) + __prev;
51210d565efSmrg	else
51310d565efSmrg	  return __not_found;
51410d565efSmrg      }
51510d565efSmrg    };
51610d565efSmrg
51710d565efSmrg  /**
51810d565efSmrg   *  Base class, specialization for no storage (zero-length %bitset).
51910d565efSmrg   *
52010d565efSmrg   *  See documentation for bitset.
52110d565efSmrg  */
52210d565efSmrg  template<>
52310d565efSmrg    struct _Base_bitset<0>
52410d565efSmrg    {
52510d565efSmrg      typedef unsigned long _WordT;
52610d565efSmrg
52710d565efSmrg      _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
52810d565efSmrg      { }
52910d565efSmrg
53010d565efSmrg#if __cplusplus >= 201103L
53110d565efSmrg      constexpr _Base_bitset(unsigned long long) noexcept
53210d565efSmrg#else
53310d565efSmrg      _Base_bitset(unsigned long)
53410d565efSmrg#endif
53510d565efSmrg      { }
53610d565efSmrg
53710d565efSmrg      static _GLIBCXX_CONSTEXPR size_t
53810d565efSmrg      _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
53910d565efSmrg      { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
54010d565efSmrg
54110d565efSmrg      static _GLIBCXX_CONSTEXPR size_t
54210d565efSmrg      _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
54310d565efSmrg      { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
54410d565efSmrg
54510d565efSmrg      static _GLIBCXX_CONSTEXPR size_t
54610d565efSmrg      _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
54710d565efSmrg      {  return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
54810d565efSmrg
54910d565efSmrg      static _GLIBCXX_CONSTEXPR _WordT
55010d565efSmrg      _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
55110d565efSmrg      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
55210d565efSmrg
55310d565efSmrg      // This would normally give access to the data.  The bounds-checking
55410d565efSmrg      // in the bitset class will prevent the user from getting this far,
55510d565efSmrg      // but (1) it must still return an lvalue to compile, and (2) the
55610d565efSmrg      // user might call _Unchecked_set directly, in which case this /needs/
55710d565efSmrg      // to fail.  Let's not penalize zero-length users unless they actually
55810d565efSmrg      // make an unchecked call; all the memory ugliness is therefore
55910d565efSmrg      // localized to this single should-never-get-this-far function.
56010d565efSmrg      _WordT&
56110d565efSmrg      _M_getword(size_t) _GLIBCXX_NOEXCEPT
56210d565efSmrg      {
56310d565efSmrg	__throw_out_of_range(__N("_Base_bitset::_M_getword"));
56410d565efSmrg	return *new _WordT;
56510d565efSmrg      }
56610d565efSmrg
56710d565efSmrg      _GLIBCXX_CONSTEXPR _WordT
568c7a68eb7Smrg      _M_getword(size_t) const _GLIBCXX_NOEXCEPT
56910d565efSmrg      { return 0; }
57010d565efSmrg
57110d565efSmrg      _GLIBCXX_CONSTEXPR _WordT
57210d565efSmrg      _M_hiword() const _GLIBCXX_NOEXCEPT
57310d565efSmrg      { return 0; }
57410d565efSmrg
57510d565efSmrg      void
57610d565efSmrg      _M_do_and(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
57710d565efSmrg      { }
57810d565efSmrg
57910d565efSmrg      void
58010d565efSmrg      _M_do_or(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
58110d565efSmrg      { }
58210d565efSmrg
58310d565efSmrg      void
58410d565efSmrg      _M_do_xor(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
58510d565efSmrg      { }
58610d565efSmrg
58710d565efSmrg      void
58810d565efSmrg      _M_do_left_shift(size_t) _GLIBCXX_NOEXCEPT
58910d565efSmrg      { }
59010d565efSmrg
59110d565efSmrg      void
59210d565efSmrg      _M_do_right_shift(size_t) _GLIBCXX_NOEXCEPT
59310d565efSmrg      { }
59410d565efSmrg
59510d565efSmrg      void
59610d565efSmrg      _M_do_flip() _GLIBCXX_NOEXCEPT
59710d565efSmrg      { }
59810d565efSmrg
59910d565efSmrg      void
60010d565efSmrg      _M_do_set() _GLIBCXX_NOEXCEPT
60110d565efSmrg      { }
60210d565efSmrg
60310d565efSmrg      void
60410d565efSmrg      _M_do_reset() _GLIBCXX_NOEXCEPT
60510d565efSmrg      { }
60610d565efSmrg
60710d565efSmrg      // Are all empty bitsets equal to each other?  Are they equal to
60810d565efSmrg      // themselves?  How to compare a thing which has no state?  What is
60910d565efSmrg      // the sound of one zero-length bitset clapping?
61010d565efSmrg      bool
61110d565efSmrg      _M_is_equal(const _Base_bitset<0>&) const _GLIBCXX_NOEXCEPT
61210d565efSmrg      { return true; }
61310d565efSmrg
61410d565efSmrg      template<size_t _Nb>
61510d565efSmrg        bool
61610d565efSmrg        _M_are_all() const _GLIBCXX_NOEXCEPT
61710d565efSmrg        { return true; }
61810d565efSmrg
61910d565efSmrg      bool
62010d565efSmrg      _M_is_any() const _GLIBCXX_NOEXCEPT
62110d565efSmrg      { return false; }
62210d565efSmrg
62310d565efSmrg      size_t
62410d565efSmrg      _M_do_count() const _GLIBCXX_NOEXCEPT
62510d565efSmrg      { return 0; }
62610d565efSmrg
62710d565efSmrg      unsigned long
62810d565efSmrg      _M_do_to_ulong() const _GLIBCXX_NOEXCEPT
62910d565efSmrg      { return 0; }
63010d565efSmrg
63110d565efSmrg#if __cplusplus >= 201103L
63210d565efSmrg      unsigned long long
63310d565efSmrg      _M_do_to_ullong() const noexcept
63410d565efSmrg      { return 0; }
63510d565efSmrg#endif
63610d565efSmrg
63710d565efSmrg      // Normally "not found" is the size, but that could also be
63810d565efSmrg      // misinterpreted as an index in this corner case.  Oh well.
63910d565efSmrg      size_t
64010d565efSmrg      _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT
64110d565efSmrg      { return 0; }
64210d565efSmrg
64310d565efSmrg      size_t
64410d565efSmrg      _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT
64510d565efSmrg      { return 0; }
64610d565efSmrg    };
64710d565efSmrg
64810d565efSmrg
64910d565efSmrg  // Helper class to zero out the unused high-order bits in the highest word.
65010d565efSmrg  template<size_t _Extrabits>
65110d565efSmrg    struct _Sanitize
65210d565efSmrg    {
65310d565efSmrg      typedef unsigned long _WordT;
65410d565efSmrg
65510d565efSmrg      static void
65610d565efSmrg      _S_do_sanitize(_WordT& __val) _GLIBCXX_NOEXCEPT
65710d565efSmrg      { __val &= ~((~static_cast<_WordT>(0)) << _Extrabits); }
65810d565efSmrg    };
65910d565efSmrg
66010d565efSmrg  template<>
66110d565efSmrg    struct _Sanitize<0>
66210d565efSmrg    {
66310d565efSmrg      typedef unsigned long _WordT;
66410d565efSmrg
66510d565efSmrg      static void
66610d565efSmrg      _S_do_sanitize(_WordT) _GLIBCXX_NOEXCEPT { }
66710d565efSmrg    };
66810d565efSmrg
66910d565efSmrg#if __cplusplus >= 201103L
67010d565efSmrg  template<size_t _Nb, bool = (_Nb < _GLIBCXX_BITSET_BITS_PER_ULL)>
67110d565efSmrg    struct _Sanitize_val
67210d565efSmrg    {
67310d565efSmrg      static constexpr unsigned long long
67410d565efSmrg      _S_do_sanitize_val(unsigned long long __val)
67510d565efSmrg      { return __val; }
67610d565efSmrg    };
67710d565efSmrg
67810d565efSmrg  template<size_t _Nb>
67910d565efSmrg    struct _Sanitize_val<_Nb, true>
68010d565efSmrg    {
68110d565efSmrg      static constexpr unsigned long long
68210d565efSmrg      _S_do_sanitize_val(unsigned long long __val)
68310d565efSmrg      { return __val & ~((~static_cast<unsigned long long>(0)) << _Nb); }
68410d565efSmrg    };
68510d565efSmrg#endif
68610d565efSmrg
68710d565efSmrg  /**
68810d565efSmrg   *  @brief The %bitset class represents a @e fixed-size sequence of bits.
68910d565efSmrg   *  @ingroup utilities
69010d565efSmrg   *
69110d565efSmrg   *  (Note that %bitset does @e not meet the formal requirements of a
69210d565efSmrg   *  <a href="tables.html#65">container</a>.  Mainly, it lacks iterators.)
69310d565efSmrg   *
69410d565efSmrg   *  The template argument, @a Nb, may be any non-negative number,
69510d565efSmrg   *  specifying the number of bits (e.g., "0", "12", "1024*1024").
69610d565efSmrg   *
69710d565efSmrg   *  In the general unoptimized case, storage is allocated in word-sized
69810d565efSmrg   *  blocks.  Let B be the number of bits in a word, then (Nb+(B-1))/B
69910d565efSmrg   *  words will be used for storage.  B - Nb%B bits are unused.  (They are
70010d565efSmrg   *  the high-order bits in the highest word.)  It is a class invariant
70110d565efSmrg   *  that those unused bits are always zero.
70210d565efSmrg   *
70310d565efSmrg   *  If you think of %bitset as <em>a simple array of bits</em>, be
70410d565efSmrg   *  aware that your mental picture is reversed: a %bitset behaves
70510d565efSmrg   *  the same way as bits in integers do, with the bit at index 0 in
70610d565efSmrg   *  the <em>least significant / right-hand</em> position, and the bit at
70710d565efSmrg   *  index Nb-1 in the <em>most significant / left-hand</em> position.
70810d565efSmrg   *  Thus, unlike other containers, a %bitset's index <em>counts from
70910d565efSmrg   *  right to left</em>, to put it very loosely.
71010d565efSmrg   *
71110d565efSmrg   *  This behavior is preserved when translating to and from strings.  For
71210d565efSmrg   *  example, the first line of the following program probably prints
71310d565efSmrg   *  <em>b(&apos;a&apos;) is 0001100001</em> on a modern ASCII system.
71410d565efSmrg   *
71510d565efSmrg   *  @code
71610d565efSmrg   *     #include <bitset>
71710d565efSmrg   *     #include <iostream>
71810d565efSmrg   *     #include <sstream>
71910d565efSmrg   *
72010d565efSmrg   *     using namespace std;
72110d565efSmrg   *
72210d565efSmrg   *     int main()
72310d565efSmrg   *     {
72410d565efSmrg   *         long         a = 'a';
72510d565efSmrg   *         bitset<10>   b(a);
72610d565efSmrg   *
72710d565efSmrg   *         cout << "b('a') is " << b << endl;
72810d565efSmrg   *
72910d565efSmrg   *         ostringstream s;
73010d565efSmrg   *         s << b;
73110d565efSmrg   *         string  str = s.str();
73210d565efSmrg   *         cout << "index 3 in the string is " << str[3] << " but\n"
73310d565efSmrg   *              << "index 3 in the bitset is " << b[3] << endl;
73410d565efSmrg   *     }
73510d565efSmrg   *  @endcode
73610d565efSmrg   *
73710d565efSmrg   *  Also see:
73810d565efSmrg   *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_containers.html
73910d565efSmrg   *  for a description of extensions.
74010d565efSmrg   *
74110d565efSmrg   *  Most of the actual code isn't contained in %bitset<> itself, but in the
74210d565efSmrg   *  base class _Base_bitset.  The base class works with whole words, not with
74310d565efSmrg   *  individual bits.  This allows us to specialize _Base_bitset for the
74410d565efSmrg   *  important special case where the %bitset is only a single word.
74510d565efSmrg   *
74610d565efSmrg   *  Extra confusion can result due to the fact that the storage for
74710d565efSmrg   *  _Base_bitset @e is a regular array, and is indexed as such.  This is
74810d565efSmrg   *  carefully encapsulated.
74910d565efSmrg  */
75010d565efSmrg  template<size_t _Nb>
75110d565efSmrg    class bitset
75210d565efSmrg    : private _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)>
75310d565efSmrg    {
75410d565efSmrg    private:
75510d565efSmrg      typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base;
75610d565efSmrg      typedef unsigned long _WordT;
75710d565efSmrg
75810d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
75910d565efSmrg      void
76010d565efSmrg      _M_check_initial_position(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
76110d565efSmrg				size_t __position) const
76210d565efSmrg      {
76310d565efSmrg	if (__position > __s.size())
76410d565efSmrg	  __throw_out_of_range_fmt(__N("bitset::bitset: __position "
76510d565efSmrg				       "(which is %zu) > __s.size() "
76610d565efSmrg				       "(which is %zu)"),
76710d565efSmrg				   __position, __s.size());
76810d565efSmrg      }
76910d565efSmrg
77010d565efSmrg      void _M_check(size_t __position, const char *__s) const
77110d565efSmrg      {
77210d565efSmrg	if (__position >= _Nb)
77310d565efSmrg	  __throw_out_of_range_fmt(__N("%s: __position (which is %zu) "
77410d565efSmrg				       ">= _Nb (which is %zu)"),
77510d565efSmrg				   __s, __position, _Nb);
77610d565efSmrg      }
77710d565efSmrg
77810d565efSmrg      void
77910d565efSmrg      _M_do_sanitize() _GLIBCXX_NOEXCEPT
78010d565efSmrg      {
78110d565efSmrg	typedef _Sanitize<_Nb % _GLIBCXX_BITSET_BITS_PER_WORD> __sanitize_type;
78210d565efSmrg	__sanitize_type::_S_do_sanitize(this->_M_hiword());
78310d565efSmrg      }
78410d565efSmrg
78510d565efSmrg#if __cplusplus >= 201103L
786c7a68eb7Smrg      friend struct std::hash<bitset>;
78710d565efSmrg#endif
78810d565efSmrg
78910d565efSmrg    public:
79010d565efSmrg      /**
79110d565efSmrg       *  This encapsulates the concept of a single bit.  An instance of this
79210d565efSmrg       *  class is a proxy for an actual bit; this way the individual bit
79310d565efSmrg       *  operations are done as faster word-size bitwise instructions.
79410d565efSmrg       *
79510d565efSmrg       *  Most users will never need to use this class directly; conversions
79610d565efSmrg       *  to and from bool are automatic and should be transparent.  Overloaded
79710d565efSmrg       *  operators help to preserve the illusion.
79810d565efSmrg       *
79910d565efSmrg       *  (On a typical system, this <em>bit %reference</em> is 64
80010d565efSmrg       *  times the size of an actual bit.  Ha.)
80110d565efSmrg       */
80210d565efSmrg      class reference
80310d565efSmrg      {
80410d565efSmrg	friend class bitset;
80510d565efSmrg
80610d565efSmrg	_WordT*	_M_wp;
80710d565efSmrg	size_t 	_M_bpos;
80810d565efSmrg
80910d565efSmrg	// left undefined
81010d565efSmrg	reference();
81110d565efSmrg
81210d565efSmrg      public:
81310d565efSmrg	reference(bitset& __b, size_t __pos) _GLIBCXX_NOEXCEPT
81410d565efSmrg	{
81510d565efSmrg	  _M_wp = &__b._M_getword(__pos);
81610d565efSmrg	  _M_bpos = _Base::_S_whichbit(__pos);
81710d565efSmrg	}
81810d565efSmrg
8190fc04c29Smrg#if __cplusplus >= 201103L
8200fc04c29Smrg	reference(const reference&) = default;
8210fc04c29Smrg#endif
8220fc04c29Smrg
82310d565efSmrg	~reference() _GLIBCXX_NOEXCEPT
82410d565efSmrg	{ }
82510d565efSmrg
82610d565efSmrg	// For b[i] = __x;
82710d565efSmrg	reference&
82810d565efSmrg	operator=(bool __x) _GLIBCXX_NOEXCEPT
82910d565efSmrg	{
83010d565efSmrg	  if (__x)
83110d565efSmrg	    *_M_wp |= _Base::_S_maskbit(_M_bpos);
83210d565efSmrg	  else
83310d565efSmrg	    *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
83410d565efSmrg	  return *this;
83510d565efSmrg	}
83610d565efSmrg
83710d565efSmrg	// For b[i] = b[__j];
83810d565efSmrg	reference&
83910d565efSmrg	operator=(const reference& __j) _GLIBCXX_NOEXCEPT
84010d565efSmrg	{
84110d565efSmrg	  if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos)))
84210d565efSmrg	    *_M_wp |= _Base::_S_maskbit(_M_bpos);
84310d565efSmrg	  else
84410d565efSmrg	    *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
84510d565efSmrg	  return *this;
84610d565efSmrg	}
84710d565efSmrg
84810d565efSmrg	// Flips the bit
84910d565efSmrg	bool
85010d565efSmrg	operator~() const _GLIBCXX_NOEXCEPT
85110d565efSmrg	{ return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; }
85210d565efSmrg
85310d565efSmrg	// For __x = b[i];
85410d565efSmrg	operator bool() const _GLIBCXX_NOEXCEPT
85510d565efSmrg	{ return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; }
85610d565efSmrg
85710d565efSmrg	// For b[i].flip();
85810d565efSmrg	reference&
85910d565efSmrg	flip() _GLIBCXX_NOEXCEPT
86010d565efSmrg	{
86110d565efSmrg	  *_M_wp ^= _Base::_S_maskbit(_M_bpos);
86210d565efSmrg	  return *this;
86310d565efSmrg	}
86410d565efSmrg      };
86510d565efSmrg      friend class reference;
86610d565efSmrg
86710d565efSmrg      // 23.3.5.1 constructors:
86810d565efSmrg      /// All bits set to zero.
86910d565efSmrg      _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT
87010d565efSmrg      { }
87110d565efSmrg
87210d565efSmrg      /// Initial bits bitwise-copied from a single word (others set to zero).
87310d565efSmrg#if __cplusplus >= 201103L
87410d565efSmrg      constexpr bitset(unsigned long long __val) noexcept
87510d565efSmrg      : _Base(_Sanitize_val<_Nb>::_S_do_sanitize_val(__val)) { }
87610d565efSmrg#else
87710d565efSmrg      bitset(unsigned long __val)
87810d565efSmrg      : _Base(__val)
87910d565efSmrg      { _M_do_sanitize(); }
88010d565efSmrg#endif
88110d565efSmrg
88210d565efSmrg      /**
88310d565efSmrg       *  Use a subset of a string.
88410d565efSmrg       *  @param  __s  A string of @a 0 and @a 1 characters.
88510d565efSmrg       *  @param  __position  Index of the first character in @a __s to use;
88610d565efSmrg       *                    defaults to zero.
88710d565efSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of @a __s.
88810d565efSmrg       *  @throw  std::invalid_argument  If a character appears in the string
88910d565efSmrg       *                                 which is neither @a 0 nor @a 1.
89010d565efSmrg       */
89110d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
89210d565efSmrg	explicit
89310d565efSmrg	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
89410d565efSmrg	       size_t __position = 0)
89510d565efSmrg	: _Base()
89610d565efSmrg	{
89710d565efSmrg	  _M_check_initial_position(__s, __position);
89810d565efSmrg	  _M_copy_from_string(__s, __position,
89910d565efSmrg			      std::basic_string<_CharT, _Traits, _Alloc>::npos,
90010d565efSmrg			      _CharT('0'), _CharT('1'));
90110d565efSmrg	}
90210d565efSmrg
90310d565efSmrg      /**
90410d565efSmrg       *  Use a subset of a string.
90510d565efSmrg       *  @param  __s  A string of @a 0 and @a 1 characters.
90610d565efSmrg       *  @param  __position  Index of the first character in @a __s to use.
90710d565efSmrg       *  @param  __n    The number of characters to copy.
90810d565efSmrg       *  @throw std::out_of_range If @a __position is bigger the size
90910d565efSmrg       *  of @a __s.
91010d565efSmrg       *  @throw  std::invalid_argument  If a character appears in the string
91110d565efSmrg       *                                 which is neither @a 0 nor @a 1.
91210d565efSmrg       */
91310d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
91410d565efSmrg	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
91510d565efSmrg	       size_t __position, size_t __n)
91610d565efSmrg	: _Base()
91710d565efSmrg	{
91810d565efSmrg	  _M_check_initial_position(__s, __position);
91910d565efSmrg	  _M_copy_from_string(__s, __position, __n, _CharT('0'), _CharT('1'));
92010d565efSmrg	}
92110d565efSmrg
92210d565efSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
92310d565efSmrg      // 396. what are characters zero and one.
92410d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
92510d565efSmrg	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
92610d565efSmrg	       size_t __position, size_t __n,
92710d565efSmrg	       _CharT __zero, _CharT __one = _CharT('1'))
92810d565efSmrg	: _Base()
92910d565efSmrg	{
93010d565efSmrg	  _M_check_initial_position(__s, __position);
93110d565efSmrg	  _M_copy_from_string(__s, __position, __n, __zero, __one);
93210d565efSmrg	}
93310d565efSmrg
93410d565efSmrg#if __cplusplus >= 201103L
93510d565efSmrg      /**
93610d565efSmrg       *  Construct from a character %array.
93710d565efSmrg       *  @param  __str  An %array of characters @a zero and @a one.
93810d565efSmrg       *  @param  __n    The number of characters to use.
93910d565efSmrg       *  @param  __zero The character corresponding to the value 0.
94010d565efSmrg       *  @param  __one  The character corresponding to the value 1.
94110d565efSmrg       *  @throw  std::invalid_argument If a character appears in the string
94210d565efSmrg       *                                which is neither @a __zero nor @a __one.
94310d565efSmrg       */
94410d565efSmrg      template<typename _CharT>
94510d565efSmrg        explicit
94610d565efSmrg        bitset(const _CharT* __str,
94710d565efSmrg	       typename std::basic_string<_CharT>::size_type __n
94810d565efSmrg	       = std::basic_string<_CharT>::npos,
94910d565efSmrg	       _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
95010d565efSmrg        : _Base()
95110d565efSmrg        {
95210d565efSmrg	  if (!__str)
95310d565efSmrg	    __throw_logic_error(__N("bitset::bitset(const _CharT*, ...)"));
95410d565efSmrg
95510d565efSmrg	  if (__n == std::basic_string<_CharT>::npos)
95610d565efSmrg	    __n = std::char_traits<_CharT>::length(__str);
95710d565efSmrg	  _M_copy_from_ptr<_CharT, std::char_traits<_CharT>>(__str, __n, 0,
95810d565efSmrg							     __n, __zero,
95910d565efSmrg							     __one);
96010d565efSmrg	}
96110d565efSmrg#endif
96210d565efSmrg
96310d565efSmrg      // 23.3.5.2 bitset operations:
964*ec02198aSmrg      ///@{
96510d565efSmrg      /**
96610d565efSmrg       *  Operations on bitsets.
96710d565efSmrg       *  @param  __rhs  A same-sized bitset.
96810d565efSmrg       *
96910d565efSmrg       *  These should be self-explanatory.
97010d565efSmrg       */
97110d565efSmrg      bitset<_Nb>&
97210d565efSmrg      operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
97310d565efSmrg      {
97410d565efSmrg	this->_M_do_and(__rhs);
97510d565efSmrg	return *this;
97610d565efSmrg      }
97710d565efSmrg
97810d565efSmrg      bitset<_Nb>&
97910d565efSmrg      operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
98010d565efSmrg      {
98110d565efSmrg	this->_M_do_or(__rhs);
98210d565efSmrg	return *this;
98310d565efSmrg      }
98410d565efSmrg
98510d565efSmrg      bitset<_Nb>&
98610d565efSmrg      operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
98710d565efSmrg      {
98810d565efSmrg	this->_M_do_xor(__rhs);
98910d565efSmrg	return *this;
99010d565efSmrg      }
991*ec02198aSmrg      ///@}
99210d565efSmrg
993*ec02198aSmrg      ///@{
99410d565efSmrg      /**
99510d565efSmrg       *  Operations on bitsets.
99610d565efSmrg       *  @param  __position  The number of places to shift.
99710d565efSmrg       *
99810d565efSmrg       *  These should be self-explanatory.
99910d565efSmrg       */
100010d565efSmrg      bitset<_Nb>&
100110d565efSmrg      operator<<=(size_t __position) _GLIBCXX_NOEXCEPT
100210d565efSmrg      {
100310d565efSmrg	if (__builtin_expect(__position < _Nb, 1))
100410d565efSmrg	  {
100510d565efSmrg	    this->_M_do_left_shift(__position);
100610d565efSmrg	    this->_M_do_sanitize();
100710d565efSmrg	  }
100810d565efSmrg	else
100910d565efSmrg	  this->_M_do_reset();
101010d565efSmrg	return *this;
101110d565efSmrg      }
101210d565efSmrg
101310d565efSmrg      bitset<_Nb>&
101410d565efSmrg      operator>>=(size_t __position) _GLIBCXX_NOEXCEPT
101510d565efSmrg      {
101610d565efSmrg	if (__builtin_expect(__position < _Nb, 1))
101710d565efSmrg	  {
101810d565efSmrg	    this->_M_do_right_shift(__position);
101910d565efSmrg	    this->_M_do_sanitize();
102010d565efSmrg	  }
102110d565efSmrg	else
102210d565efSmrg	  this->_M_do_reset();
102310d565efSmrg	return *this;
102410d565efSmrg      }
1025*ec02198aSmrg      ///@}
102610d565efSmrg
1027*ec02198aSmrg      ///@{
102810d565efSmrg      /**
102910d565efSmrg       *  These versions of single-bit set, reset, flip, and test are
103010d565efSmrg       *  extensions from the SGI version.  They do no range checking.
103110d565efSmrg       *  @ingroup SGIextensions
103210d565efSmrg       */
103310d565efSmrg      bitset<_Nb>&
103410d565efSmrg      _Unchecked_set(size_t __pos) _GLIBCXX_NOEXCEPT
103510d565efSmrg      {
103610d565efSmrg	this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
103710d565efSmrg	return *this;
103810d565efSmrg      }
103910d565efSmrg
104010d565efSmrg      bitset<_Nb>&
104110d565efSmrg      _Unchecked_set(size_t __pos, int __val) _GLIBCXX_NOEXCEPT
104210d565efSmrg      {
104310d565efSmrg	if (__val)
104410d565efSmrg	  this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
104510d565efSmrg	else
104610d565efSmrg	  this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
104710d565efSmrg	return *this;
104810d565efSmrg      }
104910d565efSmrg
105010d565efSmrg      bitset<_Nb>&
105110d565efSmrg      _Unchecked_reset(size_t __pos) _GLIBCXX_NOEXCEPT
105210d565efSmrg      {
105310d565efSmrg	this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
105410d565efSmrg	return *this;
105510d565efSmrg      }
105610d565efSmrg
105710d565efSmrg      bitset<_Nb>&
105810d565efSmrg      _Unchecked_flip(size_t __pos) _GLIBCXX_NOEXCEPT
105910d565efSmrg      {
106010d565efSmrg	this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos);
106110d565efSmrg	return *this;
106210d565efSmrg      }
106310d565efSmrg
106410d565efSmrg      _GLIBCXX_CONSTEXPR bool
106510d565efSmrg      _Unchecked_test(size_t __pos) const _GLIBCXX_NOEXCEPT
106610d565efSmrg      { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos))
106710d565efSmrg		!= static_cast<_WordT>(0)); }
1068*ec02198aSmrg      ///@}
106910d565efSmrg
107010d565efSmrg      // Set, reset, and flip.
107110d565efSmrg      /**
107210d565efSmrg       *  @brief Sets every bit to true.
107310d565efSmrg       */
107410d565efSmrg      bitset<_Nb>&
107510d565efSmrg      set() _GLIBCXX_NOEXCEPT
107610d565efSmrg      {
107710d565efSmrg	this->_M_do_set();
107810d565efSmrg	this->_M_do_sanitize();
107910d565efSmrg	return *this;
108010d565efSmrg      }
108110d565efSmrg
108210d565efSmrg      /**
108310d565efSmrg       *  @brief Sets a given bit to a particular value.
108410d565efSmrg       *  @param  __position  The index of the bit.
108510d565efSmrg       *  @param  __val  Either true or false, defaults to true.
108610d565efSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
108710d565efSmrg       */
108810d565efSmrg      bitset<_Nb>&
108910d565efSmrg      set(size_t __position, bool __val = true)
109010d565efSmrg      {
109110d565efSmrg	this->_M_check(__position, __N("bitset::set"));
109210d565efSmrg	return _Unchecked_set(__position, __val);
109310d565efSmrg      }
109410d565efSmrg
109510d565efSmrg      /**
109610d565efSmrg       *  @brief Sets every bit to false.
109710d565efSmrg       */
109810d565efSmrg      bitset<_Nb>&
109910d565efSmrg      reset() _GLIBCXX_NOEXCEPT
110010d565efSmrg      {
110110d565efSmrg	this->_M_do_reset();
110210d565efSmrg	return *this;
110310d565efSmrg      }
110410d565efSmrg
110510d565efSmrg      /**
110610d565efSmrg       *  @brief Sets a given bit to false.
110710d565efSmrg       *  @param  __position  The index of the bit.
110810d565efSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
110910d565efSmrg       *
111010d565efSmrg       *  Same as writing @c set(pos,false).
111110d565efSmrg       */
111210d565efSmrg      bitset<_Nb>&
111310d565efSmrg      reset(size_t __position)
111410d565efSmrg      {
111510d565efSmrg	this->_M_check(__position, __N("bitset::reset"));
111610d565efSmrg	return _Unchecked_reset(__position);
111710d565efSmrg      }
111810d565efSmrg
111910d565efSmrg      /**
112010d565efSmrg       *  @brief Toggles every bit to its opposite value.
112110d565efSmrg       */
112210d565efSmrg      bitset<_Nb>&
112310d565efSmrg      flip() _GLIBCXX_NOEXCEPT
112410d565efSmrg      {
112510d565efSmrg	this->_M_do_flip();
112610d565efSmrg	this->_M_do_sanitize();
112710d565efSmrg	return *this;
112810d565efSmrg      }
112910d565efSmrg
113010d565efSmrg      /**
113110d565efSmrg       *  @brief Toggles a given bit to its opposite value.
113210d565efSmrg       *  @param  __position  The index of the bit.
113310d565efSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
113410d565efSmrg       */
113510d565efSmrg      bitset<_Nb>&
113610d565efSmrg      flip(size_t __position)
113710d565efSmrg      {
113810d565efSmrg	this->_M_check(__position, __N("bitset::flip"));
113910d565efSmrg	return _Unchecked_flip(__position);
114010d565efSmrg      }
114110d565efSmrg
114210d565efSmrg      /// See the no-argument flip().
114310d565efSmrg      bitset<_Nb>
114410d565efSmrg      operator~() const _GLIBCXX_NOEXCEPT
114510d565efSmrg      { return bitset<_Nb>(*this).flip(); }
114610d565efSmrg
1147*ec02198aSmrg      ///@{
114810d565efSmrg      /**
114910d565efSmrg       *  @brief  Array-indexing support.
115010d565efSmrg       *  @param  __position  Index into the %bitset.
115110d565efSmrg       *  @return A bool for a <em>const %bitset</em>.  For non-const
115210d565efSmrg       *           bitsets, an instance of the reference proxy class.
115310d565efSmrg       *  @note  These operators do no range checking and throw no exceptions,
115410d565efSmrg       *         as required by DR 11 to the standard.
115510d565efSmrg       *
115610d565efSmrg       *  _GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already
115710d565efSmrg       *  resolves DR 11 (items 1 and 2), but does not do the range-checking
115810d565efSmrg       *  required by that DR's resolution.  -pme
115910d565efSmrg       *  The DR has since been changed:  range-checking is a precondition
116010d565efSmrg       *  (users' responsibility), and these functions must not throw.  -pme
116110d565efSmrg       */
116210d565efSmrg      reference
116310d565efSmrg      operator[](size_t __position)
116410d565efSmrg      { return reference(*this, __position); }
116510d565efSmrg
116610d565efSmrg      _GLIBCXX_CONSTEXPR bool
116710d565efSmrg      operator[](size_t __position) const
116810d565efSmrg      { return _Unchecked_test(__position); }
1169*ec02198aSmrg      ///@}
117010d565efSmrg
117110d565efSmrg      /**
117210d565efSmrg       *  @brief Returns a numerical interpretation of the %bitset.
117310d565efSmrg       *  @return  The integral equivalent of the bits.
117410d565efSmrg       *  @throw  std::overflow_error  If there are too many bits to be
117510d565efSmrg       *                               represented in an @c unsigned @c long.
117610d565efSmrg       */
117710d565efSmrg      unsigned long
117810d565efSmrg      to_ulong() const
117910d565efSmrg      { return this->_M_do_to_ulong(); }
118010d565efSmrg
118110d565efSmrg#if __cplusplus >= 201103L
118210d565efSmrg      unsigned long long
118310d565efSmrg      to_ullong() const
118410d565efSmrg      { return this->_M_do_to_ullong(); }
118510d565efSmrg#endif
118610d565efSmrg
118710d565efSmrg      /**
118810d565efSmrg       *  @brief Returns a character interpretation of the %bitset.
118910d565efSmrg       *  @return  The string equivalent of the bits.
119010d565efSmrg       *
119110d565efSmrg       *  Note the ordering of the bits:  decreasing character positions
119210d565efSmrg       *  correspond to increasing bit positions (see the main class notes for
119310d565efSmrg       *  an example).
119410d565efSmrg       */
119510d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
119610d565efSmrg	std::basic_string<_CharT, _Traits, _Alloc>
119710d565efSmrg	to_string() const
119810d565efSmrg	{
119910d565efSmrg	  std::basic_string<_CharT, _Traits, _Alloc> __result;
120010d565efSmrg	  _M_copy_to_string(__result, _CharT('0'), _CharT('1'));
120110d565efSmrg	  return __result;
120210d565efSmrg	}
120310d565efSmrg
120410d565efSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
120510d565efSmrg      // 396. what are characters zero and one.
120610d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
120710d565efSmrg	std::basic_string<_CharT, _Traits, _Alloc>
120810d565efSmrg	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
120910d565efSmrg	{
121010d565efSmrg	  std::basic_string<_CharT, _Traits, _Alloc> __result;
121110d565efSmrg	  _M_copy_to_string(__result, __zero, __one);
121210d565efSmrg	  return __result;
121310d565efSmrg	}
121410d565efSmrg
121510d565efSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
121610d565efSmrg      // 434. bitset::to_string() hard to use.
121710d565efSmrg      template<class _CharT, class _Traits>
121810d565efSmrg	std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
121910d565efSmrg	to_string() const
122010d565efSmrg	{ return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }
122110d565efSmrg
122210d565efSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
122310d565efSmrg      // 853. to_string needs updating with zero and one.
122410d565efSmrg      template<class _CharT, class _Traits>
122510d565efSmrg	std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
122610d565efSmrg	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
122710d565efSmrg	{ return to_string<_CharT, _Traits,
122810d565efSmrg	                   std::allocator<_CharT> >(__zero, __one); }
122910d565efSmrg
123010d565efSmrg      template<class _CharT>
123110d565efSmrg	std::basic_string<_CharT, std::char_traits<_CharT>,
123210d565efSmrg	                  std::allocator<_CharT> >
123310d565efSmrg	to_string() const
123410d565efSmrg	{
123510d565efSmrg	  return to_string<_CharT, std::char_traits<_CharT>,
123610d565efSmrg	                   std::allocator<_CharT> >();
123710d565efSmrg	}
123810d565efSmrg
123910d565efSmrg      template<class _CharT>
124010d565efSmrg	std::basic_string<_CharT, std::char_traits<_CharT>,
124110d565efSmrg	                  std::allocator<_CharT> >
124210d565efSmrg	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
124310d565efSmrg	{
124410d565efSmrg	  return to_string<_CharT, std::char_traits<_CharT>,
124510d565efSmrg	                   std::allocator<_CharT> >(__zero, __one);
124610d565efSmrg	}
124710d565efSmrg
124810d565efSmrg      std::basic_string<char, std::char_traits<char>, std::allocator<char> >
124910d565efSmrg      to_string() const
125010d565efSmrg      {
125110d565efSmrg	return to_string<char, std::char_traits<char>,
125210d565efSmrg	                 std::allocator<char> >();
125310d565efSmrg      }
125410d565efSmrg
125510d565efSmrg      std::basic_string<char, std::char_traits<char>, std::allocator<char> >
125610d565efSmrg      to_string(char __zero, char __one = '1') const
125710d565efSmrg      {
125810d565efSmrg	return to_string<char, std::char_traits<char>,
125910d565efSmrg	                 std::allocator<char> >(__zero, __one);
126010d565efSmrg      }
126110d565efSmrg
126210d565efSmrg      // Helper functions for string operations.
126310d565efSmrg      template<class _CharT, class _Traits>
126410d565efSmrg        void
126510d565efSmrg        _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t,
126610d565efSmrg			 _CharT, _CharT);
126710d565efSmrg
126810d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
126910d565efSmrg	void
127010d565efSmrg	_M_copy_from_string(const std::basic_string<_CharT,
127110d565efSmrg			    _Traits, _Alloc>& __s, size_t __pos, size_t __n,
127210d565efSmrg			    _CharT __zero, _CharT __one)
127310d565efSmrg	{ _M_copy_from_ptr<_CharT, _Traits>(__s.data(), __s.size(), __pos, __n,
127410d565efSmrg					    __zero, __one); }
127510d565efSmrg
127610d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
127710d565efSmrg	void
127810d565efSmrg        _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>&,
127910d565efSmrg			  _CharT, _CharT) const;
128010d565efSmrg
128110d565efSmrg      // NB: Backward compat.
128210d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
128310d565efSmrg	void
128410d565efSmrg	_M_copy_from_string(const std::basic_string<_CharT,
128510d565efSmrg			    _Traits, _Alloc>& __s, size_t __pos, size_t __n)
128610d565efSmrg	{ _M_copy_from_string(__s, __pos, __n, _CharT('0'), _CharT('1')); }
128710d565efSmrg
128810d565efSmrg      template<class _CharT, class _Traits, class _Alloc>
128910d565efSmrg	void
129010d565efSmrg        _M_copy_to_string(std::basic_string<_CharT, _Traits,_Alloc>& __s) const
129110d565efSmrg	{ _M_copy_to_string(__s, _CharT('0'), _CharT('1')); }
129210d565efSmrg
129310d565efSmrg      /// Returns the number of bits which are set.
129410d565efSmrg      size_t
129510d565efSmrg      count() const _GLIBCXX_NOEXCEPT
129610d565efSmrg      { return this->_M_do_count(); }
129710d565efSmrg
129810d565efSmrg      /// Returns the total number of bits.
129910d565efSmrg      _GLIBCXX_CONSTEXPR size_t
130010d565efSmrg      size() const _GLIBCXX_NOEXCEPT
130110d565efSmrg      { return _Nb; }
130210d565efSmrg
1303*ec02198aSmrg      ///@{
130410d565efSmrg      /// These comparisons for equality/inequality are, well, @e bitwise.
130510d565efSmrg      bool
130610d565efSmrg      operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
130710d565efSmrg      { return this->_M_is_equal(__rhs); }
130810d565efSmrg
1309*ec02198aSmrg#if __cpp_impl_three_way_comparison < 201907L
131010d565efSmrg      bool
131110d565efSmrg      operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
131210d565efSmrg      { return !this->_M_is_equal(__rhs); }
1313*ec02198aSmrg#endif
1314*ec02198aSmrg      ///@}
131510d565efSmrg
131610d565efSmrg      /**
131710d565efSmrg       *  @brief Tests the value of a bit.
131810d565efSmrg       *  @param  __position  The index of a bit.
131910d565efSmrg       *  @return  The value at @a pos.
132010d565efSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
132110d565efSmrg       */
132210d565efSmrg      bool
132310d565efSmrg      test(size_t __position) const
132410d565efSmrg      {
132510d565efSmrg	this->_M_check(__position, __N("bitset::test"));
132610d565efSmrg	return _Unchecked_test(__position);
132710d565efSmrg      }
132810d565efSmrg
132910d565efSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
133010d565efSmrg      // DR 693. std::bitset::all() missing.
133110d565efSmrg      /**
133210d565efSmrg       *  @brief Tests whether all the bits are on.
133310d565efSmrg       *  @return  True if all the bits are set.
133410d565efSmrg       */
133510d565efSmrg      bool
133610d565efSmrg      all() const _GLIBCXX_NOEXCEPT
133710d565efSmrg      { return this->template _M_are_all<_Nb>(); }
133810d565efSmrg
133910d565efSmrg      /**
134010d565efSmrg       *  @brief Tests whether any of the bits are on.
134110d565efSmrg       *  @return  True if at least one bit is set.
134210d565efSmrg       */
134310d565efSmrg      bool
134410d565efSmrg      any() const _GLIBCXX_NOEXCEPT
134510d565efSmrg      { return this->_M_is_any(); }
134610d565efSmrg
134710d565efSmrg      /**
134810d565efSmrg       *  @brief Tests whether any of the bits are on.
134910d565efSmrg       *  @return  True if none of the bits are set.
135010d565efSmrg       */
135110d565efSmrg      bool
135210d565efSmrg      none() const _GLIBCXX_NOEXCEPT
135310d565efSmrg      { return !this->_M_is_any(); }
135410d565efSmrg
1355*ec02198aSmrg      ///@{
135610d565efSmrg      /// Self-explanatory.
135710d565efSmrg      bitset<_Nb>
135810d565efSmrg      operator<<(size_t __position) const _GLIBCXX_NOEXCEPT
135910d565efSmrg      { return bitset<_Nb>(*this) <<= __position; }
136010d565efSmrg
136110d565efSmrg      bitset<_Nb>
136210d565efSmrg      operator>>(size_t __position) const _GLIBCXX_NOEXCEPT
136310d565efSmrg      { return bitset<_Nb>(*this) >>= __position; }
1364*ec02198aSmrg      ///@}
136510d565efSmrg
136610d565efSmrg      /**
136710d565efSmrg       *  @brief  Finds the index of the first "on" bit.
136810d565efSmrg       *  @return  The index of the first bit set, or size() if not found.
136910d565efSmrg       *  @ingroup SGIextensions
137010d565efSmrg       *  @sa  _Find_next
137110d565efSmrg       */
137210d565efSmrg      size_t
137310d565efSmrg      _Find_first() const _GLIBCXX_NOEXCEPT
137410d565efSmrg      { return this->_M_do_find_first(_Nb); }
137510d565efSmrg
137610d565efSmrg      /**
137710d565efSmrg       *  @brief  Finds the index of the next "on" bit after prev.
137810d565efSmrg       *  @return  The index of the next bit set, or size() if not found.
137910d565efSmrg       *  @param  __prev  Where to start searching.
138010d565efSmrg       *  @ingroup SGIextensions
138110d565efSmrg       *  @sa  _Find_first
138210d565efSmrg       */
138310d565efSmrg      size_t
138410d565efSmrg      _Find_next(size_t __prev) const _GLIBCXX_NOEXCEPT
138510d565efSmrg      { return this->_M_do_find_next(__prev, _Nb); }
138610d565efSmrg    };
138710d565efSmrg
138810d565efSmrg  // Definitions of non-inline member functions.
138910d565efSmrg  template<size_t _Nb>
139010d565efSmrg    template<class _CharT, class _Traits>
139110d565efSmrg      void
139210d565efSmrg      bitset<_Nb>::
139310d565efSmrg      _M_copy_from_ptr(const _CharT* __s, size_t __len,
139410d565efSmrg		       size_t __pos, size_t __n, _CharT __zero, _CharT __one)
139510d565efSmrg      {
139610d565efSmrg	reset();
139710d565efSmrg	const size_t __nbits = std::min(_Nb, std::min(__n, size_t(__len - __pos)));
139810d565efSmrg	for (size_t __i = __nbits; __i > 0; --__i)
139910d565efSmrg	  {
140010d565efSmrg	    const _CharT __c = __s[__pos + __nbits - __i];
140110d565efSmrg	    if (_Traits::eq(__c, __zero))
140210d565efSmrg	      ;
140310d565efSmrg	    else if (_Traits::eq(__c, __one))
140410d565efSmrg	      _Unchecked_set(__i - 1);
140510d565efSmrg	    else
140610d565efSmrg	      __throw_invalid_argument(__N("bitset::_M_copy_from_ptr"));
140710d565efSmrg	  }
140810d565efSmrg      }
140910d565efSmrg
141010d565efSmrg  template<size_t _Nb>
141110d565efSmrg    template<class _CharT, class _Traits, class _Alloc>
141210d565efSmrg      void
141310d565efSmrg      bitset<_Nb>::
141410d565efSmrg      _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>& __s,
141510d565efSmrg			_CharT __zero, _CharT __one) const
141610d565efSmrg      {
141710d565efSmrg	__s.assign(_Nb, __zero);
141810d565efSmrg	for (size_t __i = _Nb; __i > 0; --__i)
141910d565efSmrg	  if (_Unchecked_test(__i - 1))
142010d565efSmrg	    _Traits::assign(__s[_Nb - __i], __one);
142110d565efSmrg      }
142210d565efSmrg
142310d565efSmrg  // 23.3.5.3 bitset operations:
1424*ec02198aSmrg  ///@{
142510d565efSmrg  /**
142610d565efSmrg   *  @brief  Global bitwise operations on bitsets.
142710d565efSmrg   *  @param  __x  A bitset.
142810d565efSmrg   *  @param  __y  A bitset of the same size as @a __x.
142910d565efSmrg   *  @return  A new bitset.
143010d565efSmrg   *
143110d565efSmrg   *  These should be self-explanatory.
143210d565efSmrg  */
143310d565efSmrg  template<size_t _Nb>
143410d565efSmrg    inline bitset<_Nb>
143510d565efSmrg    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
143610d565efSmrg    {
143710d565efSmrg      bitset<_Nb> __result(__x);
143810d565efSmrg      __result &= __y;
143910d565efSmrg      return __result;
144010d565efSmrg    }
144110d565efSmrg
144210d565efSmrg  template<size_t _Nb>
144310d565efSmrg    inline bitset<_Nb>
144410d565efSmrg    operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
144510d565efSmrg    {
144610d565efSmrg      bitset<_Nb> __result(__x);
144710d565efSmrg      __result |= __y;
144810d565efSmrg      return __result;
144910d565efSmrg    }
145010d565efSmrg
145110d565efSmrg  template <size_t _Nb>
145210d565efSmrg    inline bitset<_Nb>
145310d565efSmrg    operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
145410d565efSmrg    {
145510d565efSmrg      bitset<_Nb> __result(__x);
145610d565efSmrg      __result ^= __y;
145710d565efSmrg      return __result;
145810d565efSmrg    }
1459*ec02198aSmrg  ///@}
146010d565efSmrg
1461*ec02198aSmrg  ///@{
146210d565efSmrg  /**
146310d565efSmrg   *  @brief Global I/O operators for bitsets.
146410d565efSmrg   *
146510d565efSmrg   *  Direct I/O between streams and bitsets is supported.  Output is
146610d565efSmrg   *  straightforward.  Input will skip whitespace, only accept @a 0 and @a 1
146710d565efSmrg   *  characters, and will only extract as many digits as the %bitset will
146810d565efSmrg   *  hold.
146910d565efSmrg  */
147010d565efSmrg  template<class _CharT, class _Traits, size_t _Nb>
147110d565efSmrg    std::basic_istream<_CharT, _Traits>&
147210d565efSmrg    operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
147310d565efSmrg    {
147410d565efSmrg      typedef typename _Traits::char_type          char_type;
147510d565efSmrg      typedef std::basic_istream<_CharT, _Traits>  __istream_type;
147610d565efSmrg      typedef typename __istream_type::ios_base    __ios_base;
147710d565efSmrg
147810d565efSmrg      std::basic_string<_CharT, _Traits> __tmp;
147910d565efSmrg      __tmp.reserve(_Nb);
148010d565efSmrg
148110d565efSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
148210d565efSmrg      // 303. Bitset input operator underspecified
148310d565efSmrg      const char_type __zero = __is.widen('0');
148410d565efSmrg      const char_type __one = __is.widen('1');
148510d565efSmrg
148610d565efSmrg      typename __ios_base::iostate __state = __ios_base::goodbit;
148710d565efSmrg      typename __istream_type::sentry __sentry(__is);
148810d565efSmrg      if (__sentry)
148910d565efSmrg	{
149010d565efSmrg	  __try
149110d565efSmrg	    {
149210d565efSmrg	      for (size_t __i = _Nb; __i > 0; --__i)
149310d565efSmrg		{
149410d565efSmrg		  static typename _Traits::int_type __eof = _Traits::eof();
149510d565efSmrg
149610d565efSmrg		  typename _Traits::int_type __c1 = __is.rdbuf()->sbumpc();
149710d565efSmrg		  if (_Traits::eq_int_type(__c1, __eof))
149810d565efSmrg		    {
149910d565efSmrg		      __state |= __ios_base::eofbit;
150010d565efSmrg		      break;
150110d565efSmrg		    }
150210d565efSmrg		  else
150310d565efSmrg		    {
150410d565efSmrg		      const char_type __c2 = _Traits::to_char_type(__c1);
150510d565efSmrg		      if (_Traits::eq(__c2, __zero))
150610d565efSmrg			__tmp.push_back(__zero);
150710d565efSmrg		      else if (_Traits::eq(__c2, __one))
150810d565efSmrg			__tmp.push_back(__one);
150910d565efSmrg		      else if (_Traits::
151010d565efSmrg			       eq_int_type(__is.rdbuf()->sputbackc(__c2),
151110d565efSmrg					   __eof))
151210d565efSmrg			{
151310d565efSmrg			  __state |= __ios_base::failbit;
151410d565efSmrg			  break;
151510d565efSmrg			}
151610d565efSmrg		    }
151710d565efSmrg		}
151810d565efSmrg	    }
151910d565efSmrg	  __catch(__cxxabiv1::__forced_unwind&)
152010d565efSmrg	    {
152110d565efSmrg	      __is._M_setstate(__ios_base::badbit);
152210d565efSmrg	      __throw_exception_again;
152310d565efSmrg	    }
152410d565efSmrg	  __catch(...)
152510d565efSmrg	    { __is._M_setstate(__ios_base::badbit); }
152610d565efSmrg	}
152710d565efSmrg
152810d565efSmrg      if (__tmp.empty() && _Nb)
152910d565efSmrg	__state |= __ios_base::failbit;
153010d565efSmrg      else
153110d565efSmrg	__x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb,
153210d565efSmrg				__zero, __one);
153310d565efSmrg      if (__state)
153410d565efSmrg	__is.setstate(__state);
153510d565efSmrg      return __is;
153610d565efSmrg    }
153710d565efSmrg
153810d565efSmrg  template <class _CharT, class _Traits, size_t _Nb>
153910d565efSmrg    std::basic_ostream<_CharT, _Traits>&
154010d565efSmrg    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
154110d565efSmrg	       const bitset<_Nb>& __x)
154210d565efSmrg    {
154310d565efSmrg      std::basic_string<_CharT, _Traits> __tmp;
154410d565efSmrg
154510d565efSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
154610d565efSmrg      // 396. what are characters zero and one.
154710d565efSmrg      const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__os.getloc());
154810d565efSmrg      __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1'));
154910d565efSmrg      return __os << __tmp;
155010d565efSmrg    }
1551*ec02198aSmrg  ///@}
155210d565efSmrg
155310d565efSmrg_GLIBCXX_END_NAMESPACE_CONTAINER
155410d565efSmrg} // namespace std
155510d565efSmrg
155610d565efSmrg#undef _GLIBCXX_BITSET_WORDS
155710d565efSmrg#undef _GLIBCXX_BITSET_BITS_PER_WORD
155810d565efSmrg#undef _GLIBCXX_BITSET_BITS_PER_ULL
155910d565efSmrg
156010d565efSmrg#if __cplusplus >= 201103L
156110d565efSmrg
156210d565efSmrgnamespace std _GLIBCXX_VISIBILITY(default)
156310d565efSmrg{
156410d565efSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
156510d565efSmrg
156610d565efSmrg  // DR 1182.
156710d565efSmrg  /// std::hash specialization for bitset.
156810d565efSmrg  template<size_t _Nb>
156910d565efSmrg    struct hash<_GLIBCXX_STD_C::bitset<_Nb>>
157010d565efSmrg    : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<_Nb>>
157110d565efSmrg    {
157210d565efSmrg      size_t
157310d565efSmrg      operator()(const _GLIBCXX_STD_C::bitset<_Nb>& __b) const noexcept
157410d565efSmrg      {
157510d565efSmrg	const size_t __clength = (_Nb + __CHAR_BIT__ - 1) / __CHAR_BIT__;
157610d565efSmrg	return std::_Hash_impl::hash(__b._M_getdata(), __clength);
157710d565efSmrg      }
157810d565efSmrg    };
157910d565efSmrg
158010d565efSmrg  template<>
158110d565efSmrg    struct hash<_GLIBCXX_STD_C::bitset<0>>
158210d565efSmrg    : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<0>>
158310d565efSmrg    {
158410d565efSmrg      size_t
158510d565efSmrg      operator()(const _GLIBCXX_STD_C::bitset<0>&) const noexcept
158610d565efSmrg      { return 0; }
158710d565efSmrg    };
158810d565efSmrg
158910d565efSmrg_GLIBCXX_END_NAMESPACE_VERSION
159010d565efSmrg} // namespace
159110d565efSmrg
159210d565efSmrg#endif // C++11
159310d565efSmrg
159410d565efSmrg#ifdef _GLIBCXX_DEBUG
159510d565efSmrg# include <debug/bitset>
159610d565efSmrg#endif
159710d565efSmrg
159810d565efSmrg#endif /* _GLIBCXX_BITSET */
1599