OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libstdc++-v3/] [include/] [std/] [bitset] - Blame information for rev 833

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 742 jeremybenn
//  -*- C++ -*-
2
 
3
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4
// 2011
5
// Free Software Foundation, Inc.
6
//
7
// This file is part of the GNU ISO C++ Library.  This library is free
8
// software; you can redistribute it and/or modify it under the
9
// terms of the GNU General Public License as published by the
10
// Free Software Foundation; either version 3, or (at your option)
11
// any later version.
12
 
13
// This library is distributed in the hope that it will be useful,
14
// but WITHOUT ANY WARRANTY; without even the implied warranty of
15
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
// GNU General Public License for more details.
17
 
18
// Under Section 7 of GPL version 3, you are granted additional
19
// permissions described in the GCC Runtime Library Exception, version
20
// 3.1, as published by the Free Software Foundation.
21
 
22
// You should have received a copy of the GNU General Public License and
23
// a copy of the GCC Runtime Library Exception along with this program;
24
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25
// .
26
 
27
/*
28
 * Copyright (c) 1998
29
 * Silicon Graphics Computer Systems, Inc.
30
 *
31
 * Permission to use, copy, modify, distribute and sell this software
32
 * and its documentation for any purpose is hereby granted without fee,
33
 * provided that the above copyright notice appear in all copies and
34
 * that both that copyright notice and this permission notice appear
35
 * in supporting documentation.  Silicon Graphics makes no
36
 * representations about the suitability of this software for any
37
 * purpose.  It is provided "as is" without express or implied warranty.
38
 */
39
 
40
/** @file include/bitset
41
 *  This is a Standard C++ Library header.
42
 */
43
 
44
#ifndef _GLIBCXX_BITSET
45
#define _GLIBCXX_BITSET 1
46
 
47
#pragma GCC system_header
48
 
49
#include 
50
#include    // For invalid_argument, out_of_range,
51
                                // overflow_error
52
#include 
53
#include 
54
 
55
#define _GLIBCXX_BITSET_BITS_PER_WORD  (__CHAR_BIT__ * __SIZEOF_LONG__)
56
#define _GLIBCXX_BITSET_WORDS(__n) \
57
  ((__n) / _GLIBCXX_BITSET_BITS_PER_WORD + \
58
   ((__n) % _GLIBCXX_BITSET_BITS_PER_WORD == 0 ? 0 : 1))
59
 
60
#define _GLIBCXX_BITSET_BITS_PER_ULL (__CHAR_BIT__ * __SIZEOF_LONG_LONG__)
61
 
