aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/marisa-trie/marisa/trie.cc
diff options
context:
space:
mode:
authorrobot-piglet <robot-piglet@yandex-team.com>2023-12-02 01:45:21 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2023-12-02 02:42:50 +0300
commit9c43d58f75cf086b744cf4fe2ae180e8f37e4a0c (patch)
tree9f88a486917d371d099cd712efd91b4c122d209d /contrib/python/marisa-trie/marisa/trie.cc
parent32fb6dda1feb24f9ab69ece5df0cb9ec238ca5e6 (diff)
downloadydb-9c43d58f75cf086b744cf4fe2ae180e8f37e4a0c.tar.gz
Intermediate changes
Diffstat (limited to 'contrib/python/marisa-trie/marisa/trie.cc')
-rw-r--r--contrib/python/marisa-trie/marisa/trie.cc249
1 files changed, 249 insertions, 0 deletions
diff --git a/contrib/python/marisa-trie/marisa/trie.cc b/contrib/python/marisa-trie/marisa/trie.cc
new file mode 100644
index 0000000000..5baaf9b288
--- /dev/null
+++ b/contrib/python/marisa-trie/marisa/trie.cc
@@ -0,0 +1,249 @@
+#include "stdio.h"
+#include "iostream.h"
+#include "trie.h"
+#include "grimoire/trie.h"
+
+namespace marisa {
+
+Trie::Trie() : trie_() {}
+
+Trie::~Trie() {}
+
+void Trie::build(Keyset &keyset, int config_flags) {
+ scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
+ MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
+
+ temp->build(keyset, config_flags);
+ trie_.swap(temp);
+}
+
+void Trie::mmap(const char *filename) {
+ MARISA_THROW_IF(filename == NULL, MARISA_NULL_ERROR);
+
+ scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
+ MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
+
+ grimoire::Mapper mapper;
+ mapper.open(filename);
+ temp->map(mapper);
+ trie_.swap(temp);
+}
+
+void Trie::map(const void *ptr, std::size_t size) {
+ MARISA_THROW_IF((ptr == NULL) && (size != 0), MARISA_NULL_ERROR);
+
+ scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
+ MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
+
+ grimoire::Mapper mapper;
+ mapper.open(ptr, size);
+ temp->map(mapper);
+ trie_.swap(temp);
+}
+
+void Trie::load(const char *filename) {
+ MARISA_THROW_IF(filename == NULL, MARISA_NULL_ERROR);
+
+ scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
+ MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
+
+ grimoire::Reader reader;
+ reader.open(filename);
+ temp->read(reader);
+ trie_.swap(temp);
+}
+
+void Trie::read(int fd) {
+ MARISA_THROW_IF(fd == -1, MARISA_CODE_ERROR);
+
+ scoped_ptr<grimoire::LoudsTrie> temp(new (std::nothrow) grimoire::LoudsTrie);
+ MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
+
+ grimoire::Reader reader;
+ reader.open(fd);
+ temp->read(reader);
+ trie_.swap(temp);
+}
+
+void Trie::save(const char *filename) const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ MARISA_THROW_IF(filename == NULL, MARISA_NULL_ERROR);
+
+ grimoire::Writer writer;
+ writer.open(filename);
+ trie_->write(writer);
+}
+
+void Trie::write(int fd) const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ MARISA_THROW_IF(fd == -1, MARISA_CODE_ERROR);
+
+ grimoire::Writer writer;
+ writer.open(fd);
+ trie_->write(writer);
+}
+
+bool Trie::lookup(Agent &agent) const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ if (!agent.has_state()) {
+ agent.init_state();
+ }
+ return trie_->lookup(agent);
+}
+
+void Trie::reverse_lookup(Agent &agent) const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ if (!agent.has_state()) {
+ agent.init_state();
+ }
+ trie_->reverse_lookup(agent);
+}
+
+bool Trie::common_prefix_search(Agent &agent) const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ if (!agent.has_state()) {
+ agent.init_state();
+ }
+ return trie_->common_prefix_search(agent);
+}
+
+bool Trie::predictive_search(Agent &agent) const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ if (!agent.has_state()) {
+ agent.init_state();
+ }
+ return trie_->predictive_search(agent);
+}
+
+std::size_t Trie::num_tries() const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ return trie_->num_tries();
+}
+
+std::size_t Trie::num_keys() const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ return trie_->num_keys();
+}
+
+std::size_t Trie::num_nodes() const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ return trie_->num_nodes();
+}
+
+TailMode Trie::tail_mode() const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ return trie_->tail_mode();
+}
+
+NodeOrder Trie::node_order() const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ return trie_->node_order();
+}
+
+bool Trie::empty() const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ return trie_->empty();
+}
+
+std::size_t Trie::size() const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ return trie_->size();
+}
+
+std::size_t Trie::total_size() const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ return trie_->total_size();
+}
+
+std::size_t Trie::io_size() const {
+ MARISA_THROW_IF(trie_.get() == NULL, MARISA_STATE_ERROR);
+ return trie_->io_size();
+}
+
+void Trie::clear() {
+ Trie().swap(*this);
+}
+
+void Trie::swap(Trie &rhs) {
+ trie_.swap(rhs.trie_);
+}
+
+} // namespace marisa
+
+#include <iostream>
+
+namespace marisa {
+
+class TrieIO {
+ public:
+ static void fread(std::FILE *file, Trie *trie) {
+ MARISA_THROW_IF(trie == NULL, MARISA_NULL_ERROR);
+
+ scoped_ptr<grimoire::LoudsTrie> temp(
+ new (std::nothrow) grimoire::LoudsTrie);
+ MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
+
+ grimoire::Reader reader;
+ reader.open(file);
+ temp->read(reader);
+ trie->trie_.swap(temp);
+ }
+ static void fwrite(std::FILE *file, const Trie &trie) {
+ MARISA_THROW_IF(file == NULL, MARISA_NULL_ERROR);
+ MARISA_THROW_IF(trie.trie_.get() == NULL, MARISA_STATE_ERROR);
+ grimoire::Writer writer;
+ writer.open(file);
+ trie.trie_->write(writer);
+ }
+
+ static std::istream &read(std::istream &stream, Trie *trie) {
+ MARISA_THROW_IF(trie == NULL, MARISA_NULL_ERROR);
+
+ scoped_ptr<grimoire::LoudsTrie> temp(
+ new (std::nothrow) grimoire::LoudsTrie);
+ MARISA_THROW_IF(temp.get() == NULL, MARISA_MEMORY_ERROR);
+
+ grimoire::Reader reader;
+ reader.open(stream);
+ temp->read(reader);
+ trie->trie_.swap(temp);
+ return stream;
+ }
+ static std::ostream &write(std::ostream &stream, const Trie &trie) {
+ MARISA_THROW_IF(trie.trie_.get() == NULL, MARISA_STATE_ERROR);
+ grimoire::Writer writer;
+ writer.open(stream);
+ trie.trie_->write(writer);
+ return stream;
+ }
+};
+
+void fread(std::FILE *file, Trie *trie) {
+ MARISA_THROW_IF(file == NULL, MARISA_NULL_ERROR);
+ MARISA_THROW_IF(trie == NULL, MARISA_NULL_ERROR);
+ TrieIO::fread(file, trie);
+}
+
+void fwrite(std::FILE *file, const Trie &trie) {
+ MARISA_THROW_IF(file == NULL, MARISA_NULL_ERROR);
+ TrieIO::fwrite(file, trie);
+}
+
+std::istream &read(std::istream &stream, Trie *trie) {
+ MARISA_THROW_IF(trie == NULL, MARISA_NULL_ERROR);
+ return TrieIO::read(stream, trie);
+}
+
+std::ostream &write(std::ostream &stream, const Trie &trie) {
+ return TrieIO::write(stream, trie);
+}
+
+std::istream &operator>>(std::istream &stream, Trie &trie) {
+ return read(stream, &trie);
+}
+
+std::ostream &operator<<(std::ostream &stream, const Trie &trie) {
+ return write(stream, trie);
+}
+
+} // namespace marisa