41#if 2 == _RWSTD_LONG_SIZE
42static const int __rw_wbasebits = 1;
43static const _RWSTD_SIZE_T __rw_wbasemask = 15;
44#elif 4 == _RWSTD_LONG_SIZE
45static const int __rw_wbasebits = 2;
46static const _RWSTD_SIZE_T __rw_wbasemask = 31;
47#elif 8 == _RWSTD_LONG_SIZE
48static const int __rw_wbasebits = 3;
49static const _RWSTD_SIZE_T __rw_wbasemask = 63;
51static const int __rw_wbasebits = 4;
52static const _RWSTD_SIZE_T __rw_wbasemask = 127;
81__rw_bitset (
unsigned long *bits, _RWSTD_SIZE_T maxbits,
82 const char *
str, _RWSTD_SIZE_T
slen,
83 const _STD::char_traits<char>*,
char b0,
char b1,
84 _RWSTD_SIZE_T
pos, _RWSTD_SIZE_T
n,
85 const char *file,
const char *
fun)
87 if (_RWSTD_SIZE_MAX ==
slen)
98 const _RWSTD_SIZE_T nbits =
nchars < maxbits ?
nchars : maxbits;
103 _RWSTD_SIZE_T nbytes = ((maxbits | 1) >> 3) + (0 != (maxbits & 7));
106 nbytes = ( (nbytes >> __rw_wbasebits)
107 + (0 != (nbytes & (__rw_wbasemask >> 3)))) << __rw_wbasebits;
109 memset (bits, 0, nbytes);
112 for (_RWSTD_SIZE_T
i = 0;
i !=
nchars; ++
i) {
116 const _RWSTD_SIZE_T bitno = nbits -
i - 1;
121 bits [bitno >> (3 + __rw_wbasebits)]
122 |= 1UL << (bitno & __rw_wbasemask);
134#ifndef _RWSTD_NO_WCHAR_T
137__rw_bitset (
unsigned long *bits, _RWSTD_SIZE_T maxbits,
138 const wchar_t *
str, _RWSTD_SIZE_T
slen,
139 const _STD::char_traits<wchar_t>*,
wchar_t b0,
wchar_t b1,
140 _RWSTD_SIZE_T
pos, _RWSTD_SIZE_T
n,
141 const char *file,
const char *
fun)
143 if (_RWSTD_SIZE_MAX ==
slen)
144 slen = _STD::char_traits<wchar_t>::length (
str);
154 const _RWSTD_SIZE_T nbits =
nchars < maxbits ?
nchars : maxbits;
159 _RWSTD_SIZE_T nbytes = ((maxbits | 1) >> 3) + (0 != (maxbits & 7));
162 nbytes = ( (nbytes >> __rw_wbasebits)
163 + (0 != (nbytes & (__rw_wbasemask >> 3)))) << __rw_wbasebits;
165 memset (bits, 0, nbytes);
168 for (_RWSTD_SIZE_T
i = 0;
i !=
nchars; ++
i) {
172 const _RWSTD_SIZE_T bitno = nbits -
i - 1;
173 bits [bitno >> (3 + __rw_wbasebits)]
174 |= 1UL << (bitno & __rw_wbasemask);
190static const unsigned char
191__rw_bitcounts [256] = {
192 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
193 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
194 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
195 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
196 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
197 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
198 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
199 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
200 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
201 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
202 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
203 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
204 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
205 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
206 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
207 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
213__rw_bit_count (
const unsigned long *bits,
218 _RWSTD_SIZE_T sum = 0;
220 typedef unsigned char UChar;
223 const UChar*
const pend = pbyte +
size *
sizeof (
unsigned long);
225 for ( ; pbyte !=
pend; ++pbyte)
226 sum += __rw_bitcounts [*pbyte];
234__rw_shl (
unsigned long *bits,
237 const _RWSTD_SIZE_T wordbits =
sizeof *bits * _RWSTD_CHAR_BIT;
239 if (
n >=
size * wordbits) {
240 memset (bits, 0,
size *
sizeof *bits);
247 const _RWSTD_SIZE_T shlw =
n / wordbits;
248 const _RWSTD_SIZE_T shlb =
n % wordbits;
251 const _RWSTD_SIZE_T shrb = wordbits - shlb;
254 for (_RWSTD_SIZE_T
i =
size - 1;
i > shlw; --
i)
255 bits [
i] = bits [
i - shlw] << shlb
256 | bits [
i - shlw - 1] >> shrb;
259 bits [shlw] = bits [0] << shlb;
263 memmove (bits + shlw, bits, (
size - shlw) *
sizeof *bits);
267 memset (bits, 0, shlw *
sizeof *bits);
273__rw_shr (
unsigned long *bits,
276 const _RWSTD_SIZE_T wordbits =
sizeof *bits * _RWSTD_CHAR_BIT;
278 if (
n >=
size * wordbits) {
279 memset (bits, 0,
size *
sizeof *bits);
286 const _RWSTD_SIZE_T shrw =
n / wordbits;
287 const _RWSTD_SIZE_T shrb =
n % wordbits;
290 const _RWSTD_SIZE_T maxw =
size - shrw - 1;
293 const _RWSTD_SIZE_T shlb = wordbits - shrb;
296 for (_RWSTD_SIZE_T
i = 0;
i < maxw; ++
i)
297 bits [
i] = bits [
i + shrw] >> shrb
298 | bits [
i + shrw + 1] << shlb;
301 bits [maxw] = bits [
size - 1] >> shrb;
305 memmove (bits, bits + shrw, (maxw + 1) *
sizeof *bits);
309 memset (bits + (maxw + 1), 0, (
size - (maxw + 1)) *
sizeof *bits);
#define _RWSTD_REQUIRES(pred, args)
#define _RWSTD_REINTERPRET_CAST(T, x)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_SPECIALIZED_FUNCTION
#define _RWSTD_ERROR_INVALID_ARGUMENT
#define _RWSTD_ERROR_OUT_OF_RANGE