138 lines
2.9 KiB
C++
138 lines
2.9 KiB
C++
#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
|