1ffeaf689SAlexander Kabaev// Debugging bitset implementation -*- C++ -*- 2ffeaf689SAlexander Kabaev 3*f8a1b7d9SAlexander Kabaev// Copyright (C) 2003, 2004, 2005 4ffeaf689SAlexander Kabaev// Free Software Foundation, Inc. 5ffeaf689SAlexander Kabaev// 6ffeaf689SAlexander Kabaev// This file is part of the GNU ISO C++ Library. This library is free 7ffeaf689SAlexander Kabaev// software; you can redistribute it and/or modify it under the 8ffeaf689SAlexander Kabaev// terms of the GNU General Public License as published by the 9ffeaf689SAlexander Kabaev// Free Software Foundation; either version 2, or (at your option) 10ffeaf689SAlexander Kabaev// any later version. 11ffeaf689SAlexander Kabaev 12ffeaf689SAlexander Kabaev// This library is distributed in the hope that it will be useful, 13ffeaf689SAlexander Kabaev// but WITHOUT ANY WARRANTY; without even the implied warranty of 14ffeaf689SAlexander Kabaev// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15ffeaf689SAlexander Kabaev// GNU General Public License for more details. 16ffeaf689SAlexander Kabaev 17ffeaf689SAlexander Kabaev// You should have received a copy of the GNU General Public License along 18ffeaf689SAlexander Kabaev// with this library; see the file COPYING. If not, write to the Free 19*f8a1b7d9SAlexander Kabaev// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 20ffeaf689SAlexander Kabaev// USA. 21ffeaf689SAlexander Kabaev 22ffeaf689SAlexander Kabaev// As a special exception, you may use this file as part of a free software 23ffeaf689SAlexander Kabaev// library without restriction. Specifically, if other files instantiate 24ffeaf689SAlexander Kabaev// templates or use macros or inline functions from this file, or you compile 25ffeaf689SAlexander Kabaev// this file and link it with other files to produce an executable, this 26ffeaf689SAlexander Kabaev// file does not by itself cause the resulting executable to be covered by 27ffeaf689SAlexander Kabaev// the GNU General Public License. This exception does not however 28ffeaf689SAlexander Kabaev// invalidate any other reasons why the executable file might be covered by 29ffeaf689SAlexander Kabaev// the GNU General Public License. 30ffeaf689SAlexander Kabaev 31*f8a1b7d9SAlexander Kabaev/** @file debug/bitset 32*f8a1b7d9SAlexander Kabaev * This file is a GNU debug extension to the Standard C++ Library. 33*f8a1b7d9SAlexander Kabaev */ 34*f8a1b7d9SAlexander Kabaev 35ffeaf689SAlexander Kabaev#ifndef _GLIBCXX_DEBUG_BITSET 36ffeaf689SAlexander Kabaev#define _GLIBCXX_DEBUG_BITSET 37ffeaf689SAlexander Kabaev 38ffeaf689SAlexander Kabaev#include <bitset> 39ffeaf689SAlexander Kabaev#include <debug/safe_sequence.h> 40ffeaf689SAlexander Kabaev#include <debug/safe_iterator.h> 41ffeaf689SAlexander Kabaev 42*f8a1b7d9SAlexander Kabaevnamespace std 43*f8a1b7d9SAlexander Kabaev{ 44*f8a1b7d9SAlexander Kabaevnamespace __debug 45ffeaf689SAlexander Kabaev{ 46ffeaf689SAlexander Kabaev template<size_t _Nb> 47ffeaf689SAlexander Kabaev class bitset 48ffeaf689SAlexander Kabaev : public _GLIBCXX_STD::bitset<_Nb>, 49ffeaf689SAlexander Kabaev public __gnu_debug::_Safe_sequence_base 50ffeaf689SAlexander Kabaev { 51ffeaf689SAlexander Kabaev typedef _GLIBCXX_STD::bitset<_Nb> _Base; 52ffeaf689SAlexander Kabaev typedef __gnu_debug::_Safe_sequence_base _Safe_base; 53ffeaf689SAlexander Kabaev 54ffeaf689SAlexander Kabaev public: 55ffeaf689SAlexander Kabaev // bit reference: 56ffeaf689SAlexander Kabaev class reference 57ffeaf689SAlexander Kabaev : private _Base::reference, public __gnu_debug::_Safe_iterator_base 58ffeaf689SAlexander Kabaev { 59ffeaf689SAlexander Kabaev typedef typename _Base::reference _Base_ref; 60ffeaf689SAlexander Kabaev 61ffeaf689SAlexander Kabaev friend class bitset; 62ffeaf689SAlexander Kabaev reference(); 63ffeaf689SAlexander Kabaev 64ffeaf689SAlexander Kabaev reference(const _Base_ref& __base, bitset* __seq) 65ffeaf689SAlexander Kabaev : _Base_ref(__base), _Safe_iterator_base(__seq, false) 66ffeaf689SAlexander Kabaev { } 67ffeaf689SAlexander Kabaev 68ffeaf689SAlexander Kabaev public: 69ffeaf689SAlexander Kabaev reference(const reference& __x) 70ffeaf689SAlexander Kabaev : _Base_ref(__x), _Safe_iterator_base(__x, false) 71ffeaf689SAlexander Kabaev { } 72ffeaf689SAlexander Kabaev 73ffeaf689SAlexander Kabaev reference& 74ffeaf689SAlexander Kabaev operator=(bool __x) 75ffeaf689SAlexander Kabaev { 76ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_VERIFY(! this->_M_singular(), 77*f8a1b7d9SAlexander Kabaev _M_message(__gnu_debug::__msg_bad_bitset_write) 78ffeaf689SAlexander Kabaev ._M_iterator(*this)); 79ffeaf689SAlexander Kabaev *static_cast<_Base_ref*>(this) = __x; 80ffeaf689SAlexander Kabaev return *this; 81ffeaf689SAlexander Kabaev } 82ffeaf689SAlexander Kabaev 83ffeaf689SAlexander Kabaev reference& 84ffeaf689SAlexander Kabaev operator=(const reference& __x) 85ffeaf689SAlexander Kabaev { 86ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_VERIFY(! __x._M_singular(), 87*f8a1b7d9SAlexander Kabaev _M_message(__gnu_debug::__msg_bad_bitset_read) 88ffeaf689SAlexander Kabaev ._M_iterator(__x)); 89ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_VERIFY(! this->_M_singular(), 90*f8a1b7d9SAlexander Kabaev _M_message(__gnu_debug::__msg_bad_bitset_write) 91ffeaf689SAlexander Kabaev ._M_iterator(*this)); 92ffeaf689SAlexander Kabaev *static_cast<_Base_ref*>(this) = __x; 93ffeaf689SAlexander Kabaev return *this; 94ffeaf689SAlexander Kabaev } 95ffeaf689SAlexander Kabaev 96ffeaf689SAlexander Kabaev bool 97ffeaf689SAlexander Kabaev operator~() const 98ffeaf689SAlexander Kabaev { 99ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_VERIFY(! this->_M_singular(), 100*f8a1b7d9SAlexander Kabaev _M_message(__gnu_debug::__msg_bad_bitset_read) 101ffeaf689SAlexander Kabaev ._M_iterator(*this)); 102ffeaf689SAlexander Kabaev return ~(*static_cast<const _Base_ref*>(this)); 103ffeaf689SAlexander Kabaev } 104ffeaf689SAlexander Kabaev 105ffeaf689SAlexander Kabaev operator bool() const 106ffeaf689SAlexander Kabaev { 107ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_VERIFY(! this->_M_singular(), 108*f8a1b7d9SAlexander Kabaev _M_message(__gnu_debug::__msg_bad_bitset_read) 109ffeaf689SAlexander Kabaev ._M_iterator(*this)); 110ffeaf689SAlexander Kabaev return *static_cast<const _Base_ref*>(this); 111ffeaf689SAlexander Kabaev } 112ffeaf689SAlexander Kabaev 113ffeaf689SAlexander Kabaev reference& 114ffeaf689SAlexander Kabaev flip() 115ffeaf689SAlexander Kabaev { 116ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_VERIFY(! this->_M_singular(), 117*f8a1b7d9SAlexander Kabaev _M_message(__gnu_debug::__msg_bad_bitset_flip) 118ffeaf689SAlexander Kabaev ._M_iterator(*this)); 119ffeaf689SAlexander Kabaev _Base_ref::flip(); 120ffeaf689SAlexander Kabaev return *this; 121ffeaf689SAlexander Kabaev } 122ffeaf689SAlexander Kabaev }; 123ffeaf689SAlexander Kabaev 124ffeaf689SAlexander Kabaev // 23.3.5.1 constructors: 125ffeaf689SAlexander Kabaev bitset() : _Base() { } 126ffeaf689SAlexander Kabaev 127ffeaf689SAlexander Kabaev bitset(unsigned long __val) : _Base(__val) { } 128ffeaf689SAlexander Kabaev 129ffeaf689SAlexander Kabaev template<typename _CharT, typename _Traits, typename _Allocator> 130ffeaf689SAlexander Kabaev explicit 131ffeaf689SAlexander Kabaev bitset(const std::basic_string<_CharT,_Traits,_Allocator>& __str, 132ffeaf689SAlexander Kabaev typename std::basic_string<_CharT,_Traits,_Allocator>::size_type 133ffeaf689SAlexander Kabaev __pos = 0, 134ffeaf689SAlexander Kabaev typename std::basic_string<_CharT,_Traits,_Allocator>::size_type 135ffeaf689SAlexander Kabaev __n = (std::basic_string<_CharT,_Traits,_Allocator>::npos)) 136ffeaf689SAlexander Kabaev : _Base(__str, __pos, __n) { } 137ffeaf689SAlexander Kabaev 138ffeaf689SAlexander Kabaev bitset(const _Base& __x) : _Base(__x), _Safe_base() { } 139ffeaf689SAlexander Kabaev 140ffeaf689SAlexander Kabaev // 23.3.5.2 bitset operations: 141ffeaf689SAlexander Kabaev bitset<_Nb>& 142ffeaf689SAlexander Kabaev operator&=(const bitset<_Nb>& __rhs) 143ffeaf689SAlexander Kabaev { 144ffeaf689SAlexander Kabaev _M_base() &= __rhs; 145ffeaf689SAlexander Kabaev return *this; 146ffeaf689SAlexander Kabaev } 147ffeaf689SAlexander Kabaev 148ffeaf689SAlexander Kabaev bitset<_Nb>& 149ffeaf689SAlexander Kabaev operator|=(const bitset<_Nb>& __rhs) 150ffeaf689SAlexander Kabaev { 151ffeaf689SAlexander Kabaev _M_base() |= __rhs; 152ffeaf689SAlexander Kabaev return *this; 153ffeaf689SAlexander Kabaev } 154ffeaf689SAlexander Kabaev 155ffeaf689SAlexander Kabaev bitset<_Nb>& 156ffeaf689SAlexander Kabaev operator^=(const bitset<_Nb>& __rhs) 157ffeaf689SAlexander Kabaev { 158ffeaf689SAlexander Kabaev _M_base() ^= __rhs; 159ffeaf689SAlexander Kabaev return *this; 160ffeaf689SAlexander Kabaev } 161ffeaf689SAlexander Kabaev 162ffeaf689SAlexander Kabaev bitset<_Nb>& 163ffeaf689SAlexander Kabaev operator<<=(size_t __pos) 164ffeaf689SAlexander Kabaev { 165ffeaf689SAlexander Kabaev _M_base() <<= __pos; 166ffeaf689SAlexander Kabaev return *this; 167ffeaf689SAlexander Kabaev } 168ffeaf689SAlexander Kabaev 169ffeaf689SAlexander Kabaev bitset<_Nb>& 170ffeaf689SAlexander Kabaev operator>>=(size_t __pos) 171ffeaf689SAlexander Kabaev { 172ffeaf689SAlexander Kabaev _M_base() >>= __pos; 173ffeaf689SAlexander Kabaev return *this; 174ffeaf689SAlexander Kabaev } 175ffeaf689SAlexander Kabaev 176ffeaf689SAlexander Kabaev bitset<_Nb>& 177ffeaf689SAlexander Kabaev set() 178ffeaf689SAlexander Kabaev { 179ffeaf689SAlexander Kabaev _Base::set(); 180ffeaf689SAlexander Kabaev return *this; 181ffeaf689SAlexander Kabaev } 182ffeaf689SAlexander Kabaev 183ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS 184ffeaf689SAlexander Kabaev // 186. bitset::set() second parameter should be bool 185ffeaf689SAlexander Kabaev bitset<_Nb>& 186ffeaf689SAlexander Kabaev set(size_t __pos, bool __val = true) 187ffeaf689SAlexander Kabaev { 188ffeaf689SAlexander Kabaev _Base::set(__pos, __val); 189ffeaf689SAlexander Kabaev return *this; 190ffeaf689SAlexander Kabaev } 191ffeaf689SAlexander Kabaev 192ffeaf689SAlexander Kabaev bitset<_Nb>& 193ffeaf689SAlexander Kabaev reset() 194ffeaf689SAlexander Kabaev { 195ffeaf689SAlexander Kabaev _Base::reset(); 196ffeaf689SAlexander Kabaev return *this; 197ffeaf689SAlexander Kabaev } 198ffeaf689SAlexander Kabaev 199ffeaf689SAlexander Kabaev bitset<_Nb>& 200ffeaf689SAlexander Kabaev reset(size_t __pos) 201ffeaf689SAlexander Kabaev { 202ffeaf689SAlexander Kabaev _Base::reset(__pos); 203ffeaf689SAlexander Kabaev return *this; 204ffeaf689SAlexander Kabaev } 205ffeaf689SAlexander Kabaev 206ffeaf689SAlexander Kabaev bitset<_Nb> operator~() const { return bitset(~_M_base()); } 207ffeaf689SAlexander Kabaev 208ffeaf689SAlexander Kabaev bitset<_Nb>& 209ffeaf689SAlexander Kabaev flip() 210ffeaf689SAlexander Kabaev { 211ffeaf689SAlexander Kabaev _Base::flip(); 212ffeaf689SAlexander Kabaev return *this; 213ffeaf689SAlexander Kabaev } 214ffeaf689SAlexander Kabaev 215ffeaf689SAlexander Kabaev bitset<_Nb>& 216ffeaf689SAlexander Kabaev flip(size_t __pos) 217ffeaf689SAlexander Kabaev { 218ffeaf689SAlexander Kabaev _Base::flip(__pos); 219ffeaf689SAlexander Kabaev return *this; 220ffeaf689SAlexander Kabaev } 221ffeaf689SAlexander Kabaev 222ffeaf689SAlexander Kabaev // element access: 223ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS 224ffeaf689SAlexander Kabaev // 11. Bitset minor problems 225ffeaf689SAlexander Kabaev reference 226ffeaf689SAlexander Kabaev operator[](size_t __pos) 227ffeaf689SAlexander Kabaev { 228ffeaf689SAlexander Kabaev __glibcxx_check_subscript(__pos); 229ffeaf689SAlexander Kabaev return reference(_M_base()[__pos], this); 230ffeaf689SAlexander Kabaev } 231ffeaf689SAlexander Kabaev 232ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS 233ffeaf689SAlexander Kabaev // 11. Bitset minor problems 234ffeaf689SAlexander Kabaev bool 235ffeaf689SAlexander Kabaev operator[](size_t __pos) const 236ffeaf689SAlexander Kabaev { 237ffeaf689SAlexander Kabaev __glibcxx_check_subscript(__pos); 238ffeaf689SAlexander Kabaev return _M_base()[__pos]; 239ffeaf689SAlexander Kabaev } 240ffeaf689SAlexander Kabaev 241ffeaf689SAlexander Kabaev using _Base::to_ulong; 242ffeaf689SAlexander Kabaev 243ffeaf689SAlexander Kabaev template <typename _CharT, typename _Traits, typename _Allocator> 244ffeaf689SAlexander Kabaev std::basic_string<_CharT, _Traits, _Allocator> 245ffeaf689SAlexander Kabaev to_string() const 246ffeaf689SAlexander Kabaev { return _M_base().template to_string<_CharT, _Traits, _Allocator>(); } 247ffeaf689SAlexander Kabaev 248*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS 249*f8a1b7d9SAlexander Kabaev // 434. bitset::to_string() hard to use. 250*f8a1b7d9SAlexander Kabaev template<typename _CharT, typename _Traits> 251*f8a1b7d9SAlexander Kabaev std::basic_string<_CharT, _Traits, std::allocator<_CharT> > 252*f8a1b7d9SAlexander Kabaev to_string() const 253*f8a1b7d9SAlexander Kabaev { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); } 254*f8a1b7d9SAlexander Kabaev 255*f8a1b7d9SAlexander Kabaev template<typename _CharT> 256*f8a1b7d9SAlexander Kabaev std::basic_string<_CharT, std::char_traits<_CharT>, 257*f8a1b7d9SAlexander Kabaev std::allocator<_CharT> > 258*f8a1b7d9SAlexander Kabaev to_string() const 259*f8a1b7d9SAlexander Kabaev { 260*f8a1b7d9SAlexander Kabaev return to_string<_CharT, std::char_traits<_CharT>, 261*f8a1b7d9SAlexander Kabaev std::allocator<_CharT> >(); 262*f8a1b7d9SAlexander Kabaev } 263*f8a1b7d9SAlexander Kabaev 264*f8a1b7d9SAlexander Kabaev std::basic_string<char, std::char_traits<char>, std::allocator<char> > 265*f8a1b7d9SAlexander Kabaev to_string() const 266*f8a1b7d9SAlexander Kabaev { 267*f8a1b7d9SAlexander Kabaev return to_string<char,std::char_traits<char>,std::allocator<char> >(); 268*f8a1b7d9SAlexander Kabaev } 269*f8a1b7d9SAlexander Kabaev 270ffeaf689SAlexander Kabaev using _Base::count; 271ffeaf689SAlexander Kabaev using _Base::size; 272ffeaf689SAlexander Kabaev 273ffeaf689SAlexander Kabaev bool 274ffeaf689SAlexander Kabaev operator==(const bitset<_Nb>& __rhs) const 275ffeaf689SAlexander Kabaev { return _M_base() == __rhs; } 276ffeaf689SAlexander Kabaev 277ffeaf689SAlexander Kabaev bool 278ffeaf689SAlexander Kabaev operator!=(const bitset<_Nb>& __rhs) const 279ffeaf689SAlexander Kabaev { return _M_base() != __rhs; } 280ffeaf689SAlexander Kabaev 281ffeaf689SAlexander Kabaev using _Base::test; 282ffeaf689SAlexander Kabaev using _Base::any; 283ffeaf689SAlexander Kabaev using _Base::none; 284ffeaf689SAlexander Kabaev 285ffeaf689SAlexander Kabaev bitset<_Nb> 286ffeaf689SAlexander Kabaev operator<<(size_t __pos) const 287ffeaf689SAlexander Kabaev { return bitset<_Nb>(_M_base() << __pos); } 288ffeaf689SAlexander Kabaev 289ffeaf689SAlexander Kabaev bitset<_Nb> 290ffeaf689SAlexander Kabaev operator>>(size_t __pos) const 291ffeaf689SAlexander Kabaev { return bitset<_Nb>(_M_base() >> __pos); } 292ffeaf689SAlexander Kabaev 293ffeaf689SAlexander Kabaev _Base& 294ffeaf689SAlexander Kabaev _M_base() { return *this; } 295ffeaf689SAlexander Kabaev 296ffeaf689SAlexander Kabaev const _Base& 297ffeaf689SAlexander Kabaev _M_base() const { return *this; } 298ffeaf689SAlexander Kabaev }; 299ffeaf689SAlexander Kabaev 300ffeaf689SAlexander Kabaev template<size_t _Nb> 301ffeaf689SAlexander Kabaev bitset<_Nb> 302ffeaf689SAlexander Kabaev operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) 303ffeaf689SAlexander Kabaev { return bitset<_Nb>(__x) &= __y; } 304ffeaf689SAlexander Kabaev 305ffeaf689SAlexander Kabaev template<size_t _Nb> 306ffeaf689SAlexander Kabaev bitset<_Nb> 307ffeaf689SAlexander Kabaev operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) 308ffeaf689SAlexander Kabaev { return bitset<_Nb>(__x) |= __y; } 309ffeaf689SAlexander Kabaev 310ffeaf689SAlexander Kabaev template<size_t _Nb> 311ffeaf689SAlexander Kabaev bitset<_Nb> 312ffeaf689SAlexander Kabaev operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) 313ffeaf689SAlexander Kabaev { return bitset<_Nb>(__x) ^= __y; } 314ffeaf689SAlexander Kabaev 315ffeaf689SAlexander Kabaev template<typename _CharT, typename _Traits, size_t _Nb> 316ffeaf689SAlexander Kabaev std::basic_istream<_CharT, _Traits>& 317ffeaf689SAlexander Kabaev operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x) 318ffeaf689SAlexander Kabaev { return __is >> __x._M_base(); } 319ffeaf689SAlexander Kabaev 320ffeaf689SAlexander Kabaev template<typename _CharT, typename _Traits, size_t _Nb> 321ffeaf689SAlexander Kabaev std::basic_ostream<_CharT, _Traits>& 322ffeaf689SAlexander Kabaev operator<<(std::basic_ostream<_CharT, _Traits>& __os, 323ffeaf689SAlexander Kabaev const bitset<_Nb>& __x) 324ffeaf689SAlexander Kabaev { return __os << __x._M_base(); } 325*f8a1b7d9SAlexander Kabaev} // namespace __debug 326*f8a1b7d9SAlexander Kabaev} // namespace std 327ffeaf689SAlexander Kabaev 328ffeaf689SAlexander Kabaev#endif 329