static void doTestCountVectorOfSize(int32_t n)
{
    BitVectorPtr bv = newLucene<BitVector>(n);
    // test count when incrementally setting bits
    for (int32_t i = 0; i < bv->size(); ++i)
    {
        BOOST_CHECK(!bv->get(i));
        BOOST_CHECK_EQUAL(i, bv->count());
        bv->set(i);
        BOOST_CHECK(bv->get(i));
        BOOST_CHECK_EQUAL(i + 1, bv->count());
    }
    
    bv = newLucene<BitVector>(n);
    // test count when setting then clearing bits
    for (int32_t i = 0; i < bv->size(); ++i)
    {
        BOOST_CHECK(!bv->get(i));
        BOOST_CHECK_EQUAL(0, bv->count());
        bv->set(i);
        BOOST_CHECK(bv->get(i));
        BOOST_CHECK_EQUAL(1, bv->count());
        bv->clear(i);
        BOOST_CHECK(!bv->get(i));
        BOOST_CHECK_EQUAL(0, bv->count());
    }
}
static void doTestDgaps(int32_t size, int32_t count1, int32_t count2)
{
    DirectoryPtr d = newLucene<RAMDirectory>();
    BitVectorPtr bv = newLucene<BitVector>(size);
    for (int32_t i = 0; i < count1; ++i)
    {
        bv->set(i);
        BOOST_CHECK_EQUAL(i + 1, bv->count());
    }
    bv->write(d, L"TESTBV");
    // gradually increase number of set bits
    for (int32_t i = count1; i < count2; ++i)
    {
        BitVectorPtr bv2 = newLucene<BitVector>(d, L"TESTBV");
        BOOST_CHECK(compareBitVectors(bv, bv2));
        bv = bv2;
        bv->set(i);
        BOOST_CHECK_EQUAL(i + 1, bv->count());
        bv->write(d, L"TESTBV");
    }
    // now start decreasing number of set bits
    for (int32_t i = count2 - 1; i >= count1; --i)
    {
        BitVectorPtr bv2 = newLucene<BitVector>(d, L"TESTBV");
        BOOST_CHECK(compareBitVectors(bv, bv2));
        bv = bv2;
        bv->clear(i);
        BOOST_CHECK_EQUAL(i, bv->count());
        bv->write(d, L"TESTBV");
    }
}
static void doTestGetSetVectorOfSize(int32_t n)
{
    BitVectorPtr bv = newLucene<BitVector>(n);
    for (int32_t i = 0; i < bv->size(); ++i)
    {
        BOOST_CHECK(!bv->get(i));
        bv->set(i);
        BOOST_CHECK(bv->get(i));
    }
}
static BitVectorPtr createSubsetTestVector()
{
    int32_t length = SIZEOF_ARRAY(subsetPattern);
    BitVectorPtr bv = newLucene<BitVector>(length);
    for (int32_t i = 0; i < length; ++i)
    {
        if (subsetPattern[i] == 1)
            bv->set(i);
    }
    return bv;
}
static void doTestWriteRead(int32_t n)
{
    DirectoryPtr d = newLucene<RAMDirectory>();
    BitVectorPtr bv = newLucene<BitVector>(n);
    // test count when incrementally setting bits
    for (int32_t i = 0; i < bv->size(); ++i)
    {
        BOOST_CHECK(!bv->get(i));
        BOOST_CHECK_EQUAL(i, bv->count());
        bv->set(i);
        BOOST_CHECK(bv->get(i));
        BOOST_CHECK_EQUAL(i + 1, bv->count());
        bv->write(d, L"TESTBV");
        BitVectorPtr compare = newLucene<BitVector>(d, L"TESTBV");
        // compare bit vectors with bits set incrementally
        BOOST_CHECK(compareBitVectors(bv, compare));
    }
}