4 * Created on: Sep 4, 2012
8 #include "TypeDescription.h"
23 void TypeDescription::AddField(const std::string &n, const FieldDescription &f) {
25 throw std::invalid_argument("duplicate definition of field " + n + " of type " + name);
27 fields.insert(std::make_pair(n, f));
31 bool TypeDescription::HasField(const std::string &name) const {
32 return fields.count(name);
35 const FieldDescription &TypeDescription::GetField(const std::string &n) const {
36 map<string, FieldDescription>::const_iterator result(fields.find(n));
37 if (result != fields.end()) {
38 return result->second;
40 throw std::invalid_argument("undefined field " + n + " of type " + name);
44 void TypeDescription::Construct(void *data) const {
48 std::memset(data, 0, Size());
52 void TypeDescription::Load(void *data) const {
59 void TypeDescription::AddSupertype(int id, std::ptrdiff_t offset) {
60 supertypes[id] = offset;
63 bool TypeDescription::IsSubtypeOf(int id) const {
64 return supertypes.count(id);
67 std::ptrdiff_t TypeDescription::SupertypeOffset(int id) const {
68 return supertypes.at(id);
72 vector<TypeDescription> TypeDescription::typeDescriptions;
74 TypeDescription &TypeDescription::CreateOrGet(const std::string &name) {
75 for (vector<TypeDescription>::iterator i(typeDescriptions.begin()), end(typeDescriptions.end()); i != end; ++i) {
76 if (i->name == name) {
80 typeDescriptions.push_back(TypeDescription(typeDescriptions.size(), name));
81 return typeDescriptions.back();
84 int TypeDescription::GetTypeId(const std::string &name) {
85 for (vector<TypeDescription>::size_type i(0), end(typeDescriptions.size()); i < end; ++i) {
86 if (typeDescriptions[i].name == name) {
90 typeDescriptions.push_back(TypeDescription(typeDescriptions.size(), name));
91 return typeDescriptions.size() - 1;
94 const TypeDescription &TypeDescription::Get(int id) {
95 assert(id >= 0 && id < int(typeDescriptions.size()));
96 return typeDescriptions[id];
100 void TypeDescription::WriteSourceWiki(std::ostream &out) {
101 vector<string> types;
102 for (vector<TypeDescription>::const_iterator i(typeDescriptions.begin()), end(typeDescriptions.end()); i != end; ++i) {
103 if (i->name != "Animation") {
104 types.push_back(i->name);
107 std::sort(types.begin(), types.end());
109 out << "h2. Data types" << endl << endl;
111 for (vector<string>::const_iterator i(types.begin()), end(types.end()); i != end; ++i) {
112 out << "* [[LoaderSource#" << *i << "|" << *i << "]]" << endl;
116 for (vector<string>::const_iterator i(types.begin()), end(types.end()); i != end; ++i) {
117 const TypeDescription &td(Get(GetTypeId(*i)));
118 out << "h3. " << td.TypeName() << endl << endl;
120 if (td.Description()) {
121 out << td.Description() << endl << endl;
124 if (td.FieldsBegin() == td.FieldsEnd()) {
125 out << "No properties." << endl << endl;
127 out << "| *Property* | *Type* | *Description* |" << endl;
128 for (FieldIterator field(td.FieldsBegin()); field != td.FieldsEnd(); ++field) {
129 const FieldDescription &fd(field->second);
130 out << "| " << field->first << " | ";
131 if (fd.IsAggregate()) {
132 out << "Array<" << Get(fd.TypeId()).TypeName() << ">";
134 out << Get(fd.TypeId()).TypeName();
137 if (fd.Description()) {
138 out << fd.Description();