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