4 * Created on: Sep 4, 2012
8 #ifndef LOADER_TYPEDESCRIPTION_H_
9 #define LOADER_TYPEDESCRIPTION_H_
18 class FieldDescription {
21 FieldDescription(std::ptrdiff_t offset, int type, bool reference = true, bool aggregate = false)
22 : offset(offset), type(type), reference(reference), aggregate(aggregate) { }
24 std::ptrdiff_t Offset() const { return offset; };
25 int TypeId() const { return type; }
26 bool IsReferenced() const { return reference; }
27 bool IsAggregate() const { return aggregate; }
30 std::ptrdiff_t offset;
36 class TypeDescription {
39 void AddField(const std::string &name, const FieldDescription &f);
40 bool HasField(const std::string &name) const;
41 const FieldDescription &GetField(const std::string &name) const;
43 void AddSupertype(int id, std::ptrdiff_t offset);
44 bool IsSubtypeOf(int id) const;
45 bool IsSubtypeOf(const TypeDescription &other) const { return IsSubtypeOf(other.TypeId()); }
46 std::ptrdiff_t SupertypeOffset(int id) const;
47 std::ptrdiff_t SupertypeOffset(const TypeDescription &other) const { return SupertypeOffset(other.TypeId()); }
49 int TypeId() const { return id; }
50 const std::string &TypeName() const { return name; }
52 void SetSize(int s) { size = s; }
53 int Size() const { return size; }
55 static TypeDescription &CreateOrGet(const std::string &name);
56 static int GetTypeId(const std::string &);
57 static const TypeDescription &Get(int id);
60 TypeDescription(int id, const std::string &name) : name(name), id(id), size(0) { }
64 std::map<std::string, FieldDescription> fields;
65 std::map<int, std::ptrdiff_t> supertypes;
69 static std::vector<TypeDescription> typeDescriptions;
75 #endif /* LOADER_TYPEDESCRIPTION_H_ */