4 * Created on: Sep 4, 2012
8 #include "TypeDescription.h"
19 void TypeDescription::AddField(const std::string &n, const FieldDescription &f) {
21 throw std::invalid_argument("duplicate definition of field " + n + " of type " + name);
23 fields.insert(std::make_pair(n, f));
27 bool TypeDescription::HasField(const std::string &name) const {
28 return fields.count(name);
31 const FieldDescription &TypeDescription::GetField(const std::string &n) const {
32 map<string, FieldDescription>::const_iterator result(fields.find(n));
33 if (result != fields.end()) {
34 return result->second;
36 throw std::invalid_argument("undefined field " + n + " of type " + name);
41 void TypeDescription::AddSupertype(int id, std::ptrdiff_t offset) {
42 supertypes[id] = offset;
45 bool TypeDescription::IsSubtypeOf(int id) const {
46 return supertypes.count(id);
49 std::ptrdiff_t TypeDescription::SupertypeOffset(int id) const {
50 return supertypes.at(id);
54 vector<TypeDescription> TypeDescription::typeDescriptions;
56 TypeDescription &TypeDescription::CreateOrGet(const std::string &name) {
57 for (vector<TypeDescription>::iterator i(typeDescriptions.begin()), end(typeDescriptions.end()); i != end; ++i) {
58 if (i->name == name) {
62 typeDescriptions.push_back(TypeDescription(typeDescriptions.size(), name));
63 return typeDescriptions.back();
66 int TypeDescription::GetTypeId(const std::string &name) {
67 for (vector<TypeDescription>::size_type i(0), end(typeDescriptions.size()); i < end; ++i) {
68 if (typeDescriptions[i].name == name) {
72 typeDescriptions.push_back(TypeDescription(typeDescriptions.size(), name));
73 return typeDescriptions.size() - 1;
76 const TypeDescription &TypeDescription::Get(int id) {
77 assert(id >= 0 && id < int(typeDescriptions.size()));
78 return typeDescriptions[id];