From 08a92468feea1994f22eeaf9034d19882feeb7c7 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 8 Aug 2017 16:51:37 +0200 Subject: [PATCH] PVStructure::getSubField() const propagation --- src/pv/pvData.h | 55 ++++++++++++++++++++++++++++++++++++----- src/pv/valueBuilder.cpp | 8 +++--- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/pv/pvData.h b/src/pv/pvData.h index 0825e51..cae9031 100644 --- a/src/pv/pvData.h +++ b/src/pv/pvData.h @@ -788,13 +788,25 @@ public: * @endcode */ template - FORCE_INLINE std::tr1::shared_ptr getSubField(std::string const &fieldName) const + FORCE_INLINE std::tr1::shared_ptr getSubField(std::string const &fieldName) { return this->getSubField(fieldName.c_str()); } template - std::tr1::shared_ptr getSubField(const char *name) const + FORCE_INLINE std::tr1::shared_ptr getSubField(std::string const &fieldName) const + { + return this->getSubField(fieldName.c_str()); + } + + template + std::tr1::shared_ptr getSubField(const char *name) + { + return std::tr1::dynamic_pointer_cast(getSubFieldImpl(name, false)); + } + + template + std::tr1::shared_ptr getSubField(const char *name) const { return std::tr1::dynamic_pointer_cast(getSubFieldImpl(name, false)); } @@ -805,7 +817,12 @@ public: * @return Pointer to the field or null if field does not exist. */ template - std::tr1::shared_ptr getSubField(std::size_t fieldOffset) const + std::tr1::shared_ptr getSubField(std::size_t fieldOffset) + { + return std::tr1::dynamic_pointer_cast(getSubFieldImpl(fieldOffset, false)); + } + template + std::tr1::shared_ptr getSubField(std::size_t fieldOffset) const { return std::tr1::dynamic_pointer_cast(getSubFieldImpl(fieldOffset, false)); } @@ -820,7 +837,13 @@ public: * @endcode */ template - FORCE_INLINE std::tr1::shared_ptr getSubFieldT(std::string const &fieldName) const + FORCE_INLINE std::tr1::shared_ptr getSubFieldT(std::string const &fieldName) + { + return this->getSubFieldT(fieldName.c_str()); + } + + template + FORCE_INLINE std::tr1::shared_ptr getSubFieldT(std::string const &fieldName) const { return this->getSubFieldT(fieldName.c_str()); } @@ -830,7 +853,17 @@ private: public: template - std::tr1::shared_ptr getSubFieldT(const char *name) const + std::tr1::shared_ptr getSubFieldT(const char *name) + { + std::tr1::shared_ptr pvField(std::tr1::dynamic_pointer_cast( + getSubFieldImpl(name, true))); + if(!pvField) + throwBadFieldType(name); + return pvField; + } + + template + std::tr1::shared_ptr getSubFieldT(const char *name) const { std::tr1::shared_ptr pvField(std::tr1::dynamic_pointer_cast( getSubFieldImpl(name, true))); @@ -850,7 +883,17 @@ public: * @throws std::runtime_error if the requested sub-field doesn't exist, or has a different type */ template - std::tr1::shared_ptr getSubFieldT(std::size_t fieldOffset) const + std::tr1::shared_ptr getSubFieldT(std::size_t fieldOffset) + { + std::tr1::shared_ptr pvField = std::tr1::dynamic_pointer_cast( + getSubFieldImpl(fieldOffset, true)); + if(!pvField) + throwBadFieldType(fieldOffset); + return pvField; + } + + template + std::tr1::shared_ptr getSubFieldT(std::size_t fieldOffset) const { std::tr1::shared_ptr pvField = std::tr1::dynamic_pointer_cast( getSubFieldImpl(fieldOffset, true)); diff --git a/src/pv/valueBuilder.cpp b/src/pv/valueBuilder.cpp index 5df9f30..d2a8ea0 100644 --- a/src/pv/valueBuilder.cpp +++ b/src/pv/valueBuilder.cpp @@ -109,16 +109,16 @@ void ValueBuilder::child_struct::fillStruct(ValueBuilder& self, const PVStructur const StringArray& field = type->getFieldNames(); for(StringArray::const_iterator it=field.begin(), end=field.end(); it!=end; ++it) { - PVFieldPtr sub(val.getSubField(*it)); + PVField::const_shared_pointer sub(val.getSubField(*it)); assert(sub); FieldConstPtr subtype(sub->getField()); switch(subtype->getType()) { case scalar: { - PVScalar* subs(static_cast(sub.get())); + const PVScalar* subs(static_cast(sub.get())); ScalarType stype = subs->getScalar()->getScalarType(); switch(stype) { -#define STYPE(stype) case pv##stype: { PV ##stype* ptr(static_cast(subs)); PV##stype::value_type temp(ptr->get()); self._add(*it, pv##stype, &temp); } break +#define STYPE(stype) case pv##stype: { const PV ##stype* ptr(static_cast(subs)); PV##stype::value_type temp(ptr->get()); self._add(*it, pv##stype, &temp); } break STYPE(Boolean); STYPE(Byte); STYPE(Short); @@ -136,7 +136,7 @@ void ValueBuilder::child_struct::fillStruct(ValueBuilder& self, const PVStructur } break; case structure: - self._add(*it, *static_cast(sub.get())); + self._add(*it, *static_cast(sub.get())); break; default: THROW_EXCEPTION2(std::runtime_error, "ValueBuilder can only clone scalar and structure");