xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/std/bitset (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg// <bitset> -*- C++ -*-
21debfc3dSmrg
3*8feb0f0bSmrg// Copyright (C) 2001-2020 Free Software Foundation, Inc.
41debfc3dSmrg//
51debfc3dSmrg// This file is part of the GNU ISO C++ Library.  This library is free
61debfc3dSmrg// software; you can redistribute it and/or modify it under the
71debfc3dSmrg// terms of the GNU General Public License as published by the
81debfc3dSmrg// Free Software Foundation; either version 3, or (at your option)
91debfc3dSmrg// any later version.
101debfc3dSmrg
111debfc3dSmrg// This library is distributed in the hope that it will be useful,
121debfc3dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of
131debfc3dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141debfc3dSmrg// GNU General Public License for more details.
151debfc3dSmrg
161debfc3dSmrg// Under Section 7 of GPL version 3, you are granted additional
171debfc3dSmrg// permissions described in the GCC Runtime Library Exception, version
181debfc3dSmrg// 3.1, as published by the Free Software Foundation.
191debfc3dSmrg
201debfc3dSmrg// You should have received a copy of the GNU General Public License and
211debfc3dSmrg// a copy of the GCC Runtime Library Exception along with this program;
221debfc3dSmrg// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
231debfc3dSmrg// <http://www.gnu.org/licenses/>.
241debfc3dSmrg
251debfc3dSmrg/*
261debfc3dSmrg * Copyright (c) 1998
271debfc3dSmrg * Silicon Graphics Computer Systems, Inc.
281debfc3dSmrg *
291debfc3dSmrg * Permission to use, copy, modify, distribute and sell this software
301debfc3dSmrg * and its documentation for any purpose is hereby granted without fee,
311debfc3dSmrg * provided that the above copyright notice appear in all copies and
321debfc3dSmrg * that both that copyright notice and this permission notice appear
331debfc3dSmrg * in supporting documentation.  Silicon Graphics makes no
341debfc3dSmrg * representations about the suitability of this software for any
351debfc3dSmrg * purpose.  It is provided "as is" without express or implied warranty.
361debfc3dSmrg */
371debfc3dSmrg
381debfc3dSmrg/** @file include/bitset
391debfc3dSmrg *  This is a Standard C++ Library header.
401debfc3dSmrg */
411debfc3dSmrg
421debfc3dSmrg#ifndef _GLIBCXX_BITSET
431debfc3dSmrg#define _GLIBCXX_BITSET 1
441debfc3dSmrg
451debfc3dSmrg#pragma GCC system_header
461debfc3dSmrg
471debfc3dSmrg#include <string>
481debfc3dSmrg#include <bits/functexcept.h>   // For invalid_argument, out_of_range,
491debfc3dSmrg                                // overflow_error
501debfc3dSmrg#include <iosfwd>
511debfc3dSmrg#include <bits/cxxabi_forced.h>
521debfc3dSmrg
53a2dc1f3fSmrg#if __cplusplus >= 201103L
54a2dc1f3fSmrg# include <bits/functional_hash.h>
55a2dc1f3fSmrg#endif
56a2dc1f3fSmrg
571debfc3dSmrg#define _GLIBCXX_BITSET_BITS_PER_WORD  (__CHAR_BIT__ * __SIZEOF_LONG__)
581debfc3dSmrg#define _GLIBCXX_BITSET_WORDS(__n) \
591debfc3dSmrg  ((__n) / _GLIBCXX_BITSET_BITS_PER_WORD + \
601debfc3dSmrg   ((__n) % _GLIBCXX_BITSET_BITS_PER_WORD == 0 ? 0 : 1))
611debfc3dSmrg
621debfc3dSmrg#define _GLIBCXX_BITSET_BITS_PER_ULL (__CHAR_BIT__ * __SIZEOF_LONG_LONG__)
631debfc3dSmrg
641debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default)
651debfc3dSmrg{
661debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
671debfc3dSmrg
681debfc3dSmrg  /**
691debfc3dSmrg   *  Base class, general case.  It is a class invariant that _Nw will be
701debfc3dSmrg   *  nonnegative.
711debfc3dSmrg   *
721debfc3dSmrg   *  See documentation for bitset.
731debfc3dSmrg  */
741debfc3dSmrg  template<size_t _Nw>
751debfc3dSmrg    struct _Base_bitset
761debfc3dSmrg    {
771debfc3dSmrg      typedef unsigned long _WordT;
781debfc3dSmrg
791debfc3dSmrg      /// 0 is the least significant word.
801debfc3dSmrg      _WordT 		_M_w[_Nw];
811debfc3dSmrg
821debfc3dSmrg      _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
831debfc3dSmrg      : _M_w() { }
841debfc3dSmrg
851debfc3dSmrg#if __cplusplus >= 201103L
861debfc3dSmrg      constexpr _Base_bitset(unsigned long long __val) noexcept
871debfc3dSmrg      : _M_w{ _WordT(__val)
881debfc3dSmrg#if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__
891debfc3dSmrg	       , _WordT(__val >> _GLIBCXX_BITSET_BITS_PER_WORD)
901debfc3dSmrg#endif
911debfc3dSmrg       } { }
921debfc3dSmrg#else
931debfc3dSmrg      _Base_bitset(unsigned long __val)
941debfc3dSmrg      : _M_w()
951debfc3dSmrg      { _M_w[0] = __val; }
961debfc3dSmrg#endif
971debfc3dSmrg
981debfc3dSmrg      static _GLIBCXX_CONSTEXPR size_t
991debfc3dSmrg      _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
1001debfc3dSmrg      { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
1011debfc3dSmrg
1021debfc3dSmrg      static _GLIBCXX_CONSTEXPR size_t
1031debfc3dSmrg      _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
1041debfc3dSmrg      { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
1051debfc3dSmrg
1061debfc3dSmrg      static _GLIBCXX_CONSTEXPR size_t
1071debfc3dSmrg      _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
1081debfc3dSmrg      { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
1091debfc3dSmrg
1101debfc3dSmrg      static _GLIBCXX_CONSTEXPR _WordT
1111debfc3dSmrg      _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
1121debfc3dSmrg      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
1131debfc3dSmrg
1141debfc3dSmrg      _WordT&
1151debfc3dSmrg      _M_getword(size_t __pos) _GLIBCXX_NOEXCEPT
1161debfc3dSmrg      { return _M_w[_S_whichword(__pos)]; }
1171debfc3dSmrg
1181debfc3dSmrg      _GLIBCXX_CONSTEXPR _WordT
1191debfc3dSmrg      _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT
1201debfc3dSmrg      { return _M_w[_S_whichword(__pos)]; }
1211debfc3dSmrg
1221debfc3dSmrg#if __cplusplus >= 201103L
1231debfc3dSmrg      const _WordT*
1241debfc3dSmrg      _M_getdata() const noexcept
1251debfc3dSmrg      { return _M_w; }
1261debfc3dSmrg#endif
1271debfc3dSmrg
1281debfc3dSmrg      _WordT&
1291debfc3dSmrg      _M_hiword() _GLIBCXX_NOEXCEPT
1301debfc3dSmrg      { return _M_w[_Nw - 1]; }
1311debfc3dSmrg
1321debfc3dSmrg      _GLIBCXX_CONSTEXPR _WordT
1331debfc3dSmrg      _M_hiword() const _GLIBCXX_NOEXCEPT
1341debfc3dSmrg      { return _M_w[_Nw - 1]; }
1351debfc3dSmrg
1361debfc3dSmrg      void
1371debfc3dSmrg      _M_do_and(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
1381debfc3dSmrg      {
1391debfc3dSmrg	for (size_t __i = 0; __i < _Nw; __i++)
1401debfc3dSmrg	  _M_w[__i] &= __x._M_w[__i];
1411debfc3dSmrg      }
1421debfc3dSmrg
1431debfc3dSmrg      void
1441debfc3dSmrg      _M_do_or(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
1451debfc3dSmrg      {
1461debfc3dSmrg	for (size_t __i = 0; __i < _Nw; __i++)
1471debfc3dSmrg	  _M_w[__i] |= __x._M_w[__i];
1481debfc3dSmrg      }
1491debfc3dSmrg
1501debfc3dSmrg      void
1511debfc3dSmrg      _M_do_xor(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
1521debfc3dSmrg      {
1531debfc3dSmrg	for (size_t __i = 0; __i < _Nw; __i++)
1541debfc3dSmrg	  _M_w[__i] ^= __x._M_w[__i];
1551debfc3dSmrg      }
1561debfc3dSmrg
1571debfc3dSmrg      void
1581debfc3dSmrg      _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT;
1591debfc3dSmrg
1601debfc3dSmrg      void
1611debfc3dSmrg      _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT;
1621debfc3dSmrg
1631debfc3dSmrg      void
1641debfc3dSmrg      _M_do_flip() _GLIBCXX_NOEXCEPT
1651debfc3dSmrg      {
1661debfc3dSmrg	for (size_t __i = 0; __i < _Nw; __i++)
1671debfc3dSmrg	  _M_w[__i] = ~_M_w[__i];
1681debfc3dSmrg      }
1691debfc3dSmrg
1701debfc3dSmrg      void
1711debfc3dSmrg      _M_do_set() _GLIBCXX_NOEXCEPT
1721debfc3dSmrg      {
1731debfc3dSmrg	for (size_t __i = 0; __i < _Nw; __i++)
1741debfc3dSmrg	  _M_w[__i] = ~static_cast<_WordT>(0);
1751debfc3dSmrg      }
1761debfc3dSmrg
1771debfc3dSmrg      void
1781debfc3dSmrg      _M_do_reset() _GLIBCXX_NOEXCEPT
1791debfc3dSmrg      { __builtin_memset(_M_w, 0, _Nw * sizeof(_WordT)); }
1801debfc3dSmrg
1811debfc3dSmrg      bool
1821debfc3dSmrg      _M_is_equal(const _Base_bitset<_Nw>& __x) const _GLIBCXX_NOEXCEPT
1831debfc3dSmrg      {
1841debfc3dSmrg	for (size_t __i = 0; __i < _Nw; ++__i)
1851debfc3dSmrg	  if (_M_w[__i] != __x._M_w[__i])
1861debfc3dSmrg	    return false;
1871debfc3dSmrg	return true;
1881debfc3dSmrg      }
1891debfc3dSmrg
1901debfc3dSmrg      template<size_t _Nb>
1911debfc3dSmrg        bool
1921debfc3dSmrg        _M_are_all() const _GLIBCXX_NOEXCEPT
1931debfc3dSmrg        {
1941debfc3dSmrg	  for (size_t __i = 0; __i < _Nw - 1; __i++)
1951debfc3dSmrg	    if (_M_w[__i] != ~static_cast<_WordT>(0))
1961debfc3dSmrg	      return false;
1971debfc3dSmrg	  return _M_hiword() == (~static_cast<_WordT>(0)
1981debfc3dSmrg				 >> (_Nw * _GLIBCXX_BITSET_BITS_PER_WORD
1991debfc3dSmrg				     - _Nb));
2001debfc3dSmrg	}
2011debfc3dSmrg
2021debfc3dSmrg      bool
2031debfc3dSmrg      _M_is_any() const _GLIBCXX_NOEXCEPT
2041debfc3dSmrg      {
2051debfc3dSmrg	for (size_t __i = 0; __i < _Nw; __i++)
2061debfc3dSmrg	  if (_M_w[__i] != static_cast<_WordT>(0))
2071debfc3dSmrg	    return true;
2081debfc3dSmrg	return false;
2091debfc3dSmrg      }
2101debfc3dSmrg
2111debfc3dSmrg      size_t
2121debfc3dSmrg      _M_do_count() const _GLIBCXX_NOEXCEPT
2131debfc3dSmrg      {
2141debfc3dSmrg	size_t __result = 0;
2151debfc3dSmrg	for (size_t __i = 0; __i < _Nw; __i++)
2161debfc3dSmrg	  __result += __builtin_popcountl(_M_w[__i]);
2171debfc3dSmrg	return __result;
2181debfc3dSmrg      }
2191debfc3dSmrg
2201debfc3dSmrg      unsigned long
2211debfc3dSmrg      _M_do_to_ulong() const;
2221debfc3dSmrg
2231debfc3dSmrg#if __cplusplus >= 201103L
2241debfc3dSmrg      unsigned long long
2251debfc3dSmrg      _M_do_to_ullong() const;
2261debfc3dSmrg#endif
2271debfc3dSmrg
2281debfc3dSmrg      // find first "on" bit
2291debfc3dSmrg      size_t
2301debfc3dSmrg      _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT;
2311debfc3dSmrg
2321debfc3dSmrg      // find the next "on" bit that follows "prev"
2331debfc3dSmrg      size_t
2341debfc3dSmrg      _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT;
2351debfc3dSmrg    };
2361debfc3dSmrg
2371debfc3dSmrg  // Definitions of non-inline functions from _Base_bitset.
2381debfc3dSmrg  template<size_t _Nw>
2391debfc3dSmrg    void
2401debfc3dSmrg    _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT
2411debfc3dSmrg    {
2421debfc3dSmrg      if (__builtin_expect(__shift != 0, 1))
2431debfc3dSmrg	{
2441debfc3dSmrg	  const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD;
2451debfc3dSmrg	  const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD;
2461debfc3dSmrg
2471debfc3dSmrg	  if (__offset == 0)
2481debfc3dSmrg	    for (size_t __n = _Nw - 1; __n >= __wshift; --__n)
2491debfc3dSmrg	      _M_w[__n] = _M_w[__n - __wshift];
2501debfc3dSmrg	  else
2511debfc3dSmrg	    {
2521debfc3dSmrg	      const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD
2531debfc3dSmrg					   - __offset);
2541debfc3dSmrg	      for (size_t __n = _Nw - 1; __n > __wshift; --__n)
2551debfc3dSmrg		_M_w[__n] = ((_M_w[__n - __wshift] << __offset)
2561debfc3dSmrg			     | (_M_w[__n - __wshift - 1] >> __sub_offset));
2571debfc3dSmrg	      _M_w[__wshift] = _M_w[0] << __offset;
2581debfc3dSmrg	    }
2591debfc3dSmrg
2601debfc3dSmrg	  std::fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0));
2611debfc3dSmrg	}
2621debfc3dSmrg    }
2631debfc3dSmrg
2641debfc3dSmrg  template<size_t _Nw>
2651debfc3dSmrg    void
2661debfc3dSmrg    _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT
2671debfc3dSmrg    {
2681debfc3dSmrg      if (__builtin_expect(__shift != 0, 1))
2691debfc3dSmrg	{
2701debfc3dSmrg	  const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD;
2711debfc3dSmrg	  const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD;
2721debfc3dSmrg	  const size_t __limit = _Nw - __wshift - 1;
2731debfc3dSmrg
2741debfc3dSmrg	  if (__offset == 0)
2751debfc3dSmrg	    for (size_t __n = 0; __n <= __limit; ++__n)
2761debfc3dSmrg	      _M_w[__n] = _M_w[__n + __wshift];
2771debfc3dSmrg	  else
2781debfc3dSmrg	    {
2791debfc3dSmrg	      const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD
2801debfc3dSmrg					   - __offset);
2811debfc3dSmrg	      for (size_t __n = 0; __n < __limit; ++__n)
2821debfc3dSmrg		_M_w[__n] = ((_M_w[__n + __wshift] >> __offset)
2831debfc3dSmrg			     | (_M_w[__n + __wshift + 1] << __sub_offset));
2841debfc3dSmrg	      _M_w[__limit] = _M_w[_Nw-1] >> __offset;
2851debfc3dSmrg	    }
2861debfc3dSmrg
2871debfc3dSmrg	  std::fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0));
2881debfc3dSmrg	}
2891debfc3dSmrg    }
2901debfc3dSmrg
2911debfc3dSmrg  template<size_t _Nw>
2921debfc3dSmrg    unsigned long
2931debfc3dSmrg    _Base_bitset<_Nw>::_M_do_to_ulong() const
2941debfc3dSmrg    {
2951debfc3dSmrg      for (size_t __i = 1; __i < _Nw; ++__i)
2961debfc3dSmrg	if (_M_w[__i])
2971debfc3dSmrg	  __throw_overflow_error(__N("_Base_bitset::_M_do_to_ulong"));
2981debfc3dSmrg      return _M_w[0];
2991debfc3dSmrg    }
3001debfc3dSmrg
3011debfc3dSmrg#if __cplusplus >= 201103L
3021debfc3dSmrg  template<size_t _Nw>
3031debfc3dSmrg    unsigned long long
3041debfc3dSmrg    _Base_bitset<_Nw>::_M_do_to_ullong() const
3051debfc3dSmrg    {
3061debfc3dSmrg      const bool __dw = sizeof(unsigned long long) > sizeof(unsigned long);
3071debfc3dSmrg      for (size_t __i = 1 + __dw; __i < _Nw; ++__i)
3081debfc3dSmrg	if (_M_w[__i])
3091debfc3dSmrg	  __throw_overflow_error(__N("_Base_bitset::_M_do_to_ullong"));
3101debfc3dSmrg
3111debfc3dSmrg      if (__dw)
3121debfc3dSmrg	return _M_w[0] + (static_cast<unsigned long long>(_M_w[1])
3131debfc3dSmrg			  << _GLIBCXX_BITSET_BITS_PER_WORD);
3141debfc3dSmrg      return _M_w[0];
3151debfc3dSmrg    }
3161debfc3dSmrg#endif
3171debfc3dSmrg
3181debfc3dSmrg  template<size_t _Nw>
3191debfc3dSmrg    size_t
3201debfc3dSmrg    _Base_bitset<_Nw>::
3211debfc3dSmrg    _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT
3221debfc3dSmrg    {
3231debfc3dSmrg      for (size_t __i = 0; __i < _Nw; __i++)
3241debfc3dSmrg	{
3251debfc3dSmrg	  _WordT __thisword = _M_w[__i];
3261debfc3dSmrg	  if (__thisword != static_cast<_WordT>(0))
3271debfc3dSmrg	    return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
3281debfc3dSmrg		    + __builtin_ctzl(__thisword));
3291debfc3dSmrg	}
3301debfc3dSmrg      // not found, so return an indication of failure.
3311debfc3dSmrg      return __not_found;
3321debfc3dSmrg    }
3331debfc3dSmrg
3341debfc3dSmrg  template<size_t _Nw>
3351debfc3dSmrg    size_t
3361debfc3dSmrg    _Base_bitset<_Nw>::
3371debfc3dSmrg    _M_do_find_next(size_t __prev, size_t __not_found) const _GLIBCXX_NOEXCEPT
3381debfc3dSmrg    {
3391debfc3dSmrg      // make bound inclusive
3401debfc3dSmrg      ++__prev;
3411debfc3dSmrg
3421debfc3dSmrg      // check out of bounds
3431debfc3dSmrg      if (__prev >= _Nw * _GLIBCXX_BITSET_BITS_PER_WORD)
3441debfc3dSmrg	return __not_found;
3451debfc3dSmrg
3461debfc3dSmrg      // search first word
3471debfc3dSmrg      size_t __i = _S_whichword(__prev);
3481debfc3dSmrg      _WordT __thisword = _M_w[__i];
3491debfc3dSmrg
3501debfc3dSmrg      // mask off bits below bound
3511debfc3dSmrg      __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev);
3521debfc3dSmrg
3531debfc3dSmrg      if (__thisword != static_cast<_WordT>(0))
3541debfc3dSmrg	return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
3551debfc3dSmrg		+ __builtin_ctzl(__thisword));
3561debfc3dSmrg
3571debfc3dSmrg      // check subsequent words
3581debfc3dSmrg      __i++;
3591debfc3dSmrg      for (; __i < _Nw; __i++)
3601debfc3dSmrg	{
3611debfc3dSmrg	  __thisword = _M_w[__i];
3621debfc3dSmrg	  if (__thisword != static_cast<_WordT>(0))
3631debfc3dSmrg	    return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
3641debfc3dSmrg		    + __builtin_ctzl(__thisword));
3651debfc3dSmrg	}
3661debfc3dSmrg      // not found, so return an indication of failure.
3671debfc3dSmrg      return __not_found;
3681debfc3dSmrg    } // end _M_do_find_next
3691debfc3dSmrg
3701debfc3dSmrg  /**
3711debfc3dSmrg   *  Base class, specialization for a single word.
3721debfc3dSmrg   *
3731debfc3dSmrg   *  See documentation for bitset.
3741debfc3dSmrg  */
3751debfc3dSmrg  template<>
3761debfc3dSmrg    struct _Base_bitset<1>
3771debfc3dSmrg    {
3781debfc3dSmrg      typedef unsigned long _WordT;
3791debfc3dSmrg      _WordT _M_w;
3801debfc3dSmrg
3811debfc3dSmrg      _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
3821debfc3dSmrg      : _M_w(0)
3831debfc3dSmrg      { }
3841debfc3dSmrg
3851debfc3dSmrg#if __cplusplus >= 201103L
3861debfc3dSmrg      constexpr _Base_bitset(unsigned long long __val) noexcept
3871debfc3dSmrg#else
3881debfc3dSmrg      _Base_bitset(unsigned long __val)
3891debfc3dSmrg#endif
3901debfc3dSmrg      : _M_w(__val)
3911debfc3dSmrg      { }
3921debfc3dSmrg
3931debfc3dSmrg      static _GLIBCXX_CONSTEXPR size_t
3941debfc3dSmrg      _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
3951debfc3dSmrg      { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
3961debfc3dSmrg
3971debfc3dSmrg      static _GLIBCXX_CONSTEXPR size_t
3981debfc3dSmrg      _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
3991debfc3dSmrg      { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
4001debfc3dSmrg
4011debfc3dSmrg      static _GLIBCXX_CONSTEXPR size_t
4021debfc3dSmrg      _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
4031debfc3dSmrg      {  return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
4041debfc3dSmrg
4051debfc3dSmrg      static _GLIBCXX_CONSTEXPR _WordT
4061debfc3dSmrg      _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
4071debfc3dSmrg      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
4081debfc3dSmrg
4091debfc3dSmrg      _WordT&
4101debfc3dSmrg      _M_getword(size_t) _GLIBCXX_NOEXCEPT
4111debfc3dSmrg      { return _M_w; }
4121debfc3dSmrg
4131debfc3dSmrg      _GLIBCXX_CONSTEXPR _WordT
4141debfc3dSmrg      _M_getword(size_t) const _GLIBCXX_NOEXCEPT
4151debfc3dSmrg      { return _M_w; }
4161debfc3dSmrg
4171debfc3dSmrg#if __cplusplus >= 201103L
4181debfc3dSmrg      const _WordT*
4191debfc3dSmrg      _M_getdata() const noexcept
4201debfc3dSmrg      { return &_M_w; }
4211debfc3dSmrg#endif
4221debfc3dSmrg
4231debfc3dSmrg      _WordT&
4241debfc3dSmrg      _M_hiword() _GLIBCXX_NOEXCEPT
4251debfc3dSmrg      { return _M_w; }
4261debfc3dSmrg
4271debfc3dSmrg      _GLIBCXX_CONSTEXPR _WordT
4281debfc3dSmrg      _M_hiword() const _GLIBCXX_NOEXCEPT
4291debfc3dSmrg      { return _M_w; }
4301debfc3dSmrg
4311debfc3dSmrg      void
4321debfc3dSmrg      _M_do_and(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
4331debfc3dSmrg      { _M_w &= __x._M_w; }
4341debfc3dSmrg
4351debfc3dSmrg      void
4361debfc3dSmrg      _M_do_or(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
4371debfc3dSmrg      { _M_w |= __x._M_w; }
4381debfc3dSmrg
4391debfc3dSmrg      void
4401debfc3dSmrg      _M_do_xor(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
4411debfc3dSmrg      { _M_w ^= __x._M_w; }
4421debfc3dSmrg
4431debfc3dSmrg      void
4441debfc3dSmrg      _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT
4451debfc3dSmrg      { _M_w <<= __shift; }
4461debfc3dSmrg
4471debfc3dSmrg      void
4481debfc3dSmrg      _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT
4491debfc3dSmrg      { _M_w >>= __shift; }
4501debfc3dSmrg
4511debfc3dSmrg      void
4521debfc3dSmrg      _M_do_flip() _GLIBCXX_NOEXCEPT
4531debfc3dSmrg      { _M_w = ~_M_w; }
4541debfc3dSmrg
4551debfc3dSmrg      void
4561debfc3dSmrg      _M_do_set() _GLIBCXX_NOEXCEPT
4571debfc3dSmrg      { _M_w = ~static_cast<_WordT>(0); }
4581debfc3dSmrg
4591debfc3dSmrg      void
4601debfc3dSmrg      _M_do_reset() _GLIBCXX_NOEXCEPT
4611debfc3dSmrg      { _M_w = 0; }
4621debfc3dSmrg
4631debfc3dSmrg      bool
4641debfc3dSmrg      _M_is_equal(const _Base_bitset<1>& __x) const _GLIBCXX_NOEXCEPT
4651debfc3dSmrg      { return _M_w == __x._M_w; }
4661debfc3dSmrg
4671debfc3dSmrg      template<size_t _Nb>
4681debfc3dSmrg        bool
4691debfc3dSmrg        _M_are_all() const _GLIBCXX_NOEXCEPT
4701debfc3dSmrg        { return _M_w == (~static_cast<_WordT>(0)
4711debfc3dSmrg			  >> (_GLIBCXX_BITSET_BITS_PER_WORD - _Nb)); }
4721debfc3dSmrg
4731debfc3dSmrg      bool
4741debfc3dSmrg      _M_is_any() const _GLIBCXX_NOEXCEPT
4751debfc3dSmrg      { return _M_w != 0; }
4761debfc3dSmrg
4771debfc3dSmrg      size_t
4781debfc3dSmrg      _M_do_count() const _GLIBCXX_NOEXCEPT
4791debfc3dSmrg      { return __builtin_popcountl(_M_w); }
4801debfc3dSmrg
4811debfc3dSmrg      unsigned long
4821debfc3dSmrg      _M_do_to_ulong() const _GLIBCXX_NOEXCEPT
4831debfc3dSmrg      { return _M_w; }
4841debfc3dSmrg
4851debfc3dSmrg#if __cplusplus >= 201103L
4861debfc3dSmrg      unsigned long long
4871debfc3dSmrg      _M_do_to_ullong() const noexcept
4881debfc3dSmrg      { return _M_w; }
4891debfc3dSmrg#endif
4901debfc3dSmrg
4911debfc3dSmrg      size_t
4921debfc3dSmrg      _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT
4931debfc3dSmrg      {
4941debfc3dSmrg        if (_M_w != 0)
4951debfc3dSmrg          return __builtin_ctzl(_M_w);
4961debfc3dSmrg        else
4971debfc3dSmrg          return __not_found;
4981debfc3dSmrg      }
4991debfc3dSmrg
5001debfc3dSmrg      // find the next "on" bit that follows "prev"
5011debfc3dSmrg      size_t
5021debfc3dSmrg      _M_do_find_next(size_t __prev, size_t __not_found) const
5031debfc3dSmrg	_GLIBCXX_NOEXCEPT
5041debfc3dSmrg      {
5051debfc3dSmrg	++__prev;
5061debfc3dSmrg	if (__prev >= ((size_t) _GLIBCXX_BITSET_BITS_PER_WORD))
5071debfc3dSmrg	  return __not_found;
5081debfc3dSmrg
5091debfc3dSmrg	_WordT __x = _M_w >> __prev;
5101debfc3dSmrg	if (__x != 0)
5111debfc3dSmrg	  return __builtin_ctzl(__x) + __prev;
5121debfc3dSmrg	else
5131debfc3dSmrg	  return __not_found;
5141debfc3dSmrg      }
5151debfc3dSmrg    };
5161debfc3dSmrg
5171debfc3dSmrg  /**
5181debfc3dSmrg   *  Base class, specialization for no storage (zero-length %bitset).
5191debfc3dSmrg   *
5201debfc3dSmrg   *  See documentation for bitset.
5211debfc3dSmrg  */
5221debfc3dSmrg  template<>
5231debfc3dSmrg    struct _Base_bitset<0>
5241debfc3dSmrg    {
5251debfc3dSmrg      typedef unsigned long _WordT;
5261debfc3dSmrg
5271debfc3dSmrg      _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
5281debfc3dSmrg      { }
5291debfc3dSmrg
5301debfc3dSmrg#if __cplusplus >= 201103L
5311debfc3dSmrg      constexpr _Base_bitset(unsigned long long) noexcept
5321debfc3dSmrg#else
5331debfc3dSmrg      _Base_bitset(unsigned long)
5341debfc3dSmrg#endif
5351debfc3dSmrg      { }
5361debfc3dSmrg
5371debfc3dSmrg      static _GLIBCXX_CONSTEXPR size_t
5381debfc3dSmrg      _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
5391debfc3dSmrg      { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
5401debfc3dSmrg
5411debfc3dSmrg      static _GLIBCXX_CONSTEXPR size_t
5421debfc3dSmrg      _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
5431debfc3dSmrg      { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
5441debfc3dSmrg
5451debfc3dSmrg      static _GLIBCXX_CONSTEXPR size_t
5461debfc3dSmrg      _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
5471debfc3dSmrg      {  return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
5481debfc3dSmrg
5491debfc3dSmrg      static _GLIBCXX_CONSTEXPR _WordT
5501debfc3dSmrg      _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
5511debfc3dSmrg      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
5521debfc3dSmrg
5531debfc3dSmrg      // This would normally give access to the data.  The bounds-checking
5541debfc3dSmrg      // in the bitset class will prevent the user from getting this far,
5551debfc3dSmrg      // but (1) it must still return an lvalue to compile, and (2) the
5561debfc3dSmrg      // user might call _Unchecked_set directly, in which case this /needs/
5571debfc3dSmrg      // to fail.  Let's not penalize zero-length users unless they actually
5581debfc3dSmrg      // make an unchecked call; all the memory ugliness is therefore
5591debfc3dSmrg      // localized to this single should-never-get-this-far function.
5601debfc3dSmrg      _WordT&
5611debfc3dSmrg      _M_getword(size_t) _GLIBCXX_NOEXCEPT
5621debfc3dSmrg      {
5631debfc3dSmrg	__throw_out_of_range(__N("_Base_bitset::_M_getword"));
5641debfc3dSmrg	return *new _WordT;
5651debfc3dSmrg      }
5661debfc3dSmrg
5671debfc3dSmrg      _GLIBCXX_CONSTEXPR _WordT
568a2dc1f3fSmrg      _M_getword(size_t) const _GLIBCXX_NOEXCEPT
5691debfc3dSmrg      { return 0; }
5701debfc3dSmrg
5711debfc3dSmrg      _GLIBCXX_CONSTEXPR _WordT
5721debfc3dSmrg      _M_hiword() const _GLIBCXX_NOEXCEPT
5731debfc3dSmrg      { return 0; }
5741debfc3dSmrg
5751debfc3dSmrg      void
5761debfc3dSmrg      _M_do_and(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
5771debfc3dSmrg      { }
5781debfc3dSmrg
5791debfc3dSmrg      void
5801debfc3dSmrg      _M_do_or(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
5811debfc3dSmrg      { }
5821debfc3dSmrg
5831debfc3dSmrg      void
5841debfc3dSmrg      _M_do_xor(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
5851debfc3dSmrg      { }
5861debfc3dSmrg
5871debfc3dSmrg      void
5881debfc3dSmrg      _M_do_left_shift(size_t) _GLIBCXX_NOEXCEPT
5891debfc3dSmrg      { }
5901debfc3dSmrg
5911debfc3dSmrg      void
5921debfc3dSmrg      _M_do_right_shift(size_t) _GLIBCXX_NOEXCEPT
5931debfc3dSmrg      { }
5941debfc3dSmrg
5951debfc3dSmrg      void
5961debfc3dSmrg      _M_do_flip() _GLIBCXX_NOEXCEPT
5971debfc3dSmrg      { }
5981debfc3dSmrg
5991debfc3dSmrg      void
6001debfc3dSmrg      _M_do_set() _GLIBCXX_NOEXCEPT
6011debfc3dSmrg      { }
6021debfc3dSmrg
6031debfc3dSmrg      void
6041debfc3dSmrg      _M_do_reset() _GLIBCXX_NOEXCEPT
6051debfc3dSmrg      { }
6061debfc3dSmrg
6071debfc3dSmrg      // Are all empty bitsets equal to each other?  Are they equal to
6081debfc3dSmrg      // themselves?  How to compare a thing which has no state?  What is
6091debfc3dSmrg      // the sound of one zero-length bitset clapping?
6101debfc3dSmrg      bool
6111debfc3dSmrg      _M_is_equal(const _Base_bitset<0>&) const _GLIBCXX_NOEXCEPT
6121debfc3dSmrg      { return true; }
6131debfc3dSmrg
6141debfc3dSmrg      template<size_t _Nb>
6151debfc3dSmrg        bool
6161debfc3dSmrg        _M_are_all() const _GLIBCXX_NOEXCEPT
6171debfc3dSmrg        { return true; }
6181debfc3dSmrg
6191debfc3dSmrg      bool
6201debfc3dSmrg      _M_is_any() const _GLIBCXX_NOEXCEPT
6211debfc3dSmrg      { return false; }
6221debfc3dSmrg
6231debfc3dSmrg      size_t
6241debfc3dSmrg      _M_do_count() const _GLIBCXX_NOEXCEPT
6251debfc3dSmrg      { return 0; }
6261debfc3dSmrg
6271debfc3dSmrg      unsigned long
6281debfc3dSmrg      _M_do_to_ulong() const _GLIBCXX_NOEXCEPT
6291debfc3dSmrg      { return 0; }
6301debfc3dSmrg
6311debfc3dSmrg#if __cplusplus >= 201103L
6321debfc3dSmrg      unsigned long long
6331debfc3dSmrg      _M_do_to_ullong() const noexcept
6341debfc3dSmrg      { return 0; }
6351debfc3dSmrg#endif
6361debfc3dSmrg
6371debfc3dSmrg      // Normally "not found" is the size, but that could also be
6381debfc3dSmrg      // misinterpreted as an index in this corner case.  Oh well.
6391debfc3dSmrg      size_t
6401debfc3dSmrg      _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT
6411debfc3dSmrg      { return 0; }
6421debfc3dSmrg
6431debfc3dSmrg      size_t
6441debfc3dSmrg      _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT
6451debfc3dSmrg      { return 0; }
6461debfc3dSmrg    };
6471debfc3dSmrg
6481debfc3dSmrg
6491debfc3dSmrg  // Helper class to zero out the unused high-order bits in the highest word.
6501debfc3dSmrg  template<size_t _Extrabits>
6511debfc3dSmrg    struct _Sanitize
6521debfc3dSmrg    {
6531debfc3dSmrg      typedef unsigned long _WordT;
6541debfc3dSmrg
6551debfc3dSmrg      static void
6561debfc3dSmrg      _S_do_sanitize(_WordT& __val) _GLIBCXX_NOEXCEPT
6571debfc3dSmrg      { __val &= ~((~static_cast<_WordT>(0)) << _Extrabits); }
6581debfc3dSmrg    };
6591debfc3dSmrg
6601debfc3dSmrg  template<>
6611debfc3dSmrg    struct _Sanitize<0>
6621debfc3dSmrg    {
6631debfc3dSmrg      typedef unsigned long _WordT;
6641debfc3dSmrg
6651debfc3dSmrg      static void
6661debfc3dSmrg      _S_do_sanitize(_WordT) _GLIBCXX_NOEXCEPT { }
6671debfc3dSmrg    };
6681debfc3dSmrg
6691debfc3dSmrg#if __cplusplus >= 201103L
6701debfc3dSmrg  template<size_t _Nb, bool = (_Nb < _GLIBCXX_BITSET_BITS_PER_ULL)>
6711debfc3dSmrg    struct _Sanitize_val
6721debfc3dSmrg    {
6731debfc3dSmrg      static constexpr unsigned long long
6741debfc3dSmrg      _S_do_sanitize_val(unsigned long long __val)
6751debfc3dSmrg      { return __val; }
6761debfc3dSmrg    };
6771debfc3dSmrg
6781debfc3dSmrg  template<size_t _Nb>
6791debfc3dSmrg    struct _Sanitize_val<_Nb, true>
6801debfc3dSmrg    {
6811debfc3dSmrg      static constexpr unsigned long long
6821debfc3dSmrg      _S_do_sanitize_val(unsigned long long __val)
6831debfc3dSmrg      { return __val & ~((~static_cast<unsigned long long>(0)) << _Nb); }
6841debfc3dSmrg    };
6851debfc3dSmrg#endif
6861debfc3dSmrg
6871debfc3dSmrg  /**
6881debfc3dSmrg   *  @brief The %bitset class represents a @e fixed-size sequence of bits.
6891debfc3dSmrg   *  @ingroup utilities
6901debfc3dSmrg   *
6911debfc3dSmrg   *  (Note that %bitset does @e not meet the formal requirements of a
6921debfc3dSmrg   *  <a href="tables.html#65">container</a>.  Mainly, it lacks iterators.)
6931debfc3dSmrg   *
6941debfc3dSmrg   *  The template argument, @a Nb, may be any non-negative number,
6951debfc3dSmrg   *  specifying the number of bits (e.g., "0", "12", "1024*1024").
6961debfc3dSmrg   *
6971debfc3dSmrg   *  In the general unoptimized case, storage is allocated in word-sized
6981debfc3dSmrg   *  blocks.  Let B be the number of bits in a word, then (Nb+(B-1))/B
6991debfc3dSmrg   *  words will be used for storage.  B - Nb%B bits are unused.  (They are
7001debfc3dSmrg   *  the high-order bits in the highest word.)  It is a class invariant
7011debfc3dSmrg   *  that those unused bits are always zero.
7021debfc3dSmrg   *
7031debfc3dSmrg   *  If you think of %bitset as <em>a simple array of bits</em>, be
7041debfc3dSmrg   *  aware that your mental picture is reversed: a %bitset behaves
7051debfc3dSmrg   *  the same way as bits in integers do, with the bit at index 0 in
7061debfc3dSmrg   *  the <em>least significant / right-hand</em> position, and the bit at
7071debfc3dSmrg   *  index Nb-1 in the <em>most significant / left-hand</em> position.
7081debfc3dSmrg   *  Thus, unlike other containers, a %bitset's index <em>counts from
7091debfc3dSmrg   *  right to left</em>, to put it very loosely.
7101debfc3dSmrg   *
7111debfc3dSmrg   *  This behavior is preserved when translating to and from strings.  For
7121debfc3dSmrg   *  example, the first line of the following program probably prints
7131debfc3dSmrg   *  <em>b(&apos;a&apos;) is 0001100001</em> on a modern ASCII system.
7141debfc3dSmrg   *
7151debfc3dSmrg   *  @code
7161debfc3dSmrg   *     #include <bitset>
7171debfc3dSmrg   *     #include <iostream>
7181debfc3dSmrg   *     #include <sstream>
7191debfc3dSmrg   *
7201debfc3dSmrg   *     using namespace std;
7211debfc3dSmrg   *
7221debfc3dSmrg   *     int main()
7231debfc3dSmrg   *     {
7241debfc3dSmrg   *         long         a = 'a';
7251debfc3dSmrg   *         bitset<10>   b(a);
7261debfc3dSmrg   *
7271debfc3dSmrg   *         cout << "b('a') is " << b << endl;
7281debfc3dSmrg   *
7291debfc3dSmrg   *         ostringstream s;
7301debfc3dSmrg   *         s << b;
7311debfc3dSmrg   *         string  str = s.str();
7321debfc3dSmrg   *         cout << "index 3 in the string is " << str[3] << " but\n"
7331debfc3dSmrg   *              << "index 3 in the bitset is " << b[3] << endl;
7341debfc3dSmrg   *     }
7351debfc3dSmrg   *  @endcode
7361debfc3dSmrg   *
7371debfc3dSmrg   *  Also see:
7381debfc3dSmrg   *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_containers.html
7391debfc3dSmrg   *  for a description of extensions.
7401debfc3dSmrg   *
7411debfc3dSmrg   *  Most of the actual code isn't contained in %bitset<> itself, but in the
7421debfc3dSmrg   *  base class _Base_bitset.  The base class works with whole words, not with
7431debfc3dSmrg   *  individual bits.  This allows us to specialize _Base_bitset for the
7441debfc3dSmrg   *  important special case where the %bitset is only a single word.
7451debfc3dSmrg   *
7461debfc3dSmrg   *  Extra confusion can result due to the fact that the storage for
7471debfc3dSmrg   *  _Base_bitset @e is a regular array, and is indexed as such.  This is
7481debfc3dSmrg   *  carefully encapsulated.
7491debfc3dSmrg  */
7501debfc3dSmrg  template<size_t _Nb>
7511debfc3dSmrg    class bitset
7521debfc3dSmrg    : private _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)>
7531debfc3dSmrg    {
7541debfc3dSmrg    private:
7551debfc3dSmrg      typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base;
7561debfc3dSmrg      typedef unsigned long _WordT;
7571debfc3dSmrg
7581debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
7591debfc3dSmrg      void
7601debfc3dSmrg      _M_check_initial_position(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
7611debfc3dSmrg				size_t __position) const
7621debfc3dSmrg      {
7631debfc3dSmrg	if (__position > __s.size())
7641debfc3dSmrg	  __throw_out_of_range_fmt(__N("bitset::bitset: __position "
7651debfc3dSmrg				       "(which is %zu) > __s.size() "
7661debfc3dSmrg				       "(which is %zu)"),
7671debfc3dSmrg				   __position, __s.size());
7681debfc3dSmrg      }
7691debfc3dSmrg
7701debfc3dSmrg      void _M_check(size_t __position, const char *__s) const
7711debfc3dSmrg      {
7721debfc3dSmrg	if (__position >= _Nb)
7731debfc3dSmrg	  __throw_out_of_range_fmt(__N("%s: __position (which is %zu) "
7741debfc3dSmrg				       ">= _Nb (which is %zu)"),
7751debfc3dSmrg				   __s, __position, _Nb);
7761debfc3dSmrg      }
7771debfc3dSmrg
7781debfc3dSmrg      void
7791debfc3dSmrg      _M_do_sanitize() _GLIBCXX_NOEXCEPT
7801debfc3dSmrg      {
7811debfc3dSmrg	typedef _Sanitize<_Nb % _GLIBCXX_BITSET_BITS_PER_WORD> __sanitize_type;
7821debfc3dSmrg	__sanitize_type::_S_do_sanitize(this->_M_hiword());
7831debfc3dSmrg      }
7841debfc3dSmrg
7851debfc3dSmrg#if __cplusplus >= 201103L
786a2dc1f3fSmrg      friend struct std::hash<bitset>;
7871debfc3dSmrg#endif
7881debfc3dSmrg
7891debfc3dSmrg    public:
7901debfc3dSmrg      /**
7911debfc3dSmrg       *  This encapsulates the concept of a single bit.  An instance of this
7921debfc3dSmrg       *  class is a proxy for an actual bit; this way the individual bit
7931debfc3dSmrg       *  operations are done as faster word-size bitwise instructions.
7941debfc3dSmrg       *
7951debfc3dSmrg       *  Most users will never need to use this class directly; conversions
7961debfc3dSmrg       *  to and from bool are automatic and should be transparent.  Overloaded
7971debfc3dSmrg       *  operators help to preserve the illusion.
7981debfc3dSmrg       *
7991debfc3dSmrg       *  (On a typical system, this <em>bit %reference</em> is 64
8001debfc3dSmrg       *  times the size of an actual bit.  Ha.)
8011debfc3dSmrg       */
8021debfc3dSmrg      class reference
8031debfc3dSmrg      {
8041debfc3dSmrg	friend class bitset;
8051debfc3dSmrg
8061debfc3dSmrg	_WordT*	_M_wp;
8071debfc3dSmrg	size_t 	_M_bpos;
8081debfc3dSmrg
8091debfc3dSmrg	// left undefined
8101debfc3dSmrg	reference();
8111debfc3dSmrg
8121debfc3dSmrg      public:
8131debfc3dSmrg	reference(bitset& __b, size_t __pos) _GLIBCXX_NOEXCEPT
8141debfc3dSmrg	{
8151debfc3dSmrg	  _M_wp = &__b._M_getword(__pos);
8161debfc3dSmrg	  _M_bpos = _Base::_S_whichbit(__pos);
8171debfc3dSmrg	}
8181debfc3dSmrg
819c0a68be4Smrg#if __cplusplus >= 201103L
820c0a68be4Smrg	reference(const reference&) = default;
821c0a68be4Smrg#endif
822c0a68be4Smrg
8231debfc3dSmrg	~reference() _GLIBCXX_NOEXCEPT
8241debfc3dSmrg	{ }
8251debfc3dSmrg
8261debfc3dSmrg	// For b[i] = __x;
8271debfc3dSmrg	reference&
8281debfc3dSmrg	operator=(bool __x) _GLIBCXX_NOEXCEPT
8291debfc3dSmrg	{
8301debfc3dSmrg	  if (__x)
8311debfc3dSmrg	    *_M_wp |= _Base::_S_maskbit(_M_bpos);
8321debfc3dSmrg	  else
8331debfc3dSmrg	    *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
8341debfc3dSmrg	  return *this;
8351debfc3dSmrg	}
8361debfc3dSmrg
8371debfc3dSmrg	// For b[i] = b[__j];
8381debfc3dSmrg	reference&
8391debfc3dSmrg	operator=(const reference& __j) _GLIBCXX_NOEXCEPT
8401debfc3dSmrg	{
8411debfc3dSmrg	  if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos)))
8421debfc3dSmrg	    *_M_wp |= _Base::_S_maskbit(_M_bpos);
8431debfc3dSmrg	  else
8441debfc3dSmrg	    *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
8451debfc3dSmrg	  return *this;
8461debfc3dSmrg	}
8471debfc3dSmrg
8481debfc3dSmrg	// Flips the bit
8491debfc3dSmrg	bool
8501debfc3dSmrg	operator~() const _GLIBCXX_NOEXCEPT
8511debfc3dSmrg	{ return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; }
8521debfc3dSmrg
8531debfc3dSmrg	// For __x = b[i];
8541debfc3dSmrg	operator bool() const _GLIBCXX_NOEXCEPT
8551debfc3dSmrg	{ return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; }
8561debfc3dSmrg
8571debfc3dSmrg	// For b[i].flip();
8581debfc3dSmrg	reference&
8591debfc3dSmrg	flip() _GLIBCXX_NOEXCEPT
8601debfc3dSmrg	{
8611debfc3dSmrg	  *_M_wp ^= _Base::_S_maskbit(_M_bpos);
8621debfc3dSmrg	  return *this;
8631debfc3dSmrg	}
8641debfc3dSmrg      };
8651debfc3dSmrg      friend class reference;
8661debfc3dSmrg
8671debfc3dSmrg      // 23.3.5.1 constructors:
8681debfc3dSmrg      /// All bits set to zero.
8691debfc3dSmrg      _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT
8701debfc3dSmrg      { }
8711debfc3dSmrg
8721debfc3dSmrg      /// Initial bits bitwise-copied from a single word (others set to zero).
8731debfc3dSmrg#if __cplusplus >= 201103L
8741debfc3dSmrg      constexpr bitset(unsigned long long __val) noexcept
8751debfc3dSmrg      : _Base(_Sanitize_val<_Nb>::_S_do_sanitize_val(__val)) { }
8761debfc3dSmrg#else
8771debfc3dSmrg      bitset(unsigned long __val)
8781debfc3dSmrg      : _Base(__val)
8791debfc3dSmrg      { _M_do_sanitize(); }
8801debfc3dSmrg#endif
8811debfc3dSmrg
8821debfc3dSmrg      /**
8831debfc3dSmrg       *  Use a subset of a string.
8841debfc3dSmrg       *  @param  __s  A string of @a 0 and @a 1 characters.
8851debfc3dSmrg       *  @param  __position  Index of the first character in @a __s to use;
8861debfc3dSmrg       *                    defaults to zero.
8871debfc3dSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of @a __s.
8881debfc3dSmrg       *  @throw  std::invalid_argument  If a character appears in the string
8891debfc3dSmrg       *                                 which is neither @a 0 nor @a 1.
8901debfc3dSmrg       */
8911debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
8921debfc3dSmrg	explicit
8931debfc3dSmrg	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
8941debfc3dSmrg	       size_t __position = 0)
8951debfc3dSmrg	: _Base()
8961debfc3dSmrg	{
8971debfc3dSmrg	  _M_check_initial_position(__s, __position);
8981debfc3dSmrg	  _M_copy_from_string(__s, __position,
8991debfc3dSmrg			      std::basic_string<_CharT, _Traits, _Alloc>::npos,
9001debfc3dSmrg			      _CharT('0'), _CharT('1'));
9011debfc3dSmrg	}
9021debfc3dSmrg
9031debfc3dSmrg      /**
9041debfc3dSmrg       *  Use a subset of a string.
9051debfc3dSmrg       *  @param  __s  A string of @a 0 and @a 1 characters.
9061debfc3dSmrg       *  @param  __position  Index of the first character in @a __s to use.
9071debfc3dSmrg       *  @param  __n    The number of characters to copy.
9081debfc3dSmrg       *  @throw std::out_of_range If @a __position is bigger the size
9091debfc3dSmrg       *  of @a __s.
9101debfc3dSmrg       *  @throw  std::invalid_argument  If a character appears in the string
9111debfc3dSmrg       *                                 which is neither @a 0 nor @a 1.
9121debfc3dSmrg       */
9131debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
9141debfc3dSmrg	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
9151debfc3dSmrg	       size_t __position, size_t __n)
9161debfc3dSmrg	: _Base()
9171debfc3dSmrg	{
9181debfc3dSmrg	  _M_check_initial_position(__s, __position);
9191debfc3dSmrg	  _M_copy_from_string(__s, __position, __n, _CharT('0'), _CharT('1'));
9201debfc3dSmrg	}
9211debfc3dSmrg
9221debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
9231debfc3dSmrg      // 396. what are characters zero and one.
9241debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
9251debfc3dSmrg	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
9261debfc3dSmrg	       size_t __position, size_t __n,
9271debfc3dSmrg	       _CharT __zero, _CharT __one = _CharT('1'))
9281debfc3dSmrg	: _Base()
9291debfc3dSmrg	{
9301debfc3dSmrg	  _M_check_initial_position(__s, __position);
9311debfc3dSmrg	  _M_copy_from_string(__s, __position, __n, __zero, __one);
9321debfc3dSmrg	}
9331debfc3dSmrg
9341debfc3dSmrg#if __cplusplus >= 201103L
9351debfc3dSmrg      /**
9361debfc3dSmrg       *  Construct from a character %array.
9371debfc3dSmrg       *  @param  __str  An %array of characters @a zero and @a one.
9381debfc3dSmrg       *  @param  __n    The number of characters to use.
9391debfc3dSmrg       *  @param  __zero The character corresponding to the value 0.
9401debfc3dSmrg       *  @param  __one  The character corresponding to the value 1.
9411debfc3dSmrg       *  @throw  std::invalid_argument If a character appears in the string
9421debfc3dSmrg       *                                which is neither @a __zero nor @a __one.
9431debfc3dSmrg       */
9441debfc3dSmrg      template<typename _CharT>
9451debfc3dSmrg        explicit
9461debfc3dSmrg        bitset(const _CharT* __str,
9471debfc3dSmrg	       typename std::basic_string<_CharT>::size_type __n
9481debfc3dSmrg	       = std::basic_string<_CharT>::npos,
9491debfc3dSmrg	       _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
9501debfc3dSmrg        : _Base()
9511debfc3dSmrg        {
9521debfc3dSmrg	  if (!__str)
9531debfc3dSmrg	    __throw_logic_error(__N("bitset::bitset(const _CharT*, ...)"));
9541debfc3dSmrg
9551debfc3dSmrg	  if (__n == std::basic_string<_CharT>::npos)
9561debfc3dSmrg	    __n = std::char_traits<_CharT>::length(__str);
9571debfc3dSmrg	  _M_copy_from_ptr<_CharT, std::char_traits<_CharT>>(__str, __n, 0,
9581debfc3dSmrg							     __n, __zero,
9591debfc3dSmrg							     __one);
9601debfc3dSmrg	}
9611debfc3dSmrg#endif
9621debfc3dSmrg
9631debfc3dSmrg      // 23.3.5.2 bitset operations:
964*8feb0f0bSmrg      ///@{
9651debfc3dSmrg      /**
9661debfc3dSmrg       *  Operations on bitsets.
9671debfc3dSmrg       *  @param  __rhs  A same-sized bitset.
9681debfc3dSmrg       *
9691debfc3dSmrg       *  These should be self-explanatory.
9701debfc3dSmrg       */
9711debfc3dSmrg      bitset<_Nb>&
9721debfc3dSmrg      operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
9731debfc3dSmrg      {
9741debfc3dSmrg	this->_M_do_and(__rhs);
9751debfc3dSmrg	return *this;
9761debfc3dSmrg      }
9771debfc3dSmrg
9781debfc3dSmrg      bitset<_Nb>&
9791debfc3dSmrg      operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
9801debfc3dSmrg      {
9811debfc3dSmrg	this->_M_do_or(__rhs);
9821debfc3dSmrg	return *this;
9831debfc3dSmrg      }
9841debfc3dSmrg
9851debfc3dSmrg      bitset<_Nb>&
9861debfc3dSmrg      operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
9871debfc3dSmrg      {
9881debfc3dSmrg	this->_M_do_xor(__rhs);
9891debfc3dSmrg	return *this;
9901debfc3dSmrg      }
991*8feb0f0bSmrg      ///@}
9921debfc3dSmrg
993*8feb0f0bSmrg      ///@{
9941debfc3dSmrg      /**
9951debfc3dSmrg       *  Operations on bitsets.
9961debfc3dSmrg       *  @param  __position  The number of places to shift.
9971debfc3dSmrg       *
9981debfc3dSmrg       *  These should be self-explanatory.
9991debfc3dSmrg       */
10001debfc3dSmrg      bitset<_Nb>&
10011debfc3dSmrg      operator<<=(size_t __position) _GLIBCXX_NOEXCEPT
10021debfc3dSmrg      {
10031debfc3dSmrg	if (__builtin_expect(__position < _Nb, 1))
10041debfc3dSmrg	  {
10051debfc3dSmrg	    this->_M_do_left_shift(__position);
10061debfc3dSmrg	    this->_M_do_sanitize();
10071debfc3dSmrg	  }
10081debfc3dSmrg	else
10091debfc3dSmrg	  this->_M_do_reset();
10101debfc3dSmrg	return *this;
10111debfc3dSmrg      }
10121debfc3dSmrg
10131debfc3dSmrg      bitset<_Nb>&
10141debfc3dSmrg      operator>>=(size_t __position) _GLIBCXX_NOEXCEPT
10151debfc3dSmrg      {
10161debfc3dSmrg	if (__builtin_expect(__position < _Nb, 1))
10171debfc3dSmrg	  {
10181debfc3dSmrg	    this->_M_do_right_shift(__position);
10191debfc3dSmrg	    this->_M_do_sanitize();
10201debfc3dSmrg	  }
10211debfc3dSmrg	else
10221debfc3dSmrg	  this->_M_do_reset();
10231debfc3dSmrg	return *this;
10241debfc3dSmrg      }
1025*8feb0f0bSmrg      ///@}
10261debfc3dSmrg
1027*8feb0f0bSmrg      ///@{
10281debfc3dSmrg      /**
10291debfc3dSmrg       *  These versions of single-bit set, reset, flip, and test are
10301debfc3dSmrg       *  extensions from the SGI version.  They do no range checking.
10311debfc3dSmrg       *  @ingroup SGIextensions
10321debfc3dSmrg       */
10331debfc3dSmrg      bitset<_Nb>&
10341debfc3dSmrg      _Unchecked_set(size_t __pos) _GLIBCXX_NOEXCEPT
10351debfc3dSmrg      {
10361debfc3dSmrg	this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
10371debfc3dSmrg	return *this;
10381debfc3dSmrg      }
10391debfc3dSmrg
10401debfc3dSmrg      bitset<_Nb>&
10411debfc3dSmrg      _Unchecked_set(size_t __pos, int __val) _GLIBCXX_NOEXCEPT
10421debfc3dSmrg      {
10431debfc3dSmrg	if (__val)
10441debfc3dSmrg	  this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
10451debfc3dSmrg	else
10461debfc3dSmrg	  this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
10471debfc3dSmrg	return *this;
10481debfc3dSmrg      }
10491debfc3dSmrg
10501debfc3dSmrg      bitset<_Nb>&
10511debfc3dSmrg      _Unchecked_reset(size_t __pos) _GLIBCXX_NOEXCEPT
10521debfc3dSmrg      {
10531debfc3dSmrg	this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
10541debfc3dSmrg	return *this;
10551debfc3dSmrg      }
10561debfc3dSmrg
10571debfc3dSmrg      bitset<_Nb>&
10581debfc3dSmrg      _Unchecked_flip(size_t __pos) _GLIBCXX_NOEXCEPT
10591debfc3dSmrg      {
10601debfc3dSmrg	this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos);
10611debfc3dSmrg	return *this;
10621debfc3dSmrg      }
10631debfc3dSmrg
10641debfc3dSmrg      _GLIBCXX_CONSTEXPR bool
10651debfc3dSmrg      _Unchecked_test(size_t __pos) const _GLIBCXX_NOEXCEPT
10661debfc3dSmrg      { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos))
10671debfc3dSmrg		!= static_cast<_WordT>(0)); }
1068*8feb0f0bSmrg      ///@}
10691debfc3dSmrg
10701debfc3dSmrg      // Set, reset, and flip.
10711debfc3dSmrg      /**
10721debfc3dSmrg       *  @brief Sets every bit to true.
10731debfc3dSmrg       */
10741debfc3dSmrg      bitset<_Nb>&
10751debfc3dSmrg      set() _GLIBCXX_NOEXCEPT
10761debfc3dSmrg      {
10771debfc3dSmrg	this->_M_do_set();
10781debfc3dSmrg	this->_M_do_sanitize();
10791debfc3dSmrg	return *this;
10801debfc3dSmrg      }
10811debfc3dSmrg
10821debfc3dSmrg      /**
10831debfc3dSmrg       *  @brief Sets a given bit to a particular value.
10841debfc3dSmrg       *  @param  __position  The index of the bit.
10851debfc3dSmrg       *  @param  __val  Either true or false, defaults to true.
10861debfc3dSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
10871debfc3dSmrg       */
10881debfc3dSmrg      bitset<_Nb>&
10891debfc3dSmrg      set(size_t __position, bool __val = true)
10901debfc3dSmrg      {
10911debfc3dSmrg	this->_M_check(__position, __N("bitset::set"));
10921debfc3dSmrg	return _Unchecked_set(__position, __val);
10931debfc3dSmrg      }
10941debfc3dSmrg
10951debfc3dSmrg      /**
10961debfc3dSmrg       *  @brief Sets every bit to false.
10971debfc3dSmrg       */
10981debfc3dSmrg      bitset<_Nb>&
10991debfc3dSmrg      reset() _GLIBCXX_NOEXCEPT
11001debfc3dSmrg      {
11011debfc3dSmrg	this->_M_do_reset();
11021debfc3dSmrg	return *this;
11031debfc3dSmrg      }
11041debfc3dSmrg
11051debfc3dSmrg      /**
11061debfc3dSmrg       *  @brief Sets a given bit to false.
11071debfc3dSmrg       *  @param  __position  The index of the bit.
11081debfc3dSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
11091debfc3dSmrg       *
11101debfc3dSmrg       *  Same as writing @c set(pos,false).
11111debfc3dSmrg       */
11121debfc3dSmrg      bitset<_Nb>&
11131debfc3dSmrg      reset(size_t __position)
11141debfc3dSmrg      {
11151debfc3dSmrg	this->_M_check(__position, __N("bitset::reset"));
11161debfc3dSmrg	return _Unchecked_reset(__position);
11171debfc3dSmrg      }
11181debfc3dSmrg
11191debfc3dSmrg      /**
11201debfc3dSmrg       *  @brief Toggles every bit to its opposite value.
11211debfc3dSmrg       */
11221debfc3dSmrg      bitset<_Nb>&
11231debfc3dSmrg      flip() _GLIBCXX_NOEXCEPT
11241debfc3dSmrg      {
11251debfc3dSmrg	this->_M_do_flip();
11261debfc3dSmrg	this->_M_do_sanitize();
11271debfc3dSmrg	return *this;
11281debfc3dSmrg      }
11291debfc3dSmrg
11301debfc3dSmrg      /**
11311debfc3dSmrg       *  @brief Toggles a given bit to its opposite value.
11321debfc3dSmrg       *  @param  __position  The index of the bit.
11331debfc3dSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
11341debfc3dSmrg       */
11351debfc3dSmrg      bitset<_Nb>&
11361debfc3dSmrg      flip(size_t __position)
11371debfc3dSmrg      {
11381debfc3dSmrg	this->_M_check(__position, __N("bitset::flip"));
11391debfc3dSmrg	return _Unchecked_flip(__position);
11401debfc3dSmrg      }
11411debfc3dSmrg
11421debfc3dSmrg      /// See the no-argument flip().
11431debfc3dSmrg      bitset<_Nb>
11441debfc3dSmrg      operator~() const _GLIBCXX_NOEXCEPT
11451debfc3dSmrg      { return bitset<_Nb>(*this).flip(); }
11461debfc3dSmrg
1147*8feb0f0bSmrg      ///@{
11481debfc3dSmrg      /**
11491debfc3dSmrg       *  @brief  Array-indexing support.
11501debfc3dSmrg       *  @param  __position  Index into the %bitset.
11511debfc3dSmrg       *  @return A bool for a <em>const %bitset</em>.  For non-const
11521debfc3dSmrg       *           bitsets, an instance of the reference proxy class.
11531debfc3dSmrg       *  @note  These operators do no range checking and throw no exceptions,
11541debfc3dSmrg       *         as required by DR 11 to the standard.
11551debfc3dSmrg       *
11561debfc3dSmrg       *  _GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already
11571debfc3dSmrg       *  resolves DR 11 (items 1 and 2), but does not do the range-checking
11581debfc3dSmrg       *  required by that DR's resolution.  -pme
11591debfc3dSmrg       *  The DR has since been changed:  range-checking is a precondition
11601debfc3dSmrg       *  (users' responsibility), and these functions must not throw.  -pme
11611debfc3dSmrg       */
11621debfc3dSmrg      reference
11631debfc3dSmrg      operator[](size_t __position)
11641debfc3dSmrg      { return reference(*this, __position); }
11651debfc3dSmrg
11661debfc3dSmrg      _GLIBCXX_CONSTEXPR bool
11671debfc3dSmrg      operator[](size_t __position) const
11681debfc3dSmrg      { return _Unchecked_test(__position); }
1169*8feb0f0bSmrg      ///@}
11701debfc3dSmrg
11711debfc3dSmrg      /**
11721debfc3dSmrg       *  @brief Returns a numerical interpretation of the %bitset.
11731debfc3dSmrg       *  @return  The integral equivalent of the bits.
11741debfc3dSmrg       *  @throw  std::overflow_error  If there are too many bits to be
11751debfc3dSmrg       *                               represented in an @c unsigned @c long.
11761debfc3dSmrg       */
11771debfc3dSmrg      unsigned long
11781debfc3dSmrg      to_ulong() const
11791debfc3dSmrg      { return this->_M_do_to_ulong(); }
11801debfc3dSmrg
11811debfc3dSmrg#if __cplusplus >= 201103L
11821debfc3dSmrg      unsigned long long
11831debfc3dSmrg      to_ullong() const
11841debfc3dSmrg      { return this->_M_do_to_ullong(); }
11851debfc3dSmrg#endif
11861debfc3dSmrg
11871debfc3dSmrg      /**
11881debfc3dSmrg       *  @brief Returns a character interpretation of the %bitset.
11891debfc3dSmrg       *  @return  The string equivalent of the bits.
11901debfc3dSmrg       *
11911debfc3dSmrg       *  Note the ordering of the bits:  decreasing character positions
11921debfc3dSmrg       *  correspond to increasing bit positions (see the main class notes for
11931debfc3dSmrg       *  an example).
11941debfc3dSmrg       */
11951debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
11961debfc3dSmrg	std::basic_string<_CharT, _Traits, _Alloc>
11971debfc3dSmrg	to_string() const
11981debfc3dSmrg	{
11991debfc3dSmrg	  std::basic_string<_CharT, _Traits, _Alloc> __result;
12001debfc3dSmrg	  _M_copy_to_string(__result, _CharT('0'), _CharT('1'));
12011debfc3dSmrg	  return __result;
12021debfc3dSmrg	}
12031debfc3dSmrg
12041debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
12051debfc3dSmrg      // 396. what are characters zero and one.
12061debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
12071debfc3dSmrg	std::basic_string<_CharT, _Traits, _Alloc>
12081debfc3dSmrg	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
12091debfc3dSmrg	{
12101debfc3dSmrg	  std::basic_string<_CharT, _Traits, _Alloc> __result;
12111debfc3dSmrg	  _M_copy_to_string(__result, __zero, __one);
12121debfc3dSmrg	  return __result;
12131debfc3dSmrg	}
12141debfc3dSmrg
12151debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
12161debfc3dSmrg      // 434. bitset::to_string() hard to use.
12171debfc3dSmrg      template<class _CharT, class _Traits>
12181debfc3dSmrg	std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
12191debfc3dSmrg	to_string() const
12201debfc3dSmrg	{ return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }
12211debfc3dSmrg
12221debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
12231debfc3dSmrg      // 853. to_string needs updating with zero and one.
12241debfc3dSmrg      template<class _CharT, class _Traits>
12251debfc3dSmrg	std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
12261debfc3dSmrg	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
12271debfc3dSmrg	{ return to_string<_CharT, _Traits,
12281debfc3dSmrg	                   std::allocator<_CharT> >(__zero, __one); }
12291debfc3dSmrg
12301debfc3dSmrg      template<class _CharT>
12311debfc3dSmrg	std::basic_string<_CharT, std::char_traits<_CharT>,
12321debfc3dSmrg	                  std::allocator<_CharT> >
12331debfc3dSmrg	to_string() const
12341debfc3dSmrg	{
12351debfc3dSmrg	  return to_string<_CharT, std::char_traits<_CharT>,
12361debfc3dSmrg	                   std::allocator<_CharT> >();
12371debfc3dSmrg	}
12381debfc3dSmrg
12391debfc3dSmrg      template<class _CharT>
12401debfc3dSmrg	std::basic_string<_CharT, std::char_traits<_CharT>,
12411debfc3dSmrg	                  std::allocator<_CharT> >
12421debfc3dSmrg	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
12431debfc3dSmrg	{
12441debfc3dSmrg	  return to_string<_CharT, std::char_traits<_CharT>,
12451debfc3dSmrg	                   std::allocator<_CharT> >(__zero, __one);
12461debfc3dSmrg	}
12471debfc3dSmrg
12481debfc3dSmrg      std::basic_string<char, std::char_traits<char>, std::allocator<char> >
12491debfc3dSmrg      to_string() const
12501debfc3dSmrg      {
12511debfc3dSmrg	return to_string<char, std::char_traits<char>,
12521debfc3dSmrg	                 std::allocator<char> >();
12531debfc3dSmrg      }
12541debfc3dSmrg
12551debfc3dSmrg      std::basic_string<char, std::char_traits<char>, std::allocator<char> >
12561debfc3dSmrg      to_string(char __zero, char __one = '1') const
12571debfc3dSmrg      {
12581debfc3dSmrg	return to_string<char, std::char_traits<char>,
12591debfc3dSmrg	                 std::allocator<char> >(__zero, __one);
12601debfc3dSmrg      }
12611debfc3dSmrg
12621debfc3dSmrg      // Helper functions for string operations.
12631debfc3dSmrg      template<class _CharT, class _Traits>
12641debfc3dSmrg        void
12651debfc3dSmrg        _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t,
12661debfc3dSmrg			 _CharT, _CharT);
12671debfc3dSmrg
12681debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
12691debfc3dSmrg	void
12701debfc3dSmrg	_M_copy_from_string(const std::basic_string<_CharT,
12711debfc3dSmrg			    _Traits, _Alloc>& __s, size_t __pos, size_t __n,
12721debfc3dSmrg			    _CharT __zero, _CharT __one)
12731debfc3dSmrg	{ _M_copy_from_ptr<_CharT, _Traits>(__s.data(), __s.size(), __pos, __n,
12741debfc3dSmrg					    __zero, __one); }
12751debfc3dSmrg
12761debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
12771debfc3dSmrg	void
12781debfc3dSmrg        _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>&,
12791debfc3dSmrg			  _CharT, _CharT) const;
12801debfc3dSmrg
12811debfc3dSmrg      // NB: Backward compat.
12821debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
12831debfc3dSmrg	void
12841debfc3dSmrg	_M_copy_from_string(const std::basic_string<_CharT,
12851debfc3dSmrg			    _Traits, _Alloc>& __s, size_t __pos, size_t __n)
12861debfc3dSmrg	{ _M_copy_from_string(__s, __pos, __n, _CharT('0'), _CharT('1')); }
12871debfc3dSmrg
12881debfc3dSmrg      template<class _CharT, class _Traits, class _Alloc>
12891debfc3dSmrg	void
12901debfc3dSmrg        _M_copy_to_string(std::basic_string<_CharT, _Traits,_Alloc>& __s) const
12911debfc3dSmrg	{ _M_copy_to_string(__s, _CharT('0'), _CharT('1')); }
12921debfc3dSmrg
12931debfc3dSmrg      /// Returns the number of bits which are set.
12941debfc3dSmrg      size_t
12951debfc3dSmrg      count() const _GLIBCXX_NOEXCEPT
12961debfc3dSmrg      { return this->_M_do_count(); }
12971debfc3dSmrg
12981debfc3dSmrg      /// Returns the total number of bits.
12991debfc3dSmrg      _GLIBCXX_CONSTEXPR size_t
13001debfc3dSmrg      size() const _GLIBCXX_NOEXCEPT
13011debfc3dSmrg      { return _Nb; }
13021debfc3dSmrg
1303*8feb0f0bSmrg      ///@{
13041debfc3dSmrg      /// These comparisons for equality/inequality are, well, @e bitwise.
13051debfc3dSmrg      bool
13061debfc3dSmrg      operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
13071debfc3dSmrg      { return this->_M_is_equal(__rhs); }
13081debfc3dSmrg
1309*8feb0f0bSmrg#if __cpp_impl_three_way_comparison < 201907L
13101debfc3dSmrg      bool
13111debfc3dSmrg      operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
13121debfc3dSmrg      { return !this->_M_is_equal(__rhs); }
1313*8feb0f0bSmrg#endif
1314*8feb0f0bSmrg      ///@}
13151debfc3dSmrg
13161debfc3dSmrg      /**
13171debfc3dSmrg       *  @brief Tests the value of a bit.
13181debfc3dSmrg       *  @param  __position  The index of a bit.
13191debfc3dSmrg       *  @return  The value at @a pos.
13201debfc3dSmrg       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
13211debfc3dSmrg       */
13221debfc3dSmrg      bool
13231debfc3dSmrg      test(size_t __position) const
13241debfc3dSmrg      {
13251debfc3dSmrg	this->_M_check(__position, __N("bitset::test"));
13261debfc3dSmrg	return _Unchecked_test(__position);
13271debfc3dSmrg      }
13281debfc3dSmrg
13291debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
13301debfc3dSmrg      // DR 693. std::bitset::all() missing.
13311debfc3dSmrg      /**
13321debfc3dSmrg       *  @brief Tests whether all the bits are on.
13331debfc3dSmrg       *  @return  True if all the bits are set.
13341debfc3dSmrg       */
13351debfc3dSmrg      bool
13361debfc3dSmrg      all() const _GLIBCXX_NOEXCEPT
13371debfc3dSmrg      { return this->template _M_are_all<_Nb>(); }
13381debfc3dSmrg
13391debfc3dSmrg      /**
13401debfc3dSmrg       *  @brief Tests whether any of the bits are on.
13411debfc3dSmrg       *  @return  True if at least one bit is set.
13421debfc3dSmrg       */
13431debfc3dSmrg      bool
13441debfc3dSmrg      any() const _GLIBCXX_NOEXCEPT
13451debfc3dSmrg      { return this->_M_is_any(); }
13461debfc3dSmrg
13471debfc3dSmrg      /**
13481debfc3dSmrg       *  @brief Tests whether any of the bits are on.
13491debfc3dSmrg       *  @return  True if none of the bits are set.
13501debfc3dSmrg       */
13511debfc3dSmrg      bool
13521debfc3dSmrg      none() const _GLIBCXX_NOEXCEPT
13531debfc3dSmrg      { return !this->_M_is_any(); }
13541debfc3dSmrg
1355*8feb0f0bSmrg      ///@{
13561debfc3dSmrg      /// Self-explanatory.
13571debfc3dSmrg      bitset<_Nb>
13581debfc3dSmrg      operator<<(size_t __position) const _GLIBCXX_NOEXCEPT
13591debfc3dSmrg      { return bitset<_Nb>(*this) <<= __position; }
13601debfc3dSmrg
13611debfc3dSmrg      bitset<_Nb>
13621debfc3dSmrg      operator>>(size_t __position) const _GLIBCXX_NOEXCEPT
13631debfc3dSmrg      { return bitset<_Nb>(*this) >>= __position; }
1364*8feb0f0bSmrg      ///@}
13651debfc3dSmrg
13661debfc3dSmrg      /**
13671debfc3dSmrg       *  @brief  Finds the index of the first "on" bit.
13681debfc3dSmrg       *  @return  The index of the first bit set, or size() if not found.
13691debfc3dSmrg       *  @ingroup SGIextensions
13701debfc3dSmrg       *  @sa  _Find_next
13711debfc3dSmrg       */
13721debfc3dSmrg      size_t
13731debfc3dSmrg      _Find_first() const _GLIBCXX_NOEXCEPT
13741debfc3dSmrg      { return this->_M_do_find_first(_Nb); }
13751debfc3dSmrg
13761debfc3dSmrg      /**
13771debfc3dSmrg       *  @brief  Finds the index of the next "on" bit after prev.
13781debfc3dSmrg       *  @return  The index of the next bit set, or size() if not found.
13791debfc3dSmrg       *  @param  __prev  Where to start searching.
13801debfc3dSmrg       *  @ingroup SGIextensions
13811debfc3dSmrg       *  @sa  _Find_first
13821debfc3dSmrg       */
13831debfc3dSmrg      size_t
13841debfc3dSmrg      _Find_next(size_t __prev) const _GLIBCXX_NOEXCEPT
13851debfc3dSmrg      { return this->_M_do_find_next(__prev, _Nb); }
13861debfc3dSmrg    };
13871debfc3dSmrg
13881debfc3dSmrg  // Definitions of non-inline member functions.
13891debfc3dSmrg  template<size_t _Nb>
13901debfc3dSmrg    template<class _CharT, class _Traits>
13911debfc3dSmrg      void
13921debfc3dSmrg      bitset<_Nb>::
13931debfc3dSmrg      _M_copy_from_ptr(const _CharT* __s, size_t __len,
13941debfc3dSmrg		       size_t __pos, size_t __n, _CharT __zero, _CharT __one)
13951debfc3dSmrg      {
13961debfc3dSmrg	reset();
13971debfc3dSmrg	const size_t __nbits = std::min(_Nb, std::min(__n, size_t(__len - __pos)));
13981debfc3dSmrg	for (size_t __i = __nbits; __i > 0; --__i)
13991debfc3dSmrg	  {
14001debfc3dSmrg	    const _CharT __c = __s[__pos + __nbits - __i];
14011debfc3dSmrg	    if (_Traits::eq(__c, __zero))
14021debfc3dSmrg	      ;
14031debfc3dSmrg	    else if (_Traits::eq(__c, __one))
14041debfc3dSmrg	      _Unchecked_set(__i - 1);
14051debfc3dSmrg	    else
14061debfc3dSmrg	      __throw_invalid_argument(__N("bitset::_M_copy_from_ptr"));
14071debfc3dSmrg	  }
14081debfc3dSmrg      }
14091debfc3dSmrg
14101debfc3dSmrg  template<size_t _Nb>
14111debfc3dSmrg    template<class _CharT, class _Traits, class _Alloc>
14121debfc3dSmrg      void
14131debfc3dSmrg      bitset<_Nb>::
14141debfc3dSmrg      _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>& __s,
14151debfc3dSmrg			_CharT __zero, _CharT __one) const
14161debfc3dSmrg      {
14171debfc3dSmrg	__s.assign(_Nb, __zero);
14181debfc3dSmrg	for (size_t __i = _Nb; __i > 0; --__i)
14191debfc3dSmrg	  if (_Unchecked_test(__i - 1))
14201debfc3dSmrg	    _Traits::assign(__s[_Nb - __i], __one);
14211debfc3dSmrg      }
14221debfc3dSmrg
14231debfc3dSmrg  // 23.3.5.3 bitset operations:
1424*8feb0f0bSmrg  ///@{
14251debfc3dSmrg  /**
14261debfc3dSmrg   *  @brief  Global bitwise operations on bitsets.
14271debfc3dSmrg   *  @param  __x  A bitset.
14281debfc3dSmrg   *  @param  __y  A bitset of the same size as @a __x.
14291debfc3dSmrg   *  @return  A new bitset.
14301debfc3dSmrg   *
14311debfc3dSmrg   *  These should be self-explanatory.
14321debfc3dSmrg  */
14331debfc3dSmrg  template<size_t _Nb>
14341debfc3dSmrg    inline bitset<_Nb>
14351debfc3dSmrg    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
14361debfc3dSmrg    {
14371debfc3dSmrg      bitset<_Nb> __result(__x);
14381debfc3dSmrg      __result &= __y;
14391debfc3dSmrg      return __result;
14401debfc3dSmrg    }
14411debfc3dSmrg
14421debfc3dSmrg  template<size_t _Nb>
14431debfc3dSmrg    inline bitset<_Nb>
14441debfc3dSmrg    operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
14451debfc3dSmrg    {
14461debfc3dSmrg      bitset<_Nb> __result(__x);
14471debfc3dSmrg      __result |= __y;
14481debfc3dSmrg      return __result;
14491debfc3dSmrg    }
14501debfc3dSmrg
14511debfc3dSmrg  template <size_t _Nb>
14521debfc3dSmrg    inline bitset<_Nb>
14531debfc3dSmrg    operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
14541debfc3dSmrg    {
14551debfc3dSmrg      bitset<_Nb> __result(__x);
14561debfc3dSmrg      __result ^= __y;
14571debfc3dSmrg      return __result;
14581debfc3dSmrg    }
1459*8feb0f0bSmrg  ///@}
14601debfc3dSmrg
1461*8feb0f0bSmrg  ///@{
14621debfc3dSmrg  /**
14631debfc3dSmrg   *  @brief Global I/O operators for bitsets.
14641debfc3dSmrg   *
14651debfc3dSmrg   *  Direct I/O between streams and bitsets is supported.  Output is
14661debfc3dSmrg   *  straightforward.  Input will skip whitespace, only accept @a 0 and @a 1
14671debfc3dSmrg   *  characters, and will only extract as many digits as the %bitset will
14681debfc3dSmrg   *  hold.
14691debfc3dSmrg  */
14701debfc3dSmrg  template<class _CharT, class _Traits, size_t _Nb>
14711debfc3dSmrg    std::basic_istream<_CharT, _Traits>&
14721debfc3dSmrg    operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
14731debfc3dSmrg    {
14741debfc3dSmrg      typedef typename _Traits::char_type          char_type;
14751debfc3dSmrg      typedef std::basic_istream<_CharT, _Traits>  __istream_type;
14761debfc3dSmrg      typedef typename __istream_type::ios_base    __ios_base;
14771debfc3dSmrg
14781debfc3dSmrg      std::basic_string<_CharT, _Traits> __tmp;
14791debfc3dSmrg      __tmp.reserve(_Nb);
14801debfc3dSmrg
14811debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
14821debfc3dSmrg      // 303. Bitset input operator underspecified
14831debfc3dSmrg      const char_type __zero = __is.widen('0');
14841debfc3dSmrg      const char_type __one = __is.widen('1');
14851debfc3dSmrg
14861debfc3dSmrg      typename __ios_base::iostate __state = __ios_base::goodbit;
14871debfc3dSmrg      typename __istream_type::sentry __sentry(__is);
14881debfc3dSmrg      if (__sentry)
14891debfc3dSmrg	{
14901debfc3dSmrg	  __try
14911debfc3dSmrg	    {
14921debfc3dSmrg	      for (size_t __i = _Nb; __i > 0; --__i)
14931debfc3dSmrg		{
14941debfc3dSmrg		  static typename _Traits::int_type __eof = _Traits::eof();
14951debfc3dSmrg
14961debfc3dSmrg		  typename _Traits::int_type __c1 = __is.rdbuf()->sbumpc();
14971debfc3dSmrg		  if (_Traits::eq_int_type(__c1, __eof))
14981debfc3dSmrg		    {
14991debfc3dSmrg		      __state |= __ios_base::eofbit;
15001debfc3dSmrg		      break;
15011debfc3dSmrg		    }
15021debfc3dSmrg		  else
15031debfc3dSmrg		    {
15041debfc3dSmrg		      const char_type __c2 = _Traits::to_char_type(__c1);
15051debfc3dSmrg		      if (_Traits::eq(__c2, __zero))
15061debfc3dSmrg			__tmp.push_back(__zero);
15071debfc3dSmrg		      else if (_Traits::eq(__c2, __one))
15081debfc3dSmrg			__tmp.push_back(__one);
15091debfc3dSmrg		      else if (_Traits::
15101debfc3dSmrg			       eq_int_type(__is.rdbuf()->sputbackc(__c2),
15111debfc3dSmrg					   __eof))
15121debfc3dSmrg			{
15131debfc3dSmrg			  __state |= __ios_base::failbit;
15141debfc3dSmrg			  break;
15151debfc3dSmrg			}
15161debfc3dSmrg		    }
15171debfc3dSmrg		}
15181debfc3dSmrg	    }
15191debfc3dSmrg	  __catch(__cxxabiv1::__forced_unwind&)
15201debfc3dSmrg	    {
15211debfc3dSmrg	      __is._M_setstate(__ios_base::badbit);
15221debfc3dSmrg	      __throw_exception_again;
15231debfc3dSmrg	    }
15241debfc3dSmrg	  __catch(...)
15251debfc3dSmrg	    { __is._M_setstate(__ios_base::badbit); }
15261debfc3dSmrg	}
15271debfc3dSmrg
15281debfc3dSmrg      if (__tmp.empty() && _Nb)
15291debfc3dSmrg	__state |= __ios_base::failbit;
15301debfc3dSmrg      else
15311debfc3dSmrg	__x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb,
15321debfc3dSmrg				__zero, __one);
15331debfc3dSmrg      if (__state)
15341debfc3dSmrg	__is.setstate(__state);
15351debfc3dSmrg      return __is;
15361debfc3dSmrg    }
15371debfc3dSmrg
15381debfc3dSmrg  template <class _CharT, class _Traits, size_t _Nb>
15391debfc3dSmrg    std::basic_ostream<_CharT, _Traits>&
15401debfc3dSmrg    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
15411debfc3dSmrg	       const bitset<_Nb>& __x)
15421debfc3dSmrg    {
15431debfc3dSmrg      std::basic_string<_CharT, _Traits> __tmp;
15441debfc3dSmrg
15451debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
15461debfc3dSmrg      // 396. what are characters zero and one.
15471debfc3dSmrg      const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__os.getloc());
15481debfc3dSmrg      __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1'));
15491debfc3dSmrg      return __os << __tmp;
15501debfc3dSmrg    }
1551*8feb0f0bSmrg  ///@}
15521debfc3dSmrg
15531debfc3dSmrg_GLIBCXX_END_NAMESPACE_CONTAINER
15541debfc3dSmrg} // namespace std
15551debfc3dSmrg
15561debfc3dSmrg#undef _GLIBCXX_BITSET_WORDS
15571debfc3dSmrg#undef _GLIBCXX_BITSET_BITS_PER_WORD
15581debfc3dSmrg#undef _GLIBCXX_BITSET_BITS_PER_ULL
15591debfc3dSmrg
15601debfc3dSmrg#if __cplusplus >= 201103L
15611debfc3dSmrg
15621debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default)
15631debfc3dSmrg{
15641debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
15651debfc3dSmrg
15661debfc3dSmrg  // DR 1182.
15671debfc3dSmrg  /// std::hash specialization for bitset.
15681debfc3dSmrg  template<size_t _Nb>
15691debfc3dSmrg    struct hash<_GLIBCXX_STD_C::bitset<_Nb>>
15701debfc3dSmrg    : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<_Nb>>
15711debfc3dSmrg    {
15721debfc3dSmrg      size_t
15731debfc3dSmrg      operator()(const _GLIBCXX_STD_C::bitset<_Nb>& __b) const noexcept
15741debfc3dSmrg      {
15751debfc3dSmrg	const size_t __clength = (_Nb + __CHAR_BIT__ - 1) / __CHAR_BIT__;
15761debfc3dSmrg	return std::_Hash_impl::hash(__b._M_getdata(), __clength);
15771debfc3dSmrg      }
15781debfc3dSmrg    };
15791debfc3dSmrg
15801debfc3dSmrg  template<>
15811debfc3dSmrg    struct hash<_GLIBCXX_STD_C::bitset<0>>
15821debfc3dSmrg    : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<0>>
15831debfc3dSmrg    {
15841debfc3dSmrg      size_t
15851debfc3dSmrg      operator()(const _GLIBCXX_STD_C::bitset<0>&) const noexcept
15861debfc3dSmrg      { return 0; }
15871debfc3dSmrg    };
15881debfc3dSmrg
15891debfc3dSmrg_GLIBCXX_END_NAMESPACE_VERSION
15901debfc3dSmrg} // namespace
15911debfc3dSmrg
15921debfc3dSmrg#endif // C++11
15931debfc3dSmrg
15941debfc3dSmrg#ifdef _GLIBCXX_DEBUG
15951debfc3dSmrg# include <debug/bitset>
15961debfc3dSmrg#endif
15971debfc3dSmrg
15981debfc3dSmrg#endif /* _GLIBCXX_BITSET */
1599