diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-12-06 03:05:32 +0000 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-12-06 03:05:32 +0000 | 
| commit | 48e2910a73cbc06d8e6f772b799be0015ba97931 (patch) | |
| tree | 809d649ad12ed6037d4fe36e22a3f6f0a7da5d4f | |
| parent | Fix visibility in Slicer parser (diff) | |
| download | slicer-48e2910a73cbc06d8e6f772b799be0015ba97931.tar.bz2 slicer-48e2910a73cbc06d8e6f772b799be0015ba97931.tar.xz slicer-48e2910a73cbc06d8e6f772b799be0015ba97931.zip | |
Push non-template dependent functions of model parts into common non-template base classes. Use them to return consistent value of model type in optional
| -rw-r--r-- | slicer/slicer/modelParts.cpp | 32 | ||||
| -rw-r--r-- | slicer/slicer/modelParts.h | 99 | 
2 files changed, 90 insertions, 41 deletions
| diff --git a/slicer/slicer/modelParts.cpp b/slicer/slicer/modelParts.cpp index 722417d..3c839e8 100644 --- a/slicer/slicer/modelParts.cpp +++ b/slicer/slicer/modelParts.cpp @@ -128,5 +128,37 @@ namespace Slicer {  	template<> DLL_PUBLIC std::string Slicer::ModelPartForRoot<IceUtil::Optional<Ice::Short>>::rootName = "OptionalShort";  	template<> DLL_PUBLIC std::string Slicer::ModelPartForRoot<IceUtil::Optional<Ice::Int>>::rootName = "OptionalInt";  	template<> DLL_PUBLIC std::string Slicer::ModelPartForRoot<IceUtil::Optional<Ice::Long>>::rootName = "OptionalLong"; + +	void ModelPartForSimpleBase::OnEachChild(const ChildHandler &) { } +	ChildRefPtr ModelPartForSimpleBase::GetAnonChildRef(const HookFilter &) { return NULL; } +	ChildRefPtr ModelPartForSimpleBase::GetChildRef(const std::string &, const HookFilter &) { return NULL; } +	bool ModelPartForSimpleBase::HasValue() const { return true; } +	ModelPartType ModelPartForSimpleBase::GetType() const { return type; } +	ModelPartType ModelPartForSimpleBase::type = mpt_Simple; + +	void ModelPartForConvertedBase::OnEachChild(const ChildHandler &) { } +	ChildRefPtr ModelPartForConvertedBase::GetAnonChildRef(const HookFilter &) { return NULL; } +	ChildRefPtr ModelPartForConvertedBase::GetChildRef(const std::string &, const HookFilter &) { return NULL; } +	bool ModelPartForConvertedBase::HasValue() const { return true; } +	ModelPartType ModelPartForConvertedBase::GetType() const { return type; } +	ModelPartType ModelPartForConvertedBase::type = mpt_Simple; + +	ModelPartType ModelPartForComplexBase::GetType() const { return type; } +	ModelPartType ModelPartForComplexBase::type = mpt_Complex; + +	void ModelPartForEnumBase::OnEachChild(const ChildHandler &) { } +	ChildRefPtr ModelPartForEnumBase::GetAnonChildRef(const HookFilter &) { return NULL; } +	ChildRefPtr ModelPartForEnumBase::GetChildRef(const std::string &, const HookFilter &) { return NULL; } +	bool ModelPartForEnumBase::HasValue() const { return true; } +	ModelPartType ModelPartForEnumBase::GetType() const { return type; } +	ModelPartType ModelPartForEnumBase::type = mpt_Simple; + +	bool ModelPartForSequenceBase::HasValue() const { return true; } +	ModelPartType ModelPartForSequenceBase::GetType() const { return type; } +	ModelPartType ModelPartForSequenceBase::type = mpt_Sequence; + +	bool ModelPartForDictionaryBase::HasValue() const { return true; } +	ModelPartType ModelPartForDictionaryBase::GetType() const { return type; } +	ModelPartType ModelPartForDictionaryBase::type = mpt_Dictionary;  } diff --git a/slicer/slicer/modelParts.h b/slicer/slicer/modelParts.h index fa365ce..6903de6 100644 --- a/slicer/slicer/modelParts.h +++ b/slicer/slicer/modelParts.h @@ -200,8 +200,18 @@ namespace Slicer {  			static const std::string & ToModelTypeName(const std::string &);  	}; +	class DLL_PUBLIC ModelPartForSimpleBase : public ModelPart { +		public: +			virtual void OnEachChild(const ChildHandler &) override; +			virtual ChildRefPtr GetAnonChildRef(const HookFilter &) override; +			virtual ChildRefPtr GetChildRef(const std::string &, const HookFilter &) override; +			virtual bool HasValue() const override; +			virtual ModelPartType GetType() const override; +			static ModelPartType type; +	}; +  	template<typename T> -	class DLL_PUBLIC ModelPartForSimple : public ModelPart { +	class DLL_PUBLIC ModelPartForSimple : public ModelPartForSimpleBase {  		public:  			typedef T element_type; @@ -213,20 +223,25 @@ namespace Slicer {  				Member(*h)  			{  			} -			virtual void OnEachChild(const ChildHandler &) override { } -			virtual ChildRefPtr GetAnonChildRef(const HookFilter &) override { return NULL; } -			virtual ChildRefPtr GetChildRef(const std::string &, const HookFilter &) override { return NULL; }  			virtual void SetValue(ValueSourcePtr s) override { s->set(Member); }  			virtual void GetValue(ValueTargetPtr s) override { s->get(Member); } -			virtual bool HasValue() const override { return true; } -			virtual ModelPartType GetType() const override { return mpt_Simple; }  		private:  			T & Member;  	}; +	class DLL_PUBLIC ModelPartForConvertedBase : public ModelPart { +		public: +			virtual void OnEachChild(const ChildHandler &) override; +			virtual ChildRefPtr GetAnonChildRef(const HookFilter &) override; +			virtual ChildRefPtr GetChildRef(const std::string &, const HookFilter &) override; +			virtual bool HasValue() const override; +			virtual ModelPartType GetType() const override; +			static ModelPartType type; +	}; +  	template<typename T, typename M, T M::* MV> -	class DLL_PUBLIC ModelPartForConverted : public ModelPart { +	class DLL_PUBLIC ModelPartForConverted : public ModelPartForConvertedBase {  		public:  			typedef T element_type; @@ -238,13 +253,8 @@ namespace Slicer {  				Member(*h)  			{  			} -			virtual void OnEachChild(const ChildHandler &) { } -			virtual ChildRefPtr GetAnonChildRef(const HookFilter &) override { return NULL; } -			virtual ChildRefPtr GetChildRef(const std::string &, const HookFilter &) override { return NULL; }  			virtual void SetValue(ValueSourcePtr s) override;  			virtual void GetValue(ValueTargetPtr s) override; -			virtual bool HasValue() const override { return true; } -			virtual ModelPartType GetType() const { return mpt_Simple; }  		private:  			T & Member; @@ -320,10 +330,7 @@ namespace Slicer {  			virtual ModelPartType GetType() const  			{ -				if (HasValue()) { -					return modelPart->GetType(); -				} -				return mpt_Null; +				return T::type;  			}  			virtual const Metadata & GetMetadata() const override { return modelPart->GetMetadata(); } @@ -332,8 +339,14 @@ namespace Slicer {  			ModelPartPtr modelPart;  	}; +	class DLL_PUBLIC ModelPartForComplexBase : public ModelPart { +		public: +			virtual ModelPartType GetType() const override; +			static ModelPartType type; +	}; +  	template<typename T> -	class DLL_PUBLIC ModelPartForComplex : public ModelPart { +	class DLL_PUBLIC ModelPartForComplex : public ModelPartForComplexBase {  		public:  			class HookBase : public HookCommon {  				public: @@ -400,8 +413,6 @@ namespace Slicer {  				return NULL;  			} -			virtual ModelPartType GetType() const { return mpt_Complex; } -  			virtual const Metadata & GetMetadata() const override { return metadata; }  			virtual T * GetModel() = 0; @@ -412,7 +423,7 @@ namespace Slicer {  			static Hooks hooks;  			static Metadata metadata;  	}; -	 +  	template<typename T>  	class DLL_PUBLIC ModelPartForClass : public ModelPartForComplex<typename T::element_type> {  		public: @@ -547,8 +558,18 @@ namespace Slicer {  			DLL_PUBLIC static std::string rootName;  	}; +	class DLL_PUBLIC ModelPartForEnumBase : public ModelPart { +		public: +			virtual void OnEachChild(const ChildHandler &) override; +			ChildRefPtr GetAnonChildRef(const HookFilter &) override; +			ChildRefPtr GetChildRef(const std::string &, const HookFilter &) override; +			virtual bool HasValue() const override; +			virtual ModelPartType GetType() const override; +			static ModelPartType type; +	}; +  	template<typename T> -	class DLL_PUBLIC ModelPartForEnum : public ModelPart { +	class DLL_PUBLIC ModelPartForEnum : public ModelPartForEnumBase {  		public:  			typedef T element_type;  			typedef boost::bimap<T, std::string> Enumerations; @@ -563,16 +584,6 @@ namespace Slicer {  			{  			} -			virtual void OnEachChild(const ChildHandler &) override { } - -			ChildRefPtr GetAnonChildRef(const HookFilter &) override { return NULL; } - -			ChildRefPtr GetChildRef(const std::string &, const HookFilter &) override { return NULL; } - -			virtual bool HasValue() const override { return true; } - -			virtual ModelPartType GetType() const { return mpt_Simple; } -  			virtual const Metadata & GetMetadata() const override { return metadata; }  			virtual void SetValue(ValueSourcePtr s) override; @@ -585,8 +596,15 @@ namespace Slicer {  			static Enumerations enumerations;  	}; +	class DLL_PUBLIC ModelPartForSequenceBase : public ModelPart { +		public: +			virtual bool HasValue() const override; +			virtual ModelPartType GetType() const override; +			static ModelPartType type; +	}; +  	template<typename T> -	class DLL_PUBLIC ModelPartForSequence : public ModelPart { +	class DLL_PUBLIC ModelPartForSequence : public ModelPartForSequenceBase {  		public:  			typedef T element_type; @@ -615,10 +633,6 @@ namespace Slicer {  			ChildRefPtr GetChildRef(const std::string &, const HookFilter &) override; -			virtual bool HasValue() const override { return true; } - -			virtual ModelPartType GetType() const { return mpt_Sequence; } -  			virtual const Metadata & GetMetadata() const override { return metadata; }  		private: @@ -667,8 +681,15 @@ namespace Slicer {  			T & dictionary;  	}; +	class DLL_PUBLIC ModelPartForDictionaryBase : public ModelPart { +		public: +			virtual bool HasValue() const override; +			virtual ModelPartType GetType() const override; +			static ModelPartType type; +	}; +  	template<typename T> -	class DLL_PUBLIC ModelPartForDictionary : public ModelPart { +	class DLL_PUBLIC ModelPartForDictionary : public ModelPartForDictionaryBase {  		public:  			typedef T element_type; @@ -702,10 +723,6 @@ namespace Slicer {  				return new ImplicitChildRef(new ModelPartForDictionaryElementInserter<T>(dictionary));  			} -			virtual bool HasValue() const override { return true; } - -			virtual ModelPartType GetType() const { return mpt_Dictionary; } -  			virtual const Metadata & GetMetadata() const override { return metadata; }  		private: | 