62
namespace std _GLIBCXX_VISIBILITY(default)
63
{
64
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
65
 
66
  /**
67
   *  Base class, general case.  It is a class invariant that _Nw will be
68
   *  nonnegative.
69
   *
70
   *  See documentation for bitset.
71
  */
72
  template
73
    struct _Base_bitset
74
    {
75
      typedef unsigned long _WordT;
76
 
77
      /// 0 is the least significant word.
78
      _WordT            _M_w[_Nw];
79
 
80
      _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
81
      : _M_w() { }
82
 
83
#ifdef __GXX_EXPERIMENTAL_CXX0X__
84
      constexpr _Base_bitset(unsigned long long __val) noexcept
85
      : _M_w{ _WordT(__val)
86
#if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__
87
               , _WordT(__val >> _GLIBCXX_BITSET_BITS_PER_WORD)
88
#endif
89
       } { }
90
#else
91
      _Base_bitset(unsigned long __val)
92
      : _M_w()
93
      { _M_w[0] = __val; }
94
#endif
95
 
96
      static _GLIBCXX_CONSTEXPR size_t
97
      _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
98
      { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
99
 
100
      static _GLIBCXX_CONSTEXPR size_t
101
      _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
102
      { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
103
 
104
      static _GLIBCXX_CONSTEXPR size_t
105
      _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
106
      { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
107
 
108
      static _GLIBCXX_CONSTEXPR _WordT
109
      _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
110
      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
111
 
112
      _WordT&
113
      _M_getword(size_t __pos) _GLIBCXX_NOEXCEPT
114
      { return _M_w[_S_whichword(__pos)]; }
115
 
116
      _GLIBCXX_CONSTEXPR _WordT
117
      _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT
118
      { return _M_w[_S_whichword(__pos)]; }
119
 
120
#ifdef __GXX_EXPERIMENTAL_CXX0X__
121
      const _WordT*
122
      _M_getdata() const noexcept
123
      { return _M_w; }
124
#endif
125
 
126
      _WordT&
127
      _M_hiword() _GLIBCXX_NOEXCEPT
128
      { return _M_w[_Nw - 1]; }
129
 
130
      _GLIBCXX_CONSTEXPR _WordT
131
      _M_hiword() const _GLIBCXX_NOEXCEPT
132
      { return _M_w[_Nw - 1]; }
133
 
134
      void
135
      _M_do_and(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
136
      {
137
        for (size_t __i = 0; __i < _Nw; __i++)
138
          _M_w[__i] &= __x._M_w[__i];
139
      }
140
 
141
      void
142
      _M_do_or(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
143
      {
144
        for (size_t __i = 0; __i < _Nw; __i++)
145
          _M_w[__i] |= __x._M_w[__i];
146
      }
147
 
148
      void
149
      _M_do_xor(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT
150
      {
151
        for (size_t __i = 0; __i < _Nw; __i++)
152
          _M_w[__i] ^= __x._M_w[__i];
153
      }
154
 
155
      void
156
      _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT;
157
 
158
      void
159
      _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT;
160
 
161
      void
162
      _M_do_flip() _GLIBCXX_NOEXCEPT
163
      {
164
        for (size_t __i = 0; __i < _Nw; __i++)
165
          _M_w[__i] = ~_M_w[__i];
166
      }
167
 
168
      void
169
      _M_do_set() _GLIBCXX_NOEXCEPT
170
      {
171
        for (size_t __i = 0; __i < _Nw; __i++)
172
          _M_w[__i] = ~static_cast<_WordT>(0);
173
      }
174
 
175
      void
176
      _M_do_reset() _GLIBCXX_NOEXCEPT
177
      { __builtin_memset(_M_w, 0, _Nw * sizeof(_WordT)); }
178
 
179
      bool
180
      _M_is_equal(const _Base_bitset<_Nw>& __x) const _GLIBCXX_NOEXCEPT
181
      {
182
        for (size_t __i = 0; __i < _Nw; ++__i)
183
          if (_M_w[__i] != __x._M_w[__i])
184
            return false;
185
        return true;
186
      }
187
 
188
      template
189
        bool
190
        _M_are_all() const _GLIBCXX_NOEXCEPT
191
        {
192
          for (size_t __i = 0; __i < _Nw - 1; __i++)
193
            if (_M_w[__i] != ~static_cast<_WordT>(0))
194
              return false;
195
          return _M_hiword() == (~static_cast<_WordT>(0)
196
                                 >> (_Nw * _GLIBCXX_BITSET_BITS_PER_WORD
197
                                     - _Nb));
198
        }
199
 
200
      bool
201
      _M_is_any() const _GLIBCXX_NOEXCEPT
202
      {
203
        for (size_t __i = 0; __i < _Nw; __i++)
204
          if (_M_w[__i] != static_cast<_WordT>(0))
205
            return true;
206
        return false;
207
      }
208
 
209
      size_t
210
      _M_do_count() const _GLIBCXX_NOEXCEPT
211
      {
212
        size_t __result = 0;
213
        for (size_t __i = 0; __i < _Nw; __i++)
214
          __result += __builtin_popcountl(_M_w[__i]);
215
        return __result;
216
      }
217
 
218
      unsigned long
219
      _M_do_to_ulong() const;
220
 
221
#ifdef __GXX_EXPERIMENTAL_CXX0X__
222
      unsigned long long
223
      _M_do_to_ullong() const;
224
#endif
225
 
226
      // find first "on" bit
227
      size_t
228
      _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT;
229
 
230
      // find the next "on" bit that follows "prev"
231
      size_t
232
      _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT;
233
    };
234
 
235
  // Definitions of non-inline functions from _Base_bitset.
236
  template
237
    void
238
    _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT
239
    {
240
      if (__builtin_expect(__shift != 0, 1))
241
        {
242
          const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD;
243
          const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD;
244
 
245
          if (__offset == 0)
246
            for (size_t __n = _Nw - 1; __n >= __wshift; --__n)
247
              _M_w[__n] = _M_w[__n - __wshift];
248
          else
249
            {
250
              const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD
251
                                           - __offset);
252
              for (size_t __n = _Nw - 1; __n > __wshift; --__n)
253
                _M_w[__n] = ((_M_w[__n - __wshift] << __offset)
254
                             | (_M_w[__n - __wshift - 1] >> __sub_offset));
255
              _M_w[__wshift] = _M_w[0] << __offset;
256
            }
257
 
258
          std::fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0));
259
        }
260
    }
261
 
262
  template
263
    void
264
    _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT
265
    {
266
      if (__builtin_expect(__shift != 0, 1))
267
        {
268
          const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD;
269
          const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD;
270
          const size_t __limit = _Nw - __wshift - 1;
271
 
272
          if (__offset == 0)
273
            for (size_t __n = 0; __n <= __limit; ++__n)
274
              _M_w[__n] = _M_w[__n + __wshift];
275
          else
276
            {
277
              const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD
278
                                           - __offset);
279
              for (size_t __n = 0; __n < __limit; ++__n)
280
                _M_w[__n] = ((_M_w[__n + __wshift] >> __offset)
281
                             | (_M_w[__n + __wshift + 1] << __sub_offset));
282
              _M_w[__limit] = _M_w[_Nw-1] >> __offset;
283
            }
284
 
285
          std::fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0));
286
        }
287
    }
288
 
289
  template
290
    unsigned long
291
    _Base_bitset<_Nw>::_M_do_to_ulong() const
292
    {
293
      for (size_t __i = 1; __i < _Nw; ++__i)
294
        if (_M_w[__i])
295
          __throw_overflow_error(__N("_Base_bitset::_M_do_to_ulong"));
296
      return _M_w[0];
297
    }
298
 
299
#ifdef __GXX_EXPERIMENTAL_CXX0X__
300
  template
301
    unsigned long long
302
    _Base_bitset<_Nw>::_M_do_to_ullong() const
303
    {
304
      const bool __dw = sizeof(unsigned long long) > sizeof(unsigned long);
305
      for (size_t __i = 1 + __dw; __i < _Nw; ++__i)
306
        if (_M_w[__i])
307
          __throw_overflow_error(__N("_Base_bitset::_M_do_to_ullong"));
308
 
309
      if (__dw)
310
        return _M_w[0] + (static_cast(_M_w[1])
311
                          << _GLIBCXX_BITSET_BITS_PER_WORD);
312
      return _M_w[0];
313
    }
314
#endif
315
 
316
  template
317
    size_t
318
    _Base_bitset<_Nw>::
319
    _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT
320
    {
321
      for (size_t __i = 0; __i < _Nw; __i++)
322
        {
323
          _WordT __thisword = _M_w[__i];
324
          if (__thisword != static_cast<_WordT>(0))
325
            return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
326
                    + __builtin_ctzl(__thisword));
327
        }
328
      // not found, so return an indication of failure.
329
      return __not_found;
330
    }
331
 
332
  template
333
    size_t
334
    _Base_bitset<_Nw>::
335
    _M_do_find_next(size_t __prev, size_t __not_found) const _GLIBCXX_NOEXCEPT
336
    {
337
      // make bound inclusive
338
      ++__prev;
339
 
340
      // check out of bounds
341
      if (__prev >= _Nw * _GLIBCXX_BITSET_BITS_PER_WORD)
342
        return __not_found;
343
 
344
      // search first word
345
      size_t __i = _S_whichword(__prev);
346
      _WordT __thisword = _M_w[__i];
347
 
348
      // mask off bits below bound
349
      __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev);
350
 
351
      if (__thisword != static_cast<_WordT>(0))
352
        return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
353
                + __builtin_ctzl(__thisword));
354
 
355
      // check subsequent words
356
      __i++;
357
      for (; __i < _Nw; __i++)
358
        {
359
          __thisword = _M_w[__i];
360
          if (__thisword != static_cast<_WordT>(0))
361
            return (__i * _GLIBCXX_BITSET_BITS_PER_WORD
362
                    + __builtin_ctzl(__thisword));
363
        }
364
      // not found, so return an indication of failure.
365
      return __not_found;
366
    } // end _M_do_find_next
367
 
368
  /**
369
   *  Base class, specialization for a single word.
370
   *
371
   *  See documentation for bitset.
372
  */
373
  template<>
374
    struct _Base_bitset<1>
