diff options
author | Ben Boeckel <MathStuf@gmail.com> | 2009-03-26 18:09:11 -0400 |
---|---|---|
committer | Ben Boeckel <MathStuf@gmail.com> | 2009-03-26 18:09:11 -0400 |
commit | c40f1818b4f090c1180b463a1c814e75aab7e354 (patch) | |
tree | 353138f8f3b71ea604eb71dc73c648dba6836b73 /sigmod | |
parent | 01d3806df3213cd40d5b46075a638a7b7a0de012 (diff) | |
download | sigen-c40f1818b4f090c1180b463a1c814e75aab7e354.tar.gz sigen-c40f1818b4f090c1180b463a1c814e75aab7e354.tar.xz sigen-c40f1818b4f090c1180b463a1c814e75aab7e354.zip |
Split out load/save functions
Diffstat (limited to 'sigmod')
-rw-r--r-- | sigmod/Macros.h | 2 | ||||
-rw-r--r-- | sigmod/Object.h | 250 | ||||
-rw-r--r-- | sigmod/XmlReader.h | 292 |
3 files changed, 299 insertions, 245 deletions
diff --git a/sigmod/Macros.h b/sigmod/Macros.h index 20148c27..61a7b60c 100644 --- a/sigmod/Macros.h +++ b/sigmod/Macros.h @@ -25,6 +25,8 @@ #ifdef MAKE_SIGMOD_LIB +#include "XmlReader.h" + #define LOAD_ID() \ int newId = id; \ if ((id == -1) && xml.hasAttribute("id")) \ diff --git a/sigmod/Object.h b/sigmod/Object.h index e7e0b4d1..7cd4097e 100644 --- a/sigmod/Object.h +++ b/sigmod/Object.h @@ -22,30 +22,21 @@ #ifndef SIGMOD_OBJECT #define SIGMOD_OBJECT -// Sigcore includes -#include <sigcore/Fraction.h> -#include <sigcore/Matrix.h> -#include <sigcore/Script.h> - // Sigmod includes #include "Global.h" // Qt includes -#include <QtCore/QBuffer> #include <QtCore/QObject> -#include <QtCore/QPoint> -#include <QtCore/QStringList> -#include <QtCore/QVariant> -#include <QtCore/QVarLengthArray> -#include <QtGui/QPainterPath> #include <QtXml/QDomElement> -// C includes -#include <climits> +// Forward decarations +namespace Sigcore +{ +class Fraction; +} namespace Sigmod { -// Forward decarations class Game; /** @@ -171,237 +162,6 @@ class SIGMOD_EXPORT Object : public QObject int m_id; const Object* const m_parent; }; - -template<typename T> inline void loadValue(const QDomElement& xml, T* value) -{ - *value = QVariant(xml.firstChild().toText().data()).value<T>(); -} - -template<> inline void loadValue<bool>(const QDomElement& xml, bool* value) -{ - *value = (xml.firstChild().toText().data() == "true"); -} - -template<> inline void loadValue<int>(const QDomElement& xml, int* value) -{ - *value = xml.firstChild().toText().data().toInt(); -} - -template<> inline void loadValue<Sigcore::Fraction>(const QDomElement& xml, Sigcore::Fraction* value) -{ - value->set(xml.attribute("numerator", "1").toInt(), xml.attribute("denominator", "1").toInt()); - value->reduce(); -} - -template<> inline void loadValue<QPoint>(const QDomElement& xml, QPoint* value) -{ - value->setX(xml.attribute("x", "0").toInt()); - value->setY(xml.attribute("y", "0").toInt()); -} - -template<> inline void loadValue<QPainterPath>(const QDomElement& xml, QPainterPath* value) -{ - QDataStream stream(QByteArray::fromBase64(xml.firstChild().toText().data().toUtf8())); - stream >> *value; -} - -template<> inline void loadValue<QByteArray>(const QDomElement& xml, QByteArray* value) -{ - *value = QByteArray::fromBase64(xml.firstChild().toText().data().toUtf8()); -} - -template<> inline void loadValue<Sigcore::Script>(const QDomElement& xml, Sigcore::Script* value) -{ - value->setInterpreter(xml.attribute("interpreter", "")); - value->setScript(xml.firstChild().toText().data()); -} - -template<typename T> inline void loadEnum(const QDomElement& xml, T* value, const QStringList& array) -{ - *value = static_cast<T>(array.indexOf(xml.firstChild().toText().data())); -} - -template<typename T, int S> inline void loadArray(const QDomElement& xml, QVarLengthArray<T, S>* value) -{ - QDomElement node = xml.firstChildElement("element"); - while (!node.isNull()) - { - int index = node.attribute("index", "-1").toInt(); - if ((0 <= index) && (index < value->size())) - loadValue(node, value->data() + index); - node = node.nextSiblingElement("element"); - } -} - -inline void loadList(const QDomElement& xml, QList<int>* value) -{ - QDomElement node = xml.firstChildElement("element"); - int element; - while (!node.isNull()) - { - loadValue(node, &element); - if (!value->contains(element)) - value->append(element); - node = node.nextSiblingElement("element"); - } -} - -inline void loadMap(const QDomElement& xml, QMap<int, int>* value, const QString& valueName) -{ - QDomElement node = xml.firstChildElement("element"); - int key; - int keyValue; - while (!node.isNull()) - { - loadValue(node.firstChildElement("key"), &key); - loadValue(node.firstChildElement(valueName), &keyValue); - (*value)[key] = keyValue; - node = node.nextSiblingElement("element"); - } -} - -template<typename T> inline void loadMatrix(const QDomElement& xml, Sigcore::Matrix<T>* value) -{ - int height = xml.attribute("height", "1").toInt(); - int width = xml.attribute("width", "1").toInt(); - value->resize(width, height); - QDomElement node = xml.firstChildElement("element"); - while (!node.isNull()) - { - int row = node.attribute("row", "-1").toInt(); - int column = node.attribute("column", "-1").toInt(); - if ((0 <= row) && (row < height) && (0 <= column) && (column < width)) - loadValue(node, &value->operator()(row, column)); - node = node.nextSiblingElement("element"); - } -} - -template<typename T> inline QDomElement saveValue(const QString& name, const T& value) -{ - QDomElement element = QDomDocument().createElement(name); - element.appendChild(QDomDocument().createTextNode(QVariant::fromValue<T>(value).toString())); - return element; -} - -template<> inline QDomElement saveValue<bool>(const QString& name, const bool& value) -{ - QDomElement element = QDomDocument().createElement(name); - element.appendChild(QDomDocument().createTextNode(value ? "true" : "false")); - return element; -} - -template<> inline QDomElement saveValue<int>(const QString& name, const int& value) -{ - QDomElement element = QDomDocument().createElement(name); - element.appendChild(QDomDocument().createTextNode(QString::number(value))); - return element; -} - -template<> inline QDomElement saveValue<QString>(const QString& name, const QString& value) -{ - QDomElement element = QDomDocument().createElement(name); - element.appendChild(QDomDocument().createTextNode(value)); - return element; -} - -template<> inline QDomElement saveValue<Sigcore::Fraction>(const QString& name, const Sigcore::Fraction& value) -{ - QDomElement element = QDomDocument().createElement(name); - element.setAttribute("numerator", value.numerator()); - element.setAttribute("denominator", value.denominator()); - return element; -} - -template<> inline QDomElement saveValue<QPoint>(const QString& name, const QPoint& value) -{ - QDomElement element = QDomDocument().createElement(name); - element.setAttribute("x", value.x()); - element.setAttribute("y", value.y()); - return element; -} - -template<> inline QDomElement saveValue<QPainterPath>(const QString& name, const QPainterPath& value) -{ - QByteArray array; - QDataStream stream(&array, QIODevice::WriteOnly); - stream << value; - QDomElement element = QDomDocument().createElement(name); - element.appendChild(QDomDocument().createTextNode(array.toBase64())); - return element; -} - -template<> inline QDomElement saveValue<QByteArray>(const QString& name, const QByteArray& value) -{ - QDomElement element = QDomDocument().createElement(name); - element.appendChild(QDomDocument().createTextNode(value.toBase64())); - return element; -} - -template<> inline QDomElement saveValue<Sigcore::Script>(const QString& name, const Sigcore::Script& value) -{ - QDomElement element = QDomDocument().createElement(name); - element.setAttribute("interpreter", value.interpreter()); - element.appendChild(QDomDocument().createCDATASection(value.script())); - return element; -} - -template<typename T> inline QDomElement saveEnum(const QString& name, const T& value, const QStringList& array) -{ - return saveValue<QString>(name, array[value]); -} - -template<typename T, int S> inline QDomElement saveArray(const QString& name, const QVarLengthArray<T, S>& value) -{ - QDomElement element = QDomDocument().createElement(name); - for (int i = 0; i < value.size(); ++i) - { - QDomElement valueElement = saveValue("element", value[i]); - valueElement.setAttribute("index", QString::number(i)); - element.appendChild(valueElement); - } - return element; -} - -inline QDomElement saveList(const QString& name, const QList<int>& value) -{ - QDomElement element = QDomDocument().createElement(name); - for (int i = 0; i < value.size(); ++i) - element.appendChild(saveValue("element", value.at(i))); - return element; -} - -inline QDomElement saveMap(const QString& name, const QMap<int, int>& value, const QString& valueName) -{ - QDomElement element = QDomDocument().createElement(name); - const QList<int> keys = value.keys(); - foreach (int key, keys) - { - QDomElement data = QDomDocument().createElement("element"); - data.appendChild(saveValue("key", key)); - data.appendChild(saveValue(valueName, value[key])); - element.appendChild(data); - } - return element; -} - -template<typename T> inline QDomElement saveMatrix(const QString& name, const Sigcore::Matrix<T>& value) -{ - QDomElement element = QDomDocument().createElement(name); - element.setAttribute("height", value.height()); - element.setAttribute("width", value.width()); - for (int i = 0; i < value.height(); ++i) - { - for (int j = 0; j < value.width(); ++j) - { - QDomElement valueElement = saveValue("element", value(i, j)); - valueElement.setAttribute("row", QString::number(i)); - valueElement.setAttribute("column", QString::number(j)); - element.appendChild(valueElement); - } - } - return element; -} - } #endif diff --git a/sigmod/XmlReader.h b/sigmod/XmlReader.h new file mode 100644 index 00000000..f6aec4b2 --- /dev/null +++ b/sigmod/XmlReader.h @@ -0,0 +1,292 @@ +/* + * Copyright 2007-2009 Ben Boeckel <MathStuf@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * \file sigmod/XmlReader.h + */ + +#ifndef SIGMOD_XMLREADER +#define SIGMOD_XMLREADER + +// Sigcore includes +#include <sigcore/Fraction.h> +#include <sigcore/Matrix.h> +#include <sigcore/Script.h> + +// Sigmod includes +#include "Global.h" + +// Qt includes +#include <QtCore/QBuffer> +#include <QtCore/QPoint> +#include <QtCore/QStringList> +#include <QtCore/QVariant> +#include <QtCore/QVarLengthArray> +#include <QtGui/QPainterPath> +#include <QtXml/QDomElement> + +// C includes +#include <climits> + +namespace Sigmod +{ +template<typename T> inline SIGMOD_NO_EXPORT void loadValue(const QDomElement& xml, T* value) +{ + *value = QVariant(xml.firstChild().toText().data()).value<T>(); +} + +template<> inline SIGMOD_NO_EXPORT void loadValue<bool>(const QDomElement& xml, bool* value) +{ + *value = (xml.firstChild().toText().data() == "true"); +} + +template<> inline SIGMOD_NO_EXPORT void loadValue<int>(const QDomElement& xml, int* value) +{ + *value = xml.firstChild().toText().data().toInt(); +} + +template<> inline SIGMOD_NO_EXPORT void loadValue<Sigcore::Fraction>(const QDomElement& xml, Sigcore::Fraction* value) +{ + value->set(xml.attribute("numerator", "1").toInt(), xml.attribute("denominator", "1").toInt()); + value->reduce(); +} + +template<> inline SIGMOD_NO_EXPORT void loadValue<QPoint>(const QDomElement& xml, QPoint* value) +{ + value->setX(xml.attribute("x", "0").toInt()); + value->setY(xml.attribute("y", "0").toInt()); +} + +template<> inline SIGMOD_NO_EXPORT void loadValue<QPainterPath>(const QDomElement& xml, QPainterPath* value) +{ + QDataStream stream(QByteArray::fromBase64(xml.firstChild().toText().data().toUtf8())); + stream >> *value; +} + +template<> inline SIGMOD_NO_EXPORT void loadValue<QByteArray>(const QDomElement& xml, QByteArray* value) +{ + *value = QByteArray::fromBase64(xml.firstChild().toText().data().toUtf8()); +} + +template<> inline SIGMOD_NO_EXPORT void loadValue<Sigcore::Script>(const QDomElement& xml, Sigcore::Script* value) +{ + value->setInterpreter(xml.attribute("interpreter", "")); + value->setScript(xml.firstChild().toText().data()); +} + +template<typename T> inline SIGMOD_NO_EXPORT void loadEnum(const QDomElement& xml, T* value, const QStringList& array) +{ + *value = static_cast<T>(array.indexOf(xml.firstChild().toText().data())); +} + +template<typename T, int S> inline SIGMOD_NO_EXPORT void loadArray(const QDomElement& xml, QVarLengthArray<T, S>* value) +{ + QDomElement node = xml.firstChildElement("element"); + while (!node.isNull()) + { + int index = node.attribute("index", "-1").toInt(); + if ((0 <= index) && (index < value->size())) + loadValue(node, value->data() + index); + node = node.nextSiblingElement("element"); + } +} + +inline SIGMOD_NO_EXPORT void loadList(const QDomElement& xml, QList<int>* value) +{ + QDomElement node = xml.firstChildElement("element"); + int element; + while (!node.isNull()) + { + loadValue(node, &element); + if (!value->contains(element)) + value->append(element); + node = node.nextSiblingElement("element"); + } +} + +inline SIGMOD_NO_EXPORT void loadMap(const QDomElement& xml, QMap<int, int>* value, const QString& valueName) +{ + QDomElement node = xml.firstChildElement("element"); + int key; + int keyValue; + while (!node.isNull()) + { + loadValue(node.firstChildElement("key"), &key); + loadValue(node.firstChildElement(valueName), &keyValue); + (*value)[key] = keyValue; + node = node.nextSiblingElement("element"); + } +} + +template<typename T> inline SIGMOD_NO_EXPORT void loadMatrix(const QDomElement& xml, Sigcore::Matrix<T>* value) +{ + int height = xml.attribute("height", "1").toInt(); + int width = xml.attribute("width", "1").toInt(); + value->resize(width, height); + QDomElement node = xml.firstChildElement("element"); + while (!node.isNull()) + { + int row = node.attribute("row", "-1").toInt(); + int column = node.attribute("column", "-1").toInt(); + if ((0 <= row) && (row < height) && (0 <= column) && (column < width)) + loadValue(node, &value->operator()(row, column)); + node = node.nextSiblingElement("element"); + } +} + +template<typename T> inline SIGMOD_NO_EXPORT QDomElement saveValue(const QString& name, const T& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.appendChild(doc.createTextNode(QVariant::fromValue<T>(value).toString())); + return element; +} + +template<> inline SIGMOD_NO_EXPORT QDomElement saveValue<bool>(const QString& name, const bool& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.appendChild(doc.createTextNode(value ? "true" : "false")); + return element; +} + +template<> inline SIGMOD_NO_EXPORT QDomElement saveValue<int>(const QString& name, const int& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.appendChild(doc.createTextNode(QString::number(value))); + return element; +} + +template<> inline SIGMOD_NO_EXPORT QDomElement saveValue<QString>(const QString& name, const QString& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.appendChild(doc.createTextNode(value)); + return element; +} + +template<> inline SIGMOD_NO_EXPORT QDomElement saveValue<Sigcore::Fraction>(const QString& name, const Sigcore::Fraction& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.setAttribute("numerator", value.numerator()); + element.setAttribute("denominator", value.denominator()); + return element; +} + +template<> inline SIGMOD_NO_EXPORT QDomElement saveValue<QPoint>(const QString& name, const QPoint& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.setAttribute("x", value.x()); + element.setAttribute("y", value.y()); + return element; +} + +template<> inline SIGMOD_NO_EXPORT QDomElement saveValue<QPainterPath>(const QString& name, const QPainterPath& value) +{ + QByteArray array; + QDataStream stream(&array, QIODevice::WriteOnly); + stream << value; + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.appendChild(doc.createTextNode(array.toBase64())); + return element; +} + +template<> inline SIGMOD_NO_EXPORT QDomElement saveValue<QByteArray>(const QString& name, const QByteArray& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.appendChild(doc.createTextNode(value.toBase64())); + return element; +} + +template<> inline SIGMOD_NO_EXPORT QDomElement saveValue<Sigcore::Script>(const QString& name, const Sigcore::Script& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.setAttribute("interpreter", value.interpreter()); + element.appendChild(doc.createCDATASection(value.script())); + return element; +} + +template<typename T> inline SIGMOD_NO_EXPORT QDomElement saveEnum(const QString& name, const T& value, const QStringList& array) +{ + return saveValue<QString>(name, array[value]); +} + +template<typename T, int S> inline SIGMOD_NO_EXPORT QDomElement saveArray(const QString& name, const QVarLengthArray<T, S>& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + for (int i = 0; i < value.size(); ++i) + { + QDomElement valueElement = saveValue("element", value[i]); + valueElement.setAttribute("index", QString::number(i)); + element.appendChild(valueElement); + } + return element; +} + +inline SIGMOD_NO_EXPORT QDomElement saveList(const QString& name, const QList<int>& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + for (int i = 0; i < value.size(); ++i) + element.appendChild(saveValue("element", value.at(i))); + return element; +} + +inline SIGMOD_NO_EXPORT QDomElement saveMap(const QString& name, const QMap<int, int>& value, const QString& valueName) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + const QList<int> keys = value.keys(); + foreach (int key, keys) + { + QDomElement data = doc.createElement("element"); + data.appendChild(saveValue("key", key)); + data.appendChild(saveValue(valueName, value[key])); + element.appendChild(data); + } + return element; +} + +template<typename T> inline SIGMOD_NO_EXPORT QDomElement saveMatrix(const QString& name, const Sigcore::Matrix<T>& value) +{ + QDomDocument doc; + QDomElement element = doc.createElement(name); + element.setAttribute("height", value.height()); + element.setAttribute("width", value.width()); + for (int i = 0; i < value.height(); ++i) + { + for (int j = 0; j < value.width(); ++j) + { + QDomElement valueElement = saveValue("element", value(i, j)); + valueElement.setAttribute("row", QString::number(i)); + valueElement.setAttribute("column", QString::number(j)); + element.appendChild(valueElement); + } + } + return element; +} + +} + +#endif |