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