#include <stdlib.h>
#include <iostream>
#include <vector>
#include <memory>
#include "bm.h"
#include "bmaggregator.h"
#include "bmundef.h"
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;
}
const unsigned max_vectors = 10;
int main(void)
{
try
{
bm::aggregator<bm::bvector<> > agg;
std::cout << "AGRUMENT (GROUP 0) SETS:" << std::endl;
std::vector<std::unique_ptr<bm::bvector<> > > vect;
for (unsigned i = 0; i < max_vectors; ++i)
{
std::unique_ptr<bm::bvector<>> bv(new bm::bvector<>());
bv->set(i);
bv->set(i+1);
bv->set(10000);
bv->set(20000);
PrintContainer(bv->first(), bv->end());
bv->optimize();
vect.push_back(std::move(bv));
}
std::cout << std::endl;
try
{
for (unsigned i = 0; i < vect.size(); ++i)
{
agg.add(vect[i].get());
}
bm::bvector<> bv_res;
agg.combine_or(bv_res);
std::cout << "OR:" << std::endl;
PrintContainer(bv_res.first(), bv_res.end());
std::cout << "AND:" << std::endl;
agg.combine_and(bv_res); PrintContainer(bv_res.first(), bv_res.end());
agg.reset();
for (unsigned i = 0; i < vect.size(); ++i)
{
const unsigned group0 = 0; agg.add(vect[i].get(), group0);
}
agg.combine_and_sub(bv_res);
std::cout << "AND-SUB(empty):" << std::endl;
PrintContainer(bv_res.first(), bv_res.end());
bm::bvector<> bv_not { 10, 10000 };
agg.add(&bv_not, 1);
agg.combine_and_sub(bv_res);
std::cout << "AND-SUB:" << std::endl;
PrintContainer(bv_res.first(), bv_res.end());
agg.reset();
}
catch(std::exception& ex)
{
std::cerr << ex.what() << std::endl;
agg.reset(); throw;
}
}
catch(std::exception& ex)
{
std::cerr << ex.what() << std::endl;
return 1;
}
return 0;
}