299 lines
6.9 KiB
C++
299 lines
6.9 KiB
C++
#include <cstdlib>
|
|
#include <ctime>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <marisa/vector.h>
|
|
#include <marisa/intvector.h>
|
|
#include <marisa/bitvector.h>
|
|
|
|
#include "assert.h"
|
|
|
|
namespace {
|
|
|
|
void TestVector() {
|
|
TEST_START();
|
|
|
|
std::vector<int> values;
|
|
for (std::size_t i = 0; i < 1000; ++i) {
|
|
values.push_back(std::rand());
|
|
}
|
|
|
|
marisa::Vector<int> vec;
|
|
|
|
ASSERT(vec.max_size() == MARISA_UINT32_MAX);
|
|
ASSERT(vec.size() == 0);
|
|
ASSERT(vec.capacity() == 0);
|
|
ASSERT(!vec.fixed());
|
|
ASSERT(vec.empty());
|
|
ASSERT(vec.total_size() == sizeof(marisa::UInt32));
|
|
|
|
for (std::size_t i = 0; i < values.size(); ++i) {
|
|
vec.push_back(values[i]);
|
|
ASSERT(vec[i] == values[i]);
|
|
ASSERT(static_cast<const marisa::Vector<int> &>(vec)[i] == values[i]);
|
|
}
|
|
|
|
ASSERT(vec.size() == values.size());
|
|
ASSERT(vec.capacity() >= vec.size());
|
|
ASSERT(!vec.empty());
|
|
ASSERT(vec.total_size() == sizeof(marisa::UInt32)
|
|
+ ((sizeof(int) * values.size())));
|
|
|
|
ASSERT(static_cast<const marisa::Vector<int> &>(vec).front()
|
|
== values.front());
|
|
ASSERT(static_cast<const marisa::Vector<int> &>(vec).back()
|
|
== values.back());
|
|
ASSERT(vec.front() == values.front());
|
|
ASSERT(vec.back() == values.back());
|
|
|
|
vec.shrink();
|
|
|
|
ASSERT(vec.size() == values.size());
|
|
ASSERT(vec.capacity() == vec.size());
|
|
for (std::size_t i = 0; i < values.size(); ++i) {
|
|
ASSERT(vec[i] == values[i]);
|
|
ASSERT(static_cast<const marisa::Vector<int> &>(vec)[i] == values[i]);
|
|
}
|
|
|
|
vec.save("vector-test.dat");
|
|
vec.clear();
|
|
|
|
ASSERT(vec.empty());
|
|
ASSERT(vec.capacity() == 0);
|
|
|
|
marisa::Mapper mapper;
|
|
vec.mmap(&mapper, "vector-test.dat");
|
|
|
|
ASSERT(mapper.is_open());
|
|
ASSERT(vec.size() == values.size());
|
|
ASSERT(vec.capacity() == 0);
|
|
ASSERT(vec.fixed());
|
|
ASSERT(!vec.empty());
|
|
ASSERT(vec.total_size() == sizeof(marisa::UInt32)
|
|
+ ((sizeof(int) * values.size())));
|
|
|
|
for (std::size_t i = 0; i < values.size(); ++i) {
|
|
ASSERT(static_cast<const marisa::Vector<int> &>(vec)[i] == values[i]);
|
|
}
|
|
|
|
vec.clear();
|
|
vec.load("vector-test.dat");
|
|
|
|
ASSERT(vec.size() == values.size());
|
|
ASSERT(vec.capacity() == vec.size());
|
|
ASSERT(!vec.fixed());
|
|
ASSERT(!vec.empty());
|
|
ASSERT(vec.total_size() == sizeof(marisa::UInt32)
|
|
+ ((sizeof(int) * values.size())));
|
|
|
|
for (std::size_t i = 0; i < values.size(); ++i) {
|
|
ASSERT(vec[i] == values[i]);
|
|
ASSERT(static_cast<const marisa::Vector<int> &>(vec)[i] == values[i]);
|
|
}
|
|
|
|
vec.clear();
|
|
|
|
vec.push_back(0);
|
|
ASSERT(vec.capacity() == 1);
|
|
vec.push_back(1);
|
|
ASSERT(vec.capacity() == 2);
|
|
vec.push_back(2);
|
|
ASSERT(vec.capacity() == 4);
|
|
vec.resize(5);
|
|
ASSERT(vec.capacity() == 8);
|
|
vec.resize(100);
|
|
ASSERT(vec.capacity() == 100);
|
|
|
|
vec.fix();
|
|
ASSERT(vec.fixed());
|
|
EXCEPT(vec.fix(), MARISA_STATE_ERROR);
|
|
EXCEPT(vec.push_back(0), MARISA_STATE_ERROR);
|
|
EXCEPT(vec.resize(0), MARISA_STATE_ERROR);
|
|
EXCEPT(vec.reserve(0), MARISA_STATE_ERROR);
|
|
|
|
TEST_END();
|
|
}
|
|
|
|
void TestIntVector() {
|
|
TEST_START();
|
|
|
|
marisa::IntVector vec;
|
|
|
|
ASSERT(vec.num_bits_per_int() == 0);
|
|
ASSERT(vec.mask() == 0);
|
|
ASSERT(vec.size() == 0);
|
|
ASSERT(vec.empty());
|
|
ASSERT(vec.total_size() == sizeof(marisa::UInt32) * 4);
|
|
|
|
marisa::Vector<marisa::UInt32> values;
|
|
vec.build(values);
|
|
|
|
ASSERT(vec.num_bits_per_int() == 1);
|
|
ASSERT(vec.mask() == 1);
|
|
ASSERT(vec.size() == 0);
|
|
ASSERT(vec.empty());
|
|
ASSERT(vec.total_size() == sizeof(marisa::UInt32) * 4);
|
|
|
|
values.push_back(0);
|
|
vec.build(values);
|
|
|
|
ASSERT(vec.num_bits_per_int() == 1);
|
|
ASSERT(vec.mask() == 1);
|
|
ASSERT(vec.size() == 1);
|
|
ASSERT(!vec.empty());
|
|
ASSERT(vec.total_size() == sizeof(marisa::UInt32) * 5);
|
|
ASSERT(vec[0] == 0);
|
|
|
|
values.push_back(255);
|
|
vec.build(values);
|
|
|
|
ASSERT(vec.num_bits_per_int() == 8);
|
|
ASSERT(vec.mask() == 0xFF);
|
|
ASSERT(vec.size() == 2);
|
|
ASSERT(vec[0] == 0);
|
|
ASSERT(vec[1] == 255);
|
|
|
|
values.push_back(65536);
|
|
vec.build(values);
|
|
|
|
ASSERT(vec.num_bits_per_int() == 17);
|
|
ASSERT(vec.mask() == 0x1FFFF);
|
|
ASSERT(vec.size() == 3);
|
|
ASSERT(vec[0] == 0);
|
|
ASSERT(vec[1] == 255);
|
|
ASSERT(vec[2] == 65536);
|
|
|
|
vec.save("vector-test.dat");
|
|
vec.clear();
|
|
|
|
ASSERT(vec.num_bits_per_int() == 0);
|
|
ASSERT(vec.mask() == 0);
|
|
ASSERT(vec.size() == 0);
|
|
|
|
marisa::Mapper mapper;
|
|
vec.mmap(&mapper, "vector-test.dat");
|
|
|
|
ASSERT(mapper.is_open());
|
|
ASSERT(vec.num_bits_per_int() == 17);
|
|
ASSERT(vec.mask() == 0x1FFFF);
|
|
ASSERT(vec.size() == 3);
|
|
ASSERT(vec[0] == 0);
|
|
ASSERT(vec[1] == 255);
|
|
ASSERT(vec[2] == 65536);
|
|
|
|
vec.clear();
|
|
vec.load("vector-test.dat");
|
|
|
|
ASSERT(vec.num_bits_per_int() == 17);
|
|
ASSERT(vec.mask() == 0x1FFFF);
|
|
ASSERT(vec.size() == 3);
|
|
ASSERT(vec[0] == 0);
|
|
ASSERT(vec[1] == 255);
|
|
ASSERT(vec[2] == 65536);
|
|
|
|
values.clear();
|
|
for (std::size_t i = 0; i < 500; ++i) {
|
|
values.push_back(std::rand());
|
|
}
|
|
vec.build(values);
|
|
|
|
ASSERT(vec.size() == values.size());
|
|
for (std::size_t i = 0; i < vec.size(); ++i) {
|
|
ASSERT(vec[i] == values[i]);
|
|
}
|
|
|
|
TEST_END();
|
|
}
|
|
|
|
void TestBitVector(marisa::UInt32 size) {
|
|
marisa::BitVector bv;
|
|
|
|
ASSERT(bv.size() == 0);
|
|
ASSERT(bv.empty());
|
|
ASSERT(bv.total_size() == sizeof(marisa::UInt32) * 5);
|
|
|
|
std::vector<bool> bits(size);
|
|
std::vector<marisa::UInt32> zeros, ones;
|
|
for (marisa::UInt32 i = 0; i < size; ++i) {
|
|
const bool bit = (std::rand() % 2) == 0;
|
|
bits[i] = bit;
|
|
bv.push_back(bit);
|
|
(bit ? ones : zeros).push_back(i);
|
|
ASSERT(bv[i] == bits[i]);
|
|
}
|
|
|
|
ASSERT(bv.size() == bits.size());
|
|
ASSERT((size == 0) || !bv.empty());
|
|
|
|
bv.build();
|
|
|
|
marisa::UInt32 num_zeros = 0, num_ones = 0;
|
|
for (marisa::UInt32 i = 0; i < bits.size(); ++i) {
|
|
ASSERT(bv[i] == bits[i]);
|
|
ASSERT(bv.rank0(i) == num_zeros);
|
|
ASSERT(bv.rank1(i) == num_ones);
|
|
++(bv[i] ? num_ones : num_zeros);
|
|
}
|
|
for (marisa::UInt32 i = 0; i < zeros.size(); ++i) {
|
|
ASSERT(bv.select0(i) == zeros[i]);
|
|
}
|
|
for (marisa::UInt32 i = 0; i < ones.size(); ++i) {
|
|
ASSERT(bv.select1(i) == ones[i]);
|
|
}
|
|
|
|
std::stringstream stream;
|
|
bv.write(stream);
|
|
bv.clear();
|
|
|
|
ASSERT(bv.size() == 0);
|
|
ASSERT(bv.empty());
|
|
ASSERT(bv.total_size() == sizeof(marisa::UInt32) * 5);
|
|
|
|
bv.read(stream);
|
|
|
|
ASSERT(bv.size() == bits.size());
|
|
|
|
num_zeros = 0, num_ones = 0;
|
|
for (marisa::UInt32 i = 0; i < bits.size(); ++i) {
|
|
ASSERT(bv[i] == bits[i]);
|
|
ASSERT(bv.rank0(i) == num_zeros);
|
|
ASSERT(bv.rank1(i) == num_ones);
|
|
++(bv[i] ? num_ones : num_zeros);
|
|
}
|
|
for (marisa::UInt32 i = 0; i < zeros.size(); ++i) {
|
|
ASSERT(bv.select0(i) == zeros[i]);
|
|
}
|
|
for (marisa::UInt32 i = 0; i < ones.size(); ++i) {
|
|
ASSERT(bv.select1(i) == ones[i]);
|
|
}
|
|
}
|
|
|
|
void TestBitVector() {
|
|
TEST_START();
|
|
|
|
TestBitVector(0);
|
|
TestBitVector(1);
|
|
TestBitVector(511);
|
|
TestBitVector(512);
|
|
TestBitVector(513);
|
|
|
|
for (marisa::UInt32 i = 0; i < 100; ++i) {
|
|
TestBitVector(std::rand() % 4096);
|
|
}
|
|
|
|
TEST_END();
|
|
}
|
|
|
|
} // namespace
|
|
|
|
int main() {
|
|
std::srand((unsigned int)time(NULL));
|
|
|
|
TestVector();
|
|
TestIntVector();
|
|
TestBitVector();
|
|
|
|
return 0;
|
|
}
|