From 041637576884a1ad08c4e11912099d1d47510952 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 20 Aug 2023 13:30:49 +0100 Subject: Make ModelPartRoots on stack --- slicer/slicer/modelParts.h | 4 ++-- slicer/slicer/modelPartsTypes.impl.h | 23 +++++++++++------------ slicer/slicer/slicer.h | 8 ++++++-- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/slicer/slicer/modelParts.h b/slicer/slicer/modelParts.h index f521257..da929ba 100644 --- a/slicer/slicer/modelParts.h +++ b/slicer/slicer/modelParts.h @@ -80,13 +80,13 @@ namespace Slicer { using ModelPartPtr = std::shared_ptr; using ModelPartUPtr = std::unique_ptr; - using ModelPartForRootPtr = std::unique_ptr; using ModelPartParam = any_ptr; using ModelPartForRootParam = any_ptr; using TypeId = std::optional; using Metadata = MetaData<>; using ChildHandler = std::function; using ModelPartHandler = std::function; + using ModelPartRootHandler = std::function; using SubPartHandler = std::function; using ClassRef = std::function; using HookFilter = std::function; @@ -142,7 +142,7 @@ namespace Slicer { template static ModelPartPtr Make(typename MP::element_type * t); template static ModelPartPtr CreateFor(T & t); template static ModelPartPtr CreateFor(Default &&); - template static ModelPartForRootPtr CreateRootFor(T & t); + template static void OnRootFor(T & t, const ModelPartRootHandler &); virtual void OnEachChild(const ChildHandler &); virtual bool OnAnonChild(const SubPartHandler &, const HookFilter & = HookFilter()); diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h index 3a4076e..393809f 100644 --- a/slicer/slicer/modelPartsTypes.impl.h +++ b/slicer/slicer/modelPartsTypes.impl.h @@ -67,21 +67,21 @@ namespace Ice { { \ return CreateFor(const_cast &>(s)); \ } \ - template<> DLL_PUBLIC ModelPartForRootPtr ModelPart::CreateRootFor(Type & s) \ + template<> DLL_PUBLIC void ModelPart::OnRootFor(Type & s, const ModelPartRootHandler & h) \ { \ - return std::make_unique>(&s); \ + h(ModelPartForRoot(&s)); \ } \ - template<> DLL_PUBLIC ModelPartForRootPtr ModelPart::CreateRootFor(Ice::optional & s) \ + template<> DLL_PUBLIC void ModelPart::OnRootFor(Ice::optional & s, const ModelPartRootHandler & h) \ { \ - return std::make_unique>>(&s); \ + h(ModelPartForRoot>(&s)); \ } \ - template<> DLL_PUBLIC ModelPartForRootPtr ModelPart::CreateRootFor(const Type & s) \ + template<> DLL_PUBLIC void ModelPart::OnRootFor(const Type & s, const ModelPartRootHandler & h) \ { \ - return CreateRootFor(const_cast(s)); \ + return OnRootFor(const_cast(s), h); \ } \ - template<> DLL_PUBLIC ModelPartForRootPtr ModelPart::CreateRootFor(const Ice::optional & s) \ + template<> DLL_PUBLIC void ModelPart::OnRootFor(const Ice::optional & s, const ModelPartRootHandler & h) \ { \ - return CreateRootFor(const_cast &>(s)); \ + return OnRootFor(const_cast &>(s), h); \ } \ template class BaseModelPart; \ template class ModelPartForRoot; \ @@ -91,11 +91,10 @@ namespace Ice { #define MODELPARTFORSTREAM(StreamImpl) \ namespace Slicer { \ template<> \ - DLL_PUBLIC ModelPartForRootPtr \ - ModelPart::CreateRootFor(const StreamImpl & stream) \ + DLL_PUBLIC void \ + ModelPart::OnRootFor(const StreamImpl & stream, const ModelPartRootHandler & h) \ { \ - return std::make_unique>( \ - const_cast(&stream)); \ + h(ModelPartForStreamRoot(const_cast(&stream))); \ } \ } diff --git a/slicer/slicer/slicer.h b/slicer/slicer/slicer.h index 66e4537..cb15af2 100644 --- a/slicer/slicer/slicer.h +++ b/slicer/slicer/slicer.h @@ -11,7 +11,9 @@ namespace Slicer { DeserializeAnyWith(any_ptr deserializer) { Object object {}; - deserializer->Deserialize(ModelPart::CreateRootFor(object)); + ModelPart::OnRootFor(object, [deserializer](auto && mp) { + deserializer->Deserialize(mp); + }); return object; } @@ -26,7 +28,9 @@ namespace Slicer { void SerializeAnyWith(const Object & object, any_ptr serializer) { - serializer->Serialize(ModelPart::CreateRootFor(object)); + ModelPart::OnRootFor(object, [serializer](auto && mp) { + serializer->Serialize(mp); + }); } template -- cgit v1.2.3