375
    {
376
      typedef unsigned long _WordT;
377
      _WordT _M_w;
378
 
379
      _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
380
      : _M_w(0)
381
      { }
382
 
383
#ifdef __GXX_EXPERIMENTAL_CXX0X__
384
      constexpr _Base_bitset(unsigned long long __val) noexcept
385
#else
386
      _Base_bitset(unsigned long __val)
387
#endif
388
      : _M_w(__val)
389
      { }
390
 
391
      static _GLIBCXX_CONSTEXPR size_t
392
      _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
393
      { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
394
 
395
      static _GLIBCXX_CONSTEXPR size_t
396
      _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
397
      { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
398
 
399
      static _GLIBCXX_CONSTEXPR size_t
400
      _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
401
      {  return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
402
 
403
      static _GLIBCXX_CONSTEXPR _WordT
404
      _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
405
      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
406
 
407
      _WordT&
408
      _M_getword(size_t) _GLIBCXX_NOEXCEPT
409
      { return _M_w; }
410
 
411
      _GLIBCXX_CONSTEXPR _WordT
412
      _M_getword(size_t) const _GLIBCXX_NOEXCEPT
413
      { return _M_w; }
414
 
415
#ifdef __GXX_EXPERIMENTAL_CXX0X__
416
      const _WordT*
417
      _M_getdata() const noexcept
418
      { return &_M_w; }
419
#endif
420
 
421
      _WordT&
422
      _M_hiword() _GLIBCXX_NOEXCEPT
423
      { return _M_w; }
424
 
425
      _GLIBCXX_CONSTEXPR _WordT
426
      _M_hiword() const _GLIBCXX_NOEXCEPT
427
      { return _M_w; }
428
 
429
      void
430
      _M_do_and(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
431
      { _M_w &= __x._M_w; }
432
 
433
      void
434
      _M_do_or(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
435
      { _M_w |= __x._M_w; }
436
 
437
      void
438
      _M_do_xor(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT
439
      { _M_w ^= __x._M_w; }
440
 
441
      void
442
      _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT
443
      { _M_w <<= __shift; }
444
 
445
      void
446
      _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT
447
      { _M_w >>= __shift; }
448
 
449
      void
450
      _M_do_flip() _GLIBCXX_NOEXCEPT
451
      { _M_w = ~_M_w; }
452
 
453
      void
454
      _M_do_set() _GLIBCXX_NOEXCEPT
455
      { _M_w = ~static_cast<_WordT>(0); }
456
 
457
      void
458
      _M_do_reset() _GLIBCXX_NOEXCEPT
459
      { _M_w = 0; }
460
 
461
      bool
462
      _M_is_equal(const _Base_bitset<1>& __x) const _GLIBCXX_NOEXCEPT
463
      { return _M_w == __x._M_w; }
464
 
465
      template
466
        bool
467
        _M_are_all() const _GLIBCXX_NOEXCEPT
468
        { return _M_w == (~static_cast<_WordT>(0)
469
                          >> (_GLIBCXX_BITSET_BITS_PER_WORD - _Nb)); }
470
 
471
      bool
472
      _M_is_any() const _GLIBCXX_NOEXCEPT
473
      { return _M_w != 0; }
474
 
475
      size_t
476
      _M_do_count() const _GLIBCXX_NOEXCEPT
477
      { return __builtin_popcountl(_M_w); }
478
 
479
      unsigned long
480
      _M_do_to_ulong() const _GLIBCXX_NOEXCEPT
481
      { return _M_w; }
482
 
483
#ifdef __GXX_EXPERIMENTAL_CXX0X__
484
      unsigned long long
485
      _M_do_to_ullong() const noexcept
486
      { return _M_w; }
487
#endif
488
 
489
      size_t
490
      _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT
491
      {
492
        if (_M_w != 0)
493
          return __builtin_ctzl(_M_w);
494
        else
495
          return __not_found;
496
      }
497
 
498
      // find the next "on" bit that follows "prev"
499
      size_t
500
      _M_do_find_next(size_t __prev, size_t __not_found) const
501
        _GLIBCXX_NOEXCEPT
502
      {
503
        ++__prev;
504
        if (__prev >= ((size_t) _GLIBCXX_BITSET_BITS_PER_WORD))
505
          return __not_found;
506
 
507
        _WordT __x = _M_w >> __prev;
508
        if (__x != 0)
509
          return __builtin_ctzl(__x) + __prev;
510
        else
511
          return __not_found;
512
      }
513
    };
514
 
515
  /**
516
   *  Base class, specialization for no storage (zero-length %bitset).
517
   *
518
   *  See documentation for bitset.
519
  */
520
  template<>
521
    struct _Base_bitset<0>
522
    {
523
      typedef unsigned long _WordT;
524
 
525
      _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT
526
      { }
527
 
528
#ifdef __GXX_EXPERIMENTAL_CXX0X__
529
      constexpr _Base_bitset(unsigned long long) noexcept
530
#else
531
      _Base_bitset(unsigned long)
532
#endif
533
      { }
534
 
535
      static _GLIBCXX_CONSTEXPR size_t
536
      _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT
537
      { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; }
538
 
539
      static _GLIBCXX_CONSTEXPR size_t
540
      _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT
541
      { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; }
542
 
543
      static _GLIBCXX_CONSTEXPR size_t
544
      _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT
545
      {  return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; }
546
 
547
      static _GLIBCXX_CONSTEXPR _WordT
548
      _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT
549
      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
550
 
551
      // This would normally give access to the data.  The bounds-checking
552
      // in the bitset class will prevent the user from getting this far,
553
      // but (1) it must still return an lvalue to compile, and (2) the
554
      // user might call _Unchecked_set directly, in which case this /needs/
555
      // to fail.  Let's not penalize zero-length users unless they actually
556
      // make an unchecked call; all the memory ugliness is therefore
557
      // localized to this single should-never-get-this-far function.
558
      _WordT&
559
      _M_getword(size_t) _GLIBCXX_NOEXCEPT
560
      {
561
        __throw_out_of_range(__N("_Base_bitset::_M_getword"));
562
        return *new _WordT;
563
      }
564
 
565
      _GLIBCXX_CONSTEXPR _WordT
566
      _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT
567
      { return 0; }
568
 
569
      _GLIBCXX_CONSTEXPR _WordT
570
      _M_hiword() const _GLIBCXX_NOEXCEPT
571
      { return 0; }
572
 
573
      void
574
      _M_do_and(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
575
      { }
576
 
577
      void
578
      _M_do_or(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
579
      { }
580
 
581
      void
582
      _M_do_xor(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT
583
      { }
584
 
585
      void
586
      _M_do_left_shift(size_t) _GLIBCXX_NOEXCEPT
587
      { }
588
 
589
      void
590
      _M_do_right_shift(size_t) _GLIBCXX_NOEXCEPT
591
      { }
592
 
593
      void
594
      _M_do_flip() _GLIBCXX_NOEXCEPT
595
      { }
596
 
597
      void
598
      _M_do_set() _GLIBCXX_NOEXCEPT
599
      { }
600
 
601
      void
602
      _M_do_reset() _GLIBCXX_NOEXCEPT
603
      { }
604
 
605
      // Are all empty bitsets equal to each other?  Are they equal to
606
      // themselves?  How to compare a thing which has no state?  What is
607
      // the sound of one zero-length bitset clapping?
608
      bool
609
      _M_is_equal(const _Base_bitset<0>&) const _GLIBCXX_NOEXCEPT
610
      { return true; }
611
 
612
      template
613
        bool
614
        _M_are_all() const _GLIBCXX_NOEXCEPT
615
        { return true; }
616
 
617
      bool
618
      _M_is_any() const _GLIBCXX_NOEXCEPT
619
      { return false; }
620
 
621
      size_t
622
      _M_do_count() const _GLIBCXX_NOEXCEPT
623
      { return 0; }
624
 
625
      unsigned long
626
      _M_do_to_ulong() const _GLIBCXX_NOEXCEPT
627
      { return 0; }
628
 
629
#ifdef __GXX_EXPERIMENTAL_CXX0X__
630
      unsigned long long
631
      _M_do_to_ullong() const noexcept
632
      { return 0; }
633
#endif
634
 
635
      // Normally "not found" is the size, but that could also be
636
      // misinterpreted as an index in this corner case.  Oh well.
637
      size_t
638
      _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT
639
      { return 0; }
640
 
641
      size_t
642
      _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT
643
      { return 0; }
644
    };
645
 
646
 
647
  // Helper class to zero out the unused high-order bits in the highest word.
648
  template
649
    struct _Sanitize
650
    {
651
      typedef unsigned long _WordT;
652
 
653
      static void
654
      _S_do_sanitize(_WordT& __val) _GLIBCXX_NOEXCEPT
655
      { __val &= ~((~static_cast<_WordT>(0)) << _Extrabits); }
656
    };
657
 
658
  template<>
659
    struct _Sanitize<0>
660
    {
661
      typedef unsigned long _WordT;
662
 
663
      static void
664
      _S_do_sanitize(_WordT) _GLIBCXX_NOEXCEPT { }
665
    };
666
 
667
#ifdef __GXX_EXPERIMENTAL_CXX0X__
668
  template
669
    struct _Sanitize_val
670
    {
671
      static constexpr unsigned long long
672
      _S_do_sanitize_val(unsigned long long __val)
673
      { return __val; }
674
    };
675
 
676
  template
677
    struct _Sanitize_val<_Nb, true>
678
    {
679
      static constexpr unsigned long long
680
      _S_do_sanitize_val(unsigned long long __val)
681
      { return __val & ~((~static_cast(0)) << _Nb); }
682
    };
683
#endif
684
 
685
  /**
686
   *  The %bitset class represents a @e fixed-size sequence of bits.
687
   *
688
   *  @ingroup containers
689
   *
690
   *  (Note that %bitset does @e not meet the formal requirements of a
691
   *  container.  Mainly, it lacks iterators.)
692
   *
693
   *  The template argument, @a Nb, may be any non-negative number,
694
   *  specifying the number of bits (e.g., "0", "12", "1024*1024").
695
   *
696
   *  In the general unoptimized case, storage is allocated in word-sized
697
   *  blocks.  Let B be the number of bits in a word, then (Nb+(B-1))/B
698
   *  words will be used for storage.  B - Nb%B bits are unused.  (They are
699
   *  the high-order bits in the highest word.)  It is a class invariant
700
   *  that those unused bits are always zero.
701
   *
702
   *  If you think of %bitset as a simple array of bits, be
703
   *  aware that your mental picture is reversed: a %bitset behaves
704
   *  the same way as bits in integers do, with the bit at index 0 in
705
   *  the least significant / right-hand position, and the bit at
706
   *  index Nb-1 in the most significant / left-hand position.
707
   *  Thus, unlike other containers, a %bitset's index counts from
708
   *  right to left, to put it very loosely.
709
   *
710
   *  This behavior is preserved when translating to and from strings.  For
711
   *  example, the first line of the following program probably prints
712
   *  b('a') is 0001100001 on a modern ASCII system.
713
   *
714
   *  @code
715
   *     #include 
716
   *     #include 
717
   *     #include 
718
   *
719
   *     using namespace std;
720
   *
721
   *     int main()
722
   *     {
723
   *         long         a = 'a';
724
   *         bitset<10>   b(a);
725
   *
726
   *         cout << "b('a') is " << b << endl;
727
   *
728
   *         ostringstream s;
729
   *         s << b;
730
   *         string  str = s.str();
731
   *         cout << "index 3 in the string is " << str[3] << " but\n"
732
   *              << "index 3 in the bitset is " << b[3] << endl;
733
   *     }
734
   *  @endcode
735
   *
736
   *  Also see:
737
   *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt12ch33s02.html
738
   *  for a description of extensions.
739
   *
740
   *  Most of the actual code isn't contained in %bitset<> itself, but in the
741
   *  base class _Base_bitset.  The base class works with whole words, not with
742
   *  individual bits.  This allows us to specialize _Base_bitset for the
743
   *  important special case where the %bitset is only a single word.
744
   *
745
   *  Extra confusion can result due to the fact that the storage for
746
   *  _Base_bitset @e is a regular array, and is indexed as such.  This is
747
   *  carefully encapsulated.
748
  */
749
  template
750
    class bitset
751
    : private _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)>
752
    {
753
    private:
754
      typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base;
755
      typedef unsigned long _WordT;
756
 
757
      void
758
      _M_do_sanitize() _GLIBCXX_NOEXCEPT
759
      {
760
        typedef _Sanitize<_Nb % _GLIBCXX_BITSET_BITS_PER_WORD> __sanitize_type;
761
        __sanitize_type::_S_do_sanitize(this->_M_hiword());
762
      }
763
 
764
#ifdef __GXX_EXPERIMENTAL_CXX0X__
765
      template friend class hash;
766
#endif
767
 
768
    public:
769
      /**
770
       *  This encapsulates the concept of a single bit.  An instance of this
771
       *  class is a proxy for an actual bit; this way the individual bit
772
       *  operations are done as faster word-size bitwise instructions.
773
       *
774
       *  Most users will never need to use this class directly; conversions
775
       *  to and from bool are automatic and should be transparent.  Overloaded
776
       *  operators help to preserve the illusion.
777
       *
778
       *  (On a typical system, this bit %reference is 64
779
       *  times the size of an actual bit.  Ha.)
780
       */
781
      class reference
782
      {
783
        friend class bitset;
784
 
785
        _WordT* _M_wp;
786
        size_t  _M_bpos;
787
 
788
        // left undefined
789
        reference();
790
 
791
      public:
792
        reference(bitset& __b, size_t __pos) _GLIBCXX_NOEXCEPT
793
        {
794
          _M_wp = &__b._M_getword(__pos);
795
          _M_bpos = _Base::_S_whichbit(__pos);
796
        }
797
 
798
        ~reference() _GLIBCXX_NOEXCEPT
799
        { }
800
 
801
        // For b[i] = __x;
802
        reference&
803
        operator=(bool __x) _GLIBCXX_NOEXCEPT
804
        {
805
          if (__x)
806
            *_M_wp |= _Base::_S_maskbit(_M_bpos);
807
          else
808
            *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
809
          return *this;
810
        }
811
 
812
        // For b[i] = b[__j];
813
        reference&
814
        operator=(const reference& __j) _GLIBCXX_NOEXCEPT
815
        {
816
          if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos)))
817
            *_M_wp |= _Base::_S_maskbit(_M_bpos);
818
          else
819
            *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
820
          return *this;
821
        }
822
 
823
        // Flips the bit
824
        bool
825
        operator~() const _GLIBCXX_NOEXCEPT
826
        { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; }
827
 
828
        // For __x = b[i];
829
        operator bool() const _GLIBCXX_NOEXCEPT
830
        { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; }
831
 
832
        // For b[i].flip();
833
        reference&
834
        flip() _GLIBCXX_NOEXCEPT
835
        {
836
          *_M_wp ^= _Base::_S_maskbit(_M_bpos);
837
          return *this;
838
        }
839
      };
840
      friend class reference;
841
 
842
      // 23.3.5.1 constructors:
843
      /// All bits set to zero.
844
      _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT
845
      { }
846
 
847
      /// Initial bits bitwise-copied from a single word (others set to zero).
848
#ifdef __GXX_EXPERIMENTAL_CXX0X__
849
      constexpr bitset(unsigned long long __val) noexcept
850
      : _Base(_Sanitize_val<_Nb>::_S_do_sanitize_val(__val)) { }
851
#else
852
      bitset(unsigned long __val)
853
      : _Base(__val)
854
      { _M_do_sanitize(); }
855
#endif
856
 
857
      /**
858
       *  Use a subset of a string.
859
       *  @param  __s  A string of @a 0 and @a 1 characters.
860
       *  @param  __position  Index of the first character in @a __s to use;
861
       *                    defaults to zero.
862
       *  @throw  std::out_of_range  If @a pos is bigger the size of @a __s.
863
       *  @throw  std::invalid_argument  If a character appears in the string
864
       *                                 which is neither @a 0 nor @a 1.
865
       */
866
      template
867
        explicit
868
        bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
869
               size_t __position = 0)
870
        : _Base()
871
        {
872
          if (__position > __s.size())
873
            __throw_out_of_range(__N("bitset::bitset initial position "
874
                                     "not valid"));
875
          _M_copy_from_string(__s, __position,
876
                              std::basic_string<_CharT, _Traits, _Alloc>::npos,
877
                              _CharT('0'), _CharT('1'));
878
        }
879
 
880
      /**
881
       *  Use a subset of a string.
882
       *  @param  __s  A string of @a 0 and @a 1 characters.
883
       *  @param  __position  Index of the first character in @a __s to use.
884
       *  @param  __n    The number of characters to copy.
885
       *  @throw std::out_of_range If @a __position is bigger the size
886
       *  of @a __s.
887
       *  @throw  std::invalid_argument  If a character appears in the string
888
       *                                 which is neither @a 0 nor @a 1.
889
       */
890
      template
891
        bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
892
               size_t __position, size_t __n)
893
        : _Base()
894
        {
895
          if (__position > __s.size())
896
            __throw_out_of_range(__N("bitset::bitset initial position "
897
                                     "not valid"));
898
          _M_copy_from_string(__s, __position, __n, _CharT('0'), _CharT('1'));
899
        }
900
 
901
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
902
      // 396. what are characters zero and one.
903
      template
904
        bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
905
               size_t __position, size_t __n,
906
               _CharT __zero, _CharT __one = _CharT('1'))
907
        : _Base()
908
        {
909
          if (__position > __s.size())
910
            __throw_out_of_range(__N("bitset::bitset initial position "
911
                                     "not valid"));
912
          _M_copy_from_string(__s, __position, __n, __zero, __one);
913
        }
914
 
915
#ifdef __GXX_EXPERIMENTAL_CXX0X__
916
      /**
917
       *  Construct from a character %array.
918
       *  @param  __str  An %array of characters @a zero and @a one.
919
       *  @param  __n    The number of characters to use.
920
       *  @param  __zero The character corresponding to the value 0.
921
       *  @param  __one  The character corresponding to the value 1.
922
       *  @throw  std::invalid_argument If a character appears in the string
923
       *                                which is neither @a __zero nor @a __one.
924
       */
925
      template
926
        explicit
927
        bitset(const _CharT* __str,
928
               typename std::basic_string<_CharT>::size_type __n
929
               = std::basic_string<_CharT>::npos,
930
               _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
931
        : _Base()
932
        {
933
          if (!__str)
934
            __throw_logic_error(__N("bitset::bitset(const _CharT*, ...)"));
935
 
936
          if (__n == std::basic_string<_CharT>::npos)
937
            __n = std::char_traits<_CharT>::length(__str);
938
          _M_copy_from_ptr<_CharT, std::char_traits<_CharT>>(__str, __n, 0,
939
                                                             __n, __zero,
940
                                                             __one);
941
        }
942
#endif
943
 
944
      // 23.3.5.2 bitset operations:
945
      //@{
946
      /**
947
       *  Operations on bitsets.
948
       *  @param  __rhs  A same-sized bitset.
949
       *
950
       *  These should be self-explanatory.
951
       */
952
      bitset<_Nb>&
953
      operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
954
      {
955
        this->_M_do_and(__rhs);
956
        return *this;
957
      }
958
 
959
      bitset<_Nb>&
960
      operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
961
      {
962
        this->_M_do_or(__rhs);
963
        return *this;
964
      }
965
 
966
      bitset<_Nb>&
967
      operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
968
      {
969
        this->_M_do_xor(__rhs);
970
        return *this;
971
      }
972
      //@}
973
 
974
      //@{
975
      /**
976
       *  Operations on bitsets.
977
       *  @param  __position  The number of places to shift.
978
       *
979
       *  These should be self-explanatory.
980
       */
981
      bitset<_Nb>&
982
      operator<<=(size_t __position) _GLIBCXX_NOEXCEPT
983
      {
984
        if (__builtin_expect(__position < _Nb, 1))
985
          {
986
            this->_M_do_left_shift(__position);
987
            this->_M_do_sanitize();
988
          }
989
        else
990
          this->_M_do_reset();
991
        return *this;
992
      }
993
 
994
      bitset<_Nb>&
995
      operator>>=(size_t __position) _GLIBCXX_NOEXCEPT
996
      {
997
        if (__builtin_expect(__position < _Nb, 1))
998
          {
999
            this->_M_do_right_shift(__position);
1000
            this->_M_do_sanitize();
1001
          }
1002
        else
1003
          this->_M_do_reset();
1004
        return *this;
1005
      }
1006
      //@}
1007
 
1008
      //@{
1009
      /**
1010
       *  These versions of single-bit set, reset, flip, and test are
1011
       *  extensions from the SGI version.  They do no range checking.
1012
       *  @ingroup SGIextensions
1013
       */
1014
      bitset<_Nb>&
1015
      _Unchecked_set(size_t __pos) _GLIBCXX_NOEXCEPT
1016
      {
1017
        this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
1018
        return *this;
1019
      }
1020
 
1021
      bitset<_Nb>&
1022
      _Unchecked_set(size_t __pos, int __val) _GLIBCXX_NOEXCEPT
1023
      {
1024
        if (__val)
1025
          this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
1026
        else
1027
          this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
1028
        return *this;
1029
      }
1030
 
1031
      bitset<_Nb>&
1032
      _Unchecked_reset(size_t __pos) _GLIBCXX_NOEXCEPT
1033
      {
1034
        this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
1035
        return *this;
1036
      }
1037
 
1038
      bitset<_Nb>&
1039
      _Unchecked_flip(size_t __pos) _GLIBCXX_NOEXCEPT
1040
      {
1041
        this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos);
1042
        return *this;
1043
      }
1044
 
1045
      _GLIBCXX_CONSTEXPR bool
1046
      _Unchecked_test(size_t __pos) const _GLIBCXX_NOEXCEPT
1047
      { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos))
1048
                != static_cast<_WordT>(0)); }
