Blame lib/marisa/trie.cc

Packit de3218
#include "stdio.h"
Packit de3218
#include "iostream.h"
Packit de3218
#include "trie.h"
Packit de3218
#include "grimoire/trie.h"
Packit de3218
Packit de3218
namespace marisa {
Packit de3218
Packit de3218
Trie::Trie() : trie_() {}
Packit de3218
Packit de3218
Trie::~Trie() {}
Packit de3218
Packit de3218
void Trie::build(Keyset &keyset, int config_flags) {
Packit de3218
  scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
Packit de3218
  MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
Packit de3218
Packit de3218
  temp->build(keyset, config_flags);
Packit de3218
  trie_.swap(temp);
Packit de3218
}
Packit de3218
Packit de3218
void Trie::mmap(const char *filename) {
Packit de3218
  MARISA_THROW_IF(filename == NULL, MARISA_NULL_ERROR);
Packit de3218
Packit de3218
  scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
Packit de3218
  MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
Packit de3218
Packit de3218
  grimoire::Mapper mapper;
Packit de3218
  mapper.open(filename);
Packit de3218
  temp->map(mapper);
Packit de3218
  trie_.swap(temp);
Packit de3218
}
Packit de3218
Packit de3218
void Trie::map(const void *ptr, std::size_t size) {
Packit de3218
  MARISA_THROW_IF((ptr == NULL) && (size != 0), MARISA_NULL_ERROR);
Packit de3218
Packit de3218
  scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
Packit de3218
  MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
Packit de3218
Packit de3218
  grimoire::Mapper mapper;
Packit de3218
  mapper.open(ptr, size);
Packit de3218
  temp->map(mapper);
Packit de3218
  trie_.swap(temp);
Packit de3218
}
Packit de3218
Packit de3218
void Trie::load(const char *filename) {
Packit de3218
  MARISA_THROW_IF(filename == NULL, MARISA_NULL_ERROR);
Packit de3218
Packit de3218
  scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
Packit de3218
  MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
Packit de3218
Packit de3218
  grimoire::Reader reader;
Packit de3218
  reader.open(filename);
Packit de3218
  temp->read(reader);
Packit de3218
  trie_.swap(temp);
Packit de3218
}
Packit de3218
Packit de3218
void Trie::read(int fd) {
Packit de3218
  MARISA_THROW_IF(fd == -1, MARISA_CODE_ERROR);
Packit de3218
Packit de3218
  scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
Packit de3218
  MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
Packit de3218
Packit de3218
  grimoire::Reader reader;
Packit de3218
  reader.open(fd);
Packit de3218
  temp->read(reader);
Packit de3218
  trie_.swap(temp);
Packit de3218
}
Packit de3218
Packit de3218
void Trie::save(const char *filename) const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  MARISA_THROW_IF(filename == NULL, MARISA_NULL_ERROR);
Packit de3218
Packit de3218
  grimoire::Writer writer;
Packit de3218
  writer.open(filename);
Packit de3218
  trie_->write(writer);
Packit de3218
}
Packit de3218
Packit de3218
void Trie::write(int fd) const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  MARISA_THROW_IF(fd == -1, MARISA_CODE_ERROR);
Packit de3218
Packit de3218
  grimoire::Writer writer;
Packit de3218
  writer.open(fd);
Packit de3218
  trie_->write(writer);
Packit de3218
}
Packit de3218
Packit de3218
bool Trie::lookup(Agent &agent) const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  if (!agent.has_state()) {
Packit de3218
    agent.init_state();
Packit de3218
  }
Packit de3218
  return trie_->lookup(agent);
Packit de3218
}
Packit de3218
Packit de3218
void Trie::reverse_lookup(Agent &agent) const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  if (!agent.has_state()) {
Packit de3218
    agent.init_state();
Packit de3218
  }
Packit de3218
  trie_->reverse_lookup(agent);
Packit de3218
}
Packit de3218
Packit de3218
bool Trie::common_prefix_search(Agent &agent) const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  if (!agent.has_state()) {
Packit de3218
    agent.init_state();
Packit de3218
  }
Packit de3218
  return trie_->common_prefix_search(agent);
Packit de3218
}
Packit de3218
Packit de3218
bool Trie::predictive_search(Agent &agent) const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  if (!agent.has_state()) {
Packit de3218
    agent.init_state();
Packit de3218
  }
Packit de3218
  return trie_->predictive_search(agent);
