diff options
-rw-r--r-- | slicer/slicer/modelParts.h | 13 | ||||
-rw-r--r-- | slicer/slicer/modelPartsTypes.cpp | 39 | ||||
-rw-r--r-- | slicer/slicer/modelPartsTypes.h | 14 | ||||
-rw-r--r-- | slicer/slicer/modelPartsTypes.impl.h | 37 |
4 files changed, 59 insertions, 44 deletions
diff --git a/slicer/slicer/modelParts.h b/slicer/slicer/modelParts.h index 733e441..8cf3bc5 100644 --- a/slicer/slicer/modelParts.h +++ b/slicer/slicer/modelParts.h @@ -181,24 +181,15 @@ namespace Slicer { class DLL_PUBLIC ModelPartForRootBase : public ModelPart { public: - }; - - template<typename T> - class ModelPartForRoot : public ModelPartForRootBase { - public: - ModelPartForRoot(T & o); + ModelPartForRootBase(ModelPartPtr mp); + virtual const std::string & GetRootName() const = 0; virtual ChildRefPtr GetAnonChildRef(const HookFilter &) override; virtual ChildRefPtr GetChildRef(const std::string & name, const HookFilter &) override; virtual void OnEachChild(const ChildHandler & ch) override; - virtual bool HasValue() const override; virtual ModelPartType GetType() const override; virtual bool IsOptional() const override; - static const std::string rootName; - - private: - T * ModelObject; ModelPartPtr mp; }; } diff --git a/slicer/slicer/modelPartsTypes.cpp b/slicer/slicer/modelPartsTypes.cpp index f518f61..bc3810c 100644 --- a/slicer/slicer/modelPartsTypes.cpp +++ b/slicer/slicer/modelPartsTypes.cpp @@ -46,6 +46,45 @@ namespace Slicer { template class Slicer::ModelPartForRoot<IceUtil::Optional<Ice::Int>>; template class Slicer::ModelPartForRoot<IceUtil::Optional<Ice::Long>>; + // ModelPartForRootBase + ModelPartForRootBase::ModelPartForRootBase(ModelPartPtr m) : + mp(m) + { + } + + ChildRefPtr + ModelPartForRootBase::GetAnonChildRef(const HookFilter &) + { + mp->Create(); + return new ImplicitChildRef(mp); + } + + ChildRefPtr + ModelPartForRootBase::GetChildRef(const std::string & name, const HookFilter & hf) + { + if (name != GetRootName()) { + throw IncorrectElementName(name); + } + return GetAnonChildRef(hf); + } + + void ModelPartForRootBase::OnEachChild(const ChildHandler & ch) + { + ch(GetRootName(), mp, NULL); + } + + ModelPartType + ModelPartForRootBase::GetType() const + { + return mp->GetType(); + } + + bool + ModelPartForRootBase::IsOptional() const + { + return mp->IsOptional(); + } + void ModelPartForSimpleBase::OnEachChild(const ChildHandler &) { } ChildRefPtr ModelPartForSimpleBase::GetAnonChildRef(const HookFilter &) { return NULL; } ChildRefPtr ModelPartForSimpleBase::GetChildRef(const std::string &, const HookFilter &) { return NULL; } diff --git a/slicer/slicer/modelPartsTypes.h b/slicer/slicer/modelPartsTypes.h index ac6ed73..88ee0bd 100644 --- a/slicer/slicer/modelPartsTypes.h +++ b/slicer/slicer/modelPartsTypes.h @@ -4,6 +4,20 @@ #include "modelParts.h" namespace Slicer { + template<typename T> + class DLL_PUBLIC ModelPartForRoot : public ModelPartForRootBase { + public: + ModelPartForRoot(T & o); + + const std::string & GetRootName() const override; + virtual bool HasValue() const override; + + static const std::string rootName; + + private: + T * ModelObject; + }; + class DLL_PUBLIC ModelPartForSimpleBase : public ModelPart { public: virtual void OnEachChild(const ChildHandler &) override; diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h index 071efcf..2de1780 100644 --- a/slicer/slicer/modelPartsTypes.impl.h +++ b/slicer/slicer/modelPartsTypes.impl.h @@ -15,32 +15,15 @@ namespace Slicer { // ModelPartForRoot template<typename T> ModelPartForRoot<T>::ModelPartForRoot(T & o) : - ModelObject(&o), - mp(ModelPart::CreateFor(o)) + ModelPartForRootBase(ModelPart::CreateFor(o)), + ModelObject(&o) { } template<typename T> - ChildRefPtr ModelPartForRoot<T>::GetAnonChildRef(const HookFilter &) + const std::string & ModelPartForRoot<T>::GetRootName() const { - mp->Create(); - return new ImplicitChildRef(mp); - } - - template<typename T> - ChildRefPtr ModelPartForRoot<T>::GetChildRef(const std::string & name, const HookFilter &) - { - if (name != rootName) { - throw IncorrectElementName(name); - } - mp->Create(); - return new ImplicitChildRef(mp); - } - - template<typename T> - void ModelPartForRoot<T>::OnEachChild(const ChildHandler & ch) - { - ch(rootName, mp, NULL); + return rootName; } template<typename T> @@ -49,18 +32,6 @@ namespace Slicer { return ModelObject && mp->HasValue(); } - template<typename T> - ModelPartType ModelPartForRoot<T>::GetType() const - { - return mp->GetType(); - } - - template<typename T> - bool ModelPartForRoot<T>::IsOptional() const - { - return mp->IsOptional(); - } - // ModelPartForSimple template<typename T> ModelPartForSimple<T>::ModelPartForSimple(T & h) : |