137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Profiling bitset implementation -*- C++ -*-
237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh//
537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// This file is part of the GNU ISO C++ Library.  This library is free
637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// software; you can redistribute it and/or modify it under the
737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// terms of the GNU General Public License as published by the
837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Free Software Foundation; either version 3, or (at your option)
937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// any later version.
1037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
1137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// This library is distributed in the hope that it will be useful,
1237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// but WITHOUT ANY WARRANTY; without even the implied warranty of
1337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// GNU General Public License for more details.
1537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
1637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Under Section 7 of GPL version 3, you are granted additional
1737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// permissions described in the GCC Runtime Library Exception, version
1837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// 3.1, as published by the Free Software Foundation.
1937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
2037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// You should have received a copy of the GNU General Public License and
2137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// a copy of the GCC Runtime Library Exception along with this program;
2237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// <http://www.gnu.org/licenses/>.
2437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
2537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh/** @file profile/bitset
2637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh *  This file is a GNU profile extension to the Standard C++ Library.
2737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */
2837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
2937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifndef _GLIBCXX_PROFILE_BITSET
3037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#define _GLIBCXX_PROFILE_BITSET
3137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
3237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#include <bitset>
3337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
3437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehnamespace std _GLIBCXX_VISIBILITY(default)
3537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh{
3637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehnamespace __profile
3737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh{
3837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /// Class std::bitset wrapper with performance instrumentation.
3937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<size_t _Nb>
4037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class bitset
4137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    : public _GLIBCXX_STD_C::bitset<_Nb>
4237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
4337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _GLIBCXX_STD_C::bitset<_Nb> _Base;
4437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
4537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
4637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // bit reference:
4737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      class reference
4837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : private _Base::reference
4937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
5037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef typename _Base::reference _Base_ref;
5137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
5237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend class bitset;
5337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	reference();
5437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
5537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	reference(const _Base_ref& __base, bitset* __seq) _GLIBCXX_NOEXCEPT
5637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _Base_ref(__base)
5737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
5837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
5937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      public:
6037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	reference(const reference& __x) _GLIBCXX_NOEXCEPT
6137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _Base_ref(__x)
6237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
6337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
6437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	reference&
6537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator=(bool __x) _GLIBCXX_NOEXCEPT
6637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
6737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  *static_cast<_Base_ref*>(this) = __x;
6837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return *this;
6937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
7037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
7137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	reference&
7237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator=(const reference& __x) _GLIBCXX_NOEXCEPT
7337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
7437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  *static_cast<_Base_ref*>(this) = __x;
7537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return *this;
7637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
7737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
7837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	bool
7937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator~() const _GLIBCXX_NOEXCEPT
8037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
8137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return ~(*static_cast<const _Base_ref*>(this));
8237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
8337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
8437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator bool() const _GLIBCXX_NOEXCEPT
8537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
8637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return *static_cast<const _Base_ref*>(this);
8737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
8837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
8937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	reference&
9037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	flip() _GLIBCXX_NOEXCEPT
9137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
9237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _Base_ref::flip();
9337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return *this;
9437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
9537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
9637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
9737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // 23.3.5.1 constructors:
9837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT
9937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _Base() { }
10037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
10137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef __GXX_EXPERIMENTAL_CXX0X__
10237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      constexpr bitset(unsigned long long __val) noexcept
10337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else
10437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset(unsigned long __val)
10537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
10637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _Base(__val) { }
10737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
10837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _CharT, typename _Traits, typename _Alloc>
10937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        explicit
11037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str,
11137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
11237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __pos = 0,
11337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
11437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __n = (std::basic_string<_CharT, _Traits, _Alloc>::npos))
11537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _Base(__str, __pos, __n) { }
11637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
11737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // _GLIBCXX_RESOLVE_LIB_DEFECTS
11837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // 396. what are characters zero and one.
11937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<class _CharT, class _Traits, class _Alloc>
12037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str,
12137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
12237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __pos,
12337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
12437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __n,
12537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _CharT __zero, _CharT __one = _CharT('1'))
12637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _Base(__str, __pos, __n, __zero, __one) { }
12737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
12837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset(const _Base& __x) : _Base(__x) { }
12937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
13037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef __GXX_EXPERIMENTAL_CXX0X__
13137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _CharT>
13237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        explicit
13337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        bitset(const _CharT* __str,
13437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename std::basic_string<_CharT>::size_type __n
13537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       = std::basic_string<_CharT>::npos,
13637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
13737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _Base(__str, __n, __zero, __one) { }
13837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
13937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
14037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // 23.3.5.2 bitset operations:
14137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
14237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
14337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
14437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_base() &= __rhs;
14537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
14637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
14737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
14837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
14937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
15037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
15137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_base() |= __rhs;
15237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
15337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
15437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
15537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
15637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
15737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
15837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_base() ^= __rhs;
15937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
16037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
16137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
16237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
16337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator<<=(size_t __pos) _GLIBCXX_NOEXCEPT
16437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
16537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_base() <<= __pos;
16637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
16737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
16837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
16937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
17037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator>>=(size_t __pos) _GLIBCXX_NOEXCEPT
17137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
17237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_base() >>= __pos;
17337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
17437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
17537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
17637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
17737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      set() _GLIBCXX_NOEXCEPT
17837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
17937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_Base::set();
18037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
18137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
18237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
18337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // _GLIBCXX_RESOLVE_LIB_DEFECTS
18437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // 186. bitset::set() second parameter should be bool
18537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
18637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      set(size_t __pos, bool __val = true)
18737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
18837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_Base::set(__pos, __val);
18937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
19037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
19137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
19237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
19337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset() _GLIBCXX_NOEXCEPT
19437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
19537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_Base::reset();
19637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
19737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
19837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
19937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
20037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset(size_t __pos)
20137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
20237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_Base::reset(__pos);
20337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
20437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
20537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
20637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>
20737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator~() const _GLIBCXX_NOEXCEPT
20837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return bitset(~_M_base()); }
20937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
21037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
21137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      flip() _GLIBCXX_NOEXCEPT
21237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
21337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_Base::flip();
21437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
21537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
21637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
21737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>&
21837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      flip(size_t __pos)
21937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
22037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_Base::flip(__pos);
22137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return *this;
22237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
22337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
22437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // element access:
22537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // _GLIBCXX_RESOLVE_LIB_DEFECTS
22637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // 11. Bitset minor problems
22737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reference
22837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator[](size_t __pos)
22937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
23037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return reference(_M_base()[__pos], this);
23137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
23237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
23337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // _GLIBCXX_RESOLVE_LIB_DEFECTS
23437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // 11. Bitset minor problems
23537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _GLIBCXX_CONSTEXPR bool
23637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator[](size_t __pos) const
23737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
23837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _Base::operator[](__pos);
23937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
24037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
24137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      using _Base::to_ulong;
24237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef __GXX_EXPERIMENTAL_CXX0X__
24337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      using _Base::to_ullong;
24437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
24537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
24637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template <typename _CharT, typename _Traits, typename _Alloc>
24737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        std::basic_string<_CharT, _Traits, _Alloc>
24837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        to_string() const
24937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { return _M_base().template to_string<_CharT, _Traits, _Alloc>(); }
25037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
25137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // _GLIBCXX_RESOLVE_LIB_DEFECTS
25237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // 396. what are characters zero and one.
25337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<class _CharT, class _Traits, class _Alloc>
25437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::basic_string<_CharT, _Traits, _Alloc>
25537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
25637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
25737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return _M_base().template
25837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    to_string<_CharT, _Traits, _Alloc>(__zero, __one);
25937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
26037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
26137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // _GLIBCXX_RESOLVE_LIB_DEFECTS
26237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // 434. bitset::to_string() hard to use.
26337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _CharT, typename _Traits>
26437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
26537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        to_string() const
26637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }
26737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
26837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // _GLIBCXX_RESOLVE_LIB_DEFECTS
26937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // 853. to_string needs updating with zero and one.
27037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<class _CharT, class _Traits>
27137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
27237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
27337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return to_string<_CharT, _Traits,
27437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	                   std::allocator<_CharT> >(__zero, __one); }
27537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
27637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _CharT>
27737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        std::basic_string<_CharT, std::char_traits<_CharT>,
27837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh                          std::allocator<_CharT> >
27937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        to_string() const
28037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        {
28137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh          return to_string<_CharT, std::char_traits<_CharT>,
28237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh                           std::allocator<_CharT> >();
28337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        }
28437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
28537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<class _CharT>
28637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::basic_string<_CharT, std::char_traits<_CharT>,
28737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	                  std::allocator<_CharT> >
28837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
28937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
29037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return to_string<_CharT, std::char_traits<_CharT>,
29137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	                   std::allocator<_CharT> >(__zero, __one);
29237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
29337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
29437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::basic_string<char, std::char_traits<char>, std::allocator<char> >
29537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      to_string() const
29637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
29737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return to_string<char,std::char_traits<char>,std::allocator<char> >();
29837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
29937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
30037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::basic_string<char, std::char_traits<char>, std::allocator<char> >
30137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      to_string(char __zero, char __one = '1') const
30237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
30337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return to_string<char, std::char_traits<char>,
30437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	                 std::allocator<char> >(__zero, __one);
30537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
30637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
30737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      using _Base::count;
30837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      using _Base::size;
30937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
31037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bool
31137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
31237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_base() == __rhs; }
31337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
31437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bool
31537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
31637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_base() != __rhs; }
31737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
31837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      using _Base::test;
31937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      using _Base::all;
32037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      using _Base::any;
32137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      using _Base::none;
32237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
32337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>
32437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator<<(size_t __pos) const _GLIBCXX_NOEXCEPT
32537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return bitset<_Nb>(_M_base() << __pos); }
32637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
32737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bitset<_Nb>
32837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator>>(size_t __pos) const _GLIBCXX_NOEXCEPT
32937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return bitset<_Nb>(_M_base() >> __pos); }
33037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
33137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _Base&
33237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _M_base() _GLIBCXX_NOEXCEPT
33337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return *this; }
33437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
33537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      const _Base&
33637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _M_base() const _GLIBCXX_NOEXCEPT
33737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return *this; }
33837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
33937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
34037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<size_t _Nb>
34137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    bitset<_Nb>
34237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
34337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return bitset<_Nb>(__x) &= __y; }
34437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
34537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<size_t _Nb>
34637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    bitset<_Nb>
34737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
34837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return bitset<_Nb>(__x) |= __y; }
34937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
35037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<size_t _Nb>
35137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    bitset<_Nb>
35237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
35337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return bitset<_Nb>(__x) ^= __y; }
35437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
35537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _CharT, typename _Traits, size_t _Nb>
35637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_istream<_CharT, _Traits>&
35737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
35837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __is >> __x._M_base(); }
35937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
36037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _CharT, typename _Traits, size_t _Nb>
36137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
36237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
36337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const bitset<_Nb>& __x)
36437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __os << __x._M_base(); }
36537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh} // namespace __profile
36637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
36737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef __GXX_EXPERIMENTAL_CXX0X__
36837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  // DR 1182.
36937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /// std::hash specialization for bitset.
37037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<size_t _Nb>
37137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    struct hash<__profile::bitset<_Nb>>
37237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    : public __hash_base<size_t, __profile::bitset<_Nb>>
37337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
37437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      size_t
37537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator()(const __profile::bitset<_Nb>& __b) const noexcept
37637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::hash<_GLIBCXX_STD_C::bitset<_Nb>>()(__b._M_base()); }
37737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
37837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
37937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
38037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh} // namespace std
38137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
38237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
383