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;
42 void Construct(void *) const;
43 void Load(void *) const;
45 void SetConstructor(void (*ctor)(void *)) { constructor = ctor; }
46 void SetLoader(void (*ld)(void *)) { loader = ld; }
47 void AddSupertype(int id, std::ptrdiff_t offset);
48 bool IsSubtypeOf(int id) const;
49 bool IsSubtypeOf(const TypeDescription &other) const { return IsSubtypeOf(other.TypeId()); }
50 std::ptrdiff_t SupertypeOffset(int id) const;
51 std::ptrdiff_t SupertypeOffset(const TypeDescription &other) const { return SupertypeOffset(other.TypeId()); }
53 int TypeId() const { return id; }
54 const std::string &TypeName() const { return name; }
56 void SetSize(int s) { size = s; }
57 int Size() const { return size; }
59 typedef std::map<std::string, FieldDescription>::const_iterator FieldIterator;
60 FieldIterator FieldsBegin() const { return fields.begin(); }
61 FieldIterator FieldsEnd() const { return fields.end(); }
63 static TypeDescription &CreateOrGet(const std::string &name);
64 static int GetTypeId(const std::string &);
65 static const TypeDescription &Get(int id);
68 TypeDescription(int id, const std::string &name) : constructor(0), loader(0), name(name), id(id), size(0) { }
71 void (*constructor)(void *);
72 void (*loader)(void *);
74 std::map<std::string, FieldDescription> fields;
75 std::map<int, std::ptrdiff_t> supertypes;
79 static std::vector<TypeDescription> typeDescriptions;
85 #endif /* LOADER_TYPEDESCRIPTION_H_ */