19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1998 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc. 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk. 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies. 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted, 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice. 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_BITSET_H 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_BITSET_H 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A bitset of size N has N % (sizeof(unsigned long) * CHAR_BIT) unused 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// bits. (They are the high- order bits in the highest word.) It is 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// a class invariant of class bitset<> that those unused bits are 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// always zero. 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Most of the actual code isn't contained in bitset<> itself, but in the 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// base class _Base_bitset. The base class works with whole words, not with 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// individual bits. This allows us to specialize _Base_bitset for the 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// important special case where the bitset is only a single word. 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The C++ standard does not define the precise semantics of operator[]. 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// In this implementation the const version of operator[] is equivalent 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// to test(), except that it does no range checking. The non-const version 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// returns a reference to a bit, again without doing any range checking. 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALGOBASE_H 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_algobase.h> 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALLOC_H 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_alloc.h> 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ITERATOR_H 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_iterator.h> 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_UNINITIALIZED_H 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_uninitialized.h> 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_RANGE_ERRORS_H 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_range_errors.h> 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_STRING_H 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_string.h> 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define __BITS_PER_WORD (CHAR_BIT*sizeof(unsigned long)) 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define __BITSET_WORDS(__n) ((__n + __BITS_PER_WORD - 1)/__BITS_PER_WORD) 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// structure to aid in counting bits 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _STLP_CLASS_DECLSPEC _Bs_G 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block public: 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //returns the number of bit set within the buffer between __beg and __end. 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _S_count(const unsigned char *__beg, const unsigned char *__end) 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_NO_IOSTREAMS) 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __result = 0; 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __beg != __end; ++__beg) { 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (size_t i = 0; i < (sizeof(unsigned char) * 8); ++i) { 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ((*__beg & (1 << i)) != 0) { ++__result; } 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ; 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Mapping from 8 bit unsigned integers to the index of the first one bit set: 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static unsigned char _S_first_one(unsigned char __x) 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_NO_IOSTREAMS) 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (unsigned char i = 0; i < (sizeof(unsigned char) * 8); ++i) { 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ((__x & (1 << i)) != 0) { return i; } 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return 0; 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ; 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Base class: general case. 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<size_t _Nw> 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Base_bitset { 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef unsigned long _WordT; 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT _M_w[_Nw]; // 0 is the least significant word. 1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base_bitset() { _M_do_reset(); } 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base_bitset(unsigned long __val) { 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_do_reset(); 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_w[0] = __val; 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _STLP_CALL _S_whichword( size_t __pos ) { 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __pos / __BITS_PER_WORD; 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _STLP_CALL _S_whichbyte( size_t __pos ) { 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__pos % __BITS_PER_WORD) / CHAR_BIT; 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _STLP_CALL _S_whichbit( size_t __pos ) { 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __pos % __BITS_PER_WORD; 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _WordT _STLP_CALL _S_maskbit( size_t __pos ) { 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __STATIC_CAST(_WordT,1) << _S_whichbit(__pos); 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT& _M_getword(size_t __pos) { return _M_w[_S_whichword(__pos)]; } 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT _M_getword(size_t __pos) const { return _M_w[_S_whichword(__pos)]; } 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT& _M_hiword() { return _M_w[_Nw - 1]; } 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT _M_hiword() const { return _M_w[_Nw - 1]; } 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_and(const _Base_bitset<_Nw>& __x) { 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( size_t __i = 0; __i < _Nw; __i++ ) { 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_w[__i] &= __x._M_w[__i]; 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_or(const _Base_bitset<_Nw>& __x) { 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( size_t __i = 0; __i < _Nw; __i++ ) { 1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_w[__i] |= __x._M_w[__i]; 1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_xor(const _Base_bitset<_Nw>& __x) { 1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( size_t __i = 0; __i < _Nw; __i++ ) { 1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_w[__i] ^= __x._M_w[__i]; 1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_left_shift(size_t __shift); 1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_right_shift(size_t __shift); 1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_flip() { 1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( size_t __i = 0; __i < _Nw; __i++ ) { 1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_w[__i] = ~_M_w[__i]; 1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_set() { 1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( size_t __i = 0; __i < _Nw; __i++ ) { 1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_w[__i] = ~__STATIC_CAST(_WordT,0); 1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_reset() { memset(_M_w, 0, _Nw * sizeof(_WordT)); } 1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool _M_is_equal(const _Base_bitset<_Nw>& __x) const { 1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (size_t __i = 0; __i < _Nw; ++__i) { 1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_w[__i] != __x._M_w[__i]) 1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return false; 1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return true; 1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool _M_is_any() const { 1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( size_t __i = 0; __i < _Nw ; __i++ ) { 1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ( _M_w[__i] != __STATIC_CAST(_WordT,0) ) 1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return true; 1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return false; 1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_do_count() const { 1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const unsigned char* __byte_ptr = (const unsigned char*)_M_w; 1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const unsigned char* __end_ptr = (const unsigned char*)(_M_w+_Nw); 1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Bs_G::_S_count(__byte_ptr, __end_ptr); 1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block unsigned long _M_do_to_ulong() const; 1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // find first "on" bit 2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_do_find_first(size_t __not_found) const; 2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // find the next "on" bit that follows "prev" 2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_do_find_next(size_t __prev, size_t __not_found) const; 2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Base class: specialization for a single word. 2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL 2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Base_bitset<1UL> { 2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef unsigned long _WordT; 2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Base_bitset<1UL> _Self; 2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT _M_w; 2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base_bitset( void ) : _M_w(0) {} 2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Base_bitset(unsigned long __val) : _M_w(__val) {} 2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _STLP_CALL _S_whichword( size_t __pos ) { 2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __pos / __BITS_PER_WORD ; 2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _STLP_CALL _S_whichbyte( size_t __pos ) { 2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__pos % __BITS_PER_WORD) / CHAR_BIT; 2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static size_t _STLP_CALL _S_whichbit( size_t __pos ) { 2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __pos % __BITS_PER_WORD; 2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static _WordT _STLP_CALL _S_maskbit( size_t __pos ) { 2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (__STATIC_CAST(_WordT,1)) << _S_whichbit(__pos); 2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT& _M_getword(size_t) { return _M_w; } 2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT _M_getword(size_t) const { return _M_w; } 2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT& _M_hiword() { return _M_w; } 2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT _M_hiword() const { return _M_w; } 2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_and(const _Self& __x) { _M_w &= __x._M_w; } 2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_or(const _Self& __x) { _M_w |= __x._M_w; } 2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_xor(const _Self& __x) { _M_w ^= __x._M_w; } 2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_left_shift(size_t __shift) { _M_w <<= __shift; } 2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_right_shift(size_t __shift) { _M_w >>= __shift; } 2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_flip() { _M_w = ~_M_w; } 2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_set() { _M_w = ~__STATIC_CAST(_WordT,0); } 2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_reset() { _M_w = 0; } 2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool _M_is_equal(const _Self& __x) const { 2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_w == __x._M_w; 2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool _M_is_any() const { 2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_w != 0; 2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_do_count() const { 2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const unsigned char* __byte_ptr = (const unsigned char*)&_M_w; 2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const unsigned char* __end_ptr = ((const unsigned char*)&_M_w)+sizeof(_M_w); 2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Bs_G::_S_count(__byte_ptr, __end_ptr); 2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block unsigned long _M_do_to_ulong() const { return _M_w; } 2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block inline size_t _M_do_find_first(size_t __not_found) const; 2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // find the next "on" bit that follows "prev" 2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block inline size_t _M_do_find_next(size_t __prev, size_t __not_found) const; 2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// ------------------------------------------------------------ 2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Definitions of should-be-non-inline functions from the single-word version of 2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// _Base_bitset. 2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline size_t 2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Base_bitset<1UL>::_M_do_find_first(size_t __not_found) const { 2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // typedef unsigned long _WordT; 2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT __thisword = _M_w; 2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ( __thisword != __STATIC_CAST(_WordT,0) ) { 2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // find byte within word 2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) { 2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block unsigned char __this_byte 2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0))); 2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ( __this_byte ) 2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __j*CHAR_BIT + _Bs_G::_S_first_one(__this_byte); 2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __thisword >>= CHAR_BIT; 2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // not found, so return a value that indicates failure. 2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __not_found; 2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline size_t 2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Base_bitset<1UL>::_M_do_find_next(size_t __prev, 2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __not_found ) const { 2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // make bound inclusive 2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__prev; 2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // check out of bounds 3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ( __prev >= __BITS_PER_WORD ) 3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __not_found; 3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // search first (and only) word 3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT __thisword = _M_w; 3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // mask off bits below bound 3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __thisword &= (~__STATIC_CAST(_WordT,0)) << _S_whichbit(__prev); 3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ( __thisword != __STATIC_CAST(_WordT,0) ) { 3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // find byte within word 3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // get first byte into place 3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __thisword >>= _S_whichbyte(__prev) * CHAR_BIT; 3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++ ) { 3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block unsigned char __this_byte 3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0))); 3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ( __this_byte ) 3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __j*CHAR_BIT + _Bs_G::_S_first_one(__this_byte); 3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __thisword >>= CHAR_BIT; 3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // not found, so return a value that indicates failure. 3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __not_found; 3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} // end _M_do_find_next 3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// ------------------------------------------------------------ 3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Helper class to zero out the unused high-order bits in the highest word. 3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <size_t _Extrabits> struct _Sanitize { 3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _STLP_CALL _M_do_sanitize(unsigned long& __val) 3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { __val &= ~((~__STATIC_CAST(unsigned long,0)) << _Extrabits); } 3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL struct _Sanitize<0UL> { 3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _STLP_CALL _M_do_sanitize(unsigned long) {} 3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// ------------------------------------------------------------ 3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Class bitset. 3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// _Nb may be any nonzero number of type size_t. 3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<size_t _Nb> 3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass bitset : public _STLP_PRIV _Base_bitset<__BITSET_WORDS(_Nb) > { 3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block enum { _Words = __BITSET_WORDS(_Nb) } ; 3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: 3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLP_PRIV _Base_bitset< _Words > _Base; 3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_do_sanitize() { 3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_PRIV _Sanitize<_Nb%__BITS_PER_WORD >::_M_do_sanitize(this->_M_hiword()); 3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef unsigned long _WordT; 3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block struct reference; 3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend struct reference; 3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // bit reference: 3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block struct reference { 3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLP_PRIV _Base_bitset<_Words > _Bitset_base; 3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef bitset<_Nb> _Bitset; 3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // friend _Bitset; 3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _WordT *_M_wp; 3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _M_bpos; 3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // should be left undefined 3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference() {} 3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference( _Bitset& __b, size_t __pos ) { 3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_wp = &__b._M_getword(__pos); 3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_bpos = _Bitset_base::_S_whichbit(__pos); 3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block public: 3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~reference() {} 3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // for b[i] = __x; 3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference& operator=(bool __x) { 3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ( __x ) 3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *_M_wp |= _Bitset_base::_S_maskbit(_M_bpos); 3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *_M_wp &= ~_Bitset_base::_S_maskbit(_M_bpos); 3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // for b[i] = b[__j]; 3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference& operator=(const reference& __j) { 3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ( (*(__j._M_wp) & _Bitset_base::_S_maskbit(__j._M_bpos)) ) 3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *_M_wp |= _Bitset_base::_S_maskbit(_M_bpos); 3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *_M_wp &= ~_Bitset_base::_S_maskbit(_M_bpos); 3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // flips the bit 4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool operator~() const { return (*(_M_wp) & _Bitset_base::_S_maskbit(_M_bpos)) == 0; } 4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // for __x = b[i]; 4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block operator bool() const { return (*(_M_wp) & _Bitset_base::_S_maskbit(_M_bpos)) != 0; } 4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // for b[i].flip(); 4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference& flip() { 4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *_M_wp ^= _Bitset_base::_S_maskbit(_M_bpos); 4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block }; 4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 23.3.5.1 constructors: 4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset() {} 4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset(unsigned long __val) : _STLP_PRIV _Base_bitset<_Words>(__val) { _M_do_sanitize(); } 4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) 4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template<class _CharT, class _Traits, class _Alloc> 4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block explicit bitset(const basic_string<_CharT,_Traits,_Alloc>& __s, 4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __pos = 0) 4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _STLP_PRIV _Base_bitset<_Words >() { 4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos > __s.size()) 4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_throw_out_of_range("bitset"); 4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copy_from_string(__s, __pos, 4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_string<_CharT, _Traits, _Alloc>::npos); 4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template<class _CharT, class _Traits, class _Alloc> 4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset(const basic_string<_CharT, _Traits, _Alloc>& __s, 4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __pos, 4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __n) 4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _STLP_PRIV _Base_bitset<_Words >() { 4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos > __s.size()) 4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_throw_out_of_range("bitset"); 4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copy_from_string(__s, __pos, __n); 4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */ 4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block explicit bitset(const string& __s, 4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __pos = 0, 4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __n = (size_t)-1) 4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _STLP_PRIV _Base_bitset<_Words >() { 4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos > __s.size()) 4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_throw_out_of_range("bitset"); 4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copy_from_string(__s, __pos, __n); 4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */ 4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 23.3.5.2 bitset operations: 4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& operator&=(const bitset<_Nb>& __rhs) { 4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_and(__rhs); 4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& operator|=(const bitset<_Nb>& __rhs) { 4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_or(__rhs); 4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& operator^=(const bitset<_Nb>& __rhs) { 4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_xor(__rhs); 4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& operator<<=(size_t __pos) { 4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_left_shift(__pos); 4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_sanitize(); 4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& operator>>=(size_t __pos) { 4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_right_shift(__pos); 4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_sanitize(); 4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Extension: 4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Versions of single-bit set, reset, flip, test with no range checking. 4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& _Unchecked_set(size_t __pos) { 4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_getword(__pos) |= _STLP_PRIV _Base_bitset<_Words > ::_S_maskbit(__pos); 4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& _Unchecked_set(size_t __pos, int __val) { 4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__val) 4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_getword(__pos) |= this->_S_maskbit(__pos); 4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_getword(__pos) &= ~ this->_S_maskbit(__pos); 4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& _Unchecked_reset(size_t __pos) { 4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_getword(__pos) &= ~ this->_S_maskbit(__pos); 4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& _Unchecked_flip(size_t __pos) { 5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_getword(__pos) ^= this->_S_maskbit(__pos); 5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool _Unchecked_test(size_t __pos) const { 5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (this->_M_getword(__pos) & this->_S_maskbit(__pos)) != __STATIC_CAST(_WordT,0); 5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Set, reset, and flip. 5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& set() { 5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_set(); 5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_sanitize(); 5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& set(size_t __pos) { 5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos >= _Nb) 5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_throw_out_of_range("bitset"); 5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Unchecked_set(__pos); 5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& set(size_t __pos, int __val) { 5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos >= _Nb) 5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_throw_out_of_range("bitset"); 5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Unchecked_set(__pos, __val); 5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& reset() { 5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_reset(); 5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& reset(size_t __pos) { 5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos >= _Nb) 5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_throw_out_of_range("bitset"); 5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Unchecked_reset(__pos); 5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& flip() { 5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_flip(); 5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_do_sanitize(); 5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb>& flip(size_t __pos) { 5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos >= _Nb) 5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_throw_out_of_range("bitset"); 5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Unchecked_flip(__pos); 5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> operator~() const { 5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return bitset<_Nb>(*this).flip(); 5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // element access: 5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //for b[i]; 5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reference operator[](size_t __pos) { return reference(*this,__pos); } 5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool operator[](size_t __pos) const { return _Unchecked_test(__pos); } 5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block unsigned long to_ulong() const { return this->_M_do_to_ulong(); } 5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) && !defined (_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS) 5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _CharT, class _Traits, class _Alloc> 5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_string<_CharT, _Traits, _Alloc> to_string() const { 5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_string<_CharT, _Traits, _Alloc> __result; 5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copy_to_string(__result); 5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block string to_string() const { 5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block string __result; 5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_copy_to_string(__result); 5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_EXPLICIT_FUNCTION_TMPL_ARGS */ 5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t count() const { return this->_M_do_count(); } 5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t size() const { return _Nb; } 5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool operator==(const bitset<_Nb>& __rhs) const { 5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return this->_M_is_equal(__rhs); 5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool operator!=(const bitset<_Nb>& __rhs) const { 5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return !this->_M_is_equal(__rhs); 5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool test(size_t __pos) const { 5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos >= _Nb) 5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_throw_out_of_range("bitset"); 5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Unchecked_test(__pos); 5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool any() const { return this->_M_is_any(); } 6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool none() const { return !this->_M_is_any(); } 6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> operator<<(size_t __pos) const { 6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> __result(*this); 6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result <<= __pos ; return __result; 6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> operator>>(size_t __pos) const { 6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> __result(*this); 6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result >>= __pos ; return __result; 6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_EXTENSIONS) 6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // EXTENSIONS: bit-find operations. These operations are 6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // experimental, and are subject to change or removal in future 6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // versions. 6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // find the index of the first "on" bit 6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _Find_first() const 6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return this->_M_do_find_first(_Nb); } 6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // find the index of the next "on" bit after prev 6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t _Find_next( size_t __prev ) const 6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return this->_M_do_find_next(__prev, _Nb); } 6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Definitions of should-be non-inline member functions. 6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) 6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template<class _CharT, class _Traits, class _Alloc> 6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s, 6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __pos, size_t __n) { 6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_copy_from_string(const string& __s, 6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __pos, size_t __n) { 6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename string::traits_type _Traits; 6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reset(); 6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __tmp = _Nb; 6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_t __Nbits = (min) (__tmp, (min) (__n, __s.size() - __pos)); 6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( size_t __i= 0; __i < __Nbits; ++__i) { 6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _Traits::int_type __k = _Traits::to_int_type(__s[__pos + __Nbits - __i - 1]); 6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // boris : widen() ? 6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__k == '1') 6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block set(__i); 6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else if (__k != '0') 6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __stl_throw_invalid_argument("bitset"); 6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) 6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _CharT, class _Traits, class _Alloc> 6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_copy_to_string(basic_string<_CharT, _Traits, _Alloc>& __s) const 6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_copy_to_string(string& __s) const 6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { 6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __s.assign(_Nb, '0'); 6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (size_t __i = 0; __i < _Nb; ++__i) { 6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Unchecked_test(__i)) 6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __s[_Nb - 1 - __i] = '1'; 6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_MEMBER_TEMPLATES) && !defined (_STLP_NO_WCHAR_T) 6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_copy_to_string(wstring& __s) const { 6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __s.assign(_Nb, '0'); 6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (size_t __i = 0; __i < _Nb; ++__i) { 6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Unchecked_test(__i)) 6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __s[_Nb - 1 - __i] = '1'; 6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) 6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> operator&(const bitset<_Nb>& __y) const { 6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> __result(*this); 6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result &= __y; 6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> operator|(const bitset<_Nb>& __y) const { 6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> __result(*this); 6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result |= __y; 6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> operator^(const bitset<_Nb>& __y) const { 6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> __result(*this); 6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result ^= __y; 6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// ------------------------------------------------------------ 6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 23.3.5.3 bitset operations: 7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if ! defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) 7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <size_t _Nb> 7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bitset<_Nb> _STLP_CALL 7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator&(const bitset<_Nb>& __x, 7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const bitset<_Nb>& __y) { 7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> __result(__x); 7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result &= __y; 7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <size_t _Nb> 7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bitset<_Nb> _STLP_CALL 7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator|(const bitset<_Nb>& __x, 7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const bitset<_Nb>& __y) { 7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> __result(__x); 7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result |= __y; 7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <size_t _Nb> 7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bitset<_Nb> _STLP_CALL 7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator^(const bitset<_Nb>& __x, 7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const bitset<_Nb>& __y) { 7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bitset<_Nb> __result(__x); 7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __result ^= __y; 7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __result; 7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_USE_NO_IOSTREAMS) 7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1300)) && \ 7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block !(defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x500)) 7369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_IOSFWD 7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_iosfwd.h> 7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, size_t _Nb> 7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& _STLP_CALL 7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x); 7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, size_t _Nb> 7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_ostream<_CharT, _Traits>& _STLP_CALL 7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Nb>& __x); 7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_STRING_IO_H 7549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_string_io.h> //includes _istream.h and _ostream.h 7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <size_t _Nb> 7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockistream& _STLP_CALL 7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(istream& __is, bitset<_Nb>& __x) { 7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename string::traits_type _Traits; 7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block string __tmp; 7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __tmp.reserve(_Nb); 7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Skip whitespace 7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename istream::sentry __sentry(__is); 7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__sentry) { 7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block streambuf* __buf = __is.rdbuf(); 7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (size_t __i = 0; __i < _Nb; ++__i) { 7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static typename _Traits::int_type __eof = _Traits::eof(); 7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _Traits::int_type __c1 = __buf->sbumpc(); 7749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Traits::eq_int_type(__c1, __eof)) { 7759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(ios_base::eofbit); 7769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 7779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 7799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _Traits::char_type __c2 = _Traits::to_char_type(__c1); 7809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char __c = __is.narrow(__c2, '*'); 7819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__c == '0' || __c == '1') 7839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __tmp.push_back(__c); 7849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else if (_Traits::eq_int_type(__buf->sputbackc(__c2), __eof)) { 7859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(ios_base::failbit); 7869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 7879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__tmp.empty()) 7929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(ios_base::failbit); 7939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 7949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __x._M_copy_from_string(__tmp, __STATIC_CAST(size_t,0), _Nb); 7959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 7969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __is; 7989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 7999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <size_t _Nb> 8019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockostream& _STLP_CALL 8029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(ostream& __os, const bitset<_Nb>& __x) { 8039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block string __tmp; 8049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __x._M_copy_to_string(__tmp); 8059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __os << __tmp; 8069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 8079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if !defined (_STLP_NO_WCHAR_T) 8099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <size_t _Nb> 8119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockwistream& _STLP_CALL 8129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>>(wistream& __is, bitset<_Nb>& __x) { 8139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename wstring::traits_type _Traits; 8149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block wstring __tmp; 8159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __tmp.reserve(_Nb); 8169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Skip whitespace 8189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename wistream::sentry __sentry(__is); 8199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__sentry) { 8209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block wstreambuf* __buf = __is.rdbuf(); 8219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (size_t __i = 0; __i < _Nb; ++__i) { 8229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static typename _Traits::int_type __eof = _Traits::eof(); 8239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _Traits::int_type __c1 = __buf->sbumpc(); 8259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Traits::eq_int_type(__c1, __eof)) { 8269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(ios_base::eofbit); 8279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 8289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 8309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _Traits::char_type __c2 = _Traits::to_char_type(__c1); 8319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char __c = __is.narrow(__c2, '*'); 8329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__c == '0' || __c == '1') 8349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __tmp.push_back(__c); 8359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else if (_Traits::eq_int_type(__buf->sputbackc(__c2), __eof)) { 8369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(ios_base::failbit); 8379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 8389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__tmp.empty()) 8439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(ios_base::failbit); 8449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 8459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __x._M_copy_from_string(__tmp, __STATIC_CAST(size_t,0), _Nb); 8469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 8479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __is; 8499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 8509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <size_t _Nb> 8529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockwostream& _STLP_CALL 8539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<<(wostream& __os, const bitset<_Nb>& __x) { 8549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block wstring __tmp; 8559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __x._M_copy_to_string(__tmp); 8569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __os << __tmp; 8579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 8589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif /* _STLP_NO_WCHAR_T */ 8609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 8619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 8629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */ 8649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef bitset 8669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 8689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __BITS_PER_WORD 8709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __BITSET_WORDS 8719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION) 8739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_bitset.c> 8749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 8759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_BITSET_H */ 8779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 8789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables: 8799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++ 8809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End: 881