libime
lattice.cpp
1 /*
2  * SPDX-FileCopyrightText: 2017-2017 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  */
6 
7 #include "lattice.h"
8 #include <cstddef>
9 #include <memory>
10 #include <string>
11 #include <type_traits>
12 #include <unordered_set>
13 #include <fcitx-utils/macros.h>
14 #include "lattice_p.h"
15 #include "segmentgraph.h"
16 
17 namespace libime {
18 
19 WordNode::WordNode(WordNode &&other) noexcept(
20  std::is_nothrow_move_constructible<std::string>::value) = default;
21 WordNode &WordNode::operator=(WordNode &&other) noexcept(
22  std::is_nothrow_move_assignable<std::string>::value) = default;
23 
24 Lattice::Lattice() : d_ptr(std::make_unique<LatticePrivate>()) {}
25 
26 FCITX_DEFINE_DEFAULT_DTOR_AND_MOVE(Lattice)
27 
28 size_t Lattice::sentenceSize() const {
29  FCITX_D();
30  return d->nbests_.size();
31 }
32 
33 const SentenceResult &Lattice::sentence(size_t idx) const {
34  FCITX_D();
35  return d->nbests_[idx];
36 }
37 
38 Lattice::NodeRange Lattice::nodes(const SegmentGraphNode *node) const {
39  FCITX_D();
40  auto iter = d->lattice_.find(node);
41  if (iter == d->lattice_.end()) {
42  return {};
43  }
44  return {iter->second.begin(), iter->second.end()};
45 }
46 
47 void Lattice::clear() {
48  FCITX_D();
49  d->lattice_.clear();
50  d->nbests_.clear();
51 }
52 
53 void Lattice::discardNode(
54  const std::unordered_set<const SegmentGraphNode *> &nodes) {
55  FCITX_D();
56  for (const auto *node : nodes) {
57  d->lattice_.erase(node);
58  }
59  for (auto &p : d->lattice_) {
60  p.second.erase_if([&nodes](const LatticeNode &node) {
61  return nodes.count(node.from());
62  });
63  }
64 }
65 } // namespace libime