libime
tablerule.h
1 /*
2  * SPDX-FileCopyrightText: 2015-2017 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  */
6 
7 #ifndef _FCITX_LIBIME_TABLE_TABLERULE_H_
8 #define _FCITX_LIBIME_TABLE_TABLERULE_H_
9 
10 #include <cstddef>
11 #include <cstdint>
12 #include <iostream>
13 #include <string>
14 #include <vector>
15 #include <fcitx-utils/macros.h>
16 #include <libime/table/libimetable_export.h>
17 
18 namespace libime {
19 enum class TableRuleEntryFlag : std::uint32_t { FromFront, FromBack };
20 
21 enum class TableRuleFlag : std::uint32_t { LengthLongerThan, LengthEqual };
22 
23 class LIBIMETABLE_EXPORT TableRuleEntry {
24 public:
25  TableRuleEntry(TableRuleEntryFlag flag = TableRuleEntryFlag::FromFront,
26  uint8_t character = 0, uint8_t encodingIndex = 0);
27 
28  explicit TableRuleEntry(std::istream &in);
29 
30  FCITX_INLINE_DEFINE_DEFAULT_DTOR_COPY_AND_MOVE(TableRuleEntry);
31 
32  bool isPlaceHolder() const;
33 
34  TableRuleEntryFlag flag() const { return flag_; }
35  uint8_t character() const { return character_; }
36 
37  uint8_t encodingIndex() const { return encodingIndex_; }
38  int index() const;
39 
40 private:
41  TableRuleEntryFlag flag_;
42  uint8_t character_;
43  uint8_t encodingIndex_;
44 };
45 
46 class LIBIMETABLE_EXPORT TableRule {
47 public:
48  TableRule(const std::string &ruleString, unsigned int maxLength);
49 
50  TableRule(TableRuleFlag _flag = TableRuleFlag::LengthEqual,
51  int _phraseLength = 0, std::vector<TableRuleEntry> _entries = {});
52 
53  explicit TableRule(std::istream &in);
54 
55  FCITX_INLINE_DEFINE_DEFAULT_DTOR_COPY_AND_MOVE(TableRule)
56 
57  std::string name() const;
58 
59  std::string toString() const;
60 
61  TableRuleFlag flag() const { return flag_; }
62  uint8_t phraseLength() const { return phraseLength_; }
63  const std::vector<TableRuleEntry> &entries() const { return entries_; }
64  size_t codeLength() const;
65 
66 private:
67  TableRuleFlag flag_ = TableRuleFlag::LengthLongerThan;
68  uint8_t phraseLength_ = 0;
69  std::vector<TableRuleEntry> entries_;
70 };
71 
72 LIBIMETABLE_EXPORT std::ostream &operator<<(std::ostream &out,
73  const TableRuleEntry &r);
74 
75 LIBIMETABLE_EXPORT std::ostream &operator<<(std::ostream &out,
76  const TableRule &r);
77 
78 } // namespace libime
79 
80 #endif // _FCITX_LIBIME_TABLE_TABLERULE_H_