]> git.localhorst.tv Git - l2e.git/commitdiff
added constructors for described types
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 10 Sep 2012 20:32:10 +0000 (22:32 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 10 Sep 2012 20:32:10 +0000 (22:32 +0200)
35 files changed:
src/battle/Hero.cpp
src/battle/Hero.h
src/battle/Monster.cpp
src/battle/Monster.h
src/battle/PartyLayout.cpp
src/battle/PartyLayout.h
src/battle/Resources.cpp
src/battle/Resources.h
src/battle/Stats.cpp
src/battle/Stats.h
src/common/Ikari.cpp
src/common/Ikari.h
src/common/Item.cpp
src/common/Item.h
src/common/Spell.cpp
src/common/Spell.h
src/common/TargetingMode.cpp
src/common/TargetingMode.h
src/graphics/ComplexAnimation.cpp
src/graphics/ComplexAnimation.h
src/graphics/Font.cpp
src/graphics/Font.h
src/graphics/Frame.cpp
src/graphics/Frame.h
src/graphics/Gauge.cpp
src/graphics/Gauge.h
src/graphics/Menu.cpp
src/graphics/Menu.h
src/graphics/SimpleAnimation.cpp
src/graphics/SimpleAnimation.h
src/graphics/Sprite.cpp
src/graphics/Sprite.h
src/loader/Interpreter.cpp
src/loader/TypeDescription.cpp
src/loader/TypeDescription.h

index fdf8125872c1df23a57c3f8187837d96da125d2f..8138bc11d89c328d20374888284aa8521f6d28d7 100644 (file)
@@ -164,6 +164,7 @@ void Hero::CreateTypeDescription() {
        int stringId(TypeDescription::GetTypeId("String"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Hero"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Hero));
 
        td.AddField("name", FieldDescription(((char *)&h.name) - ((char *)&h), stringId, true));
@@ -182,4 +183,8 @@ void Hero::CreateTypeDescription() {
        td.AddField("meleeAnimation", FieldDescription(((char *)&h.meleeAnimation) - ((char *)&h), animationId, true));
 }
 
+void Hero::Construct(void *data) {
+       new (data) Hero;
+}
+
 }
index 122ee94112a21aac140f95a0187923dd820afef0..c15c2dcbc08bf4d25cc73f7b0734b54ef4463760 100644 (file)
@@ -131,6 +131,7 @@ public:
        void SetSpellAnimation(const graphics::Animation *a) { spellAnimation = a; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        const char *name;
index dd653383a5151132777e1f6ef6ddb6fb568e680f..7cb4185f13209bf31cc327051718a3034dd5d004 100644 (file)
@@ -62,6 +62,7 @@ void Monster::CreateTypeDescription() {
        int stringId(TypeDescription::GetTypeId("String"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Monster"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Monster));
 
        td.AddField("name", FieldDescription(((char *)&m.name) - ((char *)&m), stringId, true));
@@ -79,4 +80,8 @@ void Monster::CreateTypeDescription() {
        td.AddField("meleeAnimation", FieldDescription(((char *)&m.meleeAnimation) - ((char *)&m), animationId, true));
 }
 
+void Monster::Construct(void *data) {
+       new (data) Monster;
+}
+
 }
index c5c75caa1ad2d5bd83f4db0d52ed27a81a3d4555..db37dfebe0d0bb00873309387168f5b80a408399 100644 (file)
@@ -85,6 +85,7 @@ public:
        const AttackChoice &GetAttackChoice() const { return attackChoice; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        const char *name;
index 78d2999eab2ed8ad0784b70451865ba82a6b68bf..c2bb452eec6b7ae0f5edc2f07bc6efc0c1c5b77c 100644 (file)
@@ -42,9 +42,14 @@ void PartyLayout::CreateTypeDescription() {
        int vectorId(TypeDescription::GetTypeId("Vector"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("PartyLayout"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(PartyLayout));
 
        td.AddField("positions", FieldDescription(((char *)&p.positions) - ((char *)&p), vectorId, true, true));
 }
 
+void PartyLayout::Construct(void *data) {
+       new (data) PartyLayout;
+}
+
 }
index b2454f2cba18bcbcd8b8f9588fb8f2c931bf0de8..e4f7d1b706517393bd262bebdeeaa26cd069f7d3 100644 (file)
@@ -33,6 +33,7 @@ public:
        }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        const geometry::Vector<int> *positions;
index 340f57c24cb6338410380f1576414fc2386bc6b5..6c469469e2ce10627358cc1fd3b603aac3e6afaf 100644 (file)
@@ -95,6 +95,7 @@ void Resources::CreateTypeDescription() {
        int stringId(TypeDescription::GetTypeId("String"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("BattleResources"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Resources));
 
        td.AddField("swapCursor", FieldDescription(((char *)&r.swapCursor) - ((char *)&r), spriteId, true));
@@ -165,4 +166,8 @@ void Resources::CreateTypeDescription() {
        td.AddField("heroesBgColor", FieldDescription(((char *)&r.heroesBgColor) - ((char *)&r), colorId, false));
 }
 
+void Resources::Construct(void *data) {
+       new (data) Resources;
+}
+
 }
index 7286e0db54878dc9ec486821a3b5638920d52d1e..9654fdc841d9c987569be411e17f0719cb0634bb 100644 (file)
@@ -102,6 +102,7 @@ struct Resources {
        Resources();
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 };
 
index cdf321036db0ab7941628371858983a63041fb93..a2a442ceea9bbea8f0e8a2a7ea12a284b4d67c76 100644 (file)
@@ -43,6 +43,7 @@ void Stats::CreateTypeDescription() {
        int numberId(TypeDescription::GetTypeId("Number"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Stats"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Stats));
 
        td.AddField("atp", FieldDescription(((char *)&s.attack) - ((char *)&s), numberId, false));
@@ -54,4 +55,8 @@ void Stats::CreateTypeDescription() {
        td.AddField("mgr", FieldDescription(((char *)&s.magicResistance) - ((char *)&s), numberId, false));
 }
 
+void Stats::Construct(void *data) {
+       new (data) Stats;
+}
+
 }
index 5f0d17d8efc997353181b05374b4b333a6b7dea8..e53111d70df8e2f3169be0b0cddd8bee639b6bad 100644 (file)
@@ -36,6 +36,7 @@ public:
        void SetMagicResistance(Uint16 m) { magicResistance = m; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        int attack;
index e91f12fa943e948d12c2ade80f1722f1c25845c9..604ca5b8032dbc1a8675ec0790579a90a01a30c5 100644 (file)
@@ -31,6 +31,7 @@ void Ikari::CreateTypeDescription() {
        int targetsId(TypeDescription::GetTypeId("TargetingMode"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Ikari"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Ikari));
 
        td.AddField("name", FieldDescription(((char *)&i.name) - ((char *)&i), stringId, true));
@@ -39,4 +40,8 @@ void Ikari::CreateTypeDescription() {
        td.AddField("type", FieldDescription(((char *)&i.isPhysical) - ((char *)&i), boolId, true));
 }
 
+void Ikari::Construct(void *data) {
+       new (data) Ikari;
+}
+
 }
index 76730defbc72e0f6a5900aa34faffa1b43111179..979015b636ed318d8c08666117aea888934765fd 100644 (file)
@@ -36,6 +36,7 @@ public:
        void SetPhysical() { isPhysical = true; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        const char *name;
index 9d04836e69a94f733975a5647c835140e49732cb..9a1a735ea1db2ff3c916cec81509575d243aeef2 100644 (file)
@@ -48,6 +48,7 @@ void Item::CreateTypeDescription() {
        int targetsId(TypeDescription::GetTypeId("TargetingMode"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Item"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Item));
 
        td.AddField("name", FieldDescription(((char *)&i.name) - ((char *)&i), stringId, true));
@@ -66,4 +67,8 @@ void Item::CreateTypeDescription() {
        td.AddField("attackanimation", FieldDescription(((char *)&i.attackAnimation) - ((char *)&i), animationId, true));
 }
 
+void Item::Construct(void *data) {
+       new (data) Item;
+}
+
 }
index ffa50e32f116ff09d61c3e0da3d8cb0077970588..1af15f3de365fc289d5e74a62ac14b0908b63b94 100644 (file)
@@ -89,6 +89,7 @@ public:
        void SetAttackAnimation(graphics::Animation *a) { attackAnimation = a; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        enum Equipable {
index a0b3b9de82d514f679ff01daba8bccacd561b95f..8f8784a761ed83840f9ee6c8ad77729ca6302a68 100644 (file)
@@ -29,6 +29,7 @@ void Spell::CreateTypeDescription() {
        int targetsId(TypeDescription::GetTypeId("TargetingMode"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Spell"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Spell));
 
        td.AddField("name", FieldDescription(((char *)&s.name) - ((char *)&s), stringId, true));
@@ -36,4 +37,8 @@ void Spell::CreateTypeDescription() {
        td.AddField("targets", FieldDescription(((char *)&s.targetingMode) - ((char *)&s), targetsId, false));
 }
 
+void Spell::Construct(void *data) {
+       new (data) Spell;
+}
+
 }
index 9bf0a4b8c5b6b689d3f600db671be15ea162dd6d..eb8fa02928605b2e84b2aa37084fbdc994a43405 100644 (file)
@@ -39,6 +39,7 @@ public:
        void SetUsableInBattle() { usability |= USABILITY_BATTLE; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        enum Usability {
index 82b28533dd4543fca82ad7d21e9d01748952e052..476358883cec415de445248cfec016f2453d87ea 100644 (file)
@@ -21,10 +21,15 @@ void TargetingMode::CreateTypeDescription() {
        int numberId(TypeDescription::GetTypeId("Number"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("TargetingMode"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(TargetingMode));
 
        td.AddField("faction", FieldDescription(((char *)&t.ally) - ((char *)&t), boolId, true));
        td.AddField("mode", FieldDescription(((char *)&t.mode) - ((char *)&t), numberId, true));
 }
 
+void TargetingMode::Construct(void *data) {
+       new (data) TargetingMode;
+}
+
 }
index 83d1d831fb99a550dfb35c86de83fc2716c923c1..ef2969888ec23c58ec405cbe82bcf46b056b436c 100644 (file)
@@ -31,6 +31,7 @@ public:
        void TargetEnemy() { ally = false; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        enum {
index ab19fd013fd46bde17e674cd1de041724f3a97f6..cb125f5ac20f706fd23e4d2ab1b0c2c12f13dda6 100644 (file)
@@ -23,8 +23,10 @@ void ComplexAnimation::CreateTypeDescription() {
        int frameId(TypeDescription::GetTypeId("ComplexAnimationFrame"));
        int numberId(TypeDescription::GetTypeId("Number"));
        int spriteId(TypeDescription::GetTypeId("Sprite"));
+       int vectorId(TypeDescription::GetTypeId("Vector"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("ComplexAnimation"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(ComplexAnimation));
        td.AddSupertype(animationId, ((char *)a) - ((char *)&ca));
 
@@ -34,9 +36,6 @@ void ComplexAnimation::CreateTypeDescription() {
 
        FrameProp fp;
 
-       int numberId(TypeDescription::GetTypeId("Number"));
-       int vectorId(TypeDescription::GetTypeId("Vector"));
-
        TypeDescription &ftd(TypeDescription::CreateOrGet("ComplexAnimationFrame"));
        ftd.SetSize(sizeof(FrameProp));
 
@@ -45,4 +44,8 @@ void ComplexAnimation::CreateTypeDescription() {
        ftd.AddField("disposition", FieldDescription(((char *)&fp.disposition) - ((char *)&fp), vectorId, false));
 }
 
+void ComplexAnimation::Construct(void *data) {
+       new (data) ComplexAnimation;
+}
+
 }
index a548cdbb9931b92d6be76388be0713765f0b1497..e35895d9ae5f59c5f03c01cbb20ae0a3a0e6cb00 100644 (file)
@@ -32,6 +32,7 @@ public:
        void SetFrames(const FrameProp *f, int num) { frames = f; numFrames = num; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 protected:
        virtual int NumFrames() const { return numFrames; };
index d151f2559e2ac0da0831dcfdefd5e3ac7aeaff57..e4e538d90250abf4bb06034989f95cf247ba171a 100644 (file)
@@ -82,6 +82,7 @@ void Font::CreateTypeDescription() {
        int spriteId(TypeDescription::GetTypeId("Sprite"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Font"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Font));
 
        td.AddField("sprite", FieldDescription(((char *)&f.sprite) - ((char *)&f), spriteId, true));
@@ -89,4 +90,8 @@ void Font::CreateTypeDescription() {
        td.AddField("rowoffset", FieldDescription(((char *)&f.rowOffset) - ((char *)&f), numberId, false));
 }
 
+void Font::Construct(void *data) {
+       new (data) Font;
+}
+
 }
index 8b365252c79fdb966ef1b287850557808d0aad26..3fcc7d2e8d5257e02b553959c1244aed709e7389 100644 (file)
@@ -37,6 +37,7 @@ public:
        void SetRowOffset(int n) { rowOffset = n; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        const Sprite *sprite;
index db771e5b928a81c7b304e35a53eaca75963ca78e..683bfcb54c0d6b167be6de156137f962ad5d0796 100644 (file)
@@ -126,6 +126,7 @@ void Frame::CreateTypeDescription() {
        int vectorId(TypeDescription::GetTypeId("Vector"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Frame"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Frame));
 
        td.AddField("image", FieldDescription(((char *)&f.surface) - ((char *)&f), imageId, true));
@@ -134,4 +135,8 @@ void Frame::CreateTypeDescription() {
        td.AddField("offset", FieldDescription(((char *)&f.offset) - ((char *)&f), vectorId, false));
 }
 
+void Frame::Construct(void *data) {
+       new (data) Frame;
+}
+
 }
index 75bd6056c4204b761f2bf1472629497f76c1212d..c6fb6027cb413172fee6e5c66036885b5ea30099 100644 (file)
@@ -38,6 +38,7 @@ public:
        void SetOffset(const geometry::Vector<int> &o) { offset = o; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        SDL_Surface *surface;
index 6925c2ff2482ae1a302d60a8d9f3bc77add64a7c..b7023d40538b68075a0085ccd111201bca95f44e 100644 (file)
@@ -91,6 +91,7 @@ void Gauge::CreateTypeDescription() {
        int vectorId(TypeDescription::GetTypeId("Vector"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Gauge"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Gauge));
 
        td.AddField("image", FieldDescription(((char *)&g.surface) - ((char *)&g), imageId, true));
@@ -102,4 +103,8 @@ void Gauge::CreateTypeDescription() {
        td.AddField("end", FieldDescription(((char *)&g.endWidth) - ((char *)&g), numberId, false));
 }
 
+void Gauge::Construct(void *data) {
+       new (data) Gauge;
+}
+
 }
index 82b8952603f92850772137ae9ca7d14ff435f93e..5938a02d32e267ac0e9c571a523c0e1a6f82141b 100644 (file)
@@ -35,6 +35,7 @@ public:
        void SetEndWidth(int w) { endWidth = w; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        SDL_Surface *surface;
index ebb76ff412a818352656dfbbfacdb39b1202c599..92fc898296957dfcf932d3afe45970ae170ff0e3 100644 (file)
@@ -23,6 +23,7 @@ void MenuProperties::CreateTypeDescription() {
        int stringId(TypeDescription::GetTypeId("String"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("MenuProperties"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(MenuProperties));
 
        td.AddField("font", FieldDescription(((char *)&p.font) - ((char *)&p), fontId, true));
@@ -40,4 +41,8 @@ void MenuProperties::CreateTypeDescription() {
        td.AddField("additionalTextGap", FieldDescription(((char *)&p.additionalTextGap) - ((char *)&p), numberId, false));
 }
 
+void MenuProperties::Construct(void *data) {
+       new (data) MenuProperties;
+}
+
 }
index 7aa2e9448794754d57024e36e16252bbba6f0389..e9627389e958323b7012f83e5e639df67640c23a 100644 (file)
@@ -45,6 +45,8 @@ struct MenuProperties {
        : font(font), disabledFont(disabledFont), cursor(cursor), charsPerEntry(charsPerEntry), rows(rows), rowGap(rowGap), iconSpace(iconSpace), cols(cols), colGap(colGap), charsPerNumber(charsPerNumber), charsPerAdditionalText(charsPerAdditionalText), additionalTextGap(additionalTextGap), delimiter(delimiter) { }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
+
 };
 
 template<class T>
index f1c1a724dea74e95b1ef8cdd85d4c75d55cb01e9..cdd3a8e040f784d0bcb4cd76546d0743fc40fb45 100644 (file)
@@ -24,6 +24,7 @@ void SimpleAnimation::CreateTypeDescription() {
        int spriteId(TypeDescription::GetTypeId("Sprite"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("SimpleAnimation"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(SimpleAnimation));
        td.AddSupertype(animationId, ((char *)a) - ((char *)&sa));
 
@@ -33,4 +34,8 @@ void SimpleAnimation::CreateTypeDescription() {
        td.AddField("row", FieldDescription(((char *)&sa.row) - ((char *)&sa), numberId, false));
 }
 
+void SimpleAnimation::Construct(void *data) {
+       new (data) SimpleAnimation;
+}
+
 }
index 81d62443f699fbc144de9c720722eb2cac7c4631..8374f0825363d3b80b05fe222cdfbd4db36ff61c 100644 (file)
@@ -27,6 +27,7 @@ public:
        void SetRow(int r) { row = r; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 protected:
        virtual int NumFrames() const { return numFrames; };
index 28d3b5c215c33a0459ad0963fe3f6393a0d3f9cb..434679ce740db47d280bdaf593f38ae1f85c302f 100644 (file)
@@ -48,6 +48,7 @@ void Sprite::CreateTypeDescription() {
        int vectorId(TypeDescription::GetTypeId("Vector"));
 
        TypeDescription &td(TypeDescription::CreateOrGet("Sprite"));
+       td.SetConstructor(&Construct);
        td.SetSize(sizeof(Sprite));
 
        td.AddField("image", FieldDescription(((char *)&s.surface) - ((char *)&s), imageId, true));
@@ -55,4 +56,8 @@ void Sprite::CreateTypeDescription() {
        td.AddField("offset", FieldDescription(((char *)&s.offset) - ((char *)&s), vectorId, false));
 }
 
+void Sprite::Construct(void *data) {
+       new (data) Sprite;
+}
+
 }
index 257d2dfd6007fba92d2eacd3f2354da2e61ce9d4..c22965a26c5bad802305a89e730420b61cd80cd1 100644 (file)
@@ -44,6 +44,7 @@ public:
        void SetOffset(const geometry::Vector<int> &o) { offset = o; }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
 
 private:
        SDL_Surface *surface;
index 42fb1216d18e207d4e20c843fd2856a0dde15bc4..f9f57bfb55f1fa32a4432b12b5cda29bfc586fe8 100644 (file)
@@ -175,6 +175,7 @@ void *Interpreter::GetObject(int typeId, const Value &v) {
                        int typeId(TypeDescription::GetTypeId(v.GetLiteral().GetTypeName()));
                        const TypeDescription &td(TypeDescription::Get(typeId));
                        char *object(new char[td.Size()]);
+                       td.Construct(object);
                        int id(values[typeId].size());
                        values[typeId].push_back(object);
                        ReadObject(typeId, id, object, *v.GetLiteral().GetProperties());
@@ -250,6 +251,7 @@ void *Interpreter::GetObject(int typeId, const Value &v) {
                                                const TypeDescription &td(TypeDescription::Get(typeId));
                                                id = values[typeId].size();
                                                char *object(new char[td.Size()]);
+                                               td.Construct(object);
                                                ReadObject(typeId, id, object, *v.GetLiteral().GetProperties());
                                        }
                                        break;
@@ -268,6 +270,7 @@ void Interpreter::ReadObject(const Definition &dfn) {
        const TypeDescription &td(TypeDescription::Get(typeId));
        int id(values[typeId].size());
        char *object(new char[td.Size()]);
+       td.Construct(object);
        values[typeId].push_back(object);
        ReadObject(typeId, id, object, *dfn.GetProperties());
        parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, id)));
@@ -290,6 +293,7 @@ void Interpreter::ReadObject(int typeId, int id, char *object, const PropertyLis
                                char *iter(aggregate);
                                vector<PropertyList *> list(i->second->GetLiteral().GetPropertyLists());
                                for (vector<PropertyList *>::const_iterator j(list.begin()), end(list.end()); j != end; ++j, iter += fieldType.Size()) {
+                                       fieldType.Construct(iter);
                                        ReadObject(fieldType.TypeId(), -1, iter, **j);
                                }
                                if (fd.IsReferenced()) {
index 07be7b29f165dd091e36d78e292851377546c858..ed88e8ec8eedee6e3d4f83d482ae7008f39e0440 100644 (file)
@@ -8,6 +8,7 @@
 #include "TypeDescription.h"
 
 #include <cassert>
+#include <cstring>
 #include <stdexcept>
 
 using std::map;
@@ -37,6 +38,14 @@ const FieldDescription &TypeDescription::GetField(const std::string &n) const {
        }
 }
 
+void TypeDescription::Construct(void *data) const {
+       if (constructor) {
+               (*constructor)(data);
+       } else {
+               std::memset(data, 0, Size());
+       }
+}
+
 
 void TypeDescription::AddSupertype(int id, std::ptrdiff_t offset) {
        supertypes[id] = offset;
index 01070394d8b54e0ccc9f9140a04202aad105a6c2..8f2f46c8b698bebf622c7615442ce5e5c46e571b 100644 (file)
@@ -39,7 +39,9 @@ public:
        void AddField(const std::string &name, const FieldDescription &f);
        bool HasField(const std::string &name) const;
        const FieldDescription &GetField(const std::string &name) const;
+       void Construct(void *) const;
 
+       void SetConstructor(void (*ctor)(void *)) { constructor = ctor; }
        void AddSupertype(int id, std::ptrdiff_t offset);
        bool IsSubtypeOf(int id) const;
        bool IsSubtypeOf(const TypeDescription &other) const { return IsSubtypeOf(other.TypeId()); }
@@ -57,9 +59,10 @@ public:
        static const TypeDescription &Get(int id);
 
 private:
-       TypeDescription(int id, const std::string &name) : name(name), id(id), size(0) { }
+       TypeDescription(int id, const std::string &name) : constructor(0), name(name), id(id), size(0) { }
 
 private:
+       void (*constructor)(void *);
        std::string name;
        std::map<std::string, FieldDescription> fields;
        std::map<int, std::ptrdiff_t> supertypes;