#include <assert.h>
#include <iostream>
#include <vector>
#include <chrono>
#include <algorithm>
#include <random>
#include <algorithm>
#include <stdexcept>
#include "bm.h"
#include "bmsparsevec.h"
#include "bmsparsevec_algo.h"
#include "bmintervals.h"
#include "bmundef.h"
using namespace std;
typedef bm::bvector<> bvector_type;
typedef bm::sparse_vector<unsigned, bvector_type > sparse_vector_u32;
typedef bm::interval_enumerator<bvector_type > interval_enumerator_type;
int main(void)
{
try
{
sparse_vector_u32 sv;
{
sparse_vector_u32::back_insert_iterator bit(&sv);
bit = 0;
bit = bm::id_max;
bit = 17;
bit = 17;
bit = 5;
bit = 18;
bit = 178;
bit = 178;
bit = 17;
bit = 0;
bit = bm::id_max;
bit.flush();
}
sv.optimize();
{
cout << "Sparse vector:" << endl;
std::for_each(sv.begin(), sv.end(), [](unsigned v) {
cout << v << ",";
});
cout << endl << endl;
}
bm::sparse_vector_scanner<sparse_vector_u32> scanner;
scanner.bind(sv, false);
bvector_type bv_res;
typename bvector_type::mem_pool_guard mp_guard;
mp_guard.assign_if_not_set(scanner.get_bvector_alloc_pool(), bv_res);
sparse_vector_u32::const_iterator it = sv.begin();
sparse_vector_u32::const_iterator it_end = sv.end();
bvector_type bv_seen_values(bm::BM_GAP);
bool id_max_seen(false); for (;it != it_end; ++it)
{
auto v = *it;
if (bvector_type::size_type(v) == bm::id_max)
{
if (id_max_seen)
continue;
id_max_seen = true;
}
else
{
if (bv_seen_values.test(bvector_type::size_type(v)))
continue;
bv_seen_values.set(bvector_type::size_type(v));
}
scanner.find_eq(sv, v, bv_res);
interval_enumerator_type ien(bv_res);
assert(ien.valid()); bvector_type::size_type range_cnt = ien.end() - ien.start() + 1;
if (!ien.advance()) {
if (range_cnt == 1)
{
cout << "Value = " << v << " is unique" << endl;
continue;
}
cout << "Value = " << v << " is colocated" << endl;
continue;
}
cout << "Value = " << v << " is not colocated" << endl;
} }
catch(std::exception& ex)
{
std::cerr << ex.what() << std::endl;
return 1;
}
return 0;
}