root / lab4 / .minix-src / include / c++ / bitset @ 14
History | View | Annotate | Download (33.1 KB)
1 |
// -*- C++ -*- |
---|---|
2 |
//===---------------------------- bitset ----------------------------------===// |
3 |
// |
4 |
// The LLVM Compiler Infrastructure |
5 |
// |
6 |
// This file is dual licensed under the MIT and the University of Illinois Open |
7 |
// Source Licenses. See LICENSE.TXT for details. |
8 |
// |
9 |
//===----------------------------------------------------------------------===// |
10 |
|
11 |
#ifndef _LIBCPP_BITSET |
12 |
#define _LIBCPP_BITSET |
13 |
|
14 |
/* |
15 |
bitset synopsis |
16 |
|
17 |
namespace std |
18 |
{ |
19 |
|
20 |
namespace std { |
21 |
|
22 |
template <size_t N> |
23 |
class bitset |
24 |
{ |
25 |
public: |
26 |
// bit reference: |
27 |
class reference |
28 |
{ |
29 |
friend class bitset; |
30 |
reference() noexcept; |
31 |
public: |
32 |
~reference() noexcept; |
33 |
reference& operator=(bool x) noexcept; // for b[i] = x; |
34 |
reference& operator=(const reference&) noexcept; // for b[i] = b[j]; |
35 |
bool operator~() const noexcept; // flips the bit |
36 |
operator bool() const noexcept; // for x = b[i]; |
37 |
reference& flip() noexcept; // for b[i].flip(); |
38 |
}; |
39 |
|
40 |
// 23.3.5.1 constructors: |
41 |
constexpr bitset() noexcept; |
42 |
constexpr bitset(unsigned long long val) noexcept; |
43 |
template <class charT> |
44 |
explicit bitset(const charT* str, |
45 |
typename basic_string<charT>::size_type n = basic_string<charT>::npos, |
46 |
charT zero = charT('0'), charT one = charT('1')); |
47 |
template<class charT, class traits, class Allocator> |
48 |
explicit bitset(const basic_string<charT,traits,Allocator>& str, |
49 |
typename basic_string<charT,traits,Allocator>::size_type pos = 0, |
50 |
typename basic_string<charT,traits,Allocator>::size_type n = |
51 |
basic_string<charT,traits,Allocator>::npos, |
52 |
charT zero = charT('0'), charT one = charT('1')); |
53 |
|
54 |
// 23.3.5.2 bitset operations: |
55 |
bitset& operator&=(const bitset& rhs) noexcept; |
56 |
bitset& operator|=(const bitset& rhs) noexcept; |
57 |
bitset& operator^=(const bitset& rhs) noexcept; |
58 |
bitset& operator<<=(size_t pos) noexcept; |
59 |
bitset& operator>>=(size_t pos) noexcept; |
60 |
bitset& set() noexcept; |
61 |
bitset& set(size_t pos, bool val = true); |
62 |
bitset& reset() noexcept; |
63 |
bitset& reset(size_t pos); |
64 |
bitset operator~() const noexcept; |
65 |
bitset& flip() noexcept; |
66 |
bitset& flip(size_t pos); |
67 |
|
68 |
// element access: |
69 |
constexpr bool operator[](size_t pos) const; // for b[i]; |
70 |
reference operator[](size_t pos); // for b[i]; |
71 |
unsigned long to_ulong() const; |
72 |
unsigned long long to_ullong() const; |
73 |
template <class charT, class traits, class Allocator> |
74 |
basic_string<charT, traits, Allocator> to_string(charT zero = charT('0'), charT one = charT('1')) const; |
75 |
template <class charT, class traits> |
76 |
basic_string<charT, traits, allocator<charT> > to_string(charT zero = charT('0'), charT one = charT('1')) const; |
77 |
template <class charT> |
78 |
basic_string<charT, char_traits<charT>, allocator<charT> > to_string(charT zero = charT('0'), charT one = charT('1')) const; |
79 |
basic_string<char, char_traits<char>, allocator<char> > to_string(char zero = '0', char one = '1') const; |
80 |
size_t count() const noexcept; |
81 |
constexpr size_t size() const noexcept; |
82 |
bool operator==(const bitset& rhs) const noexcept; |
83 |
bool operator!=(const bitset& rhs) const noexcept; |
84 |
bool test(size_t pos) const; |
85 |
bool all() const noexcept; |
86 |
bool any() const noexcept; |
87 |
bool none() const noexcept; |
88 |
bitset operator<<(size_t pos) const noexcept; |
89 |
bitset operator>>(size_t pos) const noexcept; |
90 |
}; |
91 |
|
92 |
// 23.3.5.3 bitset operators: |
93 |
template <size_t N> |
94 |
bitset<N> operator&(const bitset<N>&, const bitset<N>&) noexcept; |
95 |
|
96 |
template <size_t N> |
97 |
bitset<N> operator|(const bitset<N>&, const bitset<N>&) noexcept; |
98 |
|
99 |
template <size_t N> |
100 |
bitset<N> operator^(const bitset<N>&, const bitset<N>&) noexcept; |
101 |
|
102 |
template <class charT, class traits, size_t N> |
103 |
basic_istream<charT, traits>& |
104 |
operator>>(basic_istream<charT, traits>& is, bitset<N>& x); |
105 |
|
106 |
template <class charT, class traits, size_t N> |
107 |
basic_ostream<charT, traits>& |
108 |
operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x); |
109 |
|
110 |
template <size_t N> struct hash<std::bitset<N>>; |
111 |
|
112 |
} // std |
113 |
|
114 |
*/ |
115 |
|
116 |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
117 |
#pragma GCC system_header |
118 |
#endif |
119 |
|
120 |
#include <__config> |
121 |
#include <__bit_reference> |
122 |
#include <cstddef> |
123 |
#include <climits> |
124 |
#include <string> |
125 |
#include <stdexcept> |
126 |
#include <iosfwd> |
127 |
#include <__functional_base> |
128 |
#if defined(_LIBCPP_NO_EXCEPTIONS) |
129 |
#include <cassert> |
130 |
#endif |
131 |
|
132 |
#include <__undef_min_max> |
133 |
|
134 |
_LIBCPP_BEGIN_NAMESPACE_STD |
135 |
|
136 |
template <size_t _N_words, size_t _Size> |
137 |
class __bitset; |
138 |
|
139 |
template <size_t _N_words, size_t _Size> |
140 |
struct __has_storage_type<__bitset<_N_words, _Size> > |
141 |
{ |
142 |
static const bool value = true; |
143 |
}; |
144 |
|
145 |
template <size_t _N_words, size_t _Size> |
146 |
class __bitset |
147 |
{ |
148 |
public: |
149 |
typedef ptrdiff_t difference_type; |
150 |
typedef size_t size_type; |
151 |
typedef size_type __storage_type; |
152 |
protected: |
153 |
typedef __bitset __self; |
154 |
typedef __storage_type* __storage_pointer; |
155 |
typedef const __storage_type* __const_storage_pointer; |
156 |
static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); |
157 |
|
158 |
friend class __bit_reference<__bitset>; |
159 |
friend class __bit_const_reference<__bitset>; |
160 |
friend class __bit_iterator<__bitset, false>; |
161 |
friend class __bit_iterator<__bitset, true>; |
162 |
friend struct __bit_array<__bitset>; |
163 |
|
164 |
__storage_type __first_[_N_words]; |
165 |
|
166 |
typedef __bit_reference<__bitset> reference; |
167 |
typedef __bit_const_reference<__bitset> const_reference; |
168 |
typedef __bit_iterator<__bitset, false> iterator; |
169 |
typedef __bit_iterator<__bitset, true> const_iterator; |
170 |
|
171 |
_LIBCPP_CONSTEXPR __bitset() _NOEXCEPT; |
172 |
explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT; |
173 |
|
174 |
_LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT |
175 |
{return reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} |
176 |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT |
177 |
{return const_reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} |
178 |
_LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT |
179 |
{return iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);} |
180 |
_LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT |
181 |
{return const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);} |
182 |
|
183 |
void operator&=(const __bitset& __v) _NOEXCEPT; |
184 |
void operator|=(const __bitset& __v) _NOEXCEPT; |
185 |
void operator^=(const __bitset& __v) _NOEXCEPT; |
186 |
|
187 |
void flip() _NOEXCEPT; |
188 |
_LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const |
189 |
{return to_ulong(integral_constant<bool, _Size < sizeof(unsigned long) * CHAR_BIT>());} |
190 |
_LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const |
191 |
{return to_ullong(integral_constant<bool, _Size < sizeof(unsigned long long) * CHAR_BIT>());} |
192 |
|
193 |
bool all() const _NOEXCEPT; |
194 |
bool any() const _NOEXCEPT; |
195 |
size_t __hash_code() const _NOEXCEPT; |
196 |
private: |
197 |
#ifdef _LIBCPP_HAS_NO_CONSTEXPR |
198 |
void __init(unsigned long long __v, false_type) _NOEXCEPT; |
199 |
void __init(unsigned long long __v, true_type) _NOEXCEPT; |
200 |
#endif // _LIBCPP_HAS_NO_CONSTEXPR |
201 |
unsigned long to_ulong(false_type) const; |
202 |
unsigned long to_ulong(true_type) const; |
203 |
unsigned long long to_ullong(false_type) const; |
204 |
unsigned long long to_ullong(true_type) const; |
205 |
unsigned long long to_ullong(true_type, false_type) const; |
206 |
unsigned long long to_ullong(true_type, true_type) const; |
207 |
}; |
208 |
|
209 |
template <size_t _N_words, size_t _Size> |
210 |
inline _LIBCPP_INLINE_VISIBILITY |
211 |
_LIBCPP_CONSTEXPR |
212 |
__bitset<_N_words, _Size>::__bitset() _NOEXCEPT |
213 |
#ifndef _LIBCPP_HAS_NO_CONSTEXPR |
214 |
: __first_{0} |
215 |
#endif |
216 |
{ |
217 |
#ifdef _LIBCPP_HAS_NO_CONSTEXPR |
218 |
_VSTD::fill_n(__first_, _N_words, __storage_type(0)); |
219 |
#endif |
220 |
} |
221 |
|
222 |
#ifdef _LIBCPP_HAS_NO_CONSTEXPR |
223 |
|
224 |
template <size_t _N_words, size_t _Size> |
225 |
void |
226 |
__bitset<_N_words, _Size>::__init(unsigned long long __v, false_type) _NOEXCEPT |
227 |
{ |
228 |
__storage_type __t[sizeof(unsigned long long) / sizeof(__storage_type)]; |
229 |
for (size_t __i = 0; __i < sizeof(__t)/sizeof(__t[0]); ++__i, __v >>= __bits_per_word) |
230 |
__t[__i] = static_cast<__storage_type>(__v); |
231 |
_VSTD::copy(__t, __t + sizeof(__t)/sizeof(__t[0]), __first_); |
232 |
_VSTD::fill(__first_ + sizeof(__t)/sizeof(__t[0]), __first_ + sizeof(__first_)/sizeof(__first_[0]), |
233 |
__storage_type(0)); |
234 |
} |
235 |
|
236 |
template <size_t _N_words, size_t _Size> |
237 |
inline _LIBCPP_INLINE_VISIBILITY |
238 |
void |
239 |
__bitset<_N_words, _Size>::__init(unsigned long long __v, true_type) _NOEXCEPT |
240 |
{ |
241 |
__first_[0] = __v; |
242 |
_VSTD::fill(__first_ + 1, __first_ + sizeof(__first_)/sizeof(__first_[0]), __storage_type(0)); |
243 |
} |
244 |
|
245 |
#endif // _LIBCPP_HAS_NO_CONSTEXPR |
246 |
|
247 |
template <size_t _N_words, size_t _Size> |
248 |
inline _LIBCPP_INLINE_VISIBILITY |
249 |
_LIBCPP_CONSTEXPR |
250 |
__bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT |
251 |
#ifndef _LIBCPP_HAS_NO_CONSTEXPR |
252 |
#if __SIZEOF_SIZE_T__ == 8 |
253 |
: __first_{__v} |
254 |
#elif __SIZEOF_SIZE_T__ == 4 |
255 |
: __first_{__v, __v >> __bits_per_word} |
256 |
#else |
257 |
#error This constructor has not been ported to this platform |
258 |
#endif |
259 |
#endif |
260 |
{ |
261 |
#ifdef _LIBCPP_HAS_NO_CONSTEXPR |
262 |
__init(__v, integral_constant<bool, sizeof(unsigned long long) == sizeof(__storage_type)>()); |
263 |
#endif |
264 |
} |
265 |
|
266 |
template <size_t _N_words, size_t _Size> |
267 |
inline _LIBCPP_INLINE_VISIBILITY |
268 |
void |
269 |
__bitset<_N_words, _Size>::operator&=(const __bitset& __v) _NOEXCEPT |
270 |
{ |
271 |
for (size_type __i = 0; __i < _N_words; ++__i) |
272 |
__first_[__i] &= __v.__first_[__i]; |
273 |
} |
274 |
|
275 |
template <size_t _N_words, size_t _Size> |
276 |
inline _LIBCPP_INLINE_VISIBILITY |
277 |
void |
278 |
__bitset<_N_words, _Size>::operator|=(const __bitset& __v) _NOEXCEPT |
279 |
{ |
280 |
for (size_type __i = 0; __i < _N_words; ++__i) |
281 |
__first_[__i] |= __v.__first_[__i]; |
282 |
} |
283 |
|
284 |
template <size_t _N_words, size_t _Size> |
285 |
inline _LIBCPP_INLINE_VISIBILITY |
286 |
void |
287 |
__bitset<_N_words, _Size>::operator^=(const __bitset& __v) _NOEXCEPT |
288 |
{ |
289 |
for (size_type __i = 0; __i < _N_words; ++__i) |
290 |
__first_[__i] ^= __v.__first_[__i]; |
291 |
} |
292 |
|
293 |
template <size_t _N_words, size_t _Size> |
294 |
void |
295 |
__bitset<_N_words, _Size>::flip() _NOEXCEPT |
296 |
{ |
297 |
// do middle whole words |
298 |
size_type __n = _Size; |
299 |
__storage_pointer __p = __first_; |
300 |
for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) |
301 |
*__p = ~*__p; |
302 |
// do last partial word |
303 |
if (__n > 0) |
304 |
{ |
305 |
__storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); |
306 |
__storage_type __b = *__p & __m; |
307 |
*__p &= ~__m; |
308 |
*__p |= ~__b & __m; |
309 |
} |
310 |
} |
311 |
|
312 |
template <size_t _N_words, size_t _Size> |
313 |
unsigned long |
314 |
__bitset<_N_words, _Size>::to_ulong(false_type) const |
315 |
{ |
316 |
const_iterator __e = __make_iter(_Size); |
317 |
const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true); |
318 |
if (__i != __e) |
319 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
320 |
throw overflow_error("bitset to_ulong overflow error"); |
321 |
#else |
322 |
assert(!"bitset to_ulong overflow error"); |
323 |
#endif |
324 |
return __first_[0]; |
325 |
} |
326 |
|
327 |
template <size_t _N_words, size_t _Size> |
328 |
inline _LIBCPP_INLINE_VISIBILITY |
329 |
unsigned long |
330 |
__bitset<_N_words, _Size>::to_ulong(true_type) const |
331 |
{ |
332 |
return __first_[0]; |
333 |
} |
334 |
|
335 |
template <size_t _N_words, size_t _Size> |
336 |
unsigned long long |
337 |
__bitset<_N_words, _Size>::to_ullong(false_type) const |
338 |
{ |
339 |
const_iterator __e = __make_iter(_Size); |
340 |
const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true); |
341 |
if (__i != __e) |
342 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
343 |
throw overflow_error("bitset to_ullong overflow error"); |
344 |
#else |
345 |
assert(!"bitset to_ullong overflow error"); |
346 |
#endif |
347 |
return to_ullong(true_type()); |
348 |
} |
349 |
|
350 |
template <size_t _N_words, size_t _Size> |
351 |
inline _LIBCPP_INLINE_VISIBILITY |
352 |
unsigned long long |
353 |
__bitset<_N_words, _Size>::to_ullong(true_type) const |
354 |
{ |
355 |
return to_ullong(true_type(), integral_constant<bool, sizeof(__storage_type) < sizeof(unsigned long long)>()); |
356 |
} |
357 |
|
358 |
template <size_t _N_words, size_t _Size> |
359 |
inline _LIBCPP_INLINE_VISIBILITY |
360 |
unsigned long long |
361 |
__bitset<_N_words, _Size>::to_ullong(true_type, false_type) const |
362 |
{ |
363 |
return __first_[0]; |
364 |
} |
365 |
|
366 |
template <size_t _N_words, size_t _Size> |
367 |
unsigned long long |
368 |
__bitset<_N_words, _Size>::to_ullong(true_type, true_type) const |
369 |
{ |
370 |
unsigned long long __r = __first_[0]; |
371 |
for (std::size_t __i = 1; __i < sizeof(unsigned long long) / sizeof(__storage_type); ++__i) |
372 |
__r |= static_cast<unsigned long long>(__first_[__i]) << (sizeof(__storage_type) * CHAR_BIT); |
373 |
return __r; |
374 |
} |
375 |
|
376 |
template <size_t _N_words, size_t _Size> |
377 |
bool |
378 |
__bitset<_N_words, _Size>::all() const _NOEXCEPT |
379 |
{ |
380 |
// do middle whole words |
381 |
size_type __n = _Size; |
382 |
__const_storage_pointer __p = __first_; |
383 |
for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) |
384 |
if (~*__p) |
385 |
return false; |
386 |
// do last partial word |
387 |
if (__n > 0) |
388 |
{ |
389 |
__storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); |
390 |
if (~*__p & __m) |
391 |
return false; |
392 |
} |
393 |
return true; |
394 |
} |
395 |
|
396 |
template <size_t _N_words, size_t _Size> |
397 |
bool |
398 |
__bitset<_N_words, _Size>::any() const _NOEXCEPT |
399 |
{ |
400 |
// do middle whole words |
401 |
size_type __n = _Size; |
402 |
__const_storage_pointer __p = __first_; |
403 |
for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) |
404 |
if (*__p) |
405 |
return true; |
406 |
// do last partial word |
407 |
if (__n > 0) |
408 |
{ |
409 |
__storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); |
410 |
if (*__p & __m) |
411 |
return true; |
412 |
} |
413 |
return false; |
414 |
} |
415 |
|
416 |
template <size_t _N_words, size_t _Size> |
417 |
inline _LIBCPP_INLINE_VISIBILITY |
418 |
size_t |
419 |
__bitset<_N_words, _Size>::__hash_code() const _NOEXCEPT |
420 |
{ |
421 |
size_t __h = 0; |
422 |
for (size_type __i = 0; __i < _N_words; ++__i) |
423 |
__h ^= __first_[__i]; |
424 |
return __h; |
425 |
} |
426 |
|
427 |
template <size_t _Size> |
428 |
class __bitset<1, _Size> |
429 |
{ |
430 |
public: |
431 |
typedef ptrdiff_t difference_type; |
432 |
typedef size_t size_type; |
433 |
typedef size_type __storage_type; |
434 |
protected: |
435 |
typedef __bitset __self; |
436 |
typedef __storage_type* __storage_pointer; |
437 |
typedef const __storage_type* __const_storage_pointer; |
438 |
static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); |
439 |
|
440 |
friend class __bit_reference<__bitset>; |
441 |
friend class __bit_const_reference<__bitset>; |
442 |
friend class __bit_iterator<__bitset, false>; |
443 |
friend class __bit_iterator<__bitset, true>; |
444 |
friend struct __bit_array<__bitset>; |
445 |
|
446 |
__storage_type __first_; |
447 |
|
448 |
typedef __bit_reference<__bitset> reference; |
449 |
typedef __bit_const_reference<__bitset> const_reference; |
450 |
typedef __bit_iterator<__bitset, false> iterator; |
451 |
typedef __bit_iterator<__bitset, true> const_iterator; |
452 |
|
453 |
_LIBCPP_CONSTEXPR __bitset() _NOEXCEPT; |
454 |
explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT; |
455 |
|
456 |
_LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT |
457 |
{return reference(&__first_, __storage_type(1) << __pos);} |
458 |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT |
459 |
{return const_reference(&__first_, __storage_type(1) << __pos);} |
460 |
_LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT |
461 |
{return iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);} |
462 |
_LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT |
463 |
{return const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);} |
464 |
|
465 |
void operator&=(const __bitset& __v) _NOEXCEPT; |
466 |
void operator|=(const __bitset& __v) _NOEXCEPT; |
467 |
void operator^=(const __bitset& __v) _NOEXCEPT; |
468 |
|
469 |
void flip() _NOEXCEPT; |
470 |
|
471 |
unsigned long to_ulong() const; |
472 |
unsigned long long to_ullong() const; |
473 |
|
474 |
bool all() const _NOEXCEPT; |
475 |
bool any() const _NOEXCEPT; |
476 |
|
477 |
size_t __hash_code() const _NOEXCEPT; |
478 |
}; |
479 |
|
480 |
template <size_t _Size> |
481 |
inline _LIBCPP_INLINE_VISIBILITY |
482 |
_LIBCPP_CONSTEXPR |
483 |
__bitset<1, _Size>::__bitset() _NOEXCEPT |
484 |
: __first_(0) |
485 |
{ |
486 |
} |
487 |
|
488 |
template <size_t _Size> |
489 |
inline _LIBCPP_INLINE_VISIBILITY |
490 |
_LIBCPP_CONSTEXPR |
491 |
__bitset<1, _Size>::__bitset(unsigned long long __v) _NOEXCEPT |
492 |
: __first_(static_cast<__storage_type>(__v)) |
493 |
{ |
494 |
} |
495 |
|
496 |
template <size_t _Size> |
497 |
inline _LIBCPP_INLINE_VISIBILITY |
498 |
void |
499 |
__bitset<1, _Size>::operator&=(const __bitset& __v) _NOEXCEPT |
500 |
{ |
501 |
__first_ &= __v.__first_; |
502 |
} |
503 |
|
504 |
template <size_t _Size> |
505 |
inline _LIBCPP_INLINE_VISIBILITY |
506 |
void |
507 |
__bitset<1, _Size>::operator|=(const __bitset& __v) _NOEXCEPT |
508 |
{ |
509 |
__first_ |= __v.__first_; |
510 |
} |
511 |
|
512 |
template <size_t _Size> |
513 |
inline _LIBCPP_INLINE_VISIBILITY |
514 |
void |
515 |
__bitset<1, _Size>::operator^=(const __bitset& __v) _NOEXCEPT |
516 |
{ |
517 |
__first_ ^= __v.__first_; |
518 |
} |
519 |
|
520 |
template <size_t _Size> |
521 |
inline _LIBCPP_INLINE_VISIBILITY |
522 |
void |
523 |
__bitset<1, _Size>::flip() _NOEXCEPT |
524 |
{ |
525 |
__storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size); |
526 |
__first_ = ~__first_; |
527 |
__first_ &= __m; |
528 |
} |
529 |
|
530 |
template <size_t _Size> |
531 |
inline _LIBCPP_INLINE_VISIBILITY |
532 |
unsigned long |
533 |
__bitset<1, _Size>::to_ulong() const |
534 |
{ |
535 |
return __first_; |
536 |
} |
537 |
|
538 |
template <size_t _Size> |
539 |
inline _LIBCPP_INLINE_VISIBILITY |
540 |
unsigned long long |
541 |
__bitset<1, _Size>::to_ullong() const |
542 |
{ |
543 |
return __first_; |
544 |
} |
545 |
|
546 |
template <size_t _Size> |
547 |
inline _LIBCPP_INLINE_VISIBILITY |
548 |
bool |
549 |
__bitset<1, _Size>::all() const _NOEXCEPT |
550 |
{ |
551 |
__storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size); |
552 |
return !(~__first_ & __m); |
553 |
} |
554 |
|
555 |
template <size_t _Size> |
556 |
inline _LIBCPP_INLINE_VISIBILITY |
557 |
bool |
558 |
__bitset<1, _Size>::any() const _NOEXCEPT |
559 |
{ |
560 |
__storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size); |
561 |
return __first_ & __m; |
562 |
} |
563 |
|
564 |
template <size_t _Size> |
565 |
inline _LIBCPP_INLINE_VISIBILITY |
566 |
size_t |
567 |
__bitset<1, _Size>::__hash_code() const _NOEXCEPT |
568 |
{ |
569 |
return __first_; |
570 |
} |
571 |
|
572 |
template <> |
573 |
class __bitset<0, 0> |
574 |
{ |
575 |
public: |
576 |
typedef ptrdiff_t difference_type; |
577 |
typedef size_t size_type; |
578 |
typedef size_type __storage_type; |
579 |
protected: |
580 |
typedef __bitset __self; |
581 |
typedef __storage_type* __storage_pointer; |
582 |
typedef const __storage_type* __const_storage_pointer; |
583 |
static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); |
584 |
|
585 |
friend class __bit_reference<__bitset>; |
586 |
friend class __bit_const_reference<__bitset>; |
587 |
friend class __bit_iterator<__bitset, false>; |
588 |
friend class __bit_iterator<__bitset, true>; |
589 |
friend struct __bit_array<__bitset>; |
590 |
|
591 |
typedef __bit_reference<__bitset> reference; |
592 |
typedef __bit_const_reference<__bitset> const_reference; |
593 |
typedef __bit_iterator<__bitset, false> iterator; |
594 |
typedef __bit_iterator<__bitset, true> const_iterator; |
595 |
|
596 |
_LIBCPP_CONSTEXPR __bitset() _NOEXCEPT; |
597 |
explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long) _NOEXCEPT; |
598 |
|
599 |
_LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t) _NOEXCEPT |
600 |
{return reference(0, 1);} |
601 |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t) const _NOEXCEPT |
602 |
{return const_reference(0, 1);} |
603 |
_LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t) _NOEXCEPT |
604 |
{return iterator(0, 0);} |
605 |
_LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t) const _NOEXCEPT |
606 |
{return const_iterator(0, 0);} |
607 |
|
608 |
_LIBCPP_INLINE_VISIBILITY void operator&=(const __bitset&) _NOEXCEPT {} |
609 |
_LIBCPP_INLINE_VISIBILITY void operator|=(const __bitset&) _NOEXCEPT {} |
610 |
_LIBCPP_INLINE_VISIBILITY void operator^=(const __bitset&) _NOEXCEPT {} |
611 |
|
612 |
_LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {} |
613 |
|
614 |
_LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const {return 0;} |
615 |
_LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const {return 0;} |
616 |
|
617 |
_LIBCPP_INLINE_VISIBILITY bool all() const _NOEXCEPT {return true;} |
618 |
_LIBCPP_INLINE_VISIBILITY bool any() const _NOEXCEPT {return false;} |
619 |
|
620 |
_LIBCPP_INLINE_VISIBILITY size_t __hash_code() const _NOEXCEPT {return 0;} |
621 |
}; |
622 |
|
623 |
inline _LIBCPP_INLINE_VISIBILITY |
624 |
_LIBCPP_CONSTEXPR |
625 |
__bitset<0, 0>::__bitset() _NOEXCEPT |
626 |
{ |
627 |
} |
628 |
|
629 |
inline _LIBCPP_INLINE_VISIBILITY |
630 |
_LIBCPP_CONSTEXPR |
631 |
__bitset<0, 0>::__bitset(unsigned long long) _NOEXCEPT |
632 |
{ |
633 |
} |
634 |
|
635 |
template <size_t _Size> class _LIBCPP_TYPE_VIS_ONLY bitset; |
636 |
template <size_t _Size> struct _LIBCPP_TYPE_VIS_ONLY hash<bitset<_Size> >; |
637 |
|
638 |
template <size_t _Size> |
639 |
class _LIBCPP_TYPE_VIS_ONLY bitset |
640 |
: private __bitset<_Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1, _Size> |
641 |
{ |
642 |
public: |
643 |
static const unsigned __n_words = _Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1; |
644 |
typedef __bitset<__n_words, _Size> base; |
645 |
|
646 |
public: |
647 |
typedef typename base::reference reference; |
648 |
typedef typename base::const_reference const_reference; |
649 |
|
650 |
// 23.3.5.1 constructors: |
651 |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bitset() _NOEXCEPT {} |
652 |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
653 |
bitset(unsigned long long __v) _NOEXCEPT : base(__v) {} |
654 |
template<class _CharT> |
655 |
explicit bitset(const _CharT* __str, |
656 |
typename basic_string<_CharT>::size_type __n = basic_string<_CharT>::npos, |
657 |
_CharT __zero = _CharT('0'), _CharT __one = _CharT('1')); |
658 |
template<class _CharT, class _Traits, class _Allocator> |
659 |
explicit bitset(const basic_string<_CharT,_Traits,_Allocator>& __str, |
660 |
typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos = 0, |
661 |
typename basic_string<_CharT,_Traits,_Allocator>::size_type __n = |
662 |
(basic_string<_CharT,_Traits,_Allocator>::npos), |
663 |
_CharT __zero = _CharT('0'), _CharT __one = _CharT('1')); |
664 |
|
665 |
// 23.3.5.2 bitset operations: |
666 |
bitset& operator&=(const bitset& __rhs) _NOEXCEPT; |
667 |
bitset& operator|=(const bitset& __rhs) _NOEXCEPT; |
668 |
bitset& operator^=(const bitset& __rhs) _NOEXCEPT; |
669 |
bitset& operator<<=(size_t __pos) _NOEXCEPT; |
670 |
bitset& operator>>=(size_t __pos) _NOEXCEPT; |
671 |
bitset& set() _NOEXCEPT; |
672 |
bitset& set(size_t __pos, bool __val = true); |
673 |
bitset& reset() _NOEXCEPT; |
674 |
bitset& reset(size_t __pos); |
675 |
bitset operator~() const _NOEXCEPT; |
676 |
bitset& flip() _NOEXCEPT; |
677 |
bitset& flip(size_t __pos); |
678 |
|
679 |
// element access: |
680 |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
681 |
const_reference operator[](size_t __p) const {return base::__make_ref(__p);} |
682 |
_LIBCPP_INLINE_VISIBILITY reference operator[](size_t __p) {return base::__make_ref(__p);} |
683 |
unsigned long to_ulong() const; |
684 |
unsigned long long to_ullong() const; |
685 |
template <class _CharT, class _Traits, class _Allocator> |
686 |
basic_string<_CharT, _Traits, _Allocator> to_string(_CharT __zero = _CharT('0'), |
687 |
_CharT __one = _CharT('1')) const; |
688 |
template <class _CharT, class _Traits> |
689 |
basic_string<_CharT, _Traits, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'), |
690 |
_CharT __one = _CharT('1')) const; |
691 |
template <class _CharT> |
692 |
basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'), |
693 |
_CharT __one = _CharT('1')) const; |
694 |
basic_string<char, char_traits<char>, allocator<char> > to_string(char __zero = '0', |
695 |
char __one = '1') const; |
696 |
size_t count() const _NOEXCEPT; |
697 |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR size_t size() const _NOEXCEPT {return _Size;} |
698 |
bool operator==(const bitset& __rhs) const _NOEXCEPT; |
699 |
bool operator!=(const bitset& __rhs) const _NOEXCEPT; |
700 |
bool test(size_t __pos) const; |
701 |
bool all() const _NOEXCEPT; |
702 |
bool any() const _NOEXCEPT; |
703 |
_LIBCPP_INLINE_VISIBILITY bool none() const _NOEXCEPT {return !any();} |
704 |
bitset operator<<(size_t __pos) const _NOEXCEPT; |
705 |
bitset operator>>(size_t __pos) const _NOEXCEPT; |
706 |
|
707 |
private: |
708 |
|
709 |
_LIBCPP_INLINE_VISIBILITY |
710 |
size_t __hash_code() const _NOEXCEPT {return base::__hash_code();} |
711 |
|
712 |
friend struct hash<bitset>; |
713 |
}; |
714 |
|
715 |
template <size_t _Size> |
716 |
template<class _CharT> |
717 |
bitset<_Size>::bitset(const _CharT* __str, |
718 |
typename basic_string<_CharT>::size_type __n, |
719 |
_CharT __zero, _CharT __one) |
720 |
{ |
721 |
size_t __rlen = _VSTD::min(__n, char_traits<_CharT>::length(__str)); |
722 |
for (size_t __i = 0; __i < __rlen; ++__i) |
723 |
if (__str[__i] != __zero && __str[__i] != __one) |
724 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
725 |
throw invalid_argument("bitset string ctor has invalid argument"); |
726 |
#else |
727 |
assert(!"bitset string ctor has invalid argument"); |
728 |
#endif |
729 |
size_t _Mp = _VSTD::min(__rlen, _Size); |
730 |
size_t __i = 0; |
731 |
for (; __i < _Mp; ++__i) |
732 |
{ |
733 |
_CharT __c = __str[_Mp - 1 - __i]; |
734 |
if (__c == __zero) |
735 |
(*this)[__i] = false; |
736 |
else |
737 |
(*this)[__i] = true; |
738 |
} |
739 |
_VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false); |
740 |
} |
741 |
|
742 |
template <size_t _Size> |
743 |
template<class _CharT, class _Traits, class _Allocator> |
744 |
bitset<_Size>::bitset(const basic_string<_CharT,_Traits,_Allocator>& __str, |
745 |
typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos, |
746 |
typename basic_string<_CharT,_Traits,_Allocator>::size_type __n, |
747 |
_CharT __zero, _CharT __one) |
748 |
{ |
749 |
if (__pos > __str.size()) |
750 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
751 |
throw out_of_range("bitset string pos out of range"); |
752 |
#else |
753 |
assert(!"bitset string pos out of range"); |
754 |
#endif |
755 |
size_t __rlen = _VSTD::min(__n, __str.size() - __pos); |
756 |
for (size_t __i = __pos; __i < __pos + __rlen; ++__i) |
757 |
if (!_Traits::eq(__str[__i], __zero) && !_Traits::eq(__str[__i], __one)) |
758 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
759 |
throw invalid_argument("bitset string ctor has invalid argument"); |
760 |
#else |
761 |
assert(!"bitset string ctor has invalid argument"); |
762 |
#endif |
763 |
size_t _Mp = _VSTD::min(__rlen, _Size); |
764 |
size_t __i = 0; |
765 |
for (; __i < _Mp; ++__i) |
766 |
{ |
767 |
_CharT __c = __str[__pos + _Mp - 1 - __i]; |
768 |
if (_Traits::eq(__c, __zero)) |
769 |
(*this)[__i] = false; |
770 |
else |
771 |
(*this)[__i] = true; |
772 |
} |
773 |
_VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false); |
774 |
} |
775 |
|
776 |
template <size_t _Size> |
777 |
inline _LIBCPP_INLINE_VISIBILITY |
778 |
bitset<_Size>& |
779 |
bitset<_Size>::operator&=(const bitset& __rhs) _NOEXCEPT |
780 |
{ |
781 |
base::operator&=(__rhs); |
782 |
return *this; |
783 |
} |
784 |
|
785 |
template <size_t _Size> |
786 |
inline _LIBCPP_INLINE_VISIBILITY |
787 |
bitset<_Size>& |
788 |
bitset<_Size>::operator|=(const bitset& __rhs) _NOEXCEPT |
789 |
{ |
790 |
base::operator|=(__rhs); |
791 |
return *this; |
792 |
} |
793 |
|
794 |
template <size_t _Size> |
795 |
inline _LIBCPP_INLINE_VISIBILITY |
796 |
bitset<_Size>& |
797 |
bitset<_Size>::operator^=(const bitset& __rhs) _NOEXCEPT |
798 |
{ |
799 |
base::operator^=(__rhs); |
800 |
return *this; |
801 |
} |
802 |
|
803 |
template <size_t _Size> |
804 |
bitset<_Size>& |
805 |
bitset<_Size>::operator<<=(size_t __pos) _NOEXCEPT |
806 |
{ |
807 |
__pos = _VSTD::min(__pos, _Size); |
808 |
_VSTD::copy_backward(base::__make_iter(0), base::__make_iter(_Size - __pos), base::__make_iter(_Size)); |
809 |
_VSTD::fill_n(base::__make_iter(0), __pos, false); |
810 |
return *this; |
811 |
} |
812 |
|
813 |
template <size_t _Size> |
814 |
bitset<_Size>& |
815 |
bitset<_Size>::operator>>=(size_t __pos) _NOEXCEPT |
816 |
{ |
817 |
__pos = _VSTD::min(__pos, _Size); |
818 |
_VSTD::copy(base::__make_iter(__pos), base::__make_iter(_Size), base::__make_iter(0)); |
819 |
_VSTD::fill_n(base::__make_iter(_Size - __pos), __pos, false); |
820 |
return *this; |
821 |
} |
822 |
|
823 |
template <size_t _Size> |
824 |
inline _LIBCPP_INLINE_VISIBILITY |
825 |
bitset<_Size>& |
826 |
bitset<_Size>::set() _NOEXCEPT |
827 |
{ |
828 |
_VSTD::fill_n(base::__make_iter(0), _Size, true); |
829 |
return *this; |
830 |
} |
831 |
|
832 |
template <size_t _Size> |
833 |
bitset<_Size>& |
834 |
bitset<_Size>::set(size_t __pos, bool __val) |
835 |
{ |
836 |
if (__pos >= _Size) |
837 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
838 |
throw out_of_range("bitset set argument out of range"); |
839 |
#else |
840 |
assert(!"bitset set argument out of range"); |
841 |
#endif |
842 |
(*this)[__pos] = __val; |
843 |
return *this; |
844 |
} |
845 |
|
846 |
template <size_t _Size> |
847 |
inline _LIBCPP_INLINE_VISIBILITY |
848 |
bitset<_Size>& |
849 |
bitset<_Size>::reset() _NOEXCEPT |
850 |
{ |
851 |
_VSTD::fill_n(base::__make_iter(0), _Size, false); |
852 |
return *this; |
853 |
} |
854 |
|
855 |
template <size_t _Size> |
856 |
bitset<_Size>& |
857 |
bitset<_Size>::reset(size_t __pos) |
858 |
{ |
859 |
if (__pos >= _Size) |
860 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
861 |
throw out_of_range("bitset reset argument out of range"); |
862 |
#else |
863 |
assert(!"bitset reset argument out of range"); |
864 |
#endif |
865 |
(*this)[__pos] = false; |
866 |
return *this; |
867 |
} |
868 |
|
869 |
template <size_t _Size> |
870 |
inline _LIBCPP_INLINE_VISIBILITY |
871 |
bitset<_Size> |
872 |
bitset<_Size>::operator~() const _NOEXCEPT |
873 |
{ |
874 |
bitset __x(*this); |
875 |
__x.flip(); |
876 |
return __x; |
877 |
} |
878 |
|
879 |
template <size_t _Size> |
880 |
inline _LIBCPP_INLINE_VISIBILITY |
881 |
bitset<_Size>& |
882 |
bitset<_Size>::flip() _NOEXCEPT |
883 |
{ |
884 |
base::flip(); |
885 |
return *this; |
886 |
} |
887 |
|
888 |
template <size_t _Size> |
889 |
bitset<_Size>& |
890 |
bitset<_Size>::flip(size_t __pos) |
891 |
{ |
892 |
if (__pos >= _Size) |
893 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
894 |
throw out_of_range("bitset flip argument out of range"); |
895 |
#else |
896 |
assert(!"bitset flip argument out of range"); |
897 |
#endif |
898 |
reference r = base::__make_ref(__pos); |
899 |
r = ~r; |
900 |
return *this; |
901 |
} |
902 |
|
903 |
template <size_t _Size> |
904 |
inline _LIBCPP_INLINE_VISIBILITY |
905 |
unsigned long |
906 |
bitset<_Size>::to_ulong() const |
907 |
{ |
908 |
return base::to_ulong(); |
909 |
} |
910 |
|
911 |
template <size_t _Size> |
912 |
inline _LIBCPP_INLINE_VISIBILITY |
913 |
unsigned long long |
914 |
bitset<_Size>::to_ullong() const |
915 |
{ |
916 |
return base::to_ullong(); |
917 |
} |
918 |
|
919 |
template <size_t _Size> |
920 |
template <class _CharT, class _Traits, class _Allocator> |
921 |
basic_string<_CharT, _Traits, _Allocator> |
922 |
bitset<_Size>::to_string(_CharT __zero, _CharT __one) const |
923 |
{ |
924 |
basic_string<_CharT, _Traits, _Allocator> __r(_Size, __zero); |
925 |
for (size_t __i = 0; __i < _Size; ++__i) |
926 |
{ |
927 |
if ((*this)[__i]) |
928 |
__r[_Size - 1 - __i] = __one; |
929 |
} |
930 |
return __r; |
931 |
} |
932 |
|
933 |
template <size_t _Size> |
934 |
template <class _CharT, class _Traits> |
935 |
inline _LIBCPP_INLINE_VISIBILITY |
936 |
basic_string<_CharT, _Traits, allocator<_CharT> > |
937 |
bitset<_Size>::to_string(_CharT __zero, _CharT __one) const |
938 |
{ |
939 |
return to_string<_CharT, _Traits, allocator<_CharT> >(__zero, __one); |
940 |
} |
941 |
|
942 |
template <size_t _Size> |
943 |
template <class _CharT> |
944 |
inline _LIBCPP_INLINE_VISIBILITY |
945 |
basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > |
946 |
bitset<_Size>::to_string(_CharT __zero, _CharT __one) const |
947 |
{ |
948 |
return to_string<_CharT, char_traits<_CharT>, allocator<_CharT> >(__zero, __one); |
949 |
} |
950 |
|
951 |
template <size_t _Size> |
952 |
inline _LIBCPP_INLINE_VISIBILITY |
953 |
basic_string<char, char_traits<char>, allocator<char> > |
954 |
bitset<_Size>::to_string(char __zero, char __one) const |
955 |
{ |
956 |
return to_string<char, char_traits<char>, allocator<char> >(__zero, __one); |
957 |
} |
958 |
|
959 |
template <size_t _Size> |
960 |
inline _LIBCPP_INLINE_VISIBILITY |
961 |
size_t |
962 |
bitset<_Size>::count() const _NOEXCEPT |
963 |
{ |
964 |
return static_cast<size_t>(_VSTD::count(base::__make_iter(0), base::__make_iter(_Size), true)); |
965 |
} |
966 |
|
967 |
template <size_t _Size> |
968 |
inline _LIBCPP_INLINE_VISIBILITY |
969 |
bool |
970 |
bitset<_Size>::operator==(const bitset& __rhs) const _NOEXCEPT |
971 |
{ |
972 |
return _VSTD::equal(base::__make_iter(0), base::__make_iter(_Size), __rhs.__make_iter(0)); |
973 |
} |
974 |
|
975 |
template <size_t _Size> |
976 |
inline _LIBCPP_INLINE_VISIBILITY |
977 |
bool |
978 |
bitset<_Size>::operator!=(const bitset& __rhs) const _NOEXCEPT |
979 |
{ |
980 |
return !(*this == __rhs); |
981 |
} |
982 |
|
983 |
template <size_t _Size> |
984 |
bool |
985 |
bitset<_Size>::test(size_t __pos) const |
986 |
{ |
987 |
if (__pos >= _Size) |
988 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
989 |
throw out_of_range("bitset test argument out of range"); |
990 |
#else |
991 |
assert(!"bitset test argument out of range"); |
992 |
#endif |
993 |
return (*this)[__pos]; |
994 |
} |
995 |
|
996 |
template <size_t _Size> |
997 |
inline _LIBCPP_INLINE_VISIBILITY |
998 |
bool |
999 |
bitset<_Size>::all() const _NOEXCEPT |
1000 |
{ |
1001 |
return base::all(); |
1002 |
} |
1003 |
|
1004 |
template <size_t _Size> |
1005 |
inline _LIBCPP_INLINE_VISIBILITY |
1006 |
bool |
1007 |
bitset<_Size>::any() const _NOEXCEPT |
1008 |
{ |
1009 |
return base::any(); |
1010 |
} |
1011 |
|
1012 |
template <size_t _Size> |
1013 |
inline _LIBCPP_INLINE_VISIBILITY |
1014 |
bitset<_Size> |
1015 |
bitset<_Size>::operator<<(size_t __pos) const _NOEXCEPT |
1016 |
{ |
1017 |
bitset __r = *this; |
1018 |
__r <<= __pos; |
1019 |
return __r; |
1020 |
} |
1021 |
|
1022 |
template <size_t _Size> |
1023 |
inline _LIBCPP_INLINE_VISIBILITY |
1024 |
bitset<_Size> |
1025 |
bitset<_Size>::operator>>(size_t __pos) const _NOEXCEPT |
1026 |
{ |
1027 |
bitset __r = *this; |
1028 |
__r >>= __pos; |
1029 |
return __r; |
1030 |
} |
1031 |
|
1032 |
template <size_t _Size> |
1033 |
inline _LIBCPP_INLINE_VISIBILITY |
1034 |
bitset<_Size> |
1035 |
operator&(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT |
1036 |
{ |
1037 |
bitset<_Size> __r = __x; |
1038 |
__r &= __y; |
1039 |
return __r; |
1040 |
} |
1041 |
|
1042 |
template <size_t _Size> |
1043 |
inline _LIBCPP_INLINE_VISIBILITY |
1044 |
bitset<_Size> |
1045 |
operator|(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT |
1046 |
{ |
1047 |
bitset<_Size> __r = __x; |
1048 |
__r |= __y; |
1049 |
return __r; |
1050 |
} |
1051 |
|
1052 |
template <size_t _Size> |
1053 |
inline _LIBCPP_INLINE_VISIBILITY |
1054 |
bitset<_Size> |
1055 |
operator^(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT |
1056 |
{ |
1057 |
bitset<_Size> __r = __x; |
1058 |
__r ^= __y; |
1059 |
return __r; |
1060 |
} |
1061 |
|
1062 |
template <size_t _Size> |
1063 |
struct _LIBCPP_TYPE_VIS_ONLY hash<bitset<_Size> > |
1064 |
: public unary_function<bitset<_Size>, size_t> |
1065 |
{ |
1066 |
_LIBCPP_INLINE_VISIBILITY |
1067 |
size_t operator()(const bitset<_Size>& __bs) const _NOEXCEPT |
1068 |
{return __bs.__hash_code();} |
1069 |
}; |
1070 |
|
1071 |
template <class _CharT, class _Traits, size_t _Size> |
1072 |
basic_istream<_CharT, _Traits>& |
1073 |
operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x); |
1074 |
|
1075 |
template <class _CharT, class _Traits, size_t _Size> |
1076 |
basic_ostream<_CharT, _Traits>& |
1077 |
operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x); |
1078 |
|
1079 |
_LIBCPP_END_NAMESPACE_STD |
1080 |
|
1081 |
#endif // _LIBCPP_BITSET |