libime
triedictionary.cpp
1 /*
2  * SPDX-FileCopyrightText: 2018-2018 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  */
7 #include "triedictionary.h"
8 #include <cstddef>
9 #include <memory>
10 #include <string_view>
11 #include <utility>
12 #include <boost/ptr_container/ptr_vector.hpp>
13 #include <fcitx-utils/connectableobject.h>
14 #include <fcitx-utils/macros.h>
15 
16 namespace libime {
17 
18 class TrieDictionaryPrivate : fcitx::QPtrHolder<TrieDictionary> {
19 public:
21  : fcitx::QPtrHolder<TrieDictionary>(q) {}
22 
23  FCITX_DEFINE_SIGNAL_PRIVATE(TrieDictionary, dictionaryChanged);
24  FCITX_DEFINE_SIGNAL_PRIVATE(TrieDictionary, dictSizeChanged);
25 
26  boost::ptr_vector<typename TrieDictionary::TrieType> tries_;
27 };
28 
29 TrieDictionary::TrieDictionary()
30  : d_ptr(std::make_unique<TrieDictionaryPrivate>(this)) {
31  addEmptyDict();
32  addEmptyDict();
33 }
34 
35 TrieDictionary::~TrieDictionary() {}
36 
37 void TrieDictionary::addEmptyDict() {
38  FCITX_D();
39  d->tries_.push_back(new TrieType);
40  emit<TrieDictionary::dictSizeChanged>(d->tries_.size());
41 }
42 
43 void TrieDictionary::removeFrom(size_t idx) {
44  FCITX_D();
45  if (idx < UserDict + 1 || idx >= d->tries_.size()) {
46  return;
47  }
48 
49  for (auto i = idx; i < d->tries_.size(); i++) {
50  emit<TrieDictionary::dictionaryChanged>(i);
51  }
52  d->tries_.erase(d->tries_.begin() + idx, d->tries_.end());
53  emit<TrieDictionary::dictSizeChanged>(d->tries_.size());
54 }
55 
56 void TrieDictionary::removeAll() { removeFrom(UserDict + 1); }
57 
58 void TrieDictionary::clear(size_t idx) {
59  FCITX_D();
60  d->tries_[idx].clear();
61  emit<TrieDictionary::dictionaryChanged>(idx);
62 }
63 
64 const TrieDictionary::TrieType *TrieDictionary::trie(size_t idx) const {
65  FCITX_D();
66  return &d->tries_[idx];
67 }
68 
69 void TrieDictionary::setTrie(size_t idx, TrieType trie) {
70  *mutableTrie(idx) = std::move(trie);
71  emit<TrieDictionary::dictionaryChanged>(idx);
72 }
73 
74 TrieDictionary::TrieType *TrieDictionary::mutableTrie(size_t idx) {
75  FCITX_D();
76  return &d->tries_[idx];
77 }
78 
79 size_t TrieDictionary::dictSize() const {
80  FCITX_D();
81  return d->tries_.size();
82 }
83 
84 void TrieDictionary::addWord(size_t idx, std::string_view key, float cost) {
85  FCITX_D();
86  d->tries_[idx].set(key.data(), key.size(), cost);
87  emit<TrieDictionary::dictionaryChanged>(idx);
88 }
89 
90 bool TrieDictionary::removeWord(size_t idx, std::string_view key) {
91  FCITX_D();
92  if (d->tries_[idx].erase(key.data(), key.size())) {
93  emit<TrieDictionary::dictionaryChanged>(idx);
94  return true;
95  }
96  return false;
97 }
98 } // namespace libime
void setTrie(size_t idx, TrieType trie)
Set trie from external source.
void removeFrom(size_t idx)
Remove all dictionary from given index.