#include <assert.h>
#include <iostream>
#include <vector>
#include "bm.h"
#include "bmalgo.h"
#include "bmserial.h"
#include "bmaggregator.h"
#include "bmundef.h"
using namespace std;
static
void print_bvector(const bm::bvector<>& bv)
{
bm::bvector<>::size_type cnt = 0;
bm::bvector<>::enumerator en = bv.first();
for (; en.valid() && cnt < 10; ++en, ++cnt)
cout << *en << ", ";
if (cnt == 10)
cout << " ...";
cout << "(size = "<< bv.size() << ")" << endl;
}
static
void make_BLOB(vector<unsigned char>& target_buf, bm::bvector<>& bv)
{
BM_DECLARE_TEMP_BLOCK(tb)
bm::serializer<bm::bvector<> > bvs(tb);
bvs.set_compression_level(4);
bv.optimize(tb, bm::bvector<>::opt_compress);
bm::serializer<bm::bvector<> >::buffer sbuf;
bvs.serialize(bv, sbuf, 0);
target_buf.resize(sbuf.size());
::memcpy(target_buf.data(), sbuf.buf(), sbuf.size());
}
static
void DemoOR()
{
typedef bm::bvector<>::size_type size_type;
bm::operation_deserializer<bm::bvector<> > od;
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.bit_or(bv_B);
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.resize(5);
bv_B.resize(10);
bv_A.bit_or(bv_B);
print_bvector(bv_A); }
{
bm::bvector<> bv_T;
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_T.bit_or(bv_A, bv_B, bm::bvector<>::opt_compress);
print_bvector(bv_T); }
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.merge(bv_B);
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.combine_operation(bv_B, bm::BM_OR);
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<size_type> vect_B { 1, 2, 4 };
bm::combine_or(bv_A, vect_B.begin(), vect_B.end());
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<size_type> vect_B { 1, 2, 4 };
const size_type* arr = &vect_B[0];
bv_A.set(arr, unsigned(vect_B.size()), bm::BM_SORTED); print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<unsigned char> blob;
{
bm::bvector<> bv_B { 1, 2, 4 };
make_BLOB(blob, bv_B);
}
od.deserialize(bv_A, blob.data(), bm::set_OR);
print_bvector(bv_A); }
{
bm::bvector<> bv_T;
bm::bvector<> bv_A { 1, 2 };
bm::bvector<> bv_B { 2, 3 };
bm::bvector<> bv_C { 3, 4 };
bm::aggregator<bm::bvector<> > agg;
agg.set_optimization();
agg.add(&bv_A);
agg.add(&bv_B);
agg.add(&bv_C);
agg.combine_or(bv_T);
agg.reset();
print_bvector(bv_T); }
}
static
void DemoAND()
{
typedef bm::bvector<>::size_type size_type;
bm::operation_deserializer<bm::bvector<> > od;
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.bit_and(bv_B);
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.resize(5);
bv_B.resize(10);
bv_A.bit_and(bv_B);
print_bvector(bv_A); }
{
bm::bvector<> bv_T;
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_T.bit_and(bv_A, bv_B, bm::bvector<>::opt_compress);
print_bvector(bv_T); }
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.combine_operation(bv_B, bm::BM_AND);
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<unsigned> vect_B { 1, 2, 4 };
bm::combine_and(bv_A, vect_B.begin(), vect_B.end());
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<size_type> vect_B { 1, 2, 4 };
const size_type* arr = &vect_B[0];
bv_A.keep(arr, size_type(vect_B.size()), bm::BM_SORTED); print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<unsigned char> blob;
{
bm::bvector<> bv_B { 1, 2, 4 };
make_BLOB(blob, bv_B);
}
od.deserialize(bv_A, blob.data(), bm::set_AND);
print_bvector(bv_A); }
{
bm::bvector<> bv_T;
bm::bvector<> bv_A { 1, 2 };
bm::bvector<> bv_B { 1, 2, 3 };
bm::bvector<> bv_C { 1, 2, 3, 4 };
bm::aggregator<bm::bvector<> > agg;
agg.set_optimization();
agg.add(&bv_A);
agg.add(&bv_B);
agg.add(&bv_C);
agg.combine_and(bv_T);
agg.reset();
print_bvector(bv_T); }
}
static
void DemoXOR()
{
bm::operation_deserializer<bm::bvector<> > od;
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.bit_xor(bv_B);
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.resize(5);
bv_B.resize(10);
bv_A.bit_xor(bv_B);
print_bvector(bv_A); }
{
bm::bvector<> bv_T;
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_T.bit_xor(bv_A, bv_B, bm::bvector<>::opt_compress);
print_bvector(bv_T); }
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.combine_operation(bv_B, bm::BM_XOR);
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<unsigned> vect_B { 1, 2, 4 };
bm::combine_xor(bv_A, vect_B.begin(), vect_B.end());
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<unsigned char> blob;
{
bm::bvector<> bv_B { 1, 2, 4 };
make_BLOB(blob, bv_B);
}
od.deserialize(bv_A, blob.data(), bm::set_XOR);
print_bvector(bv_A); }
}
static
void DemoSUB()
{
typedef bm::bvector<>::size_type size_type;
bm::operation_deserializer<bm::bvector<> > od;
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.bit_sub(bv_B);
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.resize(5);
bv_B.resize(10);
bv_A.bit_sub(bv_B);
print_bvector(bv_A); }
{
bm::bvector<> bv_T;
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_T.bit_sub(bv_A, bv_B, bm::bvector<>::opt_compress);
print_bvector(bv_T); }
{
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.combine_operation(bv_B, bm::BM_SUB);
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<size_type> vect_B { 1, 2, 4 };
bm::combine_sub(bv_A, vect_B.begin(), vect_B.end());
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<size_type> vect_B { 1, 2, 4 };
const size_type* arr = &vect_B[0];
bv_A.clear(arr, unsigned(vect_B.size()), bm::BM_SORTED); print_bvector(bv_A); }
{
bm::bvector<> bv_A { 1, 2, 3 };
vector<unsigned char> blob;
{
bm::bvector<> bv_B { 1, 2, 4 };
make_BLOB(blob, bv_B);
}
od.deserialize(bv_A, blob.data(), bm::set_SUB);
print_bvector(bv_A); }
{
bm::bvector<> bv_T;
bm::bvector<> bv_A { 1, 2, 3, 4 };
bm::bvector<> bv_B { 1, 2 };
bm::bvector<> bv_C { 1, 2, 4 };
bm::aggregator<bm::bvector<> > agg;
agg.set_optimization();
agg.add(&bv_A, 0);
agg.add(&bv_B, 1); agg.add(&bv_C, 1);
agg.combine_and_sub(bv_T);
agg.reset();
print_bvector(bv_T); }
}
static
void DemoAND_OR()
{
{
bm::bvector<> bv_R { 0, 5 };
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_R.bit_or_and(bv_A, bv_B);
print_bvector(bv_R); }
{
bm::bvector<> bv_R { 0, 5 };
bv_R.resize(12);
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2, 4 };
bv_A.resize(5);
bv_B.resize(10);
bv_R.bit_or_and(bv_A, bv_B);
print_bvector(bv_R); }
bm::aggregator<bm::bvector<> > agg;
bm::aggregator<bm::bvector<> >::pipeline<bm::agg_opt_disable_bvects_and_counts> agg_pipe;
bm::bvector<> bv_T { 0, 65536 };
bm::bvector<> bv_A { 1, 2, 3 };
bm::bvector<> bv_B { 1, 2 };
bm::bvector<> bv_C { 2, 3, 256 };
{
bm::aggregator<bm::bvector<> >::arg_groups* args;
args = agg_pipe.add();
args->add(&bv_A, 0); args->add(&bv_B, 0);
args = agg_pipe.add();
args->add(&bv_B, 0);
args->add(&bv_C, 0);
}
agg_pipe.set_or_target(&bv_T);
agg_pipe.complete();
agg.combine_and_sub(agg_pipe);
print_bvector(bv_T); }
static
void DemoINV()
{
{
bm::bvector<> bv_A { 4, 5, 6 };
bv_A.invert();
print_bvector(bv_A); }
{
bm::bvector<> bv_A { 4, 5, 6 };
bv_A.resize(7);
bv_A.invert();
print_bvector(bv_A); }
}
static
void DemoAND_SUB()
{
bm::aggregator<bm::bvector<> > agg;
bm::bvector<> bv_A { 1, 2, 3, 4 };
bm::bvector<> bv_B { 1, 2 };
bm::bvector<> bv_C { 1, 2, 4 };
bm::bvector<> bv_D { 0, 2, 3, 4, 5 };
{
bm::bvector<> bv_T;
agg.set_optimization();
agg.add(&bv_A, 0); agg.add(&bv_D, 0);
agg.add(&bv_B, 1); agg.add(&bv_C, 1);
agg.combine_and_sub(bv_T);
agg.reset();
print_bvector(bv_T); }
cout << endl;
{
bm::aggregator<bm::bvector<> >::pipeline<> agg_pipe;
bm::bvector<> bv_T;
{
bm::aggregator<bm::bvector<> >::arg_groups* args;
args = agg_pipe.add();
args->add(&bv_A, 0); args->add(&bv_B, 0);
args->add(&bv_D, 1);
args = agg_pipe.add();
args->add(&bv_A, 0);
args->add(&bv_D, 0);
args->add(&bv_B, 1);
args = agg_pipe.add();
args->add(&bv_D, 0);
args->add(&bv_C, 1); args->add(&bv_B, 1);
}
agg_pipe.set_or_target(&bv_T);
agg_pipe.complete();
agg.combine_and_sub(agg_pipe);
auto& res_vect = agg_pipe.get_bv_res_vector();
assert(res_vect.size()==3); for (size_t i = 0; i < res_vect.size(); ++i)
{
const bm::bvector<>* bv = res_vect[i];
if (bv)
print_bvector(*bv); else
cout << "Empty result" << endl; }
print_bvector(bv_T); }
}
int main(void)
{
try
{
cout << endl << "Set Union (OR) demo" << endl << endl;
DemoOR();
cout << endl << "Set Intersect (AND) demo" << endl << endl;
DemoAND();
cout << endl << "XOR demo" << endl << endl;
DemoXOR();
cout << endl << "Set Minus (SUB/AND-NOT) demo" << endl << endl;
DemoSUB();
cout << endl << "Set Invert (NOT) demo" << endl << endl;
DemoINV();
cout << endl << "Set AND-SUB demo" << endl << endl;
DemoAND_SUB();
cout << endl << "Set AND-OR demo" << endl << endl;
DemoAND_OR();
}
catch(std::exception& ex)
{
std::cerr << ex.what() << std::endl;
}
return 0;
}