/***************************************************************************
 *
 * 23.bitset.cons.cpp - test exercising [lib.bitset.cons]
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 2004-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#include <bitset>      // for bitset
#include <stdexcept>   // for invalid_argument, out_of_range
#include <string>      // for basic_string

#include <cstddef>     // for size_t

#include <rw_char.h>   // for UserChar, UserTraits
#include <driver.h>    // for rw_test(), ...

/**************************************************************************/

int opt_char;            // for --no-char
int opt_wchar;           // for --no-wchar_t
int opt_userchar;        // for --no-UserChar
int opt_no_exceptions;   // for --no-exceptions

/**************************************************************************/

template <std::size_t N>
int bcmp (const std::bitset<N> &bset,
          const char           *str)
{
    RW_ASSERT (0 != str);

    for (std::size_t i = 0; i != N; ++i) {

        const char bit = bset [i] ? '1' : '0';
        
        if (bit != str [N - i - 1])
            return -1;
    }

    return 0;
}

/**************************************************************************/

// equivalent to the result of std::bitset<bits>(val).to_string<char>()
const char*
ulong_to_bitstring (unsigned long val, std::size_t bits)
{
    const std::size_t ulongbits = sizeof (unsigned long) * 8;

    static char bitstr [1024];

    for (std::size_t i = 0; i != bits; ++i) {
        if (i < ulongbits)
            bitstr [bits - i - 1] = val & (1UL << i) ? '1' : '0';
        else
            bitstr [bits - i - 1] = '0';
    }

    bitstr [bits] = '\0';
    return bitstr;
}

/**************************************************************************/

// exercises the effects of the default bitset ctor
template <std::size_t N>
void test_default_ctor (std::bitset<N>*)
{
    rw_info (0, 0, __LINE__, "std::bitset<%u>::bitset()", N);

    const std::bitset<N> bset;

    char all_zeros [N + 1];
    for (std::size_t i = 0; i != N; ++i) all_zeros [i] = '0';
    all_zeros [N] = '\0';

    rw_assert (!bcmp (bset, all_zeros), 0, __LINE__,
               "bitset<%u>::bitset() expected 0, got { %.*b }",
               N, int (N), &bset);
}

/**************************************************************************/

// exercises the effects of bitset<N>::bitset(unsigned long)
template <std::size_t N>
void test_long_ctor (std::bitset<N>*)
{
    rw_info (0, 0, __LINE__, "std::bitset<%u>::bitset(unsigned long)", N);

#undef DO_TEST
#define DO_TEST(T, val)                                                 \
    do {                                                                \
        const T v = val;                                                \
        const std::bitset<N> bset (v);                                  \
        const char* const bstr = ulong_to_bitstring (val, N);           \
        rw_assert (!bcmp (bset, (const char*)bstr), 0, __LINE__,        \
                   "bitset<%u>::bitset(%zu) == { %{.*b} }, "            \
                   "got { %{.*b} }", N, val, bstr, int (N), &bset);     \
    } while (0)

    DO_TEST (unsigned long,  0);
    DO_TEST (unsigned long,  1);
    DO_TEST (unsigned long,  2);
    DO_TEST (unsigned long,  3);
    DO_TEST (unsigned long,  4);
    DO_TEST (unsigned long,  5);
    DO_TEST (unsigned long,  6);
    DO_TEST (unsigned long,  7);
    DO_TEST (unsigned long,  8);
    DO_TEST (unsigned long,  9);
    DO_TEST (unsigned long, 10);
    DO_TEST (unsigned long, 11);
    DO_TEST (unsigned long, 12);
    DO_TEST (unsigned long, 13);
    DO_TEST (unsigned long, 14);
    DO_TEST (unsigned long, 15);
    DO_TEST (unsigned long, _RWSTD_LONG_MAX / 16);
    DO_TEST (unsigned long, _RWSTD_LONG_MAX /  8);
    DO_TEST (unsigned long, _RWSTD_LONG_MAX /  4);
    DO_TEST (unsigned long, _RWSTD_LONG_MAX /  2);
    DO_TEST (unsigned long, _RWSTD_LONG_MAX -  2);
    DO_TEST (unsigned long, _RWSTD_LONG_MAX -  1);
    DO_TEST (unsigned long, _RWSTD_LONG_MAX);

    // exercise calls to the ctor with arguments of other integer types
    DO_TEST (char,           16);
    DO_TEST (signed char,    17);
    DO_TEST (unsigned char,  18);
    DO_TEST (short,          19);
    DO_TEST (unsigned short, 20);
    DO_TEST (int,            21);
    DO_TEST (unsigned int,   22);
    DO_TEST (long,           23);
}

