summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2017-10-17 23:19:08 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2017-10-17 23:19:08 +0100
commitd305631ad21c584e87d1cb2d9dbb7b0d2b851d92 (patch)
tree1320327012fbc711e38a03307b70338f28fe6bc4
parentRemove unnecessary subclassing of ChildRef (diff)
downloadslicer-d305631ad21c584e87d1cb2d9dbb7b0d2b851d92.tar.bz2
slicer-d305631ad21c584e87d1cb2d9dbb7b0d2b851d92.tar.xz
slicer-d305631ad21c584e87d1cb2d9dbb7b0d2b851d92.zip
Remove need to create ChildRefs on heap
-rw-r--r--slicer/db/sqlSelectDeserializer.cpp2
-rw-r--r--slicer/slicer/modelParts.cpp4
-rw-r--r--slicer/slicer/modelParts.h14
-rw-r--r--slicer/slicer/modelPartsTypes.cpp30
-rw-r--r--slicer/slicer/modelPartsTypes.h32
-rw-r--r--slicer/slicer/modelPartsTypes.impl.h24
-rw-r--r--slicer/slicer/slicer.cpp17
-rw-r--r--slicer/tool/parser.cpp2
-rw-r--r--slicer/xml/serializer.cpp12
-rw-r--r--slicer/xml/serializer.h2
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<ChildRef> 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<std::string> 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<typename T>
- ChildRefPtr ModelPartForComplex<T>::GetAnonChildRef(const HookFilter & flt)
+ ChildRef ModelPartForComplex<T>::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<typename T>
- ChildRefPtr ModelPartForComplex<T>::GetChildRef(const std::string & name, const HookFilter & flt)
+ ChildRef ModelPartForComplex<T>::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<typename T>
@@ -579,11 +579,11 @@ namespace Slicer {
}
template<typename T>
- ChildRefPtr ModelPartForSequence<T>::GetAnonChildRef(const HookFilter &)
+ ChildRef ModelPartForSequence<T>::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<typename T>
@@ -635,20 +635,20 @@ namespace Slicer {
}
template<typename T>
- ChildRefPtr ModelPartForDictionary<T>::GetAnonChildRef(const HookFilter &)
+ ChildRef ModelPartForDictionary<T>::GetAnonChildRef(const HookFilter &)
{
BOOST_ASSERT(this->Model);
- return new ChildRef(new ModelPartForDictionaryElementInserter<T>(this->Model));
+ return ChildRef(new ModelPartForDictionaryElementInserter<T>(this->Model));
}
template<typename T>
- ChildRefPtr ModelPartForDictionary<T>::GetChildRef(const std::string & name, const HookFilter &)
+ ChildRef ModelPartForDictionary<T>::GetChildRef(const std::string & name, const HookFilter &)
{
BOOST_ASSERT(this->Model);
if (name != pairName) {
throw IncorrectElementName(name);
}
- return new ChildRef(new ModelPartForDictionaryElementInserter<T>(this->Model));
+ return ChildRef(new ModelPartForDictionaryElementInserter<T>(this->Model));
}
template<typename T>
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 <compileTimeFormatter.h>
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);