Use unordered_map in KeywordTrie

This commit is contained in:
Twan van Laarhoven
2020-05-16 21:57:28 +02:00
parent cba96d6f23
commit 0b653938cc
3 changed files with 16 additions and 7 deletions
+12 -3
View File
@@ -9,6 +9,7 @@
#include <util/prec.hpp> #include <util/prec.hpp>
#include <data/keyword.hpp> #include <data/keyword.hpp>
#include <util/tagged_string.hpp> #include <util/tagged_string.hpp>
#include <unordered_map>
class KeywordTrie; class KeywordTrie;
DECLARE_POINTER_TYPE(KeywordParamValue); DECLARE_POINTER_TYPE(KeywordParamValue);
@@ -243,13 +244,21 @@ void Keyword::prepare(const vector<KeywordParamP>& param_types, bool force) {
// ----------------------------------------------------------------------------- : KeywordTrie // ----------------------------------------------------------------------------- : KeywordTrie
namespace std {
template <> struct hash<wxUniChar> {
inline size_t operator () (wxUniChar x) const {
return std::hash<wxUniChar::value_type>()(x.GetValue());
}
};
}
/// A node in a trie to match keywords /// A node in a trie to match keywords
class KeywordTrie { class KeywordTrie {
public: public:
KeywordTrie(); KeywordTrie();
~KeywordTrie(); ~KeywordTrie();
map<wxUniChar, unique_ptr<KeywordTrie>> children; ///< children after a given character unordered_map<wxUniChar, unique_ptr<KeywordTrie>> children; ///< children after a given character
KeywordTrie* on_any_star; ///< children on /.*/ (owned or this) KeywordTrie* on_any_star; ///< children on /.*/ (owned or this)
vector<const Keyword*> finished; ///< keywords that end in this node vector<const Keyword*> finished; ///< keywords that end in this node
@@ -395,12 +404,12 @@ String KeywordDatabase::expand(const String& text,
const ScriptValueP& match_condition, const ScriptValueP& match_condition,
const ScriptValueP& expand_default, const ScriptValueP& expand_default,
const ScriptValueP& combine_script, const ScriptValueP& combine_script,
Context& ctx) const { Context& ctx,
KeywordUsageStatistics* stat) const {
assert(combine_script); assert(combine_script);
assert_tagged(text); assert_tagged(text);
// Clean up usage statistics // Clean up usage statistics
KeywordUsageStatistics* stat = keyword_usage_statistics();
Value* stat_key = value_being_updated(); Value* stat_key = value_being_updated();
if (stat && stat_key) { if (stat && stat_key) {
for (size_t i = stat->size() - 1 ; i + 1 > 0 ; --i) { // loop backwards for (size_t i = stat->size() - 1 ; i + 1 > 0 ; --i) { // loop backwards
+2 -2
View File
@@ -133,7 +133,6 @@ inline String type_name(const vector<KeywordP>&) {
/// Store keyword usage statistics here, using value_being_updated as the key /// Store keyword usage statistics here, using value_being_updated as the key
typedef vector<pair<Value*, const Keyword*>> KeywordUsageStatistics; typedef vector<pair<Value*, const Keyword*>> KeywordUsageStatistics;
DECLARE_DYNAMIC_ARG(KeywordUsageStatistics*, keyword_usage_statistics);
/// A database of keywords to allow for fast matching /// A database of keywords to allow for fast matching
/** NOTE: keywords may not be altered after they are added to the database, /** NOTE: keywords may not be altered after they are added to the database,
@@ -162,8 +161,9 @@ public:
* @param combine_script script function to combine keyword and reminder text in some way * @param combine_script script function to combine keyword and reminder text in some way
* @param case_sensitive case sensitive matching of keywords? * @param case_sensitive case sensitive matching of keywords?
* @param ctx context for evaluation of scripts * @param ctx context for evaluation of scripts
* @param stats where to put keyword statistics
*/ */
String expand(const String& text, const ScriptValueP& match_condition, const ScriptValueP& expand_default, const ScriptValueP& combine_script, Context& ctx) const; String expand(const String& text, const ScriptValueP& match_condition, const ScriptValueP& expand_default, const ScriptValueP& combine_script, Context& ctx, KeywordUsageStatistics* stats = nullptr) const;
private: private:
unique_ptr<KeywordTrie> root; ///< Data structure for finding keywords unique_ptr<KeywordTrie> root; ///< Data structure for finding keywords
+2 -2
View File
@@ -672,9 +672,9 @@ SCRIPT_FUNCTION_WITH_DEP(expand_keywords) {
db.add(set->game->keywords); db.add(set->game->keywords);
} }
SCRIPT_OPTIONAL_PARAM_C_(CardP, card); SCRIPT_OPTIONAL_PARAM_C_(CardP, card);
WITH_DYNAMIC_ARG(keyword_usage_statistics, card ? &card->keyword_usage : nullptr);
try { try {
SCRIPT_RETURN(db.expand(input, match_condition, default_expand, combine, ctx)); KeywordUsageStatistics* stat = card ? &card->keyword_usage : nullptr;
SCRIPT_RETURN(db.expand(input, match_condition, default_expand, combine, ctx, stat));
} catch (const Error& e) { } catch (const Error& e) {
throw ScriptError(_ERROR_2_("in function", e.what(), _("expand_keywords"))); throw ScriptError(_ERROR_2_("in function", e.what(), _("expand_keywords")));
} }