1049
      //@}
1050
 
1051
      // Set, reset, and flip.
1052
      /**
1053
       *  @brief Sets every bit to true.
1054
       */
1055
      bitset<_Nb>&
1056
      set() _GLIBCXX_NOEXCEPT
1057
      {
1058
        this->_M_do_set();
1059
        this->_M_do_sanitize();
1060
        return *this;
1061
      }
1062
 
1063
      /**
1064
       *  @brief Sets a given bit to a particular value.
1065
       *  @param  __position  The index of the bit.
1066
       *  @param  __val  Either true or false, defaults to true.
1067
       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
1068
       */
1069
      bitset<_Nb>&
1070
      set(size_t __position, bool __val = true)
1071
      {
1072
        if (__position >= _Nb)
1073
          __throw_out_of_range(__N("bitset::set"));
1074
        return _Unchecked_set(__position, __val);
1075
      }
1076
 
1077
      /**
1078
       *  @brief Sets every bit to false.
1079
       */
1080
      bitset<_Nb>&
1081
      reset() _GLIBCXX_NOEXCEPT
1082
      {
1083
        this->_M_do_reset();
1084
        return *this;
1085
      }
1086
 
1087
      /**
1088
       *  @brief Sets a given bit to false.
1089
       *  @param  __position  The index of the bit.
1090
       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
1091
       *
1092
       *  Same as writing @c set(pos,false).
1093
       */
