mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-10 04:57:00 -04:00
Use unordered_map in KeywordTrie
This commit is contained in:
+12
-3
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user