98 lines
2.6 KiB
C++
98 lines
2.6 KiB
C++
#ifndef MARISA_INTVECTOR_H_
|
|
#define MARISA_INTVECTOR_H_
|
|
|
|
#include "vector.h"
|
|
|
|
namespace marisa {
|
|
|
|
class IntVector {
|
|
public:
|
|
IntVector();
|
|
|
|
void build(const Vector<UInt32> &ints);
|
|
void build(UInt32 max_int, std::size_t size);
|
|
|
|
void mmap(Mapper *mapper, const char *filename,
|
|
long offset = 0, int whence = SEEK_SET);
|
|
void map(const void *ptr, std::size_t size);
|
|
void map(Mapper &mapper);
|
|
|
|
void load(const char *filename,
|
|
long offset = 0, int whence = SEEK_SET);
|
|
void fread(std::FILE *file);
|
|
void read(int fd);
|
|
void read(std::istream &stream);
|
|
void read(Reader &reader);
|
|
|
|
void save(const char *filename, bool trunc_flag = true,
|
|
long offset = 0, int whence = SEEK_SET) const;
|
|
void fwrite(std::FILE *file) const;
|
|
void write(int fd) const;
|
|
void write(std::ostream &stream) const;
|
|
void write(Writer &writer) const;
|
|
|
|
void set(std::size_t i, UInt32 value) {
|
|
MARISA_DEBUG_IF(i >= size_, MARISA_PARAM_ERROR);
|
|
std::size_t pos = i * num_bits_per_int_;
|
|
std::size_t unit_id = pos / 32;
|
|
std::size_t unit_offset = pos % 32;
|
|
units_[unit_id] &= ~(mask_ << unit_offset);
|
|
units_[unit_id] |= (value & mask_) << unit_offset;
|
|
if ((unit_offset + num_bits_per_int_) > 32) {
|
|
units_[unit_id + 1] &= ~(mask_ >> (32 - unit_offset));
|
|
units_[unit_id + 1] |= (value & mask_) >> (32 - unit_offset);
|
|
}
|
|
}
|
|
|
|
UInt32 get(std::size_t i) const {
|
|
MARISA_DEBUG_IF(i >= size_, MARISA_PARAM_ERROR);
|
|
std::size_t pos = i * num_bits_per_int_;
|
|
std::size_t unit_id = pos / 32;
|
|
std::size_t unit_offset = pos % 32;
|
|
if ((unit_offset + num_bits_per_int_) <= 32) {
|
|
return (units_[unit_id] >> unit_offset) & mask_;
|
|
} else {
|
|
return ((units_[unit_id] >> unit_offset)
|
|
| (units_[unit_id + 1] << (32 - unit_offset))) & mask_;
|
|
}
|
|
}
|
|
|
|
UInt32 operator[](std::size_t i) const {
|
|
MARISA_DEBUG_IF(i >= size_, MARISA_PARAM_ERROR);
|
|
return get(i);
|
|
}
|
|
|
|
std::size_t num_bits_per_int() const {
|
|
return num_bits_per_int_;
|
|
}
|
|
UInt32 mask() const {
|
|
return mask_;
|
|
}
|
|
std::size_t size() const {
|
|
return size_;
|
|
}
|
|
bool empty() const {
|
|
return size_ == 0;
|
|
}
|
|
std::size_t total_size() const {
|
|
return units_.total_size() + sizeof(num_bits_per_int_)
|
|
+ sizeof(mask_) + sizeof(size_);
|
|
}
|
|
|
|
void clear();
|
|
void swap(IntVector *rhs);
|
|
|
|
private:
|
|
Vector<UInt32> units_;
|
|
UInt32 num_bits_per_int_;
|
|
UInt32 mask_;
|
|
UInt32 size_;
|
|
|
|
// Disallows copy and assignment.
|
|
IntVector(const IntVector &);
|
|
IntVector &operator=(const IntVector &);
|
|
};
|
|
|
|
} // namespace marisa
|
|
|
|
#endif // MARISA_INTVECTOR_H_
|