1094
      bitset<_Nb>&
1095
      reset(size_t __position)
1096
      {
1097
        if (__position >= _Nb)
1098
          __throw_out_of_range(__N("bitset::reset"));
1099
        return _Unchecked_reset(__position);
1100
      }
1101
 
1102
      /**
1103
       *  @brief Toggles every bit to its opposite value.
1104
       */
1105
      bitset<_Nb>&
1106
      flip() _GLIBCXX_NOEXCEPT
1107
      {
1108
        this->_M_do_flip();
1109
        this->_M_do_sanitize();
1110
        return *this;
1111
      }
1112
 
1113
      /**
1114
       *  @brief Toggles a given bit to its opposite value.
1115
       *  @param  __position  The index of the bit.
1116
       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
1117
       */
1118
      bitset<_Nb>&
1119
      flip(size_t __position)
1120
      {
1121
        if (__position >= _Nb)
1122
          __throw_out_of_range(__N("bitset::flip"));
1123
        return _Unchecked_flip(__position);
1124
      }
1125
 
1126
      /// See the no-argument flip().
1127
      bitset<_Nb>
1128
      operator~() const _GLIBCXX_NOEXCEPT
1129
      { return bitset<_Nb>(*this).flip(); }
1130
 
1131
      //@{
1132
      /**
1133
       *  @brief  Array-indexing support.
1134
       *  @param  __position  Index into the %bitset.
1135
       *  @return A bool for a const %bitset.  For non-const
1136
       *           bitsets, an instance of the reference proxy class.
1137
       *  @note  These operators do no range checking and throw no exceptions,
1138
       *         as required by DR 11 to the standard.
1139
       *
1140
       *  _GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already
1141
       *  resolves DR 11 (items 1 and 2), but does not do the range-checking
1142
       *  required by that DR's resolution.  -pme
1143
       *  The DR has since been changed:  range-checking is a precondition
1144
       *  (users' responsibility), and these functions must not throw.  -pme
1145
       */
