#include <iostream>
#include <vector>
#define BM64ADDR
#include "bm.h"
#include "bmalgo.h"
#include "bmtimer.h"
#include "bmundef.h"
using namespace std;
bm::chrono_taker::duration_map_type timing_map;
typedef bm::bvector<>::size_type bm_size_type;
const unsigned benchmark_count = 1000;
bm_size_type vector_max = 4000000;
template<class T> void PrintContainer(T first, T last)
{
if (first == last)
std::cout << "<EMPTY SET>";
else
for (; first != last; ++first)
std::cout << *first << ";";
std::cout << std::endl;
}
static
void generate_test_vectors(std::vector<bm_size_type> &v1,
std::vector<bm_size_type> &v2,
std::vector<bm_size_type> &v3)
{
bm_size_type j;
for (j = 0; j < vector_max; j += 2)
{
v1.push_back(j);
}
for (j = 0; j < vector_max; j += 5)
{
v2.push_back(j);
}
for (j = 0; j < vector_max; j += 120)
{
v3.push_back(j);
}
}
static
void bv_set_bit_test()
{
bm::chrono_taker tt1("1. bvector<>::set_bit()", benchmark_count, &timing_map);
bm::bvector<> bv1, bv2, bv3;
for (unsigned i = 0; i < benchmark_count; ++i)
{
bm_size_type j;
for (j = 0; j < vector_max; j += 2)
{
bv1.set_bit(j, true);
}
for (j = 0; j < vector_max; j += 10)
{
bv2.set_bit(j, true);
}
for (j = 0; j < vector_max; j += 120)
{
bv3.set_bit(j, true);
}
bv1.reset();
bv2.reset();
bv3.reset();
} }
static
void bv_set_bit_no_check_test()
{
bm::chrono_taker tt1("2. bvector<>::set_bit_no_check()", benchmark_count, &timing_map);
bm::bvector<> bv1, bv2, bv3;
bv1.init();
bv2.init();
bv3.init();
for (unsigned i = 0; i < benchmark_count; ++i)
{
bm::id_t j;
for (j = 0; j < vector_max; j += 2)
{
bv1.set_bit_no_check(j);
}
for (j = 0; j < vector_max; j += 10)
{
bv2.set_bit_no_check(j);
}
for (j = 0; j < vector_max; j += 120)
{
bv3.set_bit_no_check(j);
}
}
}
static
void combine_or_test(std::vector<bm_size_type> &v1,
std::vector<bm_size_type> &v2,
std::vector<bm_size_type> &v3)
{
bm::chrono_taker tt1("3. combine_or()", benchmark_count, &timing_map);
bm::bvector<> bv1, bv2, bv3;
for (unsigned i = 0; i < benchmark_count; ++i)
{
bm::combine_or(bv1, v1.begin(), v1.end());
bm::combine_or(bv2, v2.begin(), v2.end());
bm::combine_or(bv3, v3.begin(), v3.end());
}
}
static
void bvector_bulk_set_test(std::vector<bm_size_type> &v1,
std::vector<bm_size_type> &v2,
std::vector<bm_size_type> &v3)
{
bm::chrono_taker tt1("3. bvector<>::set() array", benchmark_count, &timing_map);
bm::bvector<> bv1, bv2, bv3;
for (unsigned i = 0; i < benchmark_count; ++i)
{
bv1.set(&v1[0], bm_size_type(v1.size()));
bv2.set(&v2[0], bm_size_type(v2.size()));
bv3.set(&v3[0], bm_size_type(v3.size()));
}
}
int main(void)
{
try
{
bm::bvector<> bv1 { 2, 3, 4 };
PrintContainer(bv1.first(), bv1.end()); bv1.clear();
bv1.set(10);
bv1.set(256);
bv1.set(1000000);
PrintContainer(bv1.first(), bv1.end());
bm::id_t bits[] = { 256, 512, 10 };
unsigned cnt = 0;
for (unsigned i = 0; i < sizeof(bits) / sizeof(bits[0]); ++i)
{
bool b = bv1.set_bit(bits[i], true);
cnt += b;
}
std::cout << "Number of bits changed:" << cnt << std::endl;
PrintContainer(bv1.first(), bv1.end());
bool b;
b = bv1.set_bit_conditional(5, true, false); std::cout << "Bit 5 set:" << (b ? " yes " : " no ") << std::endl;
b = bv1.set_bit_conditional(256, true, false); std::cout << "Bit 256 set:" << (b ? " yes " : " no ") << std::endl;
b = bv1.set_bit_conditional(256, true, true); std::cout << "Bit 256 set:" << (b ? " yes " : " no ") << std::endl;
PrintContainer(bv1.first(), bv1.end());
bv1.set_range(10, 15, true); PrintContainer(bv1.first(), bv1.end());
bv1.set_range(10, 12, false); PrintContainer(bv1.first(), bv1.end());
b = bv1.clear_bit(13);
std::cout << "Bit 13 set:" << (b ? " yes " : " no ") << std::endl;
bv1.reset();
PrintContainer(bv1.first(), bv1.end());
bm::combine_or(bv1, &bits[0], &bits[0] + (sizeof(bits) / sizeof(bits[0])));
PrintContainer(bv1.first(), bv1.end());
bv1.flip(256);
bv1.flip(257);
PrintContainer(bv1.first(), bv1.end());
bm::bvector<> bv2;
bv1.swap(bv2);
PrintContainer(bv1.first(), bv1.end()); PrintContainer(bv2.first(), bv2.end());
bm_size_type p = 1;
for (p = bv2.extract_next(p); p != 0; p = bv2.extract_next(p))
{
std::cout << "Extracted p = " << p << std::endl;
}
PrintContainer(bv2.first(), bv2.end());
bm::bvector<> bv3;
bv3.init();
bv3.set_bit_no_check(10);
bv3.set_bit_no_check(100);
bv3.set_bit_no_check(1000);
PrintContainer(bv3.first(), bv3.end());
std::vector<bm_size_type> v1, v2, v3;
generate_test_vectors(v1, v2, v3);
for (unsigned k = 0; k < 1000; ++k)
{
bm_size_type s = 0;
bm_size_type i;
for (i = 0; i < v1.size(); ++i)
s = s + s* v1[i] + i;
for (i = 0; i < v2.size(); ++i)
s = s + s* v2[i] + i;
std::cout << s << "\r";
}
std::cout << std::endl << "Running benchmarks..." << std::endl;
bv_set_bit_test();
bv_set_bit_no_check_test();
combine_or_test(v1, v2, v3);
bvector_bulk_set_test(v1, v2, v3);
std::cout << std::endl;
bm::chrono_taker::print_duration_map(timing_map, bm::chrono_taker::ct_all);
}
catch(std::exception& ex)
{
std::cerr << ex.what() << std::endl;
return 1;
}
return 0;
}