#include <iostream>
#include <vector>
#include "bm.h"
#include "bmsparsevec.h"
#include "bmsparsevec_compr.h"
#include "bmsparsevec_serial.h"
#include "bmundef.h"
using namespace std;
typedef bm::sparse_vector<unsigned, bm::bvector<> > sparse_vector_u32;
typedef bm::rsc_sparse_vector<unsigned, sparse_vector_u32 > rsc_sparse_vector_u32;
template<class SV>
void print_svector(const SV& sv, bool show_nulls = false)
{
std::cout << sv.size() << ": ";
for (unsigned i = 0; i < sv.size(); ++i)
{
if (show_nulls)
{
if (sv.is_null(i))
std::cout << "NULL, ";
else
{
typename SV::value_type v = sv.get(i);
std::cout << v << ", ";
}
}
else
{
typename SV::value_type v = sv.get(i);
std::cout << v << ", ";
}
}
std::cout << std::endl;
}
int main(void)
{
BM_DECLARE_TEMP_BLOCK(tb)
try
{
sparse_vector_u32 sv1(bm::use_null); rsc_sparse_vector_u32 csv2;
for (unsigned i = 0; i < 15; i+=3)
{
sv1[i] = i;
}
print_svector(sv1); print_svector(sv1, true);
csv2.load_from(sv1);
print_svector(csv2);
print_svector(csv2, true);
csv2.optimize(tb);
bm::sparse_vector_serial_layout<rsc_sparse_vector_u32> sv_lay;
bm::sparse_vector_serialize(csv2, sv_lay, tb);
const unsigned char* buf = sv_lay.buf();
size_t buf_size = sv_lay.size();
vector<unsigned char> tmp_buf(buf_size);
::memcpy(&tmp_buf[0], buf, buf_size);
rsc_sparse_vector_u32 csv3;
int res = bm::sparse_vector_deserialize(csv3, &tmp_buf[0], tb);
if (res != 0)
{
std::cerr << "De-Serialization error!" << std::endl;
return 1;
}
if (!csv3.equal(csv2) )
{
cerr << "Error! Please report a bug to BitMagic project support." << endl;
return 1;
}
sparse_vector_u32 sv3(bm::use_null);
csv3.load_to(sv3);
if (!sv3.equal(sv1) )
{
std::cerr << "Error! Please report a bug to BitMagic project support." << std::endl;
return 1;
}
print_svector(sv1, true);
}
catch(std::exception& ex)
{
std::cerr << ex.what() << std::endl;
return 1;
}
return 0;
}