/**************************************************************************/

// invokes coverting bitset ctor from basic_string<char, ...>
template <std::size_t N, class Traits, class Allocator>
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])
{
    if (bstr) {
        if (std::size_t (-1) == pos)
            return std::bitset<N>(*bstr);

        if (std::size_t (-1) == n)
            return std::bitset<N>(*bstr, pos);

        if (0 == bin_digits)
            return std::bitset<N>(*bstr, pos, n);

        if (Traits::eq (bin_digits [0], bin_digits [1]))
            return std::bitset<N>(*bstr, pos, n, bin_digits [0]);

        return std::bitset<N>(*bstr, pos, n, bin_digits [0], bin_digits [1]);
    }

#if    !defined (_RWSTD_NO_EXT_BITSET_CTOR_CHAR_ARRAY) \
    && !defined (_RWSTD_NO_EXT_BITSET_CTOR_STRING)

    if (std::size_t (-1) == pos)
        return std::bitset<N>(str);

    if (std::size_t (-1) == n)
        return std::bitset<N>(str, pos);

    if (0 == bin_digits)
        return std::bitset<N>(str, pos, n);

    if (Traits::eq (bin_digits [0], bin_digits [1]))
        return std::bitset<N>(str, pos, n, bin_digits [0]);

    return std::bitset<N>(str, pos, n, bin_digits [0], bin_digits [1]);

#else

    RW_ASSERT (!"test logic error");

    return std::bitset<N>();

#endif   // _RWSTD_NO_EXT_BITSET_CTOR_{CHAR_ARRAY,STRING)

}


#ifndef _RWSTD_NO_WCHAR_T

// invokes coverting bitset ctor from basic_string<wchar_t, ...>
template <std::size_t N, class Traits, class Allocator>
std::bitset<N>
bitset_ctor (std::bitset<N>*,
             const std::basic_string<wchar_t, Traits, Allocator> *bstr,
             const wchar_t                                       *wstr,
             std::size_t pos, std::size_t n, const wchar_t bin_digits [2])
{
    if (bstr) {
        if (std::size_t (-1) == pos)
            return std::bitset<N>(*bstr);

        if (std::size_t (-1) == n)
            return std::bitset<N>(*bstr, pos);

        if (0 == bin_digits)
            return std::bitset<N>(*bstr, pos, n);

        if (Traits::eq (bin_digits [0], bin_digits [1]))
            return std::bitset<N>(*bstr, pos, n, bin_digits [0]);

        return std::bitset<N>(*bstr, pos, n, bin_digits [0], bin_digits [1]);
    }

#if    !defined (_RWSTD_NO_EXT_BITSET_CTOR_CHAR_ARRAY) \
    && !defined (_RWSTD_NO_EXT_BITSET_CTOR_STRING)

    if (std::size_t (-1) == pos)
        return std::bitset<N>(wstr);

    if (std::size_t (-1) == n)
        return std::bitset<N>(wstr, pos);

    if (0 == bin_digits)
        return std::bitset<N>(wstr, pos, n);

    if (Traits::eq (bin_digits [0], bin_digits [1]))
        return std::bitset<N>(wstr, pos, n, bin_digits [0]);

    return std::bitset<N>(wstr, pos, n, bin_digits [0], bin_digits [1]);

#else

    RW_ASSERT (!"test logic error");

    return std::bitset<N>();

#endif   // _RWSTD_NO_EXT_BITSET_CTOR_{CHAR_ARRAY,STRING)

}

