127 lines
2.7 KiB
C++
127 lines
2.7 KiB
C++
#ifndef MARISA_VECTOR_H_
|
|
#define MARISA_VECTOR_H_
|
|
|
|
#include "io.h"
|
|
|
|
namespace marisa {
|
|
|
|
template <typename T>
|
|
class Vector {
|
|
public:
|
|
Vector();
|
|
~Vector();
|
|
|
|
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 = false,
|
|
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 push_back(const T &x);
|
|
void pop_back();
|
|
|
|
void resize(std::size_t size);
|
|
void resize(std::size_t size, const T &x);
|
|
void reserve(std::size_t capacity);
|
|
void shrink();
|
|
|
|
void fix();
|
|
|
|
const T *begin() const {
|
|
return objs_;
|
|
}
|
|
const T *end() const {
|
|
return objs_ + size_;
|
|
}
|
|
const T &operator[](std::size_t i) const {
|
|
MARISA_DEBUG_IF(i > size_, MARISA_PARAM_ERROR);
|
|
return objs_[i];
|
|
}
|
|
const T &front() const {
|
|
MARISA_DEBUG_IF(size_ == 0, MARISA_STATE_ERROR);
|
|
return objs_[0];
|
|
}
|
|
const T &back() const {
|
|
MARISA_DEBUG_IF(size_ == 0, MARISA_STATE_ERROR);
|
|
return objs_[size_ - 1];
|
|
}
|
|
|
|
T *begin() {
|
|
MARISA_DEBUG_IF(fixed_, MARISA_STATE_ERROR);
|
|
return buf_;
|
|
}
|
|
T *end() {
|
|
MARISA_DEBUG_IF(fixed_, MARISA_STATE_ERROR);
|
|
return buf_ + size_;
|
|
}
|
|
T &operator[](std::size_t i) {
|
|
MARISA_DEBUG_IF(fixed_, MARISA_STATE_ERROR);
|
|
MARISA_DEBUG_IF(i > size_, MARISA_PARAM_ERROR);
|
|
return buf_[i];
|
|
}
|
|
T &front() {
|
|
MARISA_DEBUG_IF(fixed_ || (size_ == 0), MARISA_STATE_ERROR);
|
|
return buf_[0];
|
|
}
|
|
T &back() {
|
|
MARISA_DEBUG_IF(fixed_ || (size_ == 0), MARISA_STATE_ERROR);
|
|
return buf_[size_ - 1];
|
|
}
|
|
|
|
bool empty() const {
|
|
return size_ == 0;
|
|
}
|
|
std::size_t size() const {
|
|
return size_;
|
|
}
|
|
std::size_t capacity() const {
|
|
return capacity_;
|
|
}
|
|
bool fixed() const {
|
|
return fixed_;
|
|
}
|
|
std::size_t total_size() const {
|
|
return (sizeof(T) * size_) + sizeof(size_);
|
|
}
|
|
|
|
void clear() {
|
|
Vector().swap(this);
|
|
}
|
|
void swap(Vector *rhs);
|
|
|
|
static std::size_t max_size() {
|
|
return MARISA_UINT32_MAX;
|
|
}
|
|
|
|
private:
|
|
T *buf_;
|
|
const T *objs_;
|
|
UInt32 size_;
|
|
UInt32 capacity_;
|
|
bool fixed_;
|
|
|
|
void realloc(std::size_t new_capacity);
|
|
|
|
// Disallows copy and assignment.
|
|
Vector(const Vector &);
|
|
Vector &operator=(const Vector &);
|
|
};
|
|
|
|
} // namespace marisa
|
|
|
|
#include "vector-inline.h"
|
|
|
|
#endif // MARISA_VECTOR_H_
|