]> git.localhorst.tv Git - l2e.git/blob - src/loader/TypeDescription.h
added type description class
[l2e.git] / src / loader / TypeDescription.h
1 /*
2  * TypeDescription.h
3  *
4  *  Created on: Sep 4, 2012
5  *      Author: holy
6  */
7
8 #ifndef LOADER_TYPEDESCRIPTION_H_
9 #define LOADER_TYPEDESCRIPTION_H_
10
11 #include <map>
12 #include <memory>
13 #include <string>
14 #include <vector>
15
16 namespace loader {
17
18 class FieldDescription {
19
20 public:
21         FieldDescription(std::ptrdiff_t offset, int type, bool reference = true, bool aggregate = false)
22         : offset(offset), type(type), reference(reference), aggregate(aggregate) { }
23
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; }
28
29 private:
30         std::ptrdiff_t offset;
31         int type;
32         bool reference;
33         bool aggregate;
34 };
35
36 class TypeDescription {
37
38 public:
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
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()); }
48
49         int TypeId() const { return id; }
50         const std::string &TypeName() const { return name; }
51
52         void SetSize(int s) { size = s; }
53         int Size() const { return size; }
54
55         static TypeDescription &CreateOrGet(const std::string &name);
56         static int GetTypeId(const std::string &);
57         static const TypeDescription &Get(int id);
58
59 private:
60         TypeDescription(int id, const std::string &name) : name(name), id(id), size(0) { }
61
62 private:
63         std::string name;
64         std::map<std::string, FieldDescription> fields;
65         std::map<int, std::ptrdiff_t> supertypes;
66         int id;
67         int size;
68
69         static std::vector<TypeDescription> typeDescriptions;
70
71 };
72
73 }
74
75 #endif /* LOADER_TYPEDESCRIPTION_H_ */