#endif   // _RWSTD_NO_WCHAR_T


// invokes coverting bitset ctor from basic_string<UserChar, ...>
template <std::size_t N, class Traits, class Allocator>
std::bitset<N>
bitset_ctor (std::bitset<N>*,
             const std::basic_string<UserChar, Traits, Allocator> *bstr,
             const UserChar* /* intentionally unused */,
             std::size_t pos, std::size_t n, const UserChar bin_digits [2])
{
    if (std::size_t (-1) == pos)
        pos = 0;

    if (0 == bin_digits) {
        static const UserChar zero_one[] = { { 0.0, '0' }, { 0.0, '1' } };

        bin_digits = zero_one;
    }

    if (bstr)
        return std::bitset<N>(*bstr, pos, n, bin_digits [0], bin_digits [1]);

    // cannot invoke std::bitset<N>(const UserChar*) without providing
    // an explicit specialization of std::char_traits<UserChar> that
    // implements eq() and length()
    RW_ASSERT (!"test logic error");

    return std::bitset<N>();
}


// constructs a bitset object by invoking one of the overloaded ctors
template <std::size_t N, class charT, class Traits, class Allocator>
std::bitset<N>
bitset_ctor (std::bitset<N>*,
             std::basic_string<charT, Traits, Allocator> *p,
             const char *str, std::size_t pos, std::size_t n)
{
    charT wstr [1024];

    for (std::size_t i = 0; i != sizeof wstr / sizeof *wstr; ++i) {
        if (str [i])
            Traits::assign (wstr [i], make_char (str [i], (charT*)0));
        else {
            Traits::assign (wstr [i], charT ());
            break;
        }
    }

    typedef std::bitset<N>                              Bitset;
    typedef std::basic_string<charT, Traits, Allocator> String;

    if (p) {   // use one of the const basic_string& overloads

        const String bstr (wstr);

        return bitset_ctor ((Bitset*)0, &bstr, 0, pos, n, (charT*)0);
    }
    else {   // invoke one of the const charT* overloads

        return bitset_ctor ((Bitset*)0, (String*)0, wstr, pos, n, (charT*)0);
    }
}


template <class charT>
const char* type_prefix (charT) { return ""; }

#ifndef _RWSTD_NO_WCHAR_T

const char* type_prefix (wchar_t) { return "L"; }

#endif   // _RWSTD_NO_WCHAR_T

enum { InvalidArgument = 1, OutOfRange };

template <std::size_t N, class charT, class Traits, class Allocator>
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)
{
    static const char* const tpfx = type_prefix (charT ());

    typedef std::bitset<N>                              Bitset;
    typedef std::basic_string<charT, Traits, Allocator> String;

    static const char* const exstr[] = {
        "failed to throw",
        "caught std::invalid_argument",
        "caught std::out_of_range",
        "caught unknown exception"
    };

    // compute which exception, if any, the ctor is expected to throw
    const int except = bitstr - (char*)0 < 3 ? bitstr - (char*)0 : 0;

    if (except && opt_no_exceptions)
        return;

    int caught = 0;


    _TRY {
        // invoke one of the overloads of the constructor
        const Bitset bset = bitset_ctor ((Bitset*)0, p, str, pos, n);

        if (!except)
            rw_assert (!bcmp (bset, bitstr), 0, line,
                       "line %d: bitset<%u>::bitset(%s\"%s\""
                       "%{?}, %zu%{?}, %zu%{;}%{;}) "
                       "== { %s }, got { %{.*b} }",
                       __LINE__, N, tpfx, str,
                       pos != std::size_t (-1), pos,
                       n != std::size_t (-1), n,
                       bitstr, int (N), &bset);
    }

#ifndef _RWSTD_NO_EXCEPTIONS

    catch (const std::out_of_range&) {
        caught = OutOfRange;
    } 
    catch (const std::invalid_argument&) {
        caught = InvalidArgument;
    }
    catch (...) {
        caught = 3;
    }
#endif   // _RWSTD_NO_EXCEPTIONS

    rw_assert (except == caught, 0, line,
               "line %d: bitset<%u>::bitset(%s\"%s\", %u, %u) "
               "unexpectedly %s", __LINE__, N, tpfx, str, pos, n,
               exstr [caught]);
}