1146
      reference
1147
      operator[](size_t __position)
1148
      { return reference(*this, __position); }
1149
 
1150
      _GLIBCXX_CONSTEXPR bool
1151
      operator[](size_t __position) const
1152
      { return _Unchecked_test(__position); }
1153
      //@}
1154
 
1155
      /**
1156
       *  @brief Returns a numerical interpretation of the %bitset.
1157
       *  @return  The integral equivalent of the bits.
1158
       *  @throw  std::overflow_error  If there are too many bits to be
1159
       *                               represented in an @c unsigned @c long.
1160
       */
1161
      unsigned long
1162
      to_ulong() const
1163
      { return this->_M_do_to_ulong(); }
1164
 
1165
#ifdef __GXX_EXPERIMENTAL_CXX0X__
1166
      unsigned long long
1167
      to_ullong() const
1168
      { return this->_M_do_to_ullong(); }
1169
#endif
1170
 
1171
      /**
1172
       *  @brief Returns a character interpretation of the %bitset.
1173
       *  @return  The string equivalent of the bits.
1174
       *
1175
       *  Note the ordering of the bits:  decreasing character positions
1176
       *  correspond to increasing bit positions (see the main class notes for
1177
       *  an example).
1178
       */
1179
      template
1180
        std::basic_string<_CharT, _Traits, _Alloc>
1181
        to_string() const
1182
        {
1183
          std::basic_string<_CharT, _Traits, _Alloc> __result;
1184
          _M_copy_to_string(__result, _CharT('0'), _CharT('1'));
1185
          return __result;
1186
        }
1187
 
1188
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1189
      // 396. what are characters zero and one.
1190
      template
1191
        std::basic_string<_CharT, _Traits, _Alloc>
1192
        to_string(_CharT __zero, _CharT __one = _CharT('1')) const
1193
        {
1194
          std::basic_string<_CharT, _Traits, _Alloc> __result;
1195
          _M_copy_to_string(__result, __zero, __one);
1196
          return __result;
1197
        }
1198
 
1199
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1200
      // 434. bitset::to_string() hard to use.
1201
      template
1202
        std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
1203
        to_string() const
1204
        { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }
1205
 
1206
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1207
      // 853. to_string needs updating with zero and one.
1208
      template
1209
        std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
1210
        to_string(_CharT __zero, _CharT __one = _CharT('1')) const
