summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2015-01-06 19:48:26 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2015-01-06 19:48:26 +0000
commit4fe7df35051600bbcb05b0ebc98efcb90c891cb5 (patch)
treec04134eb9b30ffed1f4920a139aa493be2a68eaf
parentAllow conversions to be specified on a class/struct (diff)
downloadslicer-4fe7df35051600bbcb05b0ebc98efcb90c891cb5.tar.bz2
slicer-4fe7df35051600bbcb05b0ebc98efcb90c891cb5.tar.xz
slicer-4fe7df35051600bbcb05b0ebc98efcb90c891cb5.zip
Replace ModelPartForClassRoot with ModelPartForRoot which should work with any type for a root
-rw-r--r--slicer/slicer/modelParts.h52
-rw-r--r--slicer/slicer/parser.cpp2
-rw-r--r--slicer/slicer/slicer.h4
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);
}