summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <daniel.goodliffe@pressassociation.com>2016-10-21 11:25:02 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2016-10-22 12:45:17 +0100
commit16f48c313f4e29892a4730bbf5104ff6d5210492 (patch)
treec5e070df1ab70ec08dc9a91b24905dfa83dcd732
parentMember reference as variable, not template parameter (diff)
downloadslicer-16f48c313f4e29892a4730bbf5104ff6d5210492.tar.bz2
slicer-16f48c313f4e29892a4730bbf5104ff6d5210492.tar.xz
slicer-16f48c313f4e29892a4730bbf5104ff6d5210492.zip
Reference classes by type not handle type in model parts
-rw-r--r--slicer/slicer/modelPartsTypes.h8
-rw-r--r--slicer/slicer/modelPartsTypes.impl.h10
-rw-r--r--slicer/test/conversions.cpp4
-rw-r--r--slicer/test/conversions.h2
-rw-r--r--slicer/tool/parser.cpp17
5 files changed, 24 insertions, 17 deletions
diff --git a/slicer/slicer/modelPartsTypes.h b/slicer/slicer/modelPartsTypes.h
index 363891d..d53be93 100644
--- a/slicer/slicer/modelPartsTypes.h
+++ b/slicer/slicer/modelPartsTypes.h
@@ -167,15 +167,15 @@ namespace Slicer {
};
template<typename T>
- class DLL_PUBLIC ModelPartForClass : public ModelPartForComplex<typename T::element_type>, protected ModelPartModel<T> {
+ class DLL_PUBLIC ModelPartForClass : public ModelPartForComplex<T>, protected ModelPartModel<IceInternal::Handle<T> > {
public:
- typedef T element_type;
+ typedef IceInternal::Handle<T> element_type;
- ModelPartForClass(T & h);
+ ModelPartForClass(element_type & h);
virtual void Create() override;
- typename T::element_type * GetModel() override;
+ T * GetModel() override;
virtual ModelPartPtr GetSubclassModelPart(const std::string & name) override;
diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h
index 443b96b..b3abc2c 100644
--- a/slicer/slicer/modelPartsTypes.impl.h
+++ b/slicer/slicer/modelPartsTypes.impl.h
@@ -204,19 +204,19 @@ namespace Slicer {
// ModelPartForClass
template<typename T>
- ModelPartForClass<T>::ModelPartForClass(T & h) :
- ModelPartModel<T>(h)
+ ModelPartForClass<T>::ModelPartForClass(element_type & h) :
+ ModelPartModel<element_type>(h)
{
}
template<typename T>
void ModelPartForClass<T>::Create()
{
- this->Model = new typename T::element_type();
+ this->Model = new T();
}
template<typename T>
- typename T::element_type * ModelPartForClass<T>::GetModel()
+ T * ModelPartForClass<T>::GetModel()
{
return this->Model.get();
}
@@ -242,7 +242,7 @@ namespace Slicer {
template<typename T>
ModelPartPtr ModelPartForClass<T>::CreateModelPart(void * p)
{
- return new ModelPartForClass<T>(*static_cast<T *>(p));
+ return new ModelPartForClass<T>(*static_cast<element_type *>(p));
}
template<typename T>
diff --git a/slicer/test/conversions.cpp b/slicer/test/conversions.cpp
index 8510089..63de1de 100644
--- a/slicer/test/conversions.cpp
+++ b/slicer/test/conversions.cpp
@@ -109,7 +109,7 @@ namespace TestModule {
int completions = 0;
AbValidator::AbValidator(ClassTypePtr & m) :
- Slicer::ModelPartForClass<ClassTypePtr>(m)
+ Slicer::ModelPartForClass<ClassType>(m)
{
}
@@ -121,7 +121,7 @@ namespace TestModule {
throw std::runtime_error("Mock error");
// LCOV_EXCL_STOP
}
- Slicer::ModelPartForClass<ClassTypePtr>::Complete();
+ Slicer::ModelPartForClass<ClassType>::Complete();
completions += 1;
}
diff --git a/slicer/test/conversions.h b/slicer/test/conversions.h
index e33b670..62a9c4b 100644
--- a/slicer/test/conversions.h
+++ b/slicer/test/conversions.h
@@ -9,7 +9,7 @@
namespace TestModule {
DLL_PUBLIC extern int completions;
- class DLL_PUBLIC AbValidator : public Slicer::ModelPartForClass<ClassTypePtr> {
+ class DLL_PUBLIC AbValidator : public Slicer::ModelPartForClass<ClassType> {
public:
AbValidator(ClassTypePtr &);
diff --git a/slicer/tool/parser.cpp b/slicer/tool/parser.cpp
index 5aa5f5c..466f4dd 100644
--- a/slicer/tool/parser.cpp
+++ b/slicer/tool/parser.cpp
@@ -188,7 +188,7 @@ namespace Slicer {
fprintbf(cpp, "template<> DLL_PUBLIC\n");
auto typeId = metaDataValue("slicer:typeid:", c->getMetaData());
fprintbf(cpp, "const std::string ModelPartForClass< %s >::typeIdProperty(\"%s\");\n\n",
- typeToString(decl),
+ decl->typeId(),
typeId ? *typeId : "slicer-typeid");
auto name = metaDataValue("slicer:root:", c->getMetaData());
@@ -197,10 +197,10 @@ namespace Slicer {
auto typeName = metaDataValue("slicer:typename:", c->getMetaData());
fprintbf(cpp, "template<> DLL_PUBLIC\n");
fprintbf(cpp, "__attribute__ ((init_priority(209)))\nconst std::string ModelPartForClass< %s >::className(\"%s\");\n",
- typeToString(decl), c->scoped());
+ decl->typeId(), c->scoped());
fprintbf(cpp, "template<> DLL_PUBLIC\n");
fprintbf(cpp, "__attribute__ ((init_priority(209)))\nconst IceUtil::Optional<std::string> ModelPartForClass< %s >::typeName",
- typeToString(decl));
+ decl->typeId());
if (typeName) {
fprintbf(cpp, "(\"%s\")",
*typeName);
@@ -215,7 +215,14 @@ namespace Slicer {
copyMetadata(c->getMetaData());
fprintbf(cpp, ";\n\n");
- defineMODELPART(stringbf("::IceInternal::Handle< %s >", c->scoped()), decl, c->getMetaData());
+ if (auto cmp = metaDataValue("slicer:custommodelpart:", c->getMetaData())) {
+ fprintbf(cpp, "CUSTOMMODELPARTFOR(%s, %s< %s >, %s);\n\n",
+ Slice::typeToString(decl), getBasicModelPart(decl), c->scoped(), boost::algorithm::replace_all_copy(*cmp, ".", "::"));
+ }
+ else {
+ fprintbf(cpp, "CUSTOMMODELPARTFOR(%s, ModelPartForClass<%s>, ModelPartForClass<%s>);\n\n",
+ Slice::typeToString(decl), c->scoped(), c->scoped());
+ }
classNo += 1;
@@ -471,7 +478,7 @@ namespace Slicer {
}
else {
fprintbf(cpp, "%s< %s >",
- getBasicModelPart(type), Slice::typeToString(type));
+ getBasicModelPart(type), Slice::ClassDeclPtr::dynamicCast(type) ? type->typeId() : Slice::typeToString(type));
}
}