std::string
fillstr (const char *pfx, int bit, std::size_t count, const char *sfx)
{
    std::string str (pfx);
    str.append (count, char ('0' + bit));
    str.append (sfx);
    return str;
}


template <class charT, class Traits, class Allocator>
void test_string_ctor (std::basic_string<charT, Traits, Allocator> *p,
                       const char *cname)
{
#undef DO_TEST
#define DO_TEST(N, str, pos, n, except)                         \
    test_string_ctor ((std::bitset<N>*)0, p, __LINE__,          \
                      str, std::size_t (pos), std::size_t (n),  \
                      (const char*)except)

    //////////////////////////////////////////////////////////////////

#define CTOR_INFO(N)                                            \
    rw_info (0, 0, __LINE__, "std::bitset<%i>::bitset(const "   \
             "%{?}std::basic_string<%s>&%{:}%3$s%{;})",         \
             N, 0 != p, cname)

    CTOR_INFO (0);

#define TEST_1(N, str, except)   DO_TEST(N, str, -1, -1, except)

    //      +----------- bitset size
    //      |  +-------- string argument
    //      |  |     +-- result or exception
    //      v  v     v
    TEST_1 (0, "",   "");
    TEST_1 (0, "0",  "");
    TEST_1 (0, "1",  "");
    TEST_1 (0, "2",  InvalidArgument);
    TEST_1 (0, "00", "");
    TEST_1 (0, "01", "");
    TEST_1 (0, "02", InvalidArgument);

    CTOR_INFO (1);

    TEST_1 (1, "",   "0");
    TEST_1 (1, "0",  "0");
    TEST_1 (1, "1",  "1");
    TEST_1 (1, "2",  InvalidArgument);
    TEST_1 (1, "00", "0");
    TEST_1 (1, "01", "0");
    TEST_1 (1, "02", InvalidArgument);

    CTOR_INFO (2);

    TEST_1 (2, "",    "00");
    TEST_1 (2, "0",   "00");
    TEST_1 (2, "1",   "01");
    TEST_1 (2, "2",   InvalidArgument);
    TEST_1 (2, "00",  "00");
    TEST_1 (2, "01",  "01");
    TEST_1 (2, "02",  InvalidArgument);
    TEST_1 (2, "10",  "10");
    TEST_1 (2, "11",  "11");
    TEST_1 (2, "12",  InvalidArgument);
    TEST_1 (2, "20",  InvalidArgument);
    TEST_1 (2, "21",  InvalidArgument);
    TEST_1 (2, "22",  InvalidArgument);
    TEST_1 (2, "000", "00");
    TEST_1 (2, "001", "00");
    TEST_1 (2, "002", InvalidArgument);
    TEST_1 (2, "010", "01");
    TEST_1 (2, "011", "01");
    TEST_1 (2, "012", InvalidArgument);
    TEST_1 (2, "020", InvalidArgument);
    TEST_1 (2, "100", "10");
    TEST_1 (2, "101", "10");
    TEST_1 (2, "110", "11");
    TEST_1 (2, "111", "11");
    TEST_1 (2, "112", InvalidArgument);
    TEST_1 (2, "200", InvalidArgument);
    TEST_1 (2, "201", InvalidArgument);
    TEST_1 (2, "202", InvalidArgument);

    CTOR_INFO (3);

    TEST_1 (3, "",     "000");
    TEST_1 (3, "0",    "000");
    TEST_1 (3, "1",    "001");
    TEST_1 (3, "2",    InvalidArgument);
    TEST_1 (3, "00",   "000");
    TEST_1 (3, "01",   "001");
    TEST_1 (3, "02",   InvalidArgument);
    TEST_1 (3, "10",   "010");
    TEST_1 (3, "11",   "011");
    TEST_1 (3, "12",   InvalidArgument);
    TEST_1 (3, "000",  "000");
    TEST_1 (3, "001",  "001");
    TEST_1 (3, "002",  InvalidArgument);
    TEST_1 (3, "010",  "010");
    TEST_1 (3, "011",  "011");
    TEST_1 (3, "012",  InvalidArgument);
    TEST_1 (3, "100",  "100");
    TEST_1 (3, "101",  "101");
    TEST_1 (3, "102",  InvalidArgument);
    TEST_1 (3, "100",  "100");
    TEST_1 (3, "101",  "101");
    TEST_1 (3, "102",  InvalidArgument);

    TEST_1 (3, "0001", "000");
    TEST_1 (3, "0010", "001");
    TEST_1 (3, "0100", "010");
    TEST_1 (3, "1000", "100");
    TEST_1 (3, "1001", "100");

    TEST_1 (3, "0001", "000");
    TEST_1 (3, "0010", "001");
    TEST_1 (3, "0100", "010");
    TEST_1 (3, "1000", "100");
    TEST_1 (3, "1001", "100");
    TEST_1 (3, "1002", InvalidArgument);
    TEST_1 (3, "2000", InvalidArgument);

    TEST_1 (3, "10010",  "100");
    TEST_1 (3, "10011",  "100");
    TEST_1 (3, "10012",  InvalidArgument);
    TEST_1 (3, "100102", InvalidArgument);

    // macro to insert N zeros or ones in between two string literals
#define FILL(pfx, bit, N, sfx) fillstr (pfx, bit, N, sfx).c_str ()

    CTOR_INFO (33);

    //                        +------------- preceded by these characters
    //                        |   +--------- binary digit (0 or 1)
    //                        |   |  +------ repeated this many times
    //                        |   |  |   +-- followed by these characters
    //                        |   |  |   |
    //                        v   v  v   v
    TEST_1 (33, "",     FILL ("", 0, 33, ""));
    TEST_1 (33, "0",    FILL ("", 0, 33, ""));
    TEST_1 (33, "1",    FILL ("", 0, 32, "1"));
    TEST_1 (33, "00",   FILL ("", 0, 31, "00"));
    TEST_1 (33, "01",   FILL ("", 0, 31, "01"));
    TEST_1 (33, "10",   FILL ("", 0, 31, "10"));
    TEST_1 (33, "11",   FILL ("", 0, 31, "11"));
    TEST_1 (33, "100",  FILL ("", 0, 30, "100"));
    TEST_1 (33, "101",  FILL ("", 0, 30, "101"));

    TEST_1 (33, FILL ("1", 0, 32, ""),  FILL ("10", 0, 30, "0"));
    TEST_1 (33, FILL ("1", 0, 31, "1"), FILL ("10", 0, 30, "1"));
    TEST_1 (33, FILL ("1", 0, 31, "2"), InvalidArgument);

    TEST_1 (33, FILL ("", 1, 33, ""),      FILL ("", 1, 33, ""));
    TEST_1 (33, FILL ("", 1, 32, "0"),     FILL ("", 1, 32, "0"));
    TEST_1 (33, FILL ("", 1, 31, "00"),    FILL ("", 1, 31, "00"));
    TEST_1 (33, FILL ("", 1, 30, "000"),   FILL ("", 1, 30, "000"));
    TEST_1 (33, FILL ("", 1, 29, "0000"),  FILL ("", 1, 29, "0000"));
    TEST_1 (33, FILL ("", 1, 28, "00000"), FILL ("", 1, 28, "00000"));
    TEST_1 (33, FILL ("", 1, 28, "00001"), FILL ("", 1, 28, "00001"));
    TEST_1 (33, FILL ("", 1, 28, "00010"), FILL ("", 1, 28, "00010"));
    TEST_1 (33, FILL ("", 1, 28, "00100"), FILL ("", 1, 28, "00100"));
    TEST_1 (33, FILL ("", 1, 28, "01000"), FILL ("", 1, 28, "01000"));
    TEST_1 (33, FILL ("", 1, 28, "02000"), InvalidArgument);

    TEST_1 (33, FILL ("",  1, 33, "0"),   FILL ("", 1, 33, ""));
    TEST_1 (33, FILL ("",  1, 33, "1"),   FILL ("", 1, 33, ""));
    TEST_1 (33, FILL ("",  1, 33, "2"),   InvalidArgument);
    TEST_1 (33, FILL ("2", 1, 33, ""),    InvalidArgument);

    CTOR_INFO (80);

    TEST_1 (80, FILL ("" ,  1, 80, ""),   FILL (""  , 1, 80, ""));
    TEST_1 (80, FILL ("1",  0, 78, "1"),  FILL ("1" , 0, 78, "1"));
    TEST_1 (80, FILL ("1",  0, 77, "10"), FILL ("1" , 0, 77, "10"));
    TEST_1 (80, FILL ("1",  0, 77, "20"), InvalidArgument);
    TEST_1 (80, FILL ("2",  0, 77, "00"), InvalidArgument);
    TEST_1 (80, FILL ("02", 0, 76, "00"), InvalidArgument);
    TEST_1 (80, FILL ("12", 0, 76, "00"), InvalidArgument);

    //////////////////////////////////////////////////////////////////
#undef CTOR_INFO
#define CTOR_INFO(N)                                            \
    rw_info (0, 0, __LINE__, "std::bitset<%i>::bitset(const "   \
             "%{?}std::basic_string<%s>&%{:}%3$s%{;}, size_t)", \
             N, 0 != p, cname)

#define TEST_2(N, str, pos, except)   DO_TEST(N, str, pos, -1, except)

    CTOR_INFO (0);

    TEST_2 (0, "",  0, "");
    TEST_2 (0, "",  1, OutOfRange);
    TEST_2 (0, "0", 0, "");
    TEST_2 (0, "1", 0, "");
    TEST_2 (0, "2", 0, InvalidArgument);
    TEST_2 (0, "0", 1, "");
    TEST_2 (0, "1", 1, "");
    TEST_2 (0, "2", 1, "");

    CTOR_INFO (1);

    TEST_2 (1, "",   0, "0");
    TEST_2 (1, "0",  0, "0");
    TEST_2 (1, "1",  0, "1");
    TEST_2 (1, "2",  0, InvalidArgument);

    TEST_2 (1, "00", 0, "0");
    TEST_2 (1, "01", 0, "0");
    TEST_2 (1, "02", 0, InvalidArgument);
    TEST_2 (1, "10", 0, "1");
    TEST_2 (1, "11", 0, "1");
    TEST_2 (1, "12", 0, InvalidArgument);

    TEST_2 (1, "00", 1, "0");
    TEST_2 (1, "01", 1, "1");
    TEST_2 (1, "02", 1, InvalidArgument);
    TEST_2 (1, "10", 1, "0");
    TEST_2 (1, "11", 1, "1");
    TEST_2 (1, "12", 1, InvalidArgument);
    TEST_2 (1, "20", 1, "0");
    TEST_2 (1, "21", 1, "1");
    TEST_2 (1, "22", 1, InvalidArgument);

    TEST_2 (1, "000", 1, "0");
    TEST_2 (1, "001", 1, "0");
    TEST_2 (1, "002", 1, InvalidArgument);
    TEST_2 (1, "010", 1, "1");
    TEST_2 (1, "011", 1, "1");
    TEST_2 (1, "012", 1, InvalidArgument);
    TEST_2 (1, "020", 1, InvalidArgument);
    TEST_2 (1, "021", 1, InvalidArgument);
    TEST_2 (1, "022", 1, InvalidArgument);
    TEST_2 (1, "120", 1, InvalidArgument);
    TEST_2 (1, "121", 1, InvalidArgument);
    TEST_2 (1, "122", 1, InvalidArgument);
    TEST_2 (1, "200", 1, "0");
    TEST_2 (1, "201", 1, "0");
    TEST_2 (1, "202", 1, InvalidArgument);

    TEST_2 (1, "320",  2, "0");
    TEST_2 (1, "321",  2, "1");
    TEST_2 (1, "322",  2, InvalidArgument);
    TEST_2 (1, "3200", 2, "0");
    TEST_2 (1, "3201", 2, "0");
    TEST_2 (1, "3202", 2, InvalidArgument);
    TEST_2 (1, "3210", 2, "1");
    TEST_2 (1, "3211", 2, "1");
    TEST_2 (1, "3212", 2, InvalidArgument);

    TEST_2 (1, "",   1, OutOfRange);

    //////////////////////////////////////////////////////////////////
#undef CTOR_INFO
#define CTOR_INFO(N)                                                    \
    rw_info (0, 0, __LINE__, "std::bitset<%i>::bitset(const "           \
             "%{?}std::basic_string<%s>&%{:}%3$s%{;}, size_t, size_t)", \
             N, 0 != p, cname)

    CTOR_INFO (0);

#define TEST_3(N, str, pos, n, except)   DO_TEST(N, str, pos, n, except)

    //      +-------------------- bitset size
    //      |  +----------------- string argument
    //      |  |      +---------- pos
    //      |  |      |   +------ n
    //      |  |      |   |  +--- result or exception
    //      |  |      |   |  |
    //      v  v      v   v  v
    TEST_3 (0, "",    0,  0, "");
    TEST_3 (0, "",    1,  0, OutOfRange);
    TEST_3 (0, "02",  0,  0, "");

    CTOR_INFO (1);

    TEST_3 (1, "012", 0,  1, "0");
    TEST_3 (1, "012", 1,  1, "1");
    TEST_3 (1, "012", 2,  1, InvalidArgument);

    TEST_3 (1, "",    0,  0, "0");
    TEST_3 (1, "",    1,  0, OutOfRange);

    CTOR_INFO (8);

    TEST_3 (8, "11111111",  0, 8, FILL ("", 1, 8, ""));
    TEST_3 (8, "11111111",  1, 7, FILL ("0", 1, 7, ""));
    TEST_3 (8, "11111111",  2, 6, FILL ("00", 1, 6, ""));
    TEST_3 (8, "11111111",  3, 5, FILL ("000", 1, 5, ""));
    TEST_3 (8, "11111111",  4, 4, FILL ("0000", 1, 4, ""));
    TEST_3 (8, "11111111",  5, 3, FILL ("00000", 1, 3, ""));
    TEST_3 (8, "11111111",  6, 2, FILL ("000000", 1, 2, ""));
    TEST_3 (8, "11111111",  7, 1, FILL ("0000000", 1, 1, ""));
    TEST_3 (8, "11111111",  8, 0, FILL ("00000000", 1, 0, ""));
    TEST_3 (8, "11111111",  9, 0, OutOfRange);
    TEST_3 (8, "11111111",  9, 1, OutOfRange);
    TEST_3 (8, "111111112", 7, 1, FILL ("0000000", 1, 1, ""));
    TEST_3 (8, "111111112", 7, 2, InvalidArgument);

    TEST_3 (8, "211111112", 1, 7, FILL ("0",   1, 7, ""));
    TEST_3 (8, "210111112", 1, 7, FILL ("010", 1, 5, ""));
    TEST_3 (8, "211111012", 1, 7, FILL ("0",   1, 5, "01"));

    CTOR_INFO (40);

    TEST_3 (40, FILL ("",  0, 40, ""),   0,  0, FILL ("",  0, 40, ""));
    TEST_3 (40, FILL ("",  0, 40, "1"),  0, 40, FILL ("",  0, 40, ""));
    TEST_3 (40, FILL ("",  0, 40, "1"),  0, 41, FILL ("",  0, 40, ""));
    TEST_3 (40, FILL ("",  0, 39, "1"),  0, 39, FILL ("",  0, 40, ""));
    TEST_3 (40, FILL ("",  0, 39, "1"),  0, 40, FILL ("",  0, 39, "1"));
    TEST_3 (40, FILL ("1", 0, 40, "1"),  0,  0, FILL ("",  0, 40, ""));
    TEST_3 (40, FILL ("1", 0, 38, "1"),  0, 40, FILL ("1", 0, 38, "1"));
    TEST_3 (40, FILL ("1", 0, 38, "1"),  0, 40, FILL ("1", 0, 38, "1"));
    TEST_3 (40, FILL ("2", 0, 40, "2"),  1, 40, FILL ("",  0, 40, ""));
}

/**************************************************************************/

template <std::size_t N>
void test_ctors (std::bitset<N>* pb)
{
    test_default_ctor (pb);
    test_long_ctor (pb);
}

/**************************************************************************/

template <class Traits>
void test_ctors (const Traits*, const char *cname)
{
    typedef typename Traits::char_type                      char_type;
    typedef std::allocator<char_type>                       Allocator;
    typedef std::basic_string<char_type, Traits, Allocator> String;

    // exercise const std::string& overloads
    test_string_ctor ((String*)1, cname);

#if    !defined (_RWSTD_NO_EXT_BITSET_CTOR_CHAR_ARRAY) \
    && !defined (_RWSTD_NO_EXT_BITSET_CTOR_STRING)

    // exercise const char* and const wchar_t* extensions
    // but avoid calling the bitset(const UserChar*) overload in order
    if (sizeof (char_type) != sizeof (UserChar))
        test_string_ctor ((String*)0, cname);

#endif   // _RWSTD_NO_EXT_BITSET_CTOR_{CHAR_ARRAY,STRING}

}

/**************************************************************************/

static int
run_test (int, char**)
{
#ifdef _RWSTD_NO_EXCEPTIONS
    opt_no_exceptions = 1;
#endif   // _RWSTD_NO_EXCEPTIONS

    if (opt_no_exceptions)
        rw_note (0, 0, 0, "exception tests disabled");

#undef DO_TEST
#define DO_TEST(N)   test_ctors ((std::bitset<N>*)0)

    DO_TEST (   0);   // interesting case
    DO_TEST (   1);   // interesting case
    DO_TEST (   2);
    DO_TEST (  31);
    DO_TEST (  32);   // interesting case
    DO_TEST (  33);   // interesting case
    DO_TEST (  34);
    DO_TEST (  63);
    DO_TEST (  64);   // interesting case
    DO_TEST (  65);   // interesting case
    DO_TEST (  66);

    DO_TEST ( 123);

    DO_TEST ( 127);   // interesting case
    DO_TEST ( 128);   // interesting case
    DO_TEST ( 129);
    DO_TEST ( 130);
    DO_TEST ( 255);
    DO_TEST ( 256);   // interesting case

#if !defined(_MSC_VER) || _MSC_VER != 1300
    // FIXME: MSVC can't compile bitset<257>!
    DO_TEST ( 257);   // interesting case
#endif

    DO_TEST ( 258);   // interesting case
    DO_TEST ( 333);

    if (0 <= opt_char) {
        typedef std::char_traits<char> NarrowTraits;

        test_ctors ((NarrowTraits*)0, "char");
    }
    else {
        rw_note (0, 0, __LINE__, "tests of char specialization disabled");
    }

#ifndef _RWSTD_NO_WCHAR_T

    if (0 <= opt_wchar) {
        typedef std::char_traits<wchar_t> WideTraits;

        test_ctors ((WideTraits*)0, "wchar_t");
    }
    else {
        rw_note (0, 0, __LINE__, "tests of wchar_t specialization disabled");
    }

#endif   // _RWSTD_NO_WCHAR_T

    if (0 <= opt_userchar) {
        test_ctors ((UserTraits<UserChar>*)0, "UserChar");
    }
    else {
        rw_note (0, 0, __LINE__, "tests of UserChar specialization disabled");
    }

    return 0;
}

/**************************************************************************/

int main (int argc, char *argv[])
{
    return rw_test (argc, argv, __FILE__,
                    "lib.bitset.cons",
                    0 /* no comment */,
                    run_test,
                    "|-char~ "
                    "|-wchar_t~ "
                    "|-UserChar~ "
                    "|-no-exceptions# ",
                    &opt_char,
                    &opt_wchar,
                    &opt_userchar,
                    &opt_no_exceptions,
                    (void*)0   /* sentinel */);
}
