added order_by support to position function, orders are cached; TODO: clear the cache when a card changes

git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@109 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
twanvl
2006-12-10 23:49:34 +00:00
parent db917c2b71
commit 0a69db594e
8 changed files with 191 additions and 22 deletions
+37 -14
View File
@@ -14,6 +14,7 @@
#include <data/field.hpp>
#include <data/field/text.hpp> // for 0.2.7 fix
#include <util/tagged_string.hpp> // for 0.2.7 fix
#include <util/order_cache.hpp>
#include <script/value.hpp>
#include <script/script_manager.hpp>
#include <wx/sstream.h>
@@ -100,20 +101,6 @@ void Set::validate(Version file_app_version) {
*/ }
}
void mark_dependency_member(Set* value, const String& name, const Dependency& dep) {
// TODO
}
void mark_dependency_member(const SetP& value, const String& name, const Dependency& dep) {
mark_dependency_member(value.get(), name, dep);
}
// in scripts, set.something is read from the set_info
template <typename Tag>
void reflect_set_info_get_member(Tag& tag, const IndexMap<FieldP, ValueP>& data) {}
void reflect_set_info_get_member(GetMember& tag, const IndexMap<FieldP, ValueP>& data) {
REFLECT_NAMELESS(data);
}
IMPLEMENT_REFLECTION(Set) {
tag.addAlias(300, _("style"), _("stylesheet")); // < 0.3.0 used style instead of stylesheet
tag.addAlias(300, _("extra set info"), _("styling"));
@@ -135,6 +122,42 @@ IMPLEMENT_REFLECTION(Set) {
REFLECT(apprentice_code);
}
// ----------------------------------------------------------------------------- : Script utilities
ScriptValueP make_iterator(const Set& set) {
return new_intrusive1<ScriptCollectionIterator<vector<CardP> > >(&set.cards);
}
void mark_dependency_member(Set* value, const String& name, const Dependency& dep) {
// TODO
}
void mark_dependency_member(const SetP& value, const String& name, const Dependency& dep) {
mark_dependency_member(value.get(), name, dep);
}
// in scripts, set.something is read from the set_info
template <typename Tag>
void reflect_set_info_get_member(Tag& tag, const IndexMap<FieldP, ValueP>& data) {}
void reflect_set_info_get_member(GetMember& tag, const IndexMap<FieldP, ValueP>& data) {
REFLECT_NAMELESS(data);
}
int Set::positionOfCard(const CardP& card, const ScriptValueP& order_by) {
// TODO : Lock the map?
assert(order_by);
OrderCacheP& order = order_cache[order_by];
if (!order) {
// 1. make a list of the order value for each card
vector<String> values; values.reserve(cards.size());
FOR_EACH_CONST(c, cards) {
values.push_back(*order_by->eval(getContext(c)));
}
// 2. initialize order cache
order.reset(new OrderCache<CardP>(cards, values));
}
return order->find(card);
}
// ----------------------------------------------------------------------------- : Styling
// Extra set data, for a specific stylesheet
+9
View File
@@ -23,9 +23,12 @@ DECLARE_POINTER_TYPE(Styling);
DECLARE_POINTER_TYPE(Field);
DECLARE_POINTER_TYPE(Value);
DECLARE_POINTER_TYPE(Keyword);
DECLARE_INTRUSIVE_POINTER_TYPE(ScriptValue);
class ScriptManager;
class Context;
class Dependency;
template <typename> class OrderCache;
typedef shared_ptr<OrderCache<CardP> > OrderCacheP;
// ----------------------------------------------------------------------------- : Set
@@ -81,6 +84,9 @@ class Set : public Packaged {
throw InternalError(_("Expected a set field with name '")+name+_("'"));
}
/// Find the position of a card in this set, when the card list is sorted using the given cirterium
int positionOfCard(const CardP& card, const ScriptValueP& order_by);
protected:
virtual String typeName() const;
virtual void validate(Version);
@@ -89,11 +95,14 @@ class Set : public Packaged {
private:
/// Object for managing and executing scripts
scoped_ptr<ScriptManager> script_manager;
/// Cache of cards ordered by some criterion
map<ScriptValueP,OrderCacheP> order_cache;
};
inline int item_count(const Set& set) {
return (int)set.cards.size();
}
ScriptValueP make_iterator(const Set& set);
void mark_dependency_member(const SetP& value, const String& name, const Dependency& dep);
void mark_dependency_member(Set* value, const String& name, const Dependency& dep);