From d305631ad21c584e87d1cb2d9dbb7b0d2b851d92 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 17 Oct 2017 23:19:08 +0100 Subject: Remove need to create ChildRefs on heap --- slicer/db/sqlSelectDeserializer.cpp | 2 +- slicer/slicer/modelParts.cpp | 4 ++-- slicer/slicer/modelParts.h | 14 +++++++------- slicer/slicer/modelPartsTypes.cpp | 30 +++++++++++++++--------------- slicer/slicer/modelPartsTypes.h | 32 ++++++++++++++++---------------- slicer/slicer/modelPartsTypes.impl.h | 24 ++++++++++++------------ slicer/slicer/slicer.cpp | 17 ++++++++++++++--- slicer/tool/parser.cpp | 2 +- slicer/xml/serializer.cpp | 12 ++++++------ slicer/xml/serializer.h | 2 +- 10 files changed, 75 insertions(+), 64 deletions(-) diff --git a/slicer/db/sqlSelectDeserializer.cpp b/slicer/db/sqlSelectDeserializer.cpp index a2d5619..366c4f7 100644 --- a/slicer/db/sqlSelectDeserializer.cpp +++ b/slicer/db/sqlSelectDeserializer.cpp @@ -100,7 +100,7 @@ namespace Slicer { return boost::iequals(c.name, h->name); }); if (fmpr) { - auto fmp = fmpr->Child(); + auto fmp = fmpr.Child(); fmp->Create(); fmp->SetValue(SqlSource(c)); fmp->Complete(); diff --git a/slicer/slicer/modelParts.cpp b/slicer/slicer/modelParts.cpp index cc0ee13..e227c07 100644 --- a/slicer/slicer/modelParts.cpp +++ b/slicer/slicer/modelParts.cpp @@ -103,14 +103,14 @@ namespace Slicer { ModelPart::GetAnonChild(const HookFilter & flt) { auto ref = GetAnonChildRef(flt); - return ref ? ref->Child() : ModelPartPtr(NULL); + return ref ? ref.Child() : ModelPartPtr(NULL); } ModelPartPtr ModelPart::GetChild(const std::string & memberName, const HookFilter & flt) { auto ref = GetChildRef(memberName, flt); - return ref ? ref->Child() : ModelPartPtr(NULL); + return ref ? ref.Child() : ModelPartPtr(NULL); } bool diff --git a/slicer/slicer/modelParts.h b/slicer/slicer/modelParts.h index d65ec7c..e659a54 100644 --- a/slicer/slicer/modelParts.h +++ b/slicer/slicer/modelParts.h @@ -107,21 +107,21 @@ namespace Slicer { tcr_Value, }; - class DLL_PUBLIC ChildRef : virtual public IceUtil::Shared { + class DLL_PUBLIC ChildRef { public: + ChildRef(); ChildRef(ModelPartPtr); ChildRef(ModelPartPtr, const Metadata &); ModelPartPtr Child() const; const Metadata & ChildMetaData() const; + operator bool() const; private: ModelPartPtr mpp; const Metadata & mdr; }; - typedef IceUtil::Handle ChildRefPtr; - class DLL_PUBLIC HookCommon : virtual public IceUtil::Shared { public: HookCommon(const std::string &); @@ -149,8 +149,8 @@ namespace Slicer { virtual void OnEachChild(const ChildHandler &) = 0; ModelPartPtr GetAnonChild(const HookFilter & = HookFilter()); ModelPartPtr GetChild(const std::string & memberName, const HookFilter & = HookFilter()); - virtual ChildRefPtr GetAnonChildRef(const HookFilter & = HookFilter()) = 0; - virtual ChildRefPtr GetChildRef(const std::string & memberName, const HookFilter & = HookFilter()) = 0; + virtual ChildRef GetAnonChildRef(const HookFilter & = HookFilter()) = 0; + virtual ChildRef GetChildRef(const std::string & memberName, const HookFilter & = HookFilter()) = 0; virtual ModelPartPtr GetSubclassModelPart(const std::string &); virtual TypeId GetTypeId() const; virtual IceUtil::Optional GetTypeIdProperty() const; @@ -181,8 +181,8 @@ namespace Slicer { 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 ChildRef GetAnonChildRef(const HookFilter &) override; + virtual ChildRef GetChildRef(const std::string & name, const HookFilter &) override; virtual void OnEachChild(const ChildHandler & ch) override; virtual ModelPartType GetType() const override; virtual bool IsOptional() const override; diff --git a/slicer/slicer/modelPartsTypes.cpp b/slicer/slicer/modelPartsTypes.cpp index 1bf7939..5bf7f50 100644 --- a/slicer/slicer/modelPartsTypes.cpp +++ b/slicer/slicer/modelPartsTypes.cpp @@ -34,14 +34,14 @@ namespace Slicer { { } - ChildRefPtr + ChildRef ModelPartForRootBase::GetAnonChildRef(const HookFilter &) { mp->Create(); - return new ChildRef(mp); + return ChildRef(mp); } - ChildRefPtr + ChildRef ModelPartForRootBase::GetChildRef(const std::string & name, const HookFilter & hf) { if (name != GetRootName()) { @@ -74,15 +74,15 @@ namespace Slicer { } void ModelPartForSimpleBase::OnEachChild(const ChildHandler &) { } - ChildRefPtr ModelPartForSimpleBase::GetAnonChildRef(const HookFilter &) { return NULL; } - ChildRefPtr ModelPartForSimpleBase::GetChildRef(const std::string &, const HookFilter &) { return NULL; } + ChildRef ModelPartForSimpleBase::GetAnonChildRef(const HookFilter &) { return ChildRef(); } + ChildRef ModelPartForSimpleBase::GetChildRef(const std::string &, const HookFilter &) { return ChildRef(); } bool ModelPartForSimpleBase::HasValue() const { return true; } ModelPartType ModelPartForSimpleBase::GetType() const { return type; } const 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; } + ChildRef ModelPartForConvertedBase::GetAnonChildRef(const HookFilter &) { return ChildRef(); } + ChildRef ModelPartForConvertedBase::GetChildRef(const std::string &, const HookFilter &) { return ChildRef(); } bool ModelPartForConvertedBase::HasValue() const { return true; } ModelPartType ModelPartForConvertedBase::GetType() const { return type; } const ModelPartType ModelPartForConvertedBase::type = mpt_Simple; @@ -136,20 +136,20 @@ namespace Slicer { } } - ChildRefPtr ModelPartForOptionalBase::GetAnonChildRef(const HookFilter & flt) + ChildRef ModelPartForOptionalBase::GetAnonChildRef(const HookFilter & flt) { if (this->hasModel()) { return modelPart->GetAnonChildRef(flt); } - return NULL; + return ChildRef(); } - ChildRefPtr ModelPartForOptionalBase::GetChildRef(const std::string & name, const HookFilter & flt) + ChildRef ModelPartForOptionalBase::GetChildRef(const std::string & name, const HookFilter & flt) { if (this->hasModel()) { return modelPart->GetChildRef(name, flt); } - return NULL; + return ChildRef(); } void ModelPartForOptionalBase::SetValue(ValueSource && s) @@ -175,8 +175,8 @@ namespace Slicer { } void ModelPartForEnumBase::OnEachChild(const ChildHandler &) { } - ChildRefPtr ModelPartForEnumBase::GetAnonChildRef(const HookFilter &) { return NULL; } - ChildRefPtr ModelPartForEnumBase::GetChildRef(const std::string &, const HookFilter &) { return NULL; } + ChildRef ModelPartForEnumBase::GetAnonChildRef(const HookFilter &) { return ChildRef(); } + ChildRef ModelPartForEnumBase::GetChildRef(const std::string &, const HookFilter &) { return ChildRef(); } bool ModelPartForEnumBase::HasValue() const { return true; } ModelPartType ModelPartForEnumBase::GetType() const { return type; } const ModelPartType ModelPartForEnumBase::type = mpt_Simple; @@ -190,8 +190,8 @@ namespace Slicer { const ModelPartType ModelPartForDictionaryBase::type = mpt_Dictionary; // Streams - ChildRefPtr ModelPartForStreamBase::GetAnonChildRef(const Slicer::HookFilter &) { throw InvalidStreamOperation(__FUNCTION__); } - ChildRefPtr ModelPartForStreamBase::GetChildRef(const std::string &, const Slicer::HookFilter &) { throw InvalidStreamOperation(__FUNCTION__); } + ChildRef ModelPartForStreamBase::GetAnonChildRef(const Slicer::HookFilter &) { throw InvalidStreamOperation(__FUNCTION__); } + ChildRef ModelPartForStreamBase::GetChildRef(const std::string &, const Slicer::HookFilter &) { throw InvalidStreamOperation(__FUNCTION__); } ModelPartType ModelPartForStreamBase::GetType() const { return mpt_Sequence; } bool ModelPartForStreamBase::HasValue() const { return true; } // Stream Roots diff --git a/slicer/slicer/modelPartsTypes.h b/slicer/slicer/modelPartsTypes.h index 7392bbe..a1c4409 100644 --- a/slicer/slicer/modelPartsTypes.h +++ b/slicer/slicer/modelPartsTypes.h @@ -29,8 +29,8 @@ namespace Slicer { 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 ChildRef GetAnonChildRef(const HookFilter &) override; + virtual ChildRef GetChildRef(const std::string &, const HookFilter &) override; virtual bool HasValue() const override; virtual ModelPartType GetType() const override; static const ModelPartType type; @@ -50,8 +50,8 @@ namespace Slicer { 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 ChildRef GetAnonChildRef(const HookFilter &) override; + virtual ChildRef GetChildRef(const std::string &, const HookFilter &) override; virtual bool HasValue() const override; virtual ModelPartType GetType() const override; static const ModelPartType type; @@ -94,8 +94,8 @@ namespace Slicer { public: virtual void OnEachChild(const ChildHandler & ch) override; virtual void Complete() override; - virtual ChildRefPtr GetAnonChildRef(const HookFilter & flt) override; - virtual ChildRefPtr GetChildRef(const std::string & name, const HookFilter & flt) override; + virtual ChildRef GetAnonChildRef(const HookFilter & flt) override; + virtual ChildRef GetChildRef(const std::string & name, const HookFilter & flt) override; virtual void SetValue(ValueSource && s) override; virtual bool HasValue() const override; virtual bool IsOptional() const override; @@ -167,8 +167,8 @@ namespace Slicer { virtual void OnEachChild(const ChildHandler & ch) override; - virtual ChildRefPtr GetAnonChildRef(const HookFilter & flt) override; - ChildRefPtr GetChildRef(const std::string & name, const HookFilter & flt) override; + virtual ChildRef GetAnonChildRef(const HookFilter & flt) override; + ChildRef GetChildRef(const std::string & name, const HookFilter & flt) override; virtual const Metadata & GetMetadata() const override; @@ -229,8 +229,8 @@ namespace Slicer { 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; + ChildRef GetAnonChildRef(const HookFilter &) override; + ChildRef GetChildRef(const std::string &, const HookFilter &) override; virtual bool HasValue() const override; virtual ModelPartType GetType() const override; static const ModelPartType type; @@ -272,9 +272,9 @@ namespace Slicer { virtual void OnEachChild(const ChildHandler & ch) override; - ChildRefPtr GetAnonChildRef(const HookFilter &) override; + ChildRef GetAnonChildRef(const HookFilter &) override; - ChildRefPtr GetChildRef(const std::string &, const HookFilter &) override; + ChildRef GetChildRef(const std::string &, const HookFilter &) override; virtual const Metadata & GetMetadata() const override; @@ -316,9 +316,9 @@ namespace Slicer { virtual void OnEachChild(const ChildHandler & ch) override; - ChildRefPtr GetAnonChildRef(const HookFilter &) override; + ChildRef GetAnonChildRef(const HookFilter &) override; - ChildRefPtr GetChildRef(const std::string & name, const HookFilter &) override; + ChildRef GetChildRef(const std::string & name, const HookFilter &) override; virtual const Metadata & GetMetadata() const override; @@ -341,8 +341,8 @@ namespace Slicer { public: virtual ModelPartType GetType() const override; virtual bool HasValue() const override; - virtual ChildRefPtr GetAnonChildRef(const HookFilter &) override; - virtual ChildRefPtr GetChildRef(const std::string &, const HookFilter &) override; + virtual ChildRef GetAnonChildRef(const HookFilter &) override; + virtual ChildRef GetChildRef(const std::string &, const HookFilter &) override; virtual ModelPartPtr GetContainedModelPart() override = 0; virtual void OnEachChild(const ChildHandler & ch) override = 0; diff --git a/slicer/slicer/modelPartsTypes.impl.h b/slicer/slicer/modelPartsTypes.impl.h index fc8718e..282418c 100644 --- a/slicer/slicer/modelPartsTypes.impl.h +++ b/slicer/slicer/modelPartsTypes.impl.h @@ -335,25 +335,25 @@ namespace Slicer { } template - ChildRefPtr ModelPartForComplex::GetAnonChildRef(const HookFilter & flt) + ChildRef ModelPartForComplex::GetAnonChildRef(const HookFilter & flt) { for (const auto & h : hooks) { if (h->filter(flt)) { - return new ChildRef(h->Get(GetModel()), h->GetMetadata()); + return ChildRef(h->Get(GetModel()), h->GetMetadata()); } } - return NULL; + return ChildRef(); } template - ChildRefPtr ModelPartForComplex::GetChildRef(const std::string & name, const HookFilter & flt) + ChildRef ModelPartForComplex::GetChildRef(const std::string & name, const HookFilter & flt) { for (const auto & h : hooks) { if (h->filter(flt, name)) { - return new ChildRef(h->Get(GetModel()), h->GetMetadata()); + return ChildRef(h->Get(GetModel()), h->GetMetadata()); } } - return NULL; + return ChildRef(); } template @@ -579,11 +579,11 @@ namespace Slicer { } template - ChildRefPtr ModelPartForSequence::GetAnonChildRef(const HookFilter &) + ChildRef ModelPartForSequence::GetAnonChildRef(const HookFilter &) { BOOST_ASSERT(this->Model); this->Model->push_back(typename element_type::value_type()); - return new ChildRef(ModelPart::CreateFor(this->Model->back())); + return ChildRef(ModelPart::CreateFor(this->Model->back())); } template @@ -635,20 +635,20 @@ namespace Slicer { } template - ChildRefPtr ModelPartForDictionary::GetAnonChildRef(const HookFilter &) + ChildRef ModelPartForDictionary::GetAnonChildRef(const HookFilter &) { BOOST_ASSERT(this->Model); - return new ChildRef(new ModelPartForDictionaryElementInserter(this->Model)); + return ChildRef(new ModelPartForDictionaryElementInserter(this->Model)); } template - ChildRefPtr ModelPartForDictionary::GetChildRef(const std::string & name, const HookFilter &) + ChildRef ModelPartForDictionary::GetChildRef(const std::string & name, const HookFilter &) { BOOST_ASSERT(this->Model); if (name != pairName) { throw IncorrectElementName(name); } - return new ChildRef(new ModelPartForDictionaryElementInserter(this->Model)); + return ChildRef(new ModelPartForDictionaryElementInserter(this->Model)); } template diff --git a/slicer/slicer/slicer.cpp b/slicer/slicer/slicer.cpp index e55a8ab..e132281 100644 --- a/slicer/slicer/slicer.cpp +++ b/slicer/slicer/slicer.cpp @@ -3,9 +3,9 @@ #include namespace Slicer { - Slicer::ChildRef::ChildRef(Slicer::ModelPartPtr mp, const Slicer::Metadata & md) : - mpp(mp), - mdr(md) + Slicer::ChildRef::ChildRef() : + mpp(), + mdr(emptyMetadata) { } @@ -15,12 +15,23 @@ namespace Slicer { { } + Slicer::ChildRef::ChildRef(Slicer::ModelPartPtr mp, const Slicer::Metadata & md) : + mpp(mp), + mdr(md) + { + } + ModelPartPtr Slicer::ChildRef::Child() const { return mpp; } + Slicer::ChildRef::operator bool() const + { + return mpp; + } + const Metadata & Slicer::ChildRef::ChildMetaData() const { diff --git a/slicer/tool/parser.cpp b/slicer/tool/parser.cpp index 2e27ca1..49834c0 100644 --- a/slicer/tool/parser.cpp +++ b/slicer/tool/parser.cpp @@ -325,7 +325,7 @@ namespace Slicer { fprintbf(cpp, "// Sequence %s\n", s->name()); fprintbf(cpp, "template<> DLL_PUBLIC\n"); - fprintbf(cpp, "ChildRefPtr ModelPartForSequence< %s >::GetChildRef(const std::string & name, const HookFilter & flt)\n{\n", + fprintbf(cpp, "ChildRef ModelPartForSequence< %s >::GetChildRef(const std::string & name, const HookFilter & flt)\n{\n", s->scoped()); auto iname = metaDataValue("slicer:item:", s->getMetaData()); if (iname) { diff --git a/slicer/xml/serializer.cpp b/slicer/xml/serializer.cpp index 66e8b71..978c489 100644 --- a/slicer/xml/serializer.cpp +++ b/slicer/xml/serializer.cpp @@ -207,7 +207,7 @@ namespace Slicer { auto value = emp->GetChildRef(valueName); key->SetValue(XmlValueSource(element->get_name())); key->Complete(); - DocumentTreeIterateElement(element, value->Child(), value); + DocumentTreeIterateElement(element, value.Child(), value); emp->Complete(); } node = node->get_next_sibling(); @@ -215,7 +215,7 @@ namespace Slicer { } void - XmlDeserializer::DocumentTreeIterateElement(const xmlpp::Element * element, ModelPartPtr smp, ChildRefPtr smpr) + XmlDeserializer::DocumentTreeIterateElement(const xmlpp::Element * element, ModelPartPtr smp, const ChildRef & smpr) { if (auto typeIdPropName = smp->GetTypeIdProperty()) { if (auto typeAttr = element->get_attribute(*typeIdPropName)) { @@ -223,13 +223,13 @@ namespace Slicer { } } smp->Create(); - if (metaDataFlagSet(smpr->ChildMetaData(), md_attributes)) { + if (metaDataFlagSet(smpr.ChildMetaData(), md_attributes)) { auto attrs(element->get_attributes()); if (!attrs.empty()) { DocumentTreeIterateDictAttrs(attrs, smp); } } - else if (metaDataFlagSet(smpr->ChildMetaData(), md_elements)) { + else if (metaDataFlagSet(smpr.ChildMetaData(), md_elements)) { DocumentTreeIterateDictElements(element, smp); } else { @@ -256,8 +256,8 @@ namespace Slicer { auto smpr = mp->GetChildRef(element->get_name(), boost::bind(metaDataFlagNotSet, boost::bind(&Slicer::HookCommon::GetMetadata, _1), md_attribute)); if (smpr) { - auto smp = smpr->Child(); - if (metaDataFlagSet(smpr->ChildMetaData(), md_bare)) { + auto smp = smpr.Child(); + if (metaDataFlagSet(smpr.ChildMetaData(), md_bare)) { smp = smp->GetAnonChild(); } if (smp) { diff --git a/slicer/xml/serializer.h b/slicer/xml/serializer.h index e13b5b5..d41a994 100644 --- a/slicer/xml/serializer.h +++ b/slicer/xml/serializer.h @@ -55,7 +55,7 @@ namespace Slicer { class DLL_PUBLIC XmlDeserializer : public Deserializer { protected: static void DocumentTreeIterate(const xmlpp::Node * node, ModelPartPtr mp); - static void DocumentTreeIterateElement(const xmlpp::Element * element, ModelPartPtr mp, ChildRefPtr c); + static void DocumentTreeIterateElement(const xmlpp::Element * element, ModelPartPtr mp, const ChildRef & c); static void DocumentTreeIterate(const xmlpp::Document * doc, ModelPartPtr mp); static void DocumentTreeIterateDictAttrs(const xmlpp::Element::const_AttributeList & attrs, ModelPartPtr dict); static void DocumentTreeIterateDictElements(const xmlpp::Element * parent, ModelPartPtr dict); -- cgit v1.2.3