diff options
-rw-r--r-- | slicer/slicer/modelPartsTypes.h | 46 | ||||
-rw-r--r-- | slicer/slicer/modelPartsTypes.impl.h | 89 |
2 files changed, 63 insertions, 72 deletions
diff --git a/slicer/slicer/modelPartsTypes.h b/slicer/slicer/modelPartsTypes.h index 45ba1f6..ee5a083 100644 --- a/slicer/slicer/modelPartsTypes.h +++ b/slicer/slicer/modelPartsTypes.h @@ -2,13 +2,6 @@ #define SLICER_MODELPARTSTYPES_H #include "modelParts.h" -#include <Ice/ObjectF.h> -#include <boost/multi_index_container_fwd.hpp> -#include <boost/multi_index/sequenced_index_fwd.hpp> -#include <boost/multi_index/ordered_index_fwd.hpp> -#include <boost/multi_index/global_fun.hpp> -#include <boost/multi_index/member.hpp> -#include <boost/bimap.hpp> namespace Slicer { template<typename T> @@ -147,37 +140,14 @@ namespace Slicer { template<typename T> class DLL_PUBLIC ModelPartForComplex : public ModelPartForComplexBase { public: - class DLL_PRIVATE HookBase : public HookCommon { - public: - HookBase(const std::string & n); - virtual ~HookBase() = default; - - virtual ModelPartPtr Get(T * t) const = 0; - virtual const Metadata & GetMetadata() const override; - }; + class DLL_PRIVATE HookBase; typedef std::unique_ptr<HookBase> HookPtr; template <typename MT, typename MP> - class DLL_PRIVATE Hook : public HookBase { - public: - Hook(MT T::* m, const std::string & n); - - ModelPartPtr Get(T * t) const override; - - private: - const MT T::* member; - }; + class DLL_PRIVATE Hook; template <typename MT, typename MP> - class DLL_PRIVATE HookMetadata : public Hook<MT, MP> { - public: - HookMetadata(MT T::* member, const std::string & n, const Metadata & md); - - virtual const Metadata & GetMetadata() const override; - - const Metadata metadata; - }; - + class DLL_PRIVATE HookMetadata; virtual void OnEachChild(const ChildHandler & ch) override; @@ -192,13 +162,7 @@ namespace Slicer { template<typename R> DLL_PRIVATE ChildRef GetChildRefFromRange(const R & range, const HookFilter & flt); - typedef boost::multi_index_container< - HookPtr, - boost::multi_index::indexed_by< - boost::multi_index::sequenced<>, - boost::multi_index::ordered_non_unique<boost::multi_index::member<HookCommon, const std::string, &HookCommon::name>>, - boost::multi_index::ordered_non_unique<boost::multi_index::global_fun<const HookCommon &, std::string, &ModelPartForComplexBase::hookNameLower>> - >> Hooks; + class DLL_PRIVATE Hooks; template<typename H, typename ... P> static void addHook(Hooks &, const P & ...); @@ -269,7 +233,7 @@ namespace Slicer { class DLL_PUBLIC ModelPartForEnum : public ModelPartForEnumBase, protected ModelPartModel<T> { public: typedef T element_type; - typedef boost::bimap<T, std::string> Enumerations; + class DLL_PRIVATE Enumerations; ModelPartForEnum(T * s); diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h index 408327d..f8e2ba6 100644 --- a/slicer/slicer/modelPartsTypes.impl.h +++ b/slicer/slicer/modelPartsTypes.impl.h @@ -8,7 +8,10 @@ #include <boost/multi_index_container.hpp> #include <boost/multi_index/sequenced_index.hpp> #include <boost/multi_index/ordered_index.hpp> +#include <boost/multi_index/global_fun.hpp> +#include <boost/multi_index/member.hpp> #include <boost/algorithm/string/case_conv.hpp> +#include <boost/bimap.hpp> #define CUSTOMMODELPARTFOR(Type, BaseModelPart, ModelPartType) \ template<> ModelPartPtr ModelPart::CreateFor<Type>() { return std::make_shared<ModelPartType>(nullptr); } \ @@ -316,6 +319,15 @@ namespace Slicer { // ModelPartForComplex template<typename T> + class ModelPartForComplex<T>::Hooks : public boost::multi_index_container< + HookPtr, + boost::multi_index::indexed_by< + boost::multi_index::sequenced<>, + boost::multi_index::ordered_non_unique<boost::multi_index::member<HookCommon, const std::string, &HookCommon::name>>, + boost::multi_index::ordered_non_unique<boost::multi_index::global_fun<const HookCommon &, std::string, &ModelPartForComplexBase::hookNameLower>>>> { + }; + + template<typename T> void ModelPartForComplex<T>::OnEachChild(const ChildHandler & ch) { for (const auto & h : hooks) { @@ -369,46 +381,57 @@ namespace Slicer { } template<typename T> - ModelPartForComplex<T>::HookBase::HookBase(const std::string & n) : - HookCommon(n) - { - } + class DLL_PRIVATE ModelPartForComplex<T>::HookBase : public HookCommon { + public: + HookBase(const std::string & n) : + HookCommon(n) + { + } + virtual ~HookBase() = default; - template<typename T> - const Metadata & ModelPartForComplex<T>::HookBase::GetMetadata() const - { - return emptyMetadata; - } + virtual ModelPartPtr Get(T * t) const = 0; + virtual const Metadata & GetMetadata() const override + { + return emptyMetadata; + } + }; template<typename T> template<typename MT, typename MP> - ModelPartForComplex<T>::Hook<MT, MP>::Hook(MT T::* m, const std::string & n) : - HookBase(n), - member(m) - { - } + class DLL_PRIVATE ModelPartForComplex<T>::Hook : public ModelPartForComplex<T>::HookBase { + public: + Hook(MT T::* m, const std::string & n) : + HookBase(n), + member(m) + { + } - template<typename T> - template<typename MT, typename MP> - ModelPartPtr ModelPartForComplex<T>::Hook<MT, MP>::Get(T * t) const - { - return std::make_shared<MP>(t ? const_cast<typename std::remove_const<MT>::type *>(&(t->*member)) : NULL); - } + ModelPartPtr Get(T * t) const override + { + return std::make_shared<MP>(t ? const_cast<typename std::remove_const<MT>::type *>(&(t->*member)) : NULL); + } - template<typename T> - template<typename MT, typename MP> - ModelPartForComplex<T>::HookMetadata<MT, MP>::HookMetadata(MT T::* member, const std::string & n, const Metadata & md) : - Hook<MT, MP>(member, n), - metadata(md) - { - } + private: + const MT T::* member; + }; template<typename T> template<typename MT, typename MP> - const Metadata & ModelPartForComplex<T>::HookMetadata<MT, MP>::GetMetadata() const - { - return metadata; - } + class DLL_PRIVATE ModelPartForComplex<T>::HookMetadata : public ModelPartForComplex<T>::template Hook<MT, MP> { + public: + HookMetadata(MT T::* member, const std::string & n, const Metadata & md) : + Hook<MT, MP>(member, n), + metadata(md) + { + } + + virtual const Metadata & GetMetadata() const override + { + return metadata; + } + + const Metadata metadata; + }; // ModelPartForClass template<typename T> @@ -520,6 +543,10 @@ namespace Slicer { // ModelPartForEnum template<typename T> + class ModelPartForEnum<T>::Enumerations : public boost::bimap<T, std::string> { + }; + + template<typename T> ModelPartForEnum<T>::ModelPartForEnum(T * s) : ModelPartModel<T>(s) { |