#include <iostream>
#include <vector>
#include <assert.h>
#include "bm.h"
#include "bmsparsevec.h"
#include "bmsparsevec_serial.h"
#include "bmundef.h"
using namespace std;
typedef bm::sparse_vector<unsigned, bm::bvector<> > sparse_vector_u32;
typedef bm::sparse_vector<int, bm::bvector<> > sparse_vector_i32;
typedef bm::sparse_vector_serializer<sparse_vector_u32> sv_serializer_type;
typedef bm::sparse_vector_deserializer<sparse_vector_u32> sv_deserializer_type;
static
void SDemo1()
{
sparse_vector_u32 sv1;
sparse_vector_u32 sv2;
for (unsigned i = 0; i < 128000; ++i)
{
sv1.push_back(8);
}
sv1.optimize();
bm::sparse_vector_serial_layout<sparse_vector_u32> sv_lay;
bm::sparse_vector_serialize(sv1, sv_lay);
const unsigned char* buf = sv_lay.buf();
size_t buf_size = sv_lay.size();
cout << buf_size << endl;
vector<unsigned char> tmp_buf(buf_size);
::memcpy(&tmp_buf[0], buf, buf_size);
int res = bm::sparse_vector_deserialize(sv2, &tmp_buf[0]);
if (res != 0)
{
cerr << "De-Serialization error!" << endl;
return;
}
if (!sv1.equal(sv2) )
{
cerr << "Error! Please report a bug to BitMagic project support." << endl;
return;
}
}
static
void SDemo2()
{
sparse_vector_u32 sv1(bm::use_null); sparse_vector_u32 sv2(bm::use_null);
for (unsigned i = 0; i < 128000; i+=2)
{
sv1.set(i, 8);
}
sv1.optimize();
sv2 = sv1;
sv_serializer_type sv_ser;
sv_deserializer_type sv_dser;
bm::sparse_vector_serial_layout<sparse_vector_u32> sv_lay0;
sv_ser.enable_xor_compression();
assert(sv_ser.is_xor_ref());
sv_ser.serialize(sv1, sv_lay0);
const unsigned char* buf = sv_lay0.data();
size_t sz = sv_lay0.size();
cout << "XOR compression enabled size=" << sz << endl;
{
sparse_vector_u32 sv3(bm::use_null);
sv_dser.deserialize(sv3, buf);
assert(sv3.equal(sv1));
}
sv_ser.disable_xor_compression();
assert(!sv_ser.is_xor_ref());
sv_ser.serialize(sv2, sv_lay0);
buf = sv_lay0.data();
sz = sv_lay0.size();
cout << "XOR compression disabled size=" << sz << endl;
{
sparse_vector_u32 sv3(bm::use_null);
sv_dser.deserialize(sv3, buf);
assert(sv3.equal(sv1));
}
}
int main(void)
{
try
{
cout << "Demo 1" << endl;
SDemo1();
cout << "Demo 2" << endl;
SDemo2();
}
catch(std::exception& ex)
{
std::cerr << ex.what() << std::endl;
return 1;
}
return 0;
}