1211
        { return to_string<_CharT, _Traits,
1212
                           std::allocator<_CharT> >(__zero, __one); }
1213
 
1214
      template
1215
        std::basic_string<_CharT, std::char_traits<_CharT>,
1216
                          std::allocator<_CharT> >
1217
        to_string() const
1218
        {
1219
          return to_string<_CharT, std::char_traits<_CharT>,
1220
                           std::allocator<_CharT> >();
1221
        }
1222
 
1223
      template
1224
        std::basic_string<_CharT, std::char_traits<_CharT>,
1225
                          std::allocator<_CharT> >
1226
        to_string(_CharT __zero, _CharT __one = _CharT('1')) const
1227
        {
1228
          return to_string<_CharT, std::char_traits<_CharT>,
1229
                           std::allocator<_CharT> >(__zero, __one);
1230
        }
1231
 
1232
      std::basic_string, std::allocator >
1233
      to_string() const
1234
      {
1235
        return to_string,
1236
                         std::allocator >();
1237
      }
1238
 
1239
      std::basic_string, std::allocator >
1240
      to_string(char __zero, char __one = '1') const
1241
      {
1242
        return to_string,
1243
                         std::allocator >(__zero, __one);
1244
      }
1245
 
1246
      // Helper functions for string operations.
1247
      template
1248
        void
1249
        _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t,
1250
                         _CharT, _CharT);
1251
 
1252
      template
1253
        void
1254
        _M_copy_from_string(const std::basic_string<_CharT,
1255
                            _Traits, _Alloc>& __s, size_t __pos, size_t __n,
1256
                            _CharT __zero, _CharT __one)
1257
        { _M_copy_from_ptr<_CharT, _Traits>(__s.data(), __s.size(), __pos, __n,
1258
                                            __zero, __one); }
1259
 
1260
      template
1261
        void
1262
        _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>&,
1263
                          _CharT, _CharT) const;
1264
 
1265
      // NB: Backward compat.
1266
      template
1267
        void
1268
        _M_copy_from_string(const std::basic_string<_CharT,
1269
                            _Traits, _Alloc>& __s, size_t __pos, size_t __n)
1270
        { _M_copy_from_string(__s, __pos, __n, _CharT('0'), _CharT('1')); }
1271
 
1272
      template
1273
        void
1274
        _M_copy_to_string(std::basic_string<_CharT, _Traits,_Alloc>& __s) const
1275
        { _M_copy_to_string(__s, _CharT('0'), _CharT('1')); }
1276
 
1277
      /// Returns the number of bits which are set.
1278
      size_t
1279
      count() const _GLIBCXX_NOEXCEPT
1280
      { return this->_M_do_count(); }
1281
 
1282
      /// Returns the total number of bits.
1283
      _GLIBCXX_CONSTEXPR size_t
1284
      size() const _GLIBCXX_NOEXCEPT
1285
      { return _Nb; }
1286
 
1287
      //@{
1288
      /// These comparisons for equality/inequality are, well, @e bitwise.
1289
      bool
1290
      operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
1291
      { return this->_M_is_equal(__rhs); }
1292
 
1293
      bool
1294
      operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
1295
      { return !this->_M_is_equal(__rhs); }
1296
      //@}
1297
 
1298
      /**
1299
       *  @brief Tests the value of a bit.
1300
       *  @param  __position  The index of a bit.
1301
       *  @return  The value at @a pos.
1302
       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
1303
       */
1304
      bool
1305
      test(size_t __position) const
1306
      {
1307
        if (__position >= _Nb)
1308
          __throw_out_of_range(__N("bitset::test"));
1309
        return _Unchecked_test(__position);
1310
      }
1311
 
1312
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1313
      // DR 693. std::bitset::all() missing.
1314
      /**
1315
       *  @brief Tests whether all the bits are on.
1316
       *  @return  True if all the bits are set.
1317
       */
1318
      bool
1319
      all() const _GLIBCXX_NOEXCEPT
1320
      { return this->template _M_are_all<_Nb>(); }
1321
 
1322
      /**
1323
       *  @brief Tests whether any of the bits are on.
1324
       *  @return  True if at least one bit is set.
1325
       */
1326
      bool
1327
      any() const _GLIBCXX_NOEXCEPT
1328
      { return this->_M_is_any(); }
1329
 
1330
      /**
1331
       *  @brief Tests whether any of the bits are on.
1332
       *  @return  True if none of the bits are set.
1333
       */
1334
      bool
1335
      none() const _GLIBCXX_NOEXCEPT
1336
      { return !this->_M_is_any(); }
1337
 
1338
      //@{
1339
      /// Self-explanatory.
1340
      bitset<_Nb>
1341
      operator<<(size_t __position) const _GLIBCXX_NOEXCEPT
1342
      { return bitset<_Nb>(*this) <<= __position; }
1343
 
1344
      bitset<_Nb>
1345
      operator>>(size_t __position) const _GLIBCXX_NOEXCEPT
1346
      { return bitset<_Nb>(*this) >>= __position; }
1347
      //@}
1348
 
1349
      /**
1350
       *  @brief  Finds the index of the first "on" bit.
1351
       *  @return  The index of the first bit set, or size() if not found.
1352
       *  @ingroup SGIextensions
1353
       *  @sa  _Find_next
1354
       */
1355
      size_t
1356
      _Find_first() const _GLIBCXX_NOEXCEPT
1357
      { return this->_M_do_find_first(_Nb); }
1358
 
1359
      /**
1360
       *  @brief  Finds the index of the next "on" bit after prev.
1361
       *  @return  The index of the next bit set, or size() if not found.
1362
       *  @param  __prev  Where to start searching.
1363
       *  @ingroup SGIextensions
1364
       *  @sa  _Find_first
1365
       */
1366
      size_t
1367
      _Find_next(size_t __prev) const _GLIBCXX_NOEXCEPT
1368
      { return this->_M_do_find_next(__prev, _Nb); }
1369
    };
1370
 
1371
  // Definitions of non-inline member functions.
1372
  template
1373
    template
1374
      void
1375
      bitset<_Nb>::
1376
      _M_copy_from_ptr(const _CharT* __s, size_t __len,
1377
                       size_t __pos, size_t __n, _CharT __zero, _CharT __one)
1378
      {
1379
        reset();
1380
        const size_t __nbits = std::min(_Nb, std::min(__n, __len - __pos));
1381
        for (size_t __i = __nbits; __i > 0; --__i)
1382
          {
1383
            const _CharT __c = __s[__pos + __nbits - __i];
1384
            if (_Traits::eq(__c, __zero))
1385
              ;
1386
            else if (_Traits::eq(__c, __one))
1387
              _Unchecked_set(__i - 1);
1388
            else
1389
              __throw_invalid_argument(__N("bitset::_M_copy_from_ptr"));
1390
          }
1391
      }
1392
 
1393
  template
1394
    template
