47template <std::
size_t N>
48int bcmp (
const std::bitset<N> &bset,
53 for (std::size_t
i = 0;
i !=
N; ++
i) {
55 const char bit = bset [
i] ?
'1' :
'0';
57 if (bit !=
str [
N -
i - 1])
70 const std::size_t ulongbits =
sizeof (
unsigned long) * 8;
72 static char bitstr [1024];
74 for (std::size_t
i = 0;
i != bits; ++
i) {
76 bitstr [bits -
i - 1] =
val & (1UL <<
i) ?
'1' :
'0';
78 bitstr [bits -
i - 1] =
'0';
88template <std::
size_t N>
91 rw_info (0, 0, __LINE__,
"std::bitset<%u>::bitset()",
N);
93 const std::bitset<N> bset;
95 char all_zeros [
N + 1];
96 for (std::size_t
i = 0;
i !=
N; ++
i) all_zeros [
i] =
'0';
100 "bitset<%u>::bitset() expected 0, got { %.*b }",
107template <std::
size_t N>
110 rw_info (0, 0, __LINE__,
"std::bitset<%u>::bitset(unsigned long)",
N);
113#define DO_TEST(T, val) \
116 const std::bitset<N> bset (v); \
117 const char* const bstr = ulong_to_bitstring (val, N); \
118 rw_assert (!bcmp (bset, (const char*)bstr), 0, __LINE__, \
119 "bitset<%u>::bitset(%zu) == { %{.*b} }, " \
120 "got { %{.*b} }", N, val, bstr, int (N), &bset); \
139 DO_TEST (
unsigned long, _RWSTD_LONG_MAX / 16);
140 DO_TEST (
unsigned long, _RWSTD_LONG_MAX / 8);
141 DO_TEST (
unsigned long, _RWSTD_LONG_MAX / 4);
142 DO_TEST (
unsigned long, _RWSTD_LONG_MAX / 2);
143 DO_TEST (
unsigned long, _RWSTD_LONG_MAX - 2);
144 DO_TEST (
unsigned long, _RWSTD_LONG_MAX - 1);
145 DO_TEST (
unsigned long, _RWSTD_LONG_MAX);
161template <std::
size_t N,
class Traits,
class Allocator>
164 const std::basic_string<char, Traits, Allocator> *bstr,
166 std::size_t
pos, std::size_t
n,
const char bin_digits [2])
169 if (std::size_t (-1) ==
pos)
170 return std::bitset<N>(*bstr);
172 if (std::size_t (-1) ==
n)
173 return std::bitset<N>(*bstr,
pos);
176 return std::bitset<N>(*bstr,
pos,
n);
178 if (Traits::eq (bin_digits [0], bin_digits [1]))
179 return std::bitset<N>(*bstr,
pos,
n, bin_digits [0]);
181 return std::bitset<N>(*bstr,
pos,
n, bin_digits [0], bin_digits [1]);
184#if !defined (_RWSTD_NO_EXT_BITSET_CTOR_CHAR_ARRAY) \
185 && !defined (_RWSTD_NO_EXT_BITSET_CTOR_STRING)
187 if (std::size_t (-1) ==
pos)
188 return std::bitset<N>(
str);
190 if (std::size_t (-1) ==
n)
191 return std::bitset<N>(
str,
pos);
194 return std::bitset<N>(
str,
pos,
n);
196 if (Traits::eq (bin_digits [0], bin_digits [1]))
197 return std::bitset<N>(
str,
pos,
n, bin_digits [0]);
199 return std::bitset<N>(
str,
pos,
n, bin_digits [0], bin_digits [1]);
205 return std::bitset<N>();
212#ifndef _RWSTD_NO_WCHAR_T
215template <std::
size_t N,
class Traits,
class Allocator>
218 const std::basic_string<wchar_t, Traits, Allocator> *bstr,
220 std::size_t
pos, std::size_t
n,
const wchar_t bin_digits [2])
223 if (std::size_t (-1) ==
pos)
224 return std::bitset<N>(*bstr);
226 if (std::size_t (-1) ==
n)
227 return std::bitset<N>(*bstr,
pos);
230 return std::bitset<N>(*bstr,
pos,
n);
232 if (Traits::eq (bin_digits [0], bin_digits [1]))
233 return std::bitset<N>(*bstr,
pos,
n, bin_digits [0]);
235 return std::bitset<N>(*bstr,
pos,
n, bin_digits [0], bin_digits [1]);
238#if !defined (_RWSTD_NO_EXT_BITSET_CTOR_CHAR_ARRAY) \
239 && !defined (_RWSTD_NO_EXT_BITSET_CTOR_STRING)
241 if (std::size_t (-1) ==
pos)
242 return std::bitset<N>(wstr);
244 if (std::size_t (-1) ==
n)
245 return std::bitset<N>(wstr,
pos);
248 return std::bitset<N>(wstr,
pos,
n);
250 if (Traits::eq (bin_digits [0], bin_digits [1]))
251 return std::bitset<N>(wstr,
pos,
n, bin_digits [0]);
253 return std::bitset<N>(wstr,
pos,
n, bin_digits [0], bin_digits [1]);
259 return std::bitset<N>();
269template <std::
size_t N,
class Traits,
class Allocator>
272 const std::basic_string<UserChar, Traits, Allocator> *bstr,
274 std::size_t
pos, std::size_t
n,
const UserChar bin_digits [2])
276 if (std::size_t (-1) ==
pos)
279 if (0 == bin_digits) {
280 static const UserChar zero_one[] = { { 0.0,
'0' }, { 0.0,
'1' } };
282 bin_digits = zero_one;
286 return std::bitset<N>(*bstr,
pos,
n, bin_digits [0], bin_digits [1]);
293 return std::bitset<N>();
298template <std::
size_t N,
class charT,
class Traits,
class Allocator>
301 std::basic_string<charT, Traits, Allocator> *
p,
302 const char *
str, std::size_t
pos, std::size_t
n)
306 for (std::size_t
i = 0;
i !=
sizeof wstr /
sizeof *wstr; ++
i) {
310 Traits::assign (wstr [
i],
charT ());
315 typedef std::bitset<N> Bitset;
316 typedef std::basic_string<charT, Traits, Allocator>
String;
331template <
class charT>
334#ifndef _RWSTD_NO_WCHAR_T
342template <std::
size_t N,
class charT,
class Traits,
class Allocator>
344 std::basic_string<charT, Traits, Allocator> *
p,
346 const char *
str, std::size_t
pos, std::size_t
n,
351 typedef std::bitset<N> Bitset;
352 typedef std::basic_string<charT, Traits, Allocator>
String;
354 static const char*
const exstr[] = {
356 "caught std::invalid_argument",
357 "caught std::out_of_range",
358 "caught unknown exception"
362 const int except = int (bitstr - (
char*)0) < 3 ?
363 int (bitstr - (
char*)0) : 0;
377 "line %d: bitset<%u>::bitset(%s\"%s\""
378 "%{?}, %zu%{?}, %zu%{;}%{;}) "
379 "== { %s }, got { %{.*b} }",
380 __LINE__,
N, tpfx,
str,
381 pos != std::size_t (-1),
pos,
382 n != std::size_t (-1),
n,
383 bitstr,
int (
N), &bset);
386#ifndef _RWSTD_NO_EXCEPTIONS
388 catch (
const std::out_of_range&) {
391 catch (
const std::invalid_argument&) {
400 "line %d: bitset<%u>::bitset(%s\"%s\", %u, %u) "
401 "unexpectedly %s", __LINE__,
N, tpfx,
str,
pos,
n,
409 std::string
str (pfx);
410 str.append (
count,
char (
'0' + bit));
416template <
class charT,
class Traits,
class Allocator>
421#define DO_TEST(N, str, pos, n, except) \
422 test_string_ctor ((std::bitset<N>*)0, p, __LINE__, \
423 str, std::size_t (pos), std::size_t (n), \
428#define CTOR_INFO(N) \
429 rw_info (0, 0, __LINE__, "std::bitset<%i>::bitset(const " \
430 "%{?}std::basic_string<%s>&%{:}%3$s%{;})", \
435#define TEST_1(N, str, except) DO_TEST(N, str, -1, -1, except)
515 TEST_1 (3,
"0001",
"000");
516 TEST_1 (3,
"0010",
"001");
517 TEST_1 (3,
"0100",
"010");
518 TEST_1 (3,
"1000",
"100");
519 TEST_1 (3,
"1001",
"100");
521 TEST_1 (3,
"0001",
"000");
522 TEST_1 (3,
"0010",
"001");
523 TEST_1 (3,
"0100",
"010");
524 TEST_1 (3,
"1000",
"100");
525 TEST_1 (3,
"1001",
"100");
529 TEST_1 (3,
"10010",
"100");
530 TEST_1 (3,
"10011",
"100");
535#define FILL(pfx, bit, N, sfx) fillstr (pfx, bit, N, sfx).c_str ()
564 TEST_1 (33,
FILL (
"", 1, 28,
"00000"),
FILL (
"", 1, 28,
"00000"));
565 TEST_1 (33,
FILL (
"", 1, 28,
"00001"),
FILL (
"", 1, 28,
"00001"));
566 TEST_1 (33,
FILL (
"", 1, 28,
"00010"),
FILL (
"", 1, 28,
"00010"));
567 TEST_1 (33,
FILL (
"", 1, 28,
"00100"),
FILL (
"", 1, 28,
"00100"));
568 TEST_1 (33,
FILL (
"", 1, 28,
"01000"),
FILL (
"", 1, 28,
"01000"));
588#define CTOR_INFO(N) \
589 rw_info (0, 0, __LINE__, "std::bitset<%i>::bitset(const " \
590 "%{?}std::basic_string<%s>&%{:}%3$s%{;}, size_t)", \
593#define TEST_2(N, str, pos, except) DO_TEST(N, str, pos, -1, except)
630 TEST_2 (1,
"000", 1,
"0");
631 TEST_2 (1,
"001", 1,
"0");
633 TEST_2 (1,
"010", 1,
"1");
634 TEST_2 (1,
"011", 1,
"1");
642 TEST_2 (1,
"200", 1,
"0");
643 TEST_2 (1,
"201", 1,
"0");
646 TEST_2 (1,
"320", 2,
"0");
647 TEST_2 (1,
"321", 2,
"1");
649 TEST_2 (1,
"3200", 2,
"0");
650 TEST_2 (1,
"3201", 2,
"0");
652 TEST_2 (1,
"3210", 2,
"1");
653 TEST_2 (1,
"3211", 2,
"1");
660#define CTOR_INFO(N) \
661 rw_info (0, 0, __LINE__, "std::bitset<%i>::bitset(const " \
662 "%{?}std::basic_string<%s>&%{:}%3$s%{;}, size_t, size_t)", \
667#define TEST_3(N, str, pos, n, except) DO_TEST(N, str, pos, n, except)
678 TEST_3 (0,
"02", 0, 0,
"");
682 TEST_3 (1,
"012", 0, 1,
"0");
683 TEST_3 (1,
"012", 1, 1,
"1");
686 TEST_3 (1,
"", 0, 0,
"0");
691 TEST_3 (8,
"11111111", 0, 8,
FILL (
"", 1, 8,
""));
692 TEST_3 (8,
"11111111", 1, 7,
FILL (
"0", 1, 7,
""));
693 TEST_3 (8,
"11111111", 2, 6,
FILL (
"00", 1, 6,
""));
694 TEST_3 (8,
"11111111", 3, 5,
FILL (
"000", 1, 5,
""));
695 TEST_3 (8,
"11111111", 4, 4,
FILL (
"0000", 1, 4,
""));
696 TEST_3 (8,
"11111111", 5, 3,
FILL (
"00000", 1, 3,
""));
697 TEST_3 (8,
"11111111", 6, 2,
FILL (
"000000", 1, 2,
""));
698 TEST_3 (8,
"11111111", 7, 1,
FILL (
"0000000", 1, 1,
""));
699 TEST_3 (8,
"11111111", 8, 0,
FILL (
"00000000", 1, 0,
""));
702 TEST_3 (8,
"111111112", 7, 1,
FILL (
"0000000", 1, 1,
""));
705 TEST_3 (8,
"211111112", 1, 7,
FILL (
"0", 1, 7,
""));
706 TEST_3 (8,
"210111112", 1, 7,
FILL (
"010", 1, 5,
""));
707 TEST_3 (8,
"211111012", 1, 7,
FILL (
"0", 1, 5,
"01"));
711 TEST_3 (40,
FILL (
"", 0, 40,
""), 0, 0,
FILL (
"", 0, 40,
""));
712 TEST_3 (40,
FILL (
"", 0, 40,
"1"), 0, 40,
FILL (
"", 0, 40,
""));
713 TEST_3 (40,
FILL (
"", 0, 40,
"1"), 0, 41,
FILL (
"", 0, 40,
""));
714 TEST_3 (40,
FILL (
"", 0, 39,
"1"), 0, 39,
FILL (
"", 0, 40,
""));
715 TEST_3 (40,
FILL (
"", 0, 39,
"1"), 0, 40,
FILL (
"", 0, 39,
"1"));
716 TEST_3 (40,
FILL (
"1", 0, 40,
"1"), 0, 0,
FILL (
"", 0, 40,
""));
717 TEST_3 (40,
FILL (
"1", 0, 38,
"1"), 0, 40,
FILL (
"1", 0, 38,
"1"));
718 TEST_3 (40,
FILL (
"1", 0, 38,
"1"), 0, 40,
FILL (
"1", 0, 38,
"1"));
719 TEST_3 (40,
FILL (
"2", 0, 40,
"2"), 1, 40,
FILL (
"", 0, 40,
""));
724template <std::
size_t N>
733template <
class Traits>
736 typedef typename Traits::char_type char_type;
737 typedef std::allocator<char_type>
Allocator;
738 typedef std::basic_string<char_type, Traits, Allocator>
String;
743#if !defined (_RWSTD_NO_EXT_BITSET_CTOR_CHAR_ARRAY) \
744 && !defined (_RWSTD_NO_EXT_BITSET_CTOR_STRING)
748 if (
sizeof (char_type) !=
sizeof (
UserChar))
760#ifdef _RWSTD_NO_EXCEPTIONS
765 rw_note (0, 0, 0,
"exception tests disabled");
768#define DO_TEST(N) test_ctors ((std::bitset<N>*)0)
791#if !defined(_MSC_VER) || _MSC_VER != 1300
800 typedef std::char_traits<char> NarrowTraits;
805 rw_note (0, 0, __LINE__,
"tests of char specialization disabled");
808#ifndef _RWSTD_NO_WCHAR_T
811 typedef std::char_traits<wchar_t> WideTraits;
816 rw_note (0, 0, __LINE__,
"tests of wchar_t specialization disabled");
825 rw_note (0, 0, __LINE__,
"tests of UserChar specialization disabled");
833int main (
int argc,
char *argv[])
835 return rw_test (argc, argv, __FILE__,
void count(T, T, const U &,...)
std::string fillstr(const char *pfx, int bit, std::size_t count, const char *sfx)
std::bitset< N > bitset_ctor(std::bitset< N > *, const std::basic_string< char, Traits, Allocator > *bstr, const char *str, std::size_t pos, std::size_t n, const char bin_digits[2])
void test_long_ctor(std::bitset< N > *)
#define FILL(pfx, bit, N, sfx)
#define TEST_2(N, str, pos, except)
void test_default_ctor(std::bitset< N > *)
const char * ulong_to_bitstring(unsigned long val, std::size_t bits)
int bcmp(const std::bitset< N > &bset, const char *str)
#define TEST_3(N, str, pos, n, except)
#define TEST_1(N, str, except)
void test_string_ctor(std::bitset< N > *, std::basic_string< charT, Traits, Allocator > *p, int line, const char *str, std::size_t pos, std::size_t n, const char *bitstr)
const char * type_prefix(charT)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
std::char_traits< S > Traits
UserChar make_char(char c, UserChar *)
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_note(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)