6 #include "autophrasedict.h" 15 #include <string_view> 17 #include <boost/multi_index/indexed_by.hpp> 18 #include <boost/multi_index/mem_fun.hpp> 19 #include <boost/multi_index/ordered_index.hpp> 20 #include <boost/multi_index/sequenced_index.hpp> 21 #include <boost/multi_index_container.hpp> 22 #include <fcitx-utils/macros.h> 23 #include "libime/core/utils_p.h" 29 : entry_(std::move(entry)), hit_(hit) {}
31 std::string_view entry()
const {
return entry_; }
38 using item_list = boost::multi_index_container<
40 boost::multi_index::indexed_by<
41 boost::multi_index::sequenced<>,
42 boost::multi_index::ordered_unique<
43 boost::multi_index::const_mem_fun<AutoPhrase, std::string_view,
44 &AutoPhrase::entry>>>>;
47 using iterator = item_list::iterator;
53 std::size_t maxItems_;
56 AutoPhraseDict::AutoPhraseDict(
size_t maxItems)
57 : d_ptr(std::make_unique<AutoPhraseDictPrivate>(maxItems)) {}
59 AutoPhraseDict::AutoPhraseDict(
size_t maxItems, std::istream &in)
69 auto p = il.push_front(
AutoPhrase{entry, value});
73 il.relocate(il.begin(), p.first);
77 il.modify(iter, [](
AutoPhrase &phrase) { phrase.hit_ += 1; });
79 if (il.size() > d->maxItems_) {
86 const std::function<
bool(std::string_view, uint32_t)> &callback)
const {
88 const auto &idx = d->il_.get<1>();
89 auto iter = idx.lower_bound(s);
90 while (iter != idx.end() && iter->entry().starts_with(s)) {
91 if (!callback(iter->entry(), iter->hit_)) {
101 const auto &idx = d->il_.get<1>();
102 auto iter = idx.find(s);
103 if (iter == idx.end()) {
109 void AutoPhraseDict::erase(std::string_view s) {
111 auto &idx = d->il_.get<1>();
115 void AutoPhraseDict::clear() {
120 bool AutoPhraseDict::empty()
const {
122 return d->il_.empty();
125 void AutoPhraseDict::load(std::istream &in) {
127 throw_if_io_fail(unmarshall(in, size));
131 throw_if_io_fail(unmarshallString(in, text));
132 throw_if_io_fail(unmarshall(in, hit));
137 void AutoPhraseDict::save(std::ostream &out) {
139 uint32_t size = d->il_.size();
140 throw_if_io_fail(marshall(out, size));
141 for (
const auto &phrase : d->il_ | std::views::reverse) {
142 throw_if_io_fail(marshallString(out, phrase.entry_));
143 throw_if_io_fail(marshall(out, phrase.hit_));
uint32_t exactSearch(std::string_view s) const
Returns 0 if there is no such word.
A simple MRU based dictionary.
bool search(std::string_view s, const std::function< bool(std::string_view, uint32_t)> &callback) const
Check if any word starting with s exists in the dictionary.