1395
      void
1396
      bitset<_Nb>::
1397
      _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>& __s,
1398
                        _CharT __zero, _CharT __one) const
1399
      {
1400
        __s.assign(_Nb, __zero);
1401
        for (size_t __i = _Nb; __i > 0; --__i)
1402
          if (_Unchecked_test(__i - 1))
1403
            _Traits::assign(__s[_Nb - __i], __one);
1404
      }
1405
 
1406
  // 23.3.5.3 bitset operations:
1407
  //@{
1408
  /**
1409
   *  @brief  Global bitwise operations on bitsets.
1410
   *  @param  __x  A bitset.
1411
   *  @param  __y  A bitset of the same size as @a __x.
1412
   *  @return  A new bitset.
1413
   *
1414
   *  These should be self-explanatory.
1415
  */
1416
  template
1417
    inline bitset<_Nb>
1418
    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
1419
    {
1420
      bitset<_Nb> __result(__x);
1421
      __result &= __y;
1422
      return __result;
1423
    }
1424
 
1425
  template
1426
    inline bitset<_Nb>
1427
    operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
1428
    {
1429
      bitset<_Nb> __result(__x);
1430
      __result |= __y;
1431
      return __result;
1432
    }
1433
 
1434
  template 
1435
    inline bitset<_Nb>
1436
    operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
1437
    {
1438
      bitset<_Nb> __result(__x);
1439
      __result ^= __y;
1440
      return __result;
1441
    }
1442
  //@}
1443
 
1444
  //@{
1445
  /**
1446
   *  @brief Global I/O operators for bitsets.
1447
   *
1448
   *  Direct I/O between streams and bitsets is supported.  Output is
1449
   *  straightforward.  Input will skip whitespace, only accept @a 0 and @a 1
1450
   *  characters, and will only extract as many digits as the %bitset will
1451
   *  hold.
1452
  */
1453
  template
1454
    std::basic_istream<_CharT, _Traits>&
1455
    operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
1456
    {
1457
      typedef typename _Traits::char_type          char_type;
1458
      typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1459
      typedef typename __istream_type::ios_base    __ios_base;
1460
 
1461
      std::basic_string<_CharT, _Traits> __tmp;
1462
      __tmp.reserve(_Nb);
1463
 
1464
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1465
      // 303. Bitset input operator underspecified
1466
      const char_type __zero = __is.widen('0');
1467
      const char_type __one = __is.widen('1');
1468
 
1469
      typename __ios_base::iostate __state = __ios_base::goodbit;
1470
      typename __istream_type::sentry __sentry(__is);
1471
      if (__sentry)
1472
        {
1473
          __try
1474
            {
1475
              for (size_t __i = _Nb; __i > 0; --__i)
1476
                {
1477
                  static typename _Traits::int_type __eof = _Traits::eof();
1478
 
1479
                  typename _Traits::int_type __c1 = __is.rdbuf()->sbumpc();
1480
                  if (_Traits::eq_int_type(__c1, __eof))
1481
                    {
1482
                      __state |= __ios_base::eofbit;
1483
                      break;
1484
                    }
1485
                  else
1486
                    {
1487
                      const char_type __c2 = _Traits::to_char_type(__c1);
1488
                      if (_Traits::eq(__c2, __zero))
1489
                        __tmp.push_back(__zero);
1490
                      else if (_Traits::eq(__c2, __one))
1491
                        __tmp.push_back(__one);
1492
                      else if (_Traits::
1493
                               eq_int_type(__is.rdbuf()->sputbackc(__c2),
1494
                                           __eof))
1495
                        {
1496
                          __state |= __ios_base::failbit;
1497
                          break;
1498
                        }
1499
                    }
1500
                }
1501
            }
1502
          __catch(__cxxabiv1::__forced_unwind&)
1503
            {
1504
              __is._M_setstate(__ios_base::badbit);
1505
              __throw_exception_again;
1506
            }
1507
          __catch(...)
1508
            { __is._M_setstate(__ios_base::badbit); }
1509
        }
1510
 
1511
      if (__tmp.empty() && _Nb)
1512
        __state |= __ios_base::failbit;
1513
      else
1514
        __x._M_copy_from_string(__tmp, static_cast(0), _Nb,
1515
                                __zero, __one);
1516
      if (__state)
1517
        __is.setstate(__state);
1518
      return __is;
1519
    }
1520
 
1521
  template 
1522
    std::basic_ostream<_CharT, _Traits>&
1523
    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1524
               const bitset<_Nb>& __x)
1525
    {
1526
      std::basic_string<_CharT, _Traits> __tmp;
1527
 
1528
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1529
      // 396. what are characters zero and one.
1530
      const ctype<_CharT>& __ct = use_facet >(__os.getloc());
1531
      __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1'));
1532
      return __os << __tmp;
1533
    }
1534
  //@}
1535
 
1536
_GLIBCXX_END_NAMESPACE_CONTAINER
1537
} // namespace std
1538
 
1539
#undef _GLIBCXX_BITSET_WORDS
1540
#undef _GLIBCXX_BITSET_BITS_PER_WORD
1541
#undef _GLIBCXX_BITSET_BITS_PER_ULL
1542
 
1543
#ifdef __GXX_EXPERIMENTAL_CXX0X__
1544
 
1545
#include 
1546
 
1547
namespace std _GLIBCXX_VISIBILITY(default)
1548
{
1549
_GLIBCXX_BEGIN_NAMESPACE_VERSION
1550
 
1551
  // DR 1182.
1552
  /// std::hash specialization for bitset.
1553
  template
1554
    struct hash<_GLIBCXX_STD_C::bitset<_Nb>>
1555
    : public __hash_base>
1556
    {
1557
      size_t
1558
      operator()(const _GLIBCXX_STD_C::bitset<_Nb>& __b) const noexcept
1559
      {
1560
        const size_t __clength = (_Nb + __CHAR_BIT__ - 1) / __CHAR_BIT__;
1561
        return std::_Hash_impl::hash(__b._M_getdata(), __clength);
1562
      }
1563
    };
1564
 
1565
  template<>
1566
    struct hash<_GLIBCXX_STD_C::bitset<0>>
1567
    : public __hash_base>
1568
    {
1569
      size_t
1570
      operator()(const _GLIBCXX_STD_C::bitset<0>&) const noexcept
1571
      { return 0; }
1572
    };
1573
 
1574
_GLIBCXX_END_NAMESPACE_VERSION
1575
} // namespace
1576
 
1577
#endif // __GXX_EXPERIMENTAL_CXX0X__
1578
 
1579
#ifdef _GLIBCXX_DEBUG
1580
# include 
1581
#endif
1582
 
1583
#ifdef _GLIBCXX_PROFILE
1584
# include 
1585
#endif
1586
 
1587
#endif /* _GLIBCXX_BITSET */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.