1b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#ifndef MARISA_ALPHA_INTVECTOR_H_
2b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#define MARISA_ALPHA_INTVECTOR_H_
3b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
4b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#include "vector.h"
5b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
6b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaknamespace marisa_alpha {
7b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
8b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniakclass IntVector {
9b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak public:
10b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  IntVector();
11b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
12b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void build(const Vector<UInt32> &ints);
13b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void build(UInt32 max_int, std::size_t size);
14b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
15b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void mmap(Mapper *mapper, const char *filename,
16b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      long offset = 0, int whence = SEEK_SET);
17b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void map(const void *ptr, std::size_t size);
18b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void map(Mapper &mapper);
19b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
20b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void load(const char *filename,
21b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      long offset = 0, int whence = SEEK_SET);
22b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void fread(std::FILE *file);
23b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void read(int fd);
24b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void read(std::istream &stream);
25b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void read(Reader &reader);
26b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
27b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void save(const char *filename, bool trunc_flag = true,
28b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      long offset = 0, int whence = SEEK_SET) const;
29b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void fwrite(std::FILE *file) const;
30b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void write(int fd) const;
31b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void write(std::ostream &stream) const;
32b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void write(Writer &writer) const;
33b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
34b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void set(std::size_t i, UInt32 value) {
35b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    MARISA_ALPHA_DEBUG_IF(i >= size_, MARISA_ALPHA_PARAM_ERROR);
36b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    std::size_t pos = i * num_bits_per_int_;
37b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    std::size_t unit_id = pos / 32;
38b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    std::size_t unit_offset = pos % 32;
39b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    units_[unit_id] &= ~(mask_ << unit_offset);
40b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    units_[unit_id] |= (value & mask_) << unit_offset;
41b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    if ((unit_offset + num_bits_per_int_) > 32) {
42b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      units_[unit_id + 1] &= ~(mask_ >> (32 - unit_offset));
43b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      units_[unit_id + 1] |= (value & mask_) >> (32 - unit_offset);
44b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    }
45b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
46b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
47b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  UInt32 get(std::size_t i) const {
48b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    MARISA_ALPHA_DEBUG_IF(i >= size_, MARISA_ALPHA_PARAM_ERROR);
49b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    std::size_t pos = i * num_bits_per_int_;
50b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    std::size_t unit_id = pos / 32;
51b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    std::size_t unit_offset = pos % 32;
52b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    if ((unit_offset + num_bits_per_int_) <= 32) {
53b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      return (units_[unit_id] >> unit_offset) & mask_;
54b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    } else {
55b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      return ((units_[unit_id] >> unit_offset)
56b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak          | (units_[unit_id + 1] << (32 - unit_offset))) & mask_;
57b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    }
58b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
59b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
60b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  UInt32 operator[](std::size_t i) const {
61b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    MARISA_ALPHA_DEBUG_IF(i >= size_, MARISA_ALPHA_PARAM_ERROR);
62b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return get(i);
63b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
64b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
65b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  std::size_t num_bits_per_int() const {
66b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return num_bits_per_int_;
67b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
68b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  UInt32 mask() const {
69b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return mask_;
70b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
71b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  std::size_t size() const {
72b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return size_;
73b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
74b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  bool empty() const {
75b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return size_ == 0;
76b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
77b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  std::size_t total_size() const {
78b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return units_.total_size() + sizeof(num_bits_per_int_)
79b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak        + sizeof(mask_) + sizeof(size_);
80b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
81b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
82b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void clear();
83b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void swap(IntVector *rhs);
84b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
85b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak private:
86b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Vector<UInt32> units_;
87b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  UInt32 num_bits_per_int_;
88b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  UInt32 mask_;
89b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  UInt32 size_;
90b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
91b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  // Disallows copy and assignment.
92b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  IntVector(const IntVector &);
93b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  IntVector &operator=(const IntVector &);
94b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak};
95b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
96b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak}  // namespace marisa_alpha
97b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
98b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#endif  // MARISA_ALPHA_INTVECTOR_H_
99