⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitset

📁 mingw32.rar
💻
📖 第 1 页 / 共 3 页
字号:
    }

    bitset<_Nb>&
    _Unchecked_reset(size_t __pos)
    {
      this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
      return *this;
    }

    bitset<_Nb>&
    _Unchecked_flip(size_t __pos)
    {
      this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos);
      return *this;
    }

    bool
    _Unchecked_test(size_t __pos) const
    {
      return (this->_M_getword(__pos) & _Base::_S_maskbit(__pos))
	!= static_cast<_WordT>(0);
    }
    //@}

    // Set, reset, and flip.
    /**
     *  @brief Sets every bit to true.
    */
    bitset<_Nb>&
    set()
    {
      this->_M_do_set();
      this->_M_do_sanitize();
      return *this;
    }

    /**
     *  @brief Sets a given bit to a particular value.
     *  @param  position  The index of the bit.
     *  @param  val  Either true or false, defaults to true.
     *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
    */
    bitset<_Nb>&
    set(size_t __position, bool __val = true)
    {
      if (__position >= _Nb)
	__throw_out_of_range(__N("bitset::set"));
      return _Unchecked_set(__position, __val);
    }

    /**
     *  @brief Sets every bit to false.
    */
    bitset<_Nb>&
    reset()
    {
      this->_M_do_reset();
      return *this;
    }

    /**
     *  @brief Sets a given bit to false.
     *  @param  position  The index of the bit.
     *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
     *
     *  Same as writing @c set(pos,false).
    */
    bitset<_Nb>&
    reset(size_t __position)
    {
      if (__position >= _Nb)
	__throw_out_of_range(__N("bitset::reset"));
      return _Unchecked_reset(__position);
    }

    /**
     *  @brief Toggles every bit to its opposite value.
    */
    bitset<_Nb>&
    flip()
    {
      this->_M_do_flip();
      this->_M_do_sanitize();
      return *this;
    }

    /**
     *  @brief Toggles a given bit to its opposite value.
     *  @param  position  The index of the bit.
     *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
    */
    bitset<_Nb>&
    flip(size_t __position)
    {
      if (__position >= _Nb)
	__throw_out_of_range(__N("bitset::flip"));
      return _Unchecked_flip(__position);
    }

    /// See the no-argument flip().
    bitset<_Nb>
    operator~() const { return bitset<_Nb>(*this).flip(); }

    //@{
    /**
     *  @brief  Array-indexing support.
     *  @param  position  Index into the %bitset.
     *  @return  A bool for a 'const %bitset'.  For non-const bitsets, an
     *           instance of the reference proxy class.
     *  @note  These operators do no range checking and throw no exceptions,
     *         as required by DR 11 to the standard.
     *
     *  @if maint
     *  _GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already
     *  resolves DR 11 (items 1 and 2), but does not do the range-checking
     *  required by that DR's resolution.  -pme
     *  The DR has since been changed:  range-checking is a precondition
     *  (users' responsibility), and these functions must not throw.  -pme
     *  @endif
    */
    reference
    operator[](size_t __position) { return reference(*this,__position); }

    bool
    operator[](size_t __position) const { return _Unchecked_test(__position); }
    //@}

    /**
     *  @brief Retuns a numerical interpretation of the %bitset.
     *  @return  The integral equivalent of the bits.
     *  @throw  std::overflow_error  If there are too many bits to be
     *                               represented in an @c unsigned @c long.
    */
    unsigned long
    to_ulong() const { return this->_M_do_to_ulong(); }

    /**
     *  @brief Retuns a character interpretation of the %bitset.
     *  @return  The string equivalent of the bits.
     *
     *  Note the ordering of the bits:  decreasing character positions
     *  correspond to increasing bit positions (see the main class notes for
     *  an example).
     *
     *  Also note that you must specify the string's template parameters
     *  explicitly.  Given a bitset @c bs and a string @s:
     *  @code
     *     s = bs.to_string<char,char_traits<char>,allocator<char> >();
     *  @endcode
    */
    template<class _CharT, class _Traits, class _Alloc>
      basic_string<_CharT, _Traits, _Alloc>
      to_string() const
      {
	basic_string<_CharT, _Traits, _Alloc> __result;
	_M_copy_to_string(__result);
	return __result;
      }

    // Helper functions for string operations.
    template<class _CharT, class _Traits, class _Alloc>
      void
      _M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s,
                          size_t, size_t);

    template<class _CharT, class _Traits, class _Alloc>
      void
      _M_copy_to_string(basic_string<_CharT,_Traits,_Alloc>&) const;

    /// Returns the number of bits which are set.
    size_t
    count() const { return this->_M_do_count(); }

    /// Returns the total number of bits.
    size_t
    size() const { return _Nb; }

    //@{
    /// These comparisons for equality/inequality are, well, @e bitwise.
    bool
    operator==(const bitset<_Nb>& __rhs) const
    { return this->_M_is_equal(__rhs); }

    bool
    operator!=(const bitset<_Nb>& __rhs) const
    { return !this->_M_is_equal(__rhs); }
    //@}

    /**
     *  @brief Tests the value of a bit.
     *  @param  position  The index of a bit.
     *  @return  The value at @a pos.
     *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
    */
    bool
    test(size_t __position) const
    {
      if (__position >= _Nb)
	__throw_out_of_range(__N("bitset::test"));
      return _Unchecked_test(__position);
    }

    /**
     *  @brief Tests whether any of the bits are on.
     *  @return  True if at least one bit is set.
    */
    bool
    any() const { return this->_M_is_any(); }

    /**
     *  @brief Tests whether any of the bits are on.
     *  @return  True if none of the bits are set.
    */
    bool
    none() const { return !this->_M_is_any(); }

    //@{
    /// Self-explanatory.
    bitset<_Nb>
    operator<<(size_t __position) const
    { return bitset<_Nb>(*this) <<= __position; }

    bitset<_Nb>
    operator>>(size_t __position) const
    { return bitset<_Nb>(*this) >>= __position; }
    //@}

    /**
     *  @brief  Finds the index of the first "on" bit.
     *  @return  The index of the first bit set, or size() if not found.
     *  @ingroup SGIextensions
     *  @sa  _Find_next
    */
    size_t
    _Find_first() const
    { return this->_M_do_find_first(_Nb); }

    /**
     *  @brief  Finds the index of the next "on" bit after prev.
     *  @return  The index of the next bit set, or size() if not found.
     *  @param  prev  Where to start searching.
     *  @ingroup SGIextensions
     *  @sa  _Find_first
    */
    size_t
    _Find_next(size_t __prev ) const
    { return this->_M_do_find_next(__prev, _Nb); }
  };

  // Definitions of non-inline member functions.
  template<size_t _Nb>
    template<class _CharT, class _Traits, class _Alloc>
    void
    bitset<_Nb>::_M_copy_from_string(const basic_string<_CharT, _Traits,
				     _Alloc>& __s, size_t __pos, size_t __n)
    {
      reset();
      const size_t __nbits = std::min(_Nb, std::min(__n, __s.size() - __pos));
      for (size_t __i = 0; __i < __nbits; ++__i)
	{
	  switch(__s[__pos + __nbits - __i - 1])
	    {
	    case '0':
	      break;
	    case '1':
	      set(__i);
	      break;
	    default:
	      __throw_invalid_argument(__N("bitset::_M_copy_from_string"));
	    }
	}
    }

  template<size_t _Nb>
    template<class _CharT, class _Traits, class _Alloc>
    void
    bitset<_Nb>::_M_copy_to_string(basic_string<_CharT, _Traits,
				   _Alloc>& __s) const
    {
      __s.assign(_Nb, '0');
      for (size_t __i = 0; __i < _Nb; ++__i)
	if (_Unchecked_test(__i))
	  __s[_Nb - 1 - __i] = '1';
    }

  // 23.3.5.3 bitset operations:
  //@{
  /**
   *  @brief  Global bitwise operations on bitsets.
   *  @param  x  A bitset.
   *  @param  y  A bitset of the same size as @a x.
   *  @return  A new bitset.
   *
   *  These should be self-explanatory.
  */
  template<size_t _Nb>
    inline bitset<_Nb>
    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y)
    {
      bitset<_Nb> __result(__x);
      __result &= __y;
      return __result;
    }

  template<size_t _Nb>
    inline bitset<_Nb>
    operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y)
    {
      bitset<_Nb> __result(__x);
      __result |= __y;
      return __result;
    }

  template <size_t _Nb>
    inline bitset<_Nb>
    operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y)
    {
      bitset<_Nb> __result(__x);
      __result ^= __y;
      return __result;
    }
  //@}

  //@{
  /**
   *  @brief Global I/O operators for bitsets.
   *
   *  Direct I/O between streams and bitsets is supported.  Output is
   *  straightforward.  Input will skip whitespace, only accept '0' and '1'
   *  characters, and will only extract as many digits as the %bitset will
   *  hold.
  */
  template<class _CharT, class _Traits, size_t _Nb>
    basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
    {
      typedef typename _Traits::char_type char_type;
      basic_string<_CharT, _Traits> __tmp;
      __tmp.reserve(_Nb);

      ios_base::iostate __state = ios_base::goodbit;
      typename basic_istream<_CharT, _Traits>::sentry __sentry(__is);
      if (__sentry)
	{
	  try
	    {
	      basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
	      // 303. Bitset input operator underspecified
	      const char_type __zero = __is.widen('0');
	      const char_type __one = __is.widen('1');
	      for (size_t __i = 0; __i < _Nb; ++__i)
		{
		  static typename _Traits::int_type __eof = _Traits::eof();
		  
		  typename _Traits::int_type __c1 = __buf->sbumpc();
		  if (_Traits::eq_int_type(__c1, __eof))
		    {
		      __state |= ios_base::eofbit;
		      break;
		    }
		  else
		    {
		      char_type __c2 = _Traits::to_char_type(__c1);
		      if (__c2 == __zero)
			__tmp.push_back('0');
		      else if (__c2 == __one)
			__tmp.push_back('1');
		      else if (_Traits::eq_int_type(__buf->sputbackc(__c2),
						    __eof))
			{
			  __state |= ios_base::failbit;
			  break;
			}
		    }
		}
	    }
	  catch(...)
	    { __is._M_setstate(ios_base::badbit); }
	}

      if (__tmp.empty() && _Nb)
	__state |= ios_base::failbit;
      else
	__x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb);
      if (__state)
	__is.setstate(__state);
      return __is;
    }

  template <class _CharT, class _Traits, size_t _Nb>
    basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Nb>& __x)
    {
      basic_string<_CharT, _Traits> __tmp;
      __x._M_copy_to_string(__tmp);
      return __os << __tmp;
    }
  //@}
} // namespace std

#undef _GLIBCXX_BITSET_WORDS
#undef _GLIBCXX_BITSET_BITS_PER_WORD

#ifdef _GLIBCXX_DEBUG
# include <debug/bitset>
#endif

#endif /* _GLIBCXX_BITSET */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -