/***************************************************************************
 *
 * 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 <rw_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 = int (bitstr - (char*)0) < 3 ?
                       int (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 */);
}
