diff options
-rw-r--r-- | slicer/slicer/modelParts.h | 52 | ||||
-rw-r--r-- | slicer/slicer/parser.cpp | 2 | ||||
-rw-r--r-- | slicer/slicer/slicer.h | 4 |
3 files changed, 43 insertions, 15 deletions
diff --git a/slicer/slicer/modelParts.h b/slicer/slicer/modelParts.h index 7ed713f..7cc6332 100644 --- a/slicer/slicer/modelParts.h +++ b/slicer/slicer/modelParts.h @@ -115,6 +115,17 @@ namespace Slicer { virtual const Metadata & GetMetadata() const = 0; }; +#define templateMODELPARTFOR(Type, ModelPart) \ + template <class T> ModelPartPtr ModelPartFor(Type & t); \ + template <class T> ModelPartPtr ModelPartFor(Type * t); + templateMODELPARTFOR(IceInternal::Handle<T>, ModelPartForClass); + templateMODELPARTFOR(std::vector<T>, ModelPartForSequence); + templateMODELPARTFOR(std::list<T>, ModelPartForSequence); + template <class K, class V> ModelPartPtr ModelPartFor(std::map<K, V> & t); + template <class K, class V> ModelPartPtr ModelPartFor(std::map<K, V> * t); + templateMODELPARTFOR(T, ModelPartForStruct); +#undef templateMODELPARTFOR + class ModelPart : public IceUtil::Shared { public: virtual ~ModelPart() = default; @@ -403,17 +414,27 @@ namespace Slicer { }; template<typename T> - class ModelPartForClassRoot : public ModelPartForClass<T> { + class ModelPartForRoot : public ModelPart { public: - ModelPartForClassRoot() : - ModelPartForClass<T>(ModelObject) + ModelPartForRoot() : + ModelObject(new T()), + owned(true), + mp(ModelPartFor(*ModelObject)) + { + } + + ModelPartForRoot(T & o) : + ModelObject(&o), + owned(false), + mp(ModelPartFor(*ModelObject)) { } - ModelPartForClassRoot(T o) : - ModelPartForClass<T>(ModelObject) + ~ModelPartForRoot() { - ModelObject = o; + if (owned) { + delete ModelObject; + } } virtual ModelPartPtr GetChild(const std::string & name, const HookFilter &) override @@ -421,24 +442,31 @@ namespace Slicer { if (!name.empty() && name != rootName) { throw IncorrectElementName(rootName); } - ModelPartForClass<T>::Create(); - return new ModelPartForClass<T>(ModelObject); + mp->Create(); + return mp; } virtual void OnEachChild(const ChildHandler & ch) override { - ch(rootName, new ModelPartForClass<T>(ModelObject), NULL); + ch(rootName, mp, NULL); } - typename T::element_type * GetModel() override + T & GetModel() { - return ModelObject.get(); + return *ModelObject; } virtual bool HasValue() const override { return ModelObject; } + virtual ModelPartType GetType() const override + { + return mp->GetType(); + } + private: - T ModelObject; + T * ModelObject; + bool owned; + ModelPartPtr mp; static std::string rootName; }; diff --git a/slicer/slicer/parser.cpp b/slicer/slicer/parser.cpp index cd11bff..b8f3f89 100644 --- a/slicer/slicer/parser.cpp +++ b/slicer/slicer/parser.cpp @@ -145,7 +145,7 @@ namespace Slicer { fprintf(cpp, "template<>\n"); auto name = metaDataValue("slicer:root:", c->getMetaData()); - fprintf(cpp, "std::string ModelPartForClassRoot< %s >::rootName(\"%s\");\n\n", + fprintf(cpp, "std::string ModelPartForRoot< %s >::rootName(\"%s\");\n\n", typeToString(decl).c_str(), name ? name->c_str() : c->name().c_str()); diff --git a/slicer/slicer/slicer.h b/slicer/slicer/slicer.h index 250f0a7..878a1e6 100644 --- a/slicer/slicer/slicer.h +++ b/slicer/slicer/slicer.h @@ -10,7 +10,7 @@ namespace Slicer { IceInternal::Handle<Object> Deserialize(SerializerParams & ... sp) { - IceUtil::Handle<ModelPartForClassRoot<IceInternal::Handle<Object>>> root = new ModelPartForClassRoot<IceInternal::Handle<Object>>(); + IceUtil::Handle<ModelPartForRoot<IceInternal::Handle<Object>>> root = new ModelPartForRoot<IceInternal::Handle<Object>>(); DeserializerPtr deserializer = new Deserializer(sp ...); deserializer->Deserialize(root); return root->GetModel(); @@ -20,7 +20,7 @@ namespace Slicer { void Serialize(IceInternal::Handle<Object> object, SerializerParams & ... sp) { - IceUtil::Handle<ModelPartForClassRoot<IceInternal::Handle<Object>>> root = new ModelPartForClassRoot<IceInternal::Handle<Object>>(object); + IceUtil::Handle<ModelPartForRoot<IceInternal::Handle<Object>>> root = new ModelPartForRoot<IceInternal::Handle<Object>>(object); SerializerPtr serializer = new Serializer(sp ...); serializer->Serialize(root); } |