std_bitset.h revision 102782
1// <bitset> -*- C++ -*-
2
3// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING.  If not, write to the Free
18// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19// USA.
20
21// As a special exception, you may use this file as part of a free software
22// library without restriction.  Specifically, if other files instantiate
23// templates or use macros or inline functions from this file, or you compile
24// this file and link it with other files to produce an executable, this
25// file does not by itself cause the resulting executable to be covered by
26// the GNU General Public License.  This exception does not however
27// invalidate any other reasons why the executable file might be covered by
28// the GNU General Public License.
29
30/*
31 * Copyright (c) 1998
32 * Silicon Graphics Computer Systems, Inc.
33 *
34 * Permission to use, copy, modify, distribute and sell this software
35 * and its documentation for any purpose is hereby granted without fee,
36 * provided that the above copyright notice appear in all copies and
37 * that both that copyright notice and this permission notice appear
38 * in supporting documentation.  Silicon Graphics makes no
39 * representations about the suitability of this software for any
40 * purpose.  It is provided "as is" without express or implied warranty.
41 */
42
43/** @file bitset
44 *  This is a Standard C++ Library header.  You should @c #include this header
45 *  in your programs, rather than any of the "st[dl]_*.h" implementation files.
46 */
47
48#ifndef _GLIBCPP_BITSET_H
49#define _GLIBCPP_BITSET_H
50
51#pragma GCC system_header
52
53#include <cstddef>     // for size_t
54#include <cstring>     // for memset
55#include <string>
56#include <bits/functexcept.h>   // for invalid_argument, out_of_range,
57                                // overflow_error
58#include <ostream>     // for ostream (operator<<)
59#include <istream>     // for istream (operator>>)
60
61
62#define _GLIBCPP_BITSET_BITS_PER_WORD (CHAR_BIT*sizeof(unsigned long))
63#define _GLIBCPP_BITSET_WORDS(__n) \
64 ((__n) < 1 ? 0 : ((__n) + _GLIBCPP_BITSET_BITS_PER_WORD - 1)/_GLIBCPP_BITSET_BITS_PER_WORD)
65
66namespace std
67{
68  extern unsigned char 	_S_bit_count[256];
69  extern unsigned char 	_S_first_one[256];
70
71  /**
72   *  @if maint
73   *  Base class, general case.  It is a class inveriant that _Nw will be
74   *  nonnegative.
75   *
76   *  See documentation for bitset.
77   *  @endif
78  */
79  template<size_t _Nw>
80    struct _Base_bitset
81    {
82      typedef unsigned long _WordT;
83
84      /// 0 is the least significant word.
85      _WordT 		_M_w[_Nw];
86
87      _Base_bitset() { _M_do_reset(); }
88      _Base_bitset(unsigned long __val)
89      {
90	_M_do_reset();
91	_M_w[0] = __val;
92      }
93
94      static size_t
95      _S_whichword(size_t __pos )
96      { return __pos / _GLIBCPP_BITSET_BITS_PER_WORD; }
97
98      static size_t
99      _S_whichbyte(size_t __pos )
100      { return (__pos % _GLIBCPP_BITSET_BITS_PER_WORD) / CHAR_BIT; }
101
102      static size_t
103      _S_whichbit(size_t __pos )
104      { return __pos % _GLIBCPP_BITSET_BITS_PER_WORD; }
105
106      static _WordT
107      _S_maskbit(size_t __pos )
108      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
109
110      _WordT&
111      _M_getword(size_t __pos)
112      { return _M_w[_S_whichword(__pos)]; }
113
114      _WordT
115      _M_getword(size_t __pos) const
116      { return _M_w[_S_whichword(__pos)]; }
117
118      _WordT&
119      _M_hiword() { return _M_w[_Nw - 1]; }
120
121      _WordT
122      _M_hiword() const { return _M_w[_Nw - 1]; }
123
124      void
125      _M_do_and(const _Base_bitset<_Nw>& __x)
126      {
127	for (size_t __i = 0; __i < _Nw; __i++)
128	  _M_w[__i] &= __x._M_w[__i];
129      }
130
131      void
132      _M_do_or(const _Base_bitset<_Nw>& __x)
133      {
134	for (size_t __i = 0; __i < _Nw; __i++)
135	  _M_w[__i] |= __x._M_w[__i];
136      }
137
138      void
139      _M_do_xor(const _Base_bitset<_Nw>& __x)
140      {
141	for (size_t __i = 0; __i < _Nw; __i++)
142	  _M_w[__i] ^= __x._M_w[__i];
143      }
144
145      void
146      _M_do_left_shift(size_t __shift);
147
148      void
149      _M_do_right_shift(size_t __shift);
150
151      void
152      _M_do_flip()
153      {
154	for (size_t __i = 0; __i < _Nw; __i++)
155	  _M_w[__i] = ~_M_w[__i];
156      }
157
158      void
159      _M_do_set()
160      {
161	for (size_t __i = 0; __i < _Nw; __i++)
162	  _M_w[__i] = ~static_cast<_WordT>(0);
163      }
164
165      void
166      _M_do_reset() { memset(_M_w, 0, _Nw * sizeof(_WordT)); }
167
168      bool
169      _M_is_equal(const _Base_bitset<_Nw>& __x) const
170      {
171	for (size_t __i = 0; __i < _Nw; ++__i)
172	  {
173	    if (_M_w[__i] != __x._M_w[__i])
174	      return false;
175	  }
176	return true;
177      }
178
179      bool
180      _M_is_any() const
181      {
182	for (size_t __i = 0; __i < _Nw; __i++)
183	  {
184	    if (_M_w[__i] != static_cast<_WordT>(0))
185	      return true;
186	  }
187	return false;
188      }
189
190      size_t
191      _M_do_count() const
192      {
193	size_t __result = 0;
194	const unsigned char* __byte_ptr = (const unsigned char*)_M_w;
195	const unsigned char* __end_ptr = (const unsigned char*)(_M_w + _Nw);
196
197	while ( __byte_ptr < __end_ptr )
198	  {
199	    __result += _S_bit_count[*__byte_ptr];
200	    __byte_ptr++;
201	  }
202	return __result;
203      }
204
205      unsigned long
206      _M_do_to_ulong() const;
207
208      // find first "on" bit
209      size_t
210      _M_do_find_first(size_t __not_found) const;
211
212      // find the next "on" bit that follows "prev"
213      size_t
214      _M_do_find_next(size_t __prev, size_t __not_found) const;
215    };
216
217  // Definitions of non-inline functions from _Base_bitset.
218  template<size_t _Nw>
219    void
220    _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift)
221    {
222      if (__shift != 0)
223	{
224	  const size_t __wshift = __shift / _GLIBCPP_BITSET_BITS_PER_WORD;
225	  const size_t __offset = __shift % _GLIBCPP_BITSET_BITS_PER_WORD;
226
227	  if (__offset == 0)
228	    for (size_t __n = _Nw - 1; __n >= __wshift; --__n)
229	      _M_w[__n] = _M_w[__n - __wshift];
230	  else
231	    {
232	      const size_t __sub_offset = _GLIBCPP_BITSET_BITS_PER_WORD - __offset;
233	      for (size_t __n = _Nw - 1; __n > __wshift; --__n)
234		_M_w[__n] = (_M_w[__n - __wshift] << __offset) |
235		  (_M_w[__n - __wshift - 1] >> __sub_offset);
236	      _M_w[__wshift] = _M_w[0] << __offset;
237	    }
238
239	  fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0));
240	}
241    }
242
243  template<size_t _Nw>
244    void
245    _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift)
246    {
247      if (__shift != 0)
248	{
249	  const size_t __wshift = __shift / _GLIBCPP_BITSET_BITS_PER_WORD;
250	  const size_t __offset = __shift % _GLIBCPP_BITSET_BITS_PER_WORD;
251	  const size_t __limit = _Nw - __wshift - 1;
252
253	  if (__offset == 0)
254	    for (size_t __n = 0; __n <= __limit; ++__n)
255	      _M_w[__n] = _M_w[__n + __wshift];
256	  else
257	    {
258	      const size_t __sub_offset = _GLIBCPP_BITSET_BITS_PER_WORD - __offset;
259	      for (size_t __n = 0; __n < __limit; ++__n)
260		_M_w[__n] = (_M_w[__n + __wshift] >> __offset) |
261		  (_M_w[__n + __wshift + 1] << __sub_offset);
262	      _M_w[__limit] = _M_w[_Nw-1] >> __offset;
263	    }
264
265	  fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0));
266	}
267    }
268
269  template<size_t _Nw>
270    unsigned long
271    _Base_bitset<_Nw>::_M_do_to_ulong() const
272    {
273      for (size_t __i = 1; __i < _Nw; ++__i)
274	if (_M_w[__i])
275	  __throw_overflow_error("bitset -- too large to fit in unsigned long");
276      return _M_w[0];
277    }
278
279  template<size_t _Nw>
280    size_t
281    _Base_bitset<_Nw>::_M_do_find_first(size_t __not_found) const
282    {
283      for (size_t __i = 0; __i < _Nw; __i++ )
284	{
285	  _WordT __thisword = _M_w[__i];
286	  if ( __thisword != static_cast<_WordT>(0) )
287	    {
288	      // find byte within word
289	      for (size_t __j = 0; __j < sizeof(_WordT); __j++ )
290		{
291		  unsigned char __this_byte
292		    = static_cast<unsigned char>(__thisword & (~(unsigned char)0));
293		  if (__this_byte)
294		    return __i*_GLIBCPP_BITSET_BITS_PER_WORD + __j*CHAR_BIT +
295		      _S_first_one[__this_byte];
296
297		  __thisword >>= CHAR_BIT;
298		}
299	    }
300	}
301      // not found, so return an indication of failure.
302      return __not_found;
303    }
304
305  template<size_t _Nw>
306    size_t
307    _Base_bitset<_Nw>::_M_do_find_next(size_t __prev, size_t __not_found) const
308    {
309      // make bound inclusive
310      ++__prev;
311
312      // check out of bounds
313      if ( __prev >= _Nw * _GLIBCPP_BITSET_BITS_PER_WORD )
314	return __not_found;
315
316      // search first word
317      size_t __i = _S_whichword(__prev);
318      _WordT __thisword = _M_w[__i];
319
320      // mask off bits below bound
321      __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev);
322
323      if ( __thisword != static_cast<_WordT>(0) )
324	{
325	  // find byte within word
326	  // get first byte into place
327	  __thisword >>= _S_whichbyte(__prev) * CHAR_BIT;
328	  for (size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++)
329	    {
330	      unsigned char __this_byte
331		= static_cast<unsigned char>(__thisword & (~(unsigned char)0));
332	      if ( __this_byte )
333		return __i*_GLIBCPP_BITSET_BITS_PER_WORD + __j*CHAR_BIT +
334		  _S_first_one[__this_byte];
335
336	      __thisword >>= CHAR_BIT;
337	    }
338	}
339
340      // check subsequent words
341      __i++;
342      for ( ; __i < _Nw; __i++ )
343	{
344	  __thisword = _M_w[__i];
345	  if ( __thisword != static_cast<_WordT>(0) )
346	    {
347	      // find byte within word
348	      for (size_t __j = 0; __j < sizeof(_WordT); __j++ )
349		{
350		  unsigned char __this_byte
351		    = static_cast<unsigned char>(__thisword & (~(unsigned char)0));
352		  if ( __this_byte )
353		    return __i*_GLIBCPP_BITSET_BITS_PER_WORD + __j*CHAR_BIT +
354		      _S_first_one[__this_byte];
355
356		  __thisword >>= CHAR_BIT;
357		}
358	    }
359	}
360      // not found, so return an indication of failure.
361      return __not_found;
362    } // end _M_do_find_next
363
364
365  /**
366   *  @if maint
367   *  Base class, specialization for a single word.
368   *
369   *  See documentation for bitset.
370   *  @endif
371  */
372  template<>
373    struct _Base_bitset<1>
374    {
375      typedef unsigned long _WordT;
376      _WordT _M_w;
377
378      _Base_bitset( void ) : _M_w(0) {}
379      _Base_bitset(unsigned long __val) : _M_w(__val) {}
380
381      static size_t
382      _S_whichword(size_t __pos )
383      { return __pos / _GLIBCPP_BITSET_BITS_PER_WORD; }
384
385      static size_t
386      _S_whichbyte(size_t __pos )
387      { return (__pos % _GLIBCPP_BITSET_BITS_PER_WORD) / CHAR_BIT; }
388
389      static size_t
390      _S_whichbit(size_t __pos )
391      {  return __pos % _GLIBCPP_BITSET_BITS_PER_WORD; }
392
393      static _WordT
394      _S_maskbit(size_t __pos )
395      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
396
397      _WordT&
398      _M_getword(size_t) { return _M_w; }
399
400      _WordT
401      _M_getword(size_t) const { return _M_w; }
402
403      _WordT&
404      _M_hiword() { return _M_w; }
405
406      _WordT
407      _M_hiword() const { return _M_w; }
408
409      void
410      _M_do_and(const _Base_bitset<1>& __x) { _M_w &= __x._M_w; }
411
412      void
413      _M_do_or(const _Base_bitset<1>& __x)  { _M_w |= __x._M_w; }
414
415      void
416      _M_do_xor(const _Base_bitset<1>& __x) { _M_w ^= __x._M_w; }
417
418      void
419      _M_do_left_shift(size_t __shift) { _M_w <<= __shift; }
420
421      void
422      _M_do_right_shift(size_t __shift) { _M_w >>= __shift; }
423
424      void
425      _M_do_flip() { _M_w = ~_M_w; }
426
427      void
428      _M_do_set() { _M_w = ~static_cast<_WordT>(0); }
429
430      void
431      _M_do_reset() { _M_w = 0; }
432
433      bool
434      _M_is_equal(const _Base_bitset<1>& __x) const
435      { return _M_w == __x._M_w; }
436
437      bool
438      _M_is_any() const { return _M_w != 0; }
439
440      size_t
441      _M_do_count() const
442      {
443	size_t __result = 0;
444	const unsigned char* __byte_ptr = (const unsigned char*)&_M_w;
445	const unsigned char* __end_ptr
446	  = ((const unsigned char*)&_M_w)+sizeof(_M_w);
447	while ( __byte_ptr < __end_ptr )
448	  {
449	    __result += _S_bit_count[*__byte_ptr];
450	    __byte_ptr++;
451	  }
452	return __result;
453      }
454
455      unsigned long
456      _M_do_to_ulong() const { return _M_w; }
457
458      size_t
459      _M_do_find_first(size_t __not_found) const;
460
461      // find the next "on" bit that follows "prev"
462      size_t
463      _M_do_find_next(size_t __prev, size_t __not_found) const;
464    };
465
466
467  /**
468   *  @if maint
469   *  Base class, specialization for no storage (zero-length %bitset).
470   *
471   *  See documentation for bitset.
472   *  @endif
473  */
474  template<>
475    struct _Base_bitset<0>
476    {
477      typedef unsigned long _WordT;
478
479      _Base_bitset() {}
480      _Base_bitset(unsigned long) {}
481
482      static size_t
483      _S_whichword(size_t __pos )
484      { return __pos / _GLIBCPP_BITSET_BITS_PER_WORD; }
485
486      static size_t
487      _S_whichbyte(size_t __pos )
488      { return (__pos % _GLIBCPP_BITSET_BITS_PER_WORD) / CHAR_BIT; }
489
490      static size_t
491      _S_whichbit(size_t __pos )
492      {  return __pos % _GLIBCPP_BITSET_BITS_PER_WORD; }
493
494      static _WordT
495      _S_maskbit(size_t __pos )
496      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
497
498      // This would normally give access to the data.  The bounds-checking
499      // in the bitset class will prevent the user from getting this far,
500      // but (1) it must still return an lvalue to compile, and (2) the
501      // user might call _Unchecked_set directly, in which case this /needs/
502      // to fail.  Let's not penalize zero-length users unless they actually
503      // make an unchecked call; all the memory ugliness is therefore
504      // localized to this single should-never-get-this-far function.
505      _WordT&
506      _M_getword(size_t) const
507      { __throw_out_of_range("bitset -- zero-length"); return *new _WordT; }
508
509      _WordT
510      _M_hiword() const { return 0; }
511
512      void
513      _M_do_and(const _Base_bitset<0>&) { }
514
515      void
516      _M_do_or(const _Base_bitset<0>&)  { }
517
518      void
519      _M_do_xor(const _Base_bitset<0>&) { }
520
521      void
522      _M_do_left_shift(size_t) { }
523
524      void
525      _M_do_right_shift(size_t) { }
526
527      void
528      _M_do_flip() { }
529
530      void
531      _M_do_set() { }
532
533      void
534      _M_do_reset() { }
535
536      // Are all empty bitsets equal to each other?  Are they equal to
537      // themselves?  How to compare a thing which has no state?  What is
538      // the sound of one zero-length bitset clapping?
539      bool
540      _M_is_equal(const _Base_bitset<0>&) const { return true; }
541
542      bool
543      _M_is_any() const { return false; }
544
545      size_t
546      _M_do_count() const { return 0; }
547
548      unsigned long
549      _M_do_to_ulong() const { return 0; }
550
551      // Normally "not found" is the size, but that could also be
552      // misinterpreted as an index in this corner case.  Oh well.
553      size_t
554      _M_do_find_first(size_t) const { return 0; }
555
556      size_t
557      _M_do_find_next(size_t, size_t) const { return 0; }
558    };
559
560
561  // Helper class to zero out the unused high-order bits in the highest word.
562  template<size_t _Extrabits>
563    struct _Sanitize
564    {
565      static void _S_do_sanitize(unsigned long& __val)
566      { __val &= ~((~static_cast<unsigned long>(0)) << _Extrabits); }
567    };
568
569  template<>
570    struct _Sanitize<0>
571    { static void _S_do_sanitize(unsigned long) { } };
572
573  /**
574   *  @brief  The %bitset class represents a @e fixed-size sequence of bits.
575   *
576   *  @ingroup Containers
577   *
578   *  (Note that %bitset does @e not meet the formal requirements of a
579   *  <a href="tables.html#65">container</a>.  Mainly, it lacks iterators.)
580   *
581   *  The template argument, @a _Nb, may be any nonzero number of type
582   *  size_t.
583   *
584   *  A %bitset of size N has N % (sizeof(unsigned long) * CHAR_BIT) unused
585   *  bits.  (They are the high-order bits in the highest word.)  It is
586   *  a class invariant that those unused bits are always zero.
587   *
588   *  If you think of %bitset as "a simple array of bits," be aware that
589   *  your mental picture is reversed:  a %bitset behaves the same way as
590   *  bits in integers do, with the bit at index 0 in the "least significant
591   *  / right-hand" position, and the bit at index N-1 in the "most
592   *  significant / left-hand" position.  Thus, unlike other containers, a
593   *  %bitset's index "counts from right to left," to put it very loosely.
594   *
595   *  This behavior is preserved when translating to and from strings.  For
596   *  example, the first line of the following program probably prints
597   *  "b('a') is 0001100001" on a modern ASCII system.
598   *
599   *  @code
600   *     #include <bitset>
601   *     #include <iostream>
602   *     #include <sstream>
603   *
604   *     using namespace std;
605   *
606   *     int main()
607   *     {
608   *         long         a = 'a';
609   *         bitset<10>   b(a);
610   *
611   *         cout << "b('a') is " << b << endl;
612   *
613   *         ostringstream s;
614   *         s << b;
615   *         string  str = s.str();
616   *         cout << "index 3 in the string is " << str[3] << " but\n"
617   *              << "index 3 in the bitset is " << b[3] << endl;
618   *     }
619   *  @endcode
620   *
621   *  Also see http://gcc.gnu.org/onlinedocs/libstdc++/ext/sgiexts.html#ch23
622   *
623   *  @if maint
624   *  Most of the actual code isn't contained in %bitset<> itself, but in the
625   *  base class _Base_bitset.  The base class works with whole words, not with
626   *  individual bits.  This allows us to specialize _Base_bitset for the
627   *  important special case where the %bitset is only a single word.
628   *
629   *  Extra confusion can result due to the fact that the storage for
630   *  _Base_bitset @e is a regular array, and is indexed as such.  This is
631   *  carefully encapsulated.
632   *  @endif
633  */
634  template<size_t _Nb>
635    class bitset : private _Base_bitset<_GLIBCPP_BITSET_WORDS(_Nb)>
636  {
637  private:
638    typedef _Base_bitset<_GLIBCPP_BITSET_WORDS(_Nb)> _Base;
639    typedef unsigned long _WordT;
640
641    void
642    _M_do_sanitize()
643    {
644      _Sanitize<_Nb%_GLIBCPP_BITSET_BITS_PER_WORD>::
645          _S_do_sanitize(this->_M_hiword());
646    }
647
648  public:
649    /**
650     *  This encapsulates the concept of a single bit.  An instance of this
651     *  class is a proxy for an actual bit; this way the individual bit
652     *  operations are done as faster word-size bitwise instructions.
653     *
654     *  Most users will never need to use this class directly; conversions
655     *  to and from bool are automatic and should be transparent.  Overloaded
656     *  operators help to preserve the illusion.
657     *
658     *  (On a typical system, this "bit %reference" is 64 times the size of
659     *  an actual bit.  Ha.)
660    */
661    class reference
662    {
663      friend class bitset;
664
665      _WordT *_M_wp;
666      size_t _M_bpos;
667
668      // left undefined
669      reference();
670
671    public:
672      reference(bitset& __b, size_t __pos)
673      {
674	_M_wp = &__b._M_getword(__pos);
675	_M_bpos = _Base::_S_whichbit(__pos);
676      }
677
678      ~reference() { }
679
680      // for b[i] = __x;
681      reference&
682      operator=(bool __x)
683      {
684	if ( __x )
685	  *_M_wp |= _Base::_S_maskbit(_M_bpos);
686	else
687	  *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
688	return *this;
689      }
690
691      // for b[i] = b[__j];
692      reference&
693      operator=(const reference& __j)
694      {
695	if ( (*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos)) )
696	  *_M_wp |= _Base::_S_maskbit(_M_bpos);
697	else
698	  *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
699	return *this;
700      }
701
702      // flips the bit
703      bool
704      operator~() const
705      { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; }
706
707      // for __x = b[i];
708      operator bool() const
709      { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; }
710
711      // for b[i].flip();
712      reference&
713      flip()
714      {
715	*_M_wp ^= _Base::_S_maskbit(_M_bpos);
716	return *this;
717      }
718    };
719    friend class reference;
720
721    // 23.3.5.1 constructors:
722    /// All bits set to zero.
723    bitset() { }
724
725    /// Initial bits bitwise-copied from a single word (others set to zero).
726    bitset(unsigned long __val) : _Base(__val)
727    { _M_do_sanitize(); }
728
729    /**
730     *  @brief  Use a subset of a string.
731     *  @param  s  A string of '0' and '1' characters.
732     *  @param  pos  Index of the first character in @a s to use; defaults
733     *               to zero.
734     *  @throw  std::out_of_range  If @a pos is bigger the size of @a s.
735     *  @throw  std::invalid_argument  If a character appears in the string
736     *                                 which is neither '0' nor '1'.
737    */
738    template<class _CharT, class _Traits, class _Alloc>
739      explicit bitset(const basic_string<_CharT, _Traits, _Alloc>& __s,
740		      size_t __pos = 0) : _Base()
741      {
742	if (__pos > __s.size())
743	  __throw_out_of_range("bitset -- initial position is larger than "
744	                       "the string itself");
745	_M_copy_from_string(__s, __pos,
746			    basic_string<_CharT, _Traits, _Alloc>::npos);
747      }
748
749    /**
750     *  @brief  Use a subset of a string.
751     *  @param  s  A string of '0' and '1' characters.
752     *  @param  pos  Index of the first character in @a s to use.
753     *  @param  n    The number of characters to copy.
754     *  @throw  std::out_of_range  If @a pos is bigger the size of @a s.
755     *  @throw  std::invalid_argument  If a character appears in the string
756     *                                 which is neither '0' nor '1'.
757    */
758    template<class _CharT, class _Traits, class _Alloc>
759      bitset(const basic_string<_CharT, _Traits, _Alloc>& __s,
760	     size_t __pos, size_t __n) : _Base()
761      {
762	if (__pos > __s.size())
763	  __throw_out_of_range("bitset -- initial position is larger than "
764	                       "the string itself");
765	_M_copy_from_string(__s, __pos, __n);
766      }
767
768    // 23.3.5.2 bitset operations:
769    //@{
770    /**
771     *  @brief  Operations on bitsets.
772     *  @param  rhs  A same-sized bitset.
773     *
774     *  These should be self-explanatory.
775    */
776    bitset<_Nb>&
777    operator&=(const bitset<_Nb>& __rhs)
778    {
779      this->_M_do_and(__rhs);
780      return *this;
781    }
782
783    bitset<_Nb>&
784    operator|=(const bitset<_Nb>& __rhs)
785    {
786      this->_M_do_or(__rhs);
787      return *this;
788    }
789
790    bitset<_Nb>&
791    operator^=(const bitset<_Nb>& __rhs)
792    {
793      this->_M_do_xor(__rhs);
794      return *this;
795    }
796    //@}
797
798    //@{
799    /**
800     *  @brief  Operations on bitsets.
801     *  @param  pos  The number of places to shift.
802     *
803     *  These should be self-explanatory.
804    */
805    bitset<_Nb>&
806    operator<<=(size_t __pos)
807    {
808      this->_M_do_left_shift(__pos);
809      this->_M_do_sanitize();
810      return *this;
811    }
812
813    bitset<_Nb>&
814    operator>>=(size_t __pos)
815    {
816      this->_M_do_right_shift(__pos);
817      this->_M_do_sanitize();
818      return *this;
819    }
820    //@}
821
822    //@{
823    /**
824     *  These versions of single-bit set, reset, flip, and test are
825     *  extensions from the SGI version.  They do no range checking.
826     *  @ingroup SGIextensions
827    */
828    bitset<_Nb>&
829    _Unchecked_set(size_t __pos)
830    {
831      this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
832      return *this;
833    }
834
835    bitset<_Nb>&
836    _Unchecked_set(size_t __pos, int __val)
837    {
838      if (__val)
839	this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
840      else
841	this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
842      return *this;
843    }
844
845    bitset<_Nb>&
846    _Unchecked_reset(size_t __pos)
847    {
848      this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
849      return *this;
850    }
851
852    bitset<_Nb>&
853    _Unchecked_flip(size_t __pos)
854    {
855      this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos);
856      return *this;
857    }
858
859    bool
860    _Unchecked_test(size_t __pos) const
861    {
862      return (this->_M_getword(__pos) & _Base::_S_maskbit(__pos))
863	!= static_cast<_WordT>(0);
864    }
865    //@}
866
867    // Set, reset, and flip.
868    /**
869     *  @brief Sets every bit to true.
870    */
871    bitset<_Nb>&
872    set()
873    {
874      this->_M_do_set();
875      this->_M_do_sanitize();
876      return *this;
877    }
878
879    /**
880     *  @brief Sets a given bit to a particular value.
881     *  @param  pos  The index of the bit.
882     *  @param  val  Either true or false, defaults to true.
883     *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
884    */
885    bitset<_Nb>&
886    set(size_t __pos, bool __val = true)
887    {
888      if (__pos >= _Nb)
889	__throw_out_of_range("bitset -- set() argument too large");
890      return _Unchecked_set(__pos, __val);
891    }
892
893    /**
894     *  @brief Sets every bit to false.
895    */
896    bitset<_Nb>&
897    reset()
898    {
899      this->_M_do_reset();
900      return *this;
901    }
902
903    /**
904     *  @brief Sets a given bit to false.
905     *  @param  pos  The index of the bit.
906     *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
907     *
908     *  Same as writing @c set(pos,false).
909    */
910    bitset<_Nb>&
911    reset(size_t __pos)
912    {
913      if (__pos >= _Nb)
914	__throw_out_of_range("bitset -- reset() argument too large");
915      return _Unchecked_reset(__pos);
916    }
917
918    /**
919     *  @brief Toggles every bit to its opposite value.
920    */
921    bitset<_Nb>&
922    flip()
923    {
924      this->_M_do_flip();
925      this->_M_do_sanitize();
926      return *this;
927    }
928
929    /**
930     *  @brief Toggles a given bit to its opposite value.
931     *  @param  pos  The index of the bit.
932     *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
933    */
934    bitset<_Nb>&
935    flip(size_t __pos)
936    {
937      if (__pos >= _Nb)
938	__throw_out_of_range("bitset -- flip() argument too large");
939      return _Unchecked_flip(__pos);
940    }
941
942    /// See the no-argument flip().
943    bitset<_Nb>
944    operator~() const { return bitset<_Nb>(*this).flip(); }
945
946    //@{
947    /**
948     *  @brief  Array-indexing support.
949     *  @param  pos  Index into the %bitset.
950     *  @return  A bool for a 'const %bitset'.  For non-const bitsets, an
951     *           instance of the reference proxy class.
952     *  @note  These operators do no range checking and throw no exceptions,
953     *         as required by DR 11 to the standard.
954     *
955     *  @if maint
956     *  _GLIBCPP_RESOLVE_LIB_DEFECTS Note that this implementation already
957     *  resolves DR 11 (items 1 and 2), but does not do the range-checking
958     *  required by that DR's resolution.  -pme
959     *  The DR has since been changed:  range-checking is a precondition
960     *  (users' responsibility), and these functions must not throw.  -pme
961     *  @endif
962    */
963    reference
964    operator[](size_t __pos) { return reference(*this,__pos); }
965
966    bool
967    operator[](size_t __pos) const { return _Unchecked_test(__pos); }
968    //@}
969
970    /**
971     *  @brief Retuns a numerical interpretation of the %bitset.
972     *  @return  The integral equivalent of the bits.
973     *  @throw  std::overflow_error  If there are too many bits to be
974     *                               represented in an @c unsigned @c long.
975    */
976    unsigned long
977    to_ulong() const { return this->_M_do_to_ulong(); }
978
979    /**
980     *  @brief Retuns a character interpretation of the %bitset.
981     *  @return  The string equivalent of the bits.
982     *
983     *  Note the ordering of the bits:  decreasing character positions
984     *  correspond to increasing bit positions (see the main class notes for
985     *  an example).
986     *
987     *  Also note that you must specify the string's template parameters
988     *  explicitly.  Given a bitset @c bs and a string @s:
989     *  @code
990     *     s = bs.to_string<char,char_traits<char>,allocator<char> >();
991     *  @endcode
992    */
993    template<class _CharT, class _Traits, class _Alloc>
994      basic_string<_CharT, _Traits, _Alloc>
995      to_string() const
996      {
997	basic_string<_CharT, _Traits, _Alloc> __result;
998	_M_copy_to_string(__result);
999	return __result;
1000      }
1001
1002    // Helper functions for string operations.
1003    template<class _CharT, class _Traits, class _Alloc>
1004      void
1005      _M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s,
1006                          size_t, size_t);
1007
1008    template<class _CharT, class _Traits, class _Alloc>
1009      void
1010      _M_copy_to_string(basic_string<_CharT,_Traits,_Alloc>&) const;
1011
1012    /// Returns the number of bits which are set.
1013    size_t
1014    count() const { return this->_M_do_count(); }
1015
1016    /// Returns the total number of bits.
1017    size_t
1018    size() const { return _Nb; }
1019
1020    //@{
1021    /// These comparisons for equality/inequality are, well, @e bitwise.
1022    bool
1023    operator==(const bitset<_Nb>& __rhs) const
1024    { return this->_M_is_equal(__rhs); }
1025
1026    bool
1027    operator!=(const bitset<_Nb>& __rhs) const
1028    { return !this->_M_is_equal(__rhs); }
1029    //@}
1030
1031    /**
1032     *  @brief Tests the value of a bit.
1033     *  @param  pos  The index of a bit.
1034     *  @return  The value at @a pos.
1035     *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
1036    */
1037    bool
1038    test(size_t __pos) const
1039    {
1040      if (__pos >= _Nb)
1041	__throw_out_of_range("bitset -- test() argument too large");
1042      return _Unchecked_test(__pos);
1043    }
1044
1045    /**
1046     *  @brief Tests whether any of the bits are on.
1047     *  @return  True if at least one bit is set.
1048    */
1049    bool
1050    any() const { return this->_M_is_any(); }
1051
1052    /**
1053     *  @brief Tests whether any of the bits are on.
1054     *  @return  True if none of the bits are set.
1055    */
1056    bool
1057    none() const { return !this->_M_is_any(); }
1058
1059    //@{
1060    /// Self-explanatory.
1061    bitset<_Nb>
1062    operator<<(size_t __pos) const
1063    { return bitset<_Nb>(*this) <<= __pos; }
1064
1065    bitset<_Nb>
1066    operator>>(size_t __pos) const
1067    { return bitset<_Nb>(*this) >>= __pos; }
1068    //@}
1069
1070    /**
1071     *  @brief  Finds the index of the first "on" bit.
1072     *  @return  The index of the first bit set, or size() if not found.
1073     *  @ingroup SGIextensions
1074     *  @sa  _Find_next
1075    */
1076    size_t
1077    _Find_first() const
1078    { return this->_M_do_find_first(_Nb); }
1079
1080    /**
1081     *  @brief  Finds the index of the next "on" bit after prev.
1082     *  @return  The index of the next bit set, or size() if not found.
1083     *  @param  prev  Where to start searching.
1084     *  @ingroup SGIextensions
1085     *  @sa  _Find_first
1086    */
1087    size_t
1088    _Find_next(size_t __prev ) const
1089    { return this->_M_do_find_next(__prev, _Nb); }
1090  };
1091
1092  // Definitions of non-inline member functions.
1093  template<size_t _Nb>
1094    template<class _CharT, class _Traits, class _Alloc>
1095    void
1096    bitset<_Nb>::_M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s, size_t __pos, size_t __n)
1097    {
1098      reset();
1099      const size_t __nbits = min(_Nb, min(__n, __s.size() - __pos));
1100      for (size_t __i = 0; __i < __nbits; ++__i)
1101	{
1102	  switch(__s[__pos + __nbits - __i - 1])
1103	    {
1104	    case '0':
1105	      break;
1106	    case '1':
1107	      set(__i);
1108	      break;
1109	    default:
1110	      __throw_invalid_argument("bitset -- string contains characters "
1111	                               "which are neither 0 nor 1");
1112	    }
1113	}
1114    }
1115
1116  template<size_t _Nb>
1117    template<class _CharT, class _Traits, class _Alloc>
1118    void
1119    bitset<_Nb>::_M_copy_to_string(basic_string<_CharT, _Traits, _Alloc>& __s) const
1120    {
1121      __s.assign(_Nb, '0');
1122      for (size_t __i = 0; __i < _Nb; ++__i)
1123	if (_Unchecked_test(__i))
1124	  __s[_Nb - 1 - __i] = '1';
1125    }
1126
1127  // 23.3.5.3 bitset operations:
1128  //@{
1129  /**
1130   *  @brief  Global bitwise operations on bitsets.
1131   *  @param  x  A bitset.
1132   *  @param  y  A bitset of the same size as @a x.
1133   *  @return  A new bitset.
1134   *
1135   *  These should be self-explanatory.
1136  */
1137  template<size_t _Nb>
1138    inline bitset<_Nb>
1139    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y)
1140    {
1141      bitset<_Nb> __result(__x);
1142      __result &= __y;
1143      return __result;
1144    }
1145
1146  template<size_t _Nb>
1147    inline bitset<_Nb>
1148    operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y)
1149    {
1150      bitset<_Nb> __result(__x);
1151      __result |= __y;
1152      return __result;
1153    }
1154
1155  template <size_t _Nb>
1156    inline bitset<_Nb>
1157    operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y)
1158    {
1159      bitset<_Nb> __result(__x);
1160      __result ^= __y;
1161      return __result;
1162    }
1163  //@}
1164
1165  //@{
1166  /**
1167   *  @brief Global I/O operators for bitsets.
1168   *
1169   *  Direct I/O between streams and bitsets is supported.  Output is
1170   *  straightforward.  Input will skip whitespace, only accept '0' and '1'
1171   *  characters, and will only extract as many digits as the %bitset will
1172   *  hold.
1173  */
1174  template<class _CharT, class _Traits, size_t _Nb>
1175    basic_istream<_CharT, _Traits>&
1176    operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
1177    {
1178      typedef typename _Traits::char_type char_type;
1179      basic_string<_CharT, _Traits> __tmp;
1180      __tmp.reserve(_Nb);
1181
1182      // Skip whitespace
1183      typename basic_istream<_CharT, _Traits>::sentry __sentry(__is);
1184      if (__sentry)
1185	{
1186	  basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
1187	  for (size_t __i = 0; __i < _Nb; ++__i)
1188	    {
1189	      static typename _Traits::int_type __eof = _Traits::eof();
1190
1191	      typename _Traits::int_type __c1 = __buf->sbumpc();
1192	      if (_Traits::eq_int_type(__c1, __eof))
1193		{
1194		  __is.setstate(ios_base::eofbit);
1195		  break;
1196		}
1197	      else
1198		{
1199		  char_type __c2 = _Traits::to_char_type(__c1);
1200		  char_type __c  = __is.narrow(__c2, '*');
1201
1202		  if (__c == '0' || __c == '1')
1203		    __tmp.push_back(__c);
1204		  else if (_Traits::eq_int_type(__buf->sputbackc(__c2),
1205						__eof))
1206		    {
1207		      __is.setstate(ios_base::failbit);
1208		      break;
1209		    }
1210		}
1211	    }
1212
1213	  if (__tmp.empty() && !_Nb)
1214	    __is.setstate(ios_base::failbit);
1215	  else
1216	    __x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb);
1217	}
1218
1219      return __is;
1220    }
1221
1222  template <class _CharT, class _Traits, size_t _Nb>
1223    basic_ostream<_CharT, _Traits>&
1224    operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Nb>& __x)
1225    {
1226      basic_string<_CharT, _Traits> __tmp;
1227      __x._M_copy_to_string(__tmp);
1228      return __os << __tmp;
1229    }
1230  //@}
1231} // namespace std
1232
1233#undef _GLIBCPP_BITSET_WORDS
1234
1235#endif /* _GLIBCPP_BITSET_H */
1236