-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwords.h
107 lines (91 loc) · 2.74 KB
/
words.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#pragma once
#include <QDir>
#include <set>
#include "worditem.h"
#include "sqlmanager.h"
#include <QMap>
#include <unordered_map>
// NOTE: words is designed as two layer-ed, in memory and in-disk persistance.
class Words {
protected:
QDir rootdir;
std::set<QString> m_known_list;
std::set<QString> m_dict_list;
std::set<QString> m_ignore_list;
QMap<QString, wordlevel_t> m_all_list;
QMap<int, std::set<QString> *> m_dicts{
{WORD_IS_KNOWN, &m_known_list},
{WORD_IS_LEARNING, &m_dict_list},
{WORD_IS_IGNORED, &m_ignore_list},
};
virtual void save() = 0;
virtual void load() = 0;
public:
Words();
virtual ~Words() = default;
bool isKnown(const QString &word);
bool isIgnored(const QString &word);
bool isInDict(const QString &word);
void resetdict(const QString &word) {
m_ignore_list.erase(word);
m_dict_list.erase(word);
m_ignore_list.erase(word);
}
wordlevel_t getWordLevel(const QString &word) {
return m_all_list.value(word, LEVEL_UNKOWN);
}
void setWordWithLevel(const QString &word, wordlevel_t level) {
resetdict(word);
switch (level) {
case WORD_IS_KNOWN:
break;
case WORD_IS_LEARNING:
break;
case WORD_IS_IGNORED:
break;
default:
break;
}
}
virtual void updateWord(const QString &word, wordlevel_t old_level,
wordlevel_t new_level) {
assert(isValidLevel(old_level));
assert(isValidLevel(new_level));
m_dicts[new_level]->insert(word);
if (old_level != LEVEL_UNKOWN) {
m_dicts[old_level]->erase(word);
}
}
};
class TextSave : public Words {
const std::string c_known = "plain_known.txt";
const std::string c_ignore = "plain_ignore.txt";
const std::string c_dict = "plain_dict.txt";
QString m_fileOfKnown;
QString m_fileOfDict;
QString m_fileOfIgnore;
public:
TextSave();
virtual ~TextSave();
virtual void save() override;
virtual void load() override;
};
class SqlSave : public Words {
public:
SqlSave();
virtual ~SqlSave() {}
virtual void updateWord(const QString &word, wordlevel_t old_level,
wordlevel_t new_level) override {
Words::updateWord(word, old_level, new_level);
if (old_level == LEVEL_UNKOWN) {
// add
SQLManager::instance()->addword(word, new_level);
} else {
// update.
SQLManager::instance()->updateword(word, new_level);
}
}
virtual void save() override {}
virtual void load() override;
};
class Leveldb : public Words {};