Packit de3218
}
Packit de3218
Packit de3218
std::size_t Trie::num_tries() const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  return trie_->num_tries();
Packit de3218
}
Packit de3218
Packit de3218
std::size_t Trie::num_keys() const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  return trie_->num_keys();
Packit de3218
}
Packit de3218
Packit de3218
std::size_t Trie::num_nodes() const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  return trie_->num_nodes();
Packit de3218
}
Packit de3218
Packit de3218
TailMode Trie::tail_mode() const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  return trie_->tail_mode();
Packit de3218
}
Packit de3218
Packit de3218
NodeOrder Trie::node_order() const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  return trie_->node_order();
Packit de3218
}
Packit de3218
Packit de3218
bool Trie::empty() const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  return trie_->empty();
Packit de3218
}
Packit de3218
Packit de3218
std::size_t Trie::size() const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  return trie_->size();
Packit de3218
}
Packit de3218
Packit de3218
std::size_t Trie::total_size() const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  return trie_->total_size();
Packit de3218
}
Packit de3218
Packit de3218
std::size_t Trie::io_size() const {
Packit de3218
  MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
  return trie_->io_size();
Packit de3218
}
Packit de3218
Packit de3218
void Trie::clear() {
Packit de3218
  Trie().swap(*this);
Packit de3218
}
Packit de3218
Packit de3218
void Trie::swap(Trie &rhs) {
Packit de3218
  trie_.swap(rhs.trie_);
Packit de3218
}
Packit de3218
Packit de3218
}  // namespace marisa
Packit de3218
Packit de3218
#include <iostream>
Packit de3218
Packit de3218
namespace marisa {
Packit de3218
Packit de3218
class TrieIO {
Packit de3218
 public:
Packit de3218
  static void fread(std::FILE *file, Trie *trie) {
Packit de3218
    MARISA_THROW_IF(trie == NULL, MARISA_NULL_ERROR);
Packit de3218
Packit de3218
    scoped_ptr<grimoire::LoudsTrie> temp(
Packit de3218
        new (std::nothrow) grimoire::LoudsTrie);
Packit de3218
    MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
Packit de3218
Packit de3218
    grimoire::Reader reader;
Packit de3218
    reader.open(file);
Packit de3218
    temp->read(reader);
Packit de3218
    trie->trie_.swap(temp);
Packit de3218
  }
Packit de3218
  static void fwrite(std::FILE *file, const Trie &trie) {
Packit de3218
    MARISA_THROW_IF(file == NULL, MARISA_NULL_ERROR);
Packit de3218
    MARISA_THROW_IF(trie.trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
    grimoire::Writer writer;
Packit de3218
    writer.open(file);
Packit de3218
    trie.trie_->write(writer);
Packit de3218
  }
Packit de3218
Packit de3218
  static std::istream &read(std::istream &stream, Trie *trie) {
Packit de3218
    MARISA_THROW_IF(trie == NULL, MARISA_NULL_ERROR);
Packit de3218
Packit de3218
    scoped_ptr<grimoire::LoudsTrie> temp(
Packit de3218
        new (std::nothrow) grimoire::LoudsTrie);
Packit de3218
    MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
Packit de3218
Packit de3218
    grimoire::Reader reader;
Packit de3218
    reader.open(stream);
Packit de3218
    temp->read(reader);
Packit de3218
    trie->trie_.swap(temp);
Packit de3218
    return stream;
Packit de3218
  }
Packit de3218
  static std::ostream &write(std::ostream &stream, const Trie &trie) {
Packit de3218
    MARISA_THROW_IF(trie.trie_.get() == NULL, MARISA_STATE_ERROR);
Packit de3218
    grimoire::Writer writer;
Packit de3218
    writer.open(stream);
Packit de3218
    trie.trie_->write(writer);
Packit de3218
    return stream;
Packit de3218
  }
Packit de3218
};
Packit de3218
Packit de3218
void fread(std::FILE *file, Trie *trie) {
Packit de3218
  MARISA_THROW_IF(file == NULL, MARISA_NULL_ERROR);
Packit de3218
  MARISA_THROW_IF(trie == NULL, MARISA_NULL_ERROR);
Packit de3218
  TrieIO::fread(file, trie);
Packit de3218
}
Packit de3218
Packit de3218
void fwrite(std::FILE *file, const Trie &trie) {
Packit de3218
  MARISA_THROW_IF(file == NULL, MARISA_NULL_ERROR);
Packit de3218
  TrieIO::fwrite(file, trie);
Packit de3218
}
Packit de3218
Packit de3218
std::istream &read(std::istream &stream, Trie *trie) {
Packit de3218
  MARISA_THROW_IF(trie == NULL, MARISA_NULL_ERROR);
Packit de3218
  return TrieIO::read(stream, trie);
Packit de3218
}
Packit de3218
Packit de3218
std::ostream &write(std::ostream &stream, const Trie &trie) {
Packit de3218
  return TrieIO::write(stream, trie);
Packit de3218
}
Packit de3218
Packit de3218
std::istream &operator>>(std::istream &stream, Trie &trie) {
Packit de3218
  return read(stream, &trie);
Packit de3218
}
Packit de3218
Packit de3218
std::ostream &operator<<(std::ostream &stream, const Trie &trie) {
Packit de3218
  return write(stream, trie);
Packit de3218
}
Packit de3218
Packit de3218
}  // namespace marisa