1b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#ifndef MARISA_ALPHA_VECTOR_H_ 2b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#define MARISA_ALPHA_VECTOR_H_ 3b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 4b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#include "io.h" 5b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 6b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaknamespace marisa_alpha { 7b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 8b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaktemplate <typename T> 9b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniakclass Vector { 10b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak public: 11b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak Vector(); 12b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak ~Vector(); 13b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 14b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void mmap(Mapper *mapper, const char *filename, 15b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak long offset = 0, int whence = SEEK_SET); 16b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void map(const void *ptr, std::size_t size); 17b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void map(Mapper &mapper); 18b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 19b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void load(const char *filename, 20b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak long offset = 0, int whence = SEEK_SET); 21b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void fread(std::FILE *file); 22b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void read(int fd); 23b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void read(std::istream &stream); 24b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void read(Reader &reader); 25b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 26b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void save(const char *filename, bool trunc_flag = false, 27b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak long offset = 0, int whence = SEEK_SET) const; 28b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void fwrite(std::FILE *file) const; 29b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void write(int fd) const; 30b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void write(std::ostream &stream) const; 31b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void write(Writer &writer) const; 32b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 33b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void push_back(const T &x); 34b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void pop_back(); 35b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 36b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void resize(std::size_t size); 37b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void resize(std::size_t size, const T &x); 38b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void reserve(std::size_t capacity); 39b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void shrink(); 40b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 41b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void fix(); 42b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 43b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak const T *begin() const { 44b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return objs_; 45b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 46b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak const T *end() const { 47b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return objs_ + size_; 48b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 49b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak const T &operator[](std::size_t i) const { 50b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak MARISA_ALPHA_DEBUG_IF(i > size_, MARISA_ALPHA_PARAM_ERROR); 51b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return objs_[i]; 52b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 53b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak const T &front() const { 54b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak MARISA_ALPHA_DEBUG_IF(size_ == 0, MARISA_ALPHA_STATE_ERROR); 55b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return objs_[0]; 56b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 57b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak const T &back() const { 58b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak MARISA_ALPHA_DEBUG_IF(size_ == 0, MARISA_ALPHA_STATE_ERROR); 59b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return objs_[size_ - 1]; 60b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 61b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 62b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak T *begin() { 63b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak MARISA_ALPHA_DEBUG_IF(fixed_, MARISA_ALPHA_STATE_ERROR); 64b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return buf_; 65b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 66b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak T *end() { 67b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak MARISA_ALPHA_DEBUG_IF(fixed_, MARISA_ALPHA_STATE_ERROR); 68b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return buf_ + size_; 69b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 70b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak T &operator[](std::size_t i) { 71b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak MARISA_ALPHA_DEBUG_IF(fixed_, MARISA_ALPHA_STATE_ERROR); 72b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak MARISA_ALPHA_DEBUG_IF(i > size_, MARISA_ALPHA_PARAM_ERROR); 73b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return buf_[i]; 74b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 75b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak T &front() { 76b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak MARISA_ALPHA_DEBUG_IF(fixed_ || (size_ == 0), MARISA_ALPHA_STATE_ERROR); 77b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return buf_[0]; 78b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 79b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak T &back() { 80b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak MARISA_ALPHA_DEBUG_IF(fixed_ || (size_ == 0), MARISA_ALPHA_STATE_ERROR); 81b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return buf_[size_ - 1]; 82b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 83b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 84b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak bool empty() const { 85b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return size_ == 0; 86b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 87b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak std::size_t size() const { 88b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return size_; 89b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 90b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak std::size_t capacity() const { 91b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return capacity_; 92b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 93b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak bool fixed() const { 94b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return fixed_; 95b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 96b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak std::size_t total_size() const { 97b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return (sizeof(T) * size_) + sizeof(size_); 98b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 99b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 100b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void clear() { 101b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak Vector().swap(this); 102b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 103b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void swap(Vector *rhs); 104b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 105b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak static std::size_t max_size() { 106b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return MARISA_ALPHA_UINT32_MAX; 107b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 108b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 109b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak private: 110b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak T *buf_; 111b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak const T *objs_; 112b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak UInt32 size_; 113b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak UInt32 capacity_; 114b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak bool fixed_; 115b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 116b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak void realloc(std::size_t new_capacity); 117b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 118b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak // Disallows copy and assignment. 119b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak Vector(const Vector &); 120b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak Vector &operator=(const Vector &); 121b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak}; 122b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 123b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak} // namespace marisa_alpha 124b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 125b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#include "vector-inline.h" 126b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 127b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#endif // MARISA_ALPHA_VECTOR_H_ 128