fixed reading of IndexMaps: loop, initialization of 'index'

git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@41 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
twanvl
2006-10-20 13:38:03 +00:00
parent c15bc94ee7
commit b5cb26474a
3 changed files with 71 additions and 8 deletions
+7 -4
View File
@@ -116,10 +116,13 @@ void Reader::readLine() {
}
void Reader::unknownKey() {
warning(_("Unexpected key: '") + key + _("'"));
do {
moveNext();
} while (indent > expected_indent);
if (indent == expected_indent) {
warning(_("Unexpected key: '") + key + _("'"));
do {
moveNext();
} while (indent > expected_indent);
}
// else: could be a nameless value, which doesn't call exitBlock to move past its own key
}
// ----------------------------------------------------------------------------- : Handling basic types
+10 -4
View File
@@ -146,12 +146,16 @@ shared_ptr<T> read_new(Reader& reader) {
return new_shared<T>();
}
/// Update the 'index' member of a value for use by IndexMap
template <typename T> void update_index(T&, size_t index) {}
template <typename T>
void Reader::handle(const Char* name, vector<T>& vector) {
String vectorKey = singular_form(name);
while (enterBlock(vectorKey)) {
vector.resize(vector.size() + 1);
handle(vector.back());
update_index(vector.back(), vector.size() - 1); // update index for IndexMap
exitBlock();
}
}
@@ -169,11 +173,13 @@ void Reader::handle(map<K,V>& m) {
template <typename K, typename V>
void Reader::handle(IndexMap<K,V>& m) {
while (indent >= expected_indent) {
do {
UInt l = line_number;
for (typename IndexMap<K,V>::iterator it = m.begin() ; it != m.end() ; ++it) {
handle(get_key_name(*it).c_str(), *it);
}
}
if (l == line_number) unknownKey(m);
} while (indent >= expected_indent);
}
// ----------------------------------------------------------------------------- : Reflection
@@ -181,11 +187,11 @@ void Reader::handle(IndexMap<K,V>& m) {
/// Implement reflection as used by Reader
#define REFLECT_OBJECT_READER(Cls) \
template<> void Reader::handle<Cls>(Cls& object) { \
while (indent >= expected_indent) { \
do { \
UInt l = line_number; \
object.reflect(*this); \
if (l == line_number) unknownKey(object); \
} \
} while (indent >= expected_indent); \
} \
void Cls::reflect(Reader& reader) { \
reflect_impl(reader); \
+54
View File
@@ -0,0 +1,54 @@
//+----------------------------------------------------------------------------+
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
//| Copyright: (C) 2001 - 2006 Twan van Laarhoven |
//| License: GNU General Public License 2 or later (see file COPYING) |
//+----------------------------------------------------------------------------+
// ----------------------------------------------------------------------------- : Includes
#include <util/version.hpp>
#include <util/reflect.hpp>
#include <script/value.hpp>
// ----------------------------------------------------------------------------- : Version
UInt Version::toNumber() const { return version; }
String Version::toString() const {
return String() <<
((version / 10000) % 100) <<
_(".") << ((version / 100) % 100) <<
_(".") << ((version / 1) % 100);
}
Version Version::fromString(const String& version) {
UInt major = 0, minor = 0, build = 0;
wxSscanf(version, _("%u.%u.%u"), &major, &minor, &build);
return Version(major * 10000 + minor * 100 + build);
}
template <> void Reader::handle(Version& v) {
v = Version::fromString(value);
}
template <> void Writer::handle(const Version& v) {
handle(v.toString());
}
template <> void GetDefaultMember::handle(const Version& v) {
handle(v.toNumber());
}
// ----------------------------------------------------------------------------- : Versions
// NOTE: Don't use leading zeroes, they mean octal
const Version app_version = 300; // 0.3.0
const Char* version_suffix = _(" (beta)");
/* Changes:
* 0.2.0 : start of version numbering practice
* 0.2.2 : _("include file")
* 0.2.6 : fix in settings loading
* 0.2.7 : new tag system, different style of close tags
* 0.3.0 : port of code to C++
*/
const Version file_version = 300; // 0.3.0