#include "TypeDescription.h"
+#include <algorithm>
#include <cassert>
+#include <cstring>
+#include <ostream>
#include <stdexcept>
+using std::endl;
using std::map;
using std::string;
using std::vector;
}
}
+void TypeDescription::Construct(void *data) const {
+ if (constructor) {
+ (*constructor)(data);
+ } else {
+ std::memset(data, 0, Size());
+ }
+}
+
+void TypeDescription::Load(void *data) const {
+ if (loader) {
+ (*loader)(data);
+ }
+}
+
void TypeDescription::AddSupertype(int id, std::ptrdiff_t offset) {
supertypes[id] = offset;
return typeDescriptions[id];
}
+
+void TypeDescription::WriteSourceWiki(std::ostream &out) {
+ vector<string> types;
+ for (vector<TypeDescription>::const_iterator i(typeDescriptions.begin()), end(typeDescriptions.end()); i != end; ++i) {
+ if (i->name != "Animation") {
+ types.push_back(i->name);
+ }
+ }
+ std::sort(types.begin(), types.end());
+
+ out << "h2. Data types" << endl << endl;
+
+ for (vector<string>::const_iterator i(types.begin()), end(types.end()); i != end; ++i) {
+ out << "* [[LoaderSource#" << *i << "|" << *i << "]]" << endl;
+ }
+ out << endl << endl;
+
+ for (vector<string>::const_iterator i(types.begin()), end(types.end()); i != end; ++i) {
+ const TypeDescription &td(Get(GetTypeId(*i)));
+ out << "h3. " << td.TypeName() << endl << endl;
+
+ if (td.Description()) {
+ out << td.Description() << endl << endl;
+ }
+
+ if (td.FieldsBegin() == td.FieldsEnd()) {
+ out << "No properties." << endl << endl;
+ } else {
+ out << "| *Property* | *Type* | *Description* |" << endl;
+ for (FieldIterator field(td.FieldsBegin()); field != td.FieldsEnd(); ++field) {
+ const FieldDescription &fd(field->second);
+ out << "| " << field->first << " | ";
+ if (fd.IsAggregate()) {
+ out << "Array<" << Get(fd.TypeId()).TypeName() << ">";
+ } else {
+ out << Get(fd.TypeId()).TypeName();
+ }
+ out << " | ";
+ if (fd.Description()) {
+ out << fd.Description();
+ }
+ out << " |" << endl;
+ }
+ out << endl;
+ }
+ }
+}
+
}