From 777d6a896acfaf95c9438450de840efeb1769cbe Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 6 Oct 2016 21:55:06 +0100 Subject: Detemplate class registration a bit --- slicer/slicer/modelParts.cpp | 12 ++++++------ slicer/slicer/modelParts.h | 4 ++-- slicer/slicer/modelPartsTypes.cpp | 14 ++++++++++++++ slicer/slicer/modelPartsTypes.h | 4 ++++ slicer/slicer/modelPartsTypes.impl.h | 10 ++-------- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/slicer/slicer/modelParts.cpp b/slicer/slicer/modelParts.cpp index b53997e..9c2c6e9 100644 --- a/slicer/slicer/modelParts.cpp +++ b/slicer/slicer/modelParts.cpp @@ -3,12 +3,13 @@ namespace Slicer { const Metadata emptyMetadata; + static ClassNameMap names __attribute__((init_priority(209))); + static ClassRefMap refs __attribute__((init_priority(209))); - ClassNameMap * & + ClassNameMap * classNameMap() { - static ClassNameMap * refs = new ClassNameMap(); - return refs; + return &names; } const std::string & @@ -31,11 +32,10 @@ namespace Slicer { return name; } - ClassRefMap * & + ClassRefMap * classRefMap() { - static ClassRefMap * refs = new ClassRefMap(); - return refs; + return &refs; } void diff --git a/slicer/slicer/modelParts.h b/slicer/slicer/modelParts.h index 59f12c7..c131dc8 100644 --- a/slicer/slicer/modelParts.h +++ b/slicer/slicer/modelParts.h @@ -89,9 +89,9 @@ namespace Slicer { typedef boost::function ClassRef; typedef boost::function HookFilter; typedef std::map ClassRefMap; - DLL_PUBLIC ClassRefMap * & classRefMap(); + DLL_PUBLIC ClassRefMap * classRefMap(); typedef boost::bimap ClassNameMap; - DLL_PUBLIC ClassNameMap * & classNameMap(); + DLL_PUBLIC ClassNameMap * classNameMap(); typedef std::list Metadata; DLL_PUBLIC extern const Metadata emptyMetadata; diff --git a/slicer/slicer/modelPartsTypes.cpp b/slicer/slicer/modelPartsTypes.cpp index 7cf508e..e5744df 100644 --- a/slicer/slicer/modelPartsTypes.cpp +++ b/slicer/slicer/modelPartsTypes.cpp @@ -83,6 +83,20 @@ namespace Slicer { ModelPartType ModelPartForComplexBase::GetType() const { return type; } const ModelPartType ModelPartForComplexBase::type = mpt_Complex; + void ModelPartForComplexBase::registerClass(const std::string & className, const TypeId & typeName, const ClassRef & cr) + { + Slicer::classRefMap()->insert({ className, cr }); + if (typeName) { + Slicer::classNameMap()->insert({ className, *typeName }); + } + } + void ModelPartForComplexBase::unregisterClass(const std::string & className, const TypeId & typeName) + { + Slicer::classRefMap()->erase(className); + if (typeName) { + Slicer::classNameMap()->left.erase(className); + } + } void ModelPartForEnumBase::OnEachChild(const ChildHandler &) { } ChildRefPtr ModelPartForEnumBase::GetAnonChildRef(const HookFilter &) { return NULL; } diff --git a/slicer/slicer/modelPartsTypes.h b/slicer/slicer/modelPartsTypes.h index a1230e9..483d8a7 100644 --- a/slicer/slicer/modelPartsTypes.h +++ b/slicer/slicer/modelPartsTypes.h @@ -90,6 +90,10 @@ namespace Slicer { public: virtual ModelPartType GetType() const override; static const ModelPartType type; + + protected: + static void registerClass(const std::string & className, const TypeId & typeName, const ClassRef &); + static void unregisterClass(const std::string & className, const TypeId & typeName); }; template diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h index d8d86bc..658e95b 100644 --- a/slicer/slicer/modelPartsTypes.impl.h +++ b/slicer/slicer/modelPartsTypes.impl.h @@ -307,19 +307,13 @@ namespace Slicer { template void ModelPartForClass::registerClass() { - Slicer::classRefMap()->insert({ className, &ModelPartForClass::CreateModelPart }); - if (typeName) { - Slicer::classNameMap()->insert({ className, *typeName }); - } + ModelPartForComplexBase::registerClass(className, typeName, &ModelPartForClass::CreateModelPart); } template void ModelPartForClass::unregisterClass() { - Slicer::classRefMap()->erase(className); - if (typeName) { - Slicer::classNameMap()->left.erase(className); - } + ModelPartForComplexBase::unregisterClass(className, typeName); } template -- cgit v1.2.3