#include "intvector.h"
namespace marisa {
IntVector::IntVector()
: units_(), num_bits_per_int_(0), mask_(0), size_(0) {}
void IntVector::build(const Vector<UInt32> &ints) {
UInt32 max_int = 0;
for (UInt32 i = 0; i < ints.size(); ++i) {
if (ints[i] > max_int) {
max_int = ints[i];
}
}
build(max_int, ints.size());
for (UInt32 i = 0; i < ints.size(); ++i) {
set(i, ints[i]);
}
}
void IntVector::build(UInt32 max_int, std::size_t size) {
UInt32 num_bits_per_int = 0;
do {
++num_bits_per_int;
max_int >>= 1;
} while (max_int != 0);
const std::size_t new_size = (std::size_t)(
(((UInt64)num_bits_per_int * size) + 31) / 32);
Vector<UInt32> temp_units;
temp_units.resize(new_size, 0);
units_.swap(&temp_units);
num_bits_per_int_ = num_bits_per_int;
mask_ = ~0U;
if (num_bits_per_int != 32) {
mask_ = (1U << num_bits_per_int) - 1;
}
size_ = (UInt32)size;
}
void IntVector::mmap(Mapper *mapper, const char *filename,
long offset, int whence) {
MARISA_THROW_IF(mapper == NULL, MARISA_PARAM_ERROR);
Mapper temp_mapper;
temp_mapper.open(filename, offset, whence);
map(temp_mapper);
temp_mapper.swap(mapper);
}
void IntVector::map(const void *ptr, std::size_t size) {
Mapper mapper(ptr, size);
map(mapper);
}
void IntVector::map(Mapper &mapper) {
IntVector temp;
temp.units_.map(mapper);
mapper.map(&temp.num_bits_per_int_);
mapper.map(&temp.mask_);
mapper.map(&temp.size_);
temp.swap(this);
}
void IntVector::load(const char *filename,
long offset, int whence) {
Reader reader;
reader.open(filename, offset, whence);
read(reader);
}
void IntVector::fread(std::FILE *file) {
Reader reader(file);
read(reader);
}
void IntVector::read(int fd) {
Reader reader(fd);
read(reader);
}
void IntVector::read(std::istream &stream) {
Reader reader(&stream);
read(reader);
}
void IntVector::read(Reader &reader) {
IntVector temp;
temp.units_.read(reader);
reader.read(&temp.num_bits_per_int_);
reader.read(&temp.mask_);
reader.read(&temp.size_);
temp.swap(this);
}
void IntVector::save(const char *filename, bool trunc_flag,
long offset, int whence) const {
Writer writer;
writer.open(filename, trunc_flag, offset, whence);
write(writer);
}
void IntVector::fwrite(std::FILE *file) const {
Writer writer(file);
write(writer);
}
void IntVector::write(int fd) const {
Writer writer(fd);
write(writer);
}
void IntVector::write(std::ostream &stream) const {
Writer writer(&stream);
write(writer);
}
void IntVector::write(Writer &writer) const {
units_.write(writer);
writer.write(num_bits_per_int_);
writer.write(mask_);
writer.write(size_);
}
void IntVector::clear() {
IntVector().swap(this);
}
void IntVector::swap(IntVector *rhs) {
MARISA_THROW_IF(rhs == NULL, MARISA_PARAM_ERROR);
units_.swap(&rhs->units_);
Swap(&num_bits_per_int_, &rhs->num_bits_per_int_);
Swap(&mask_, &rhs->mask_);
Swap(&size_, &rhs->size_);
}
} // namespace marisa