From 52bc6d060d372b1e02e3e02b2c9ac87fc51238f7 Mon Sep 17 00:00:00 2001 From: Dave Hickin Date: Wed, 15 Jul 2015 11:34:44 +0100 Subject: [PATCH] Move getSubFieldT definitions out of class body Move definitions of 2 getSubFieldT overloads: shared_ptr PVStructure::getSubFieldT(const char *name) const shared_ptr PVStructure::getSubFieldT(size_t fieldOffset) const out of class body so not implicitly inlined. --- src/pv/pvData.h | 61 +++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/src/pv/pvData.h b/src/pv/pvData.h index e54d636..0a0f969 100644 --- a/src/pv/pvData.h +++ b/src/pv/pvData.h @@ -757,20 +757,8 @@ public: } template - std::tr1::shared_ptr getSubFieldT(const char *name) const - { - std::tr1::shared_ptr pvField = std::tr1::dynamic_pointer_cast( - getSubFieldImpl(name)->shared_from_this()); + std::tr1::shared_ptr getSubFieldT(const char *name) const; - if (pvField.get()) - return pvField; - else - { - std::stringstream ss; - ss << "Failed to get field: " << name << " (Field has wrong type)"; - throw std::runtime_error(ss.str()); - } - } /** * Get the subfield with the specified offset. * @param fieldOffset The offset. @@ -786,20 +774,7 @@ 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 pvField = std::tr1::dynamic_pointer_cast( - getSubFieldT(fieldOffset)); - if (pvField.get()) - return pvField; - else - { - std::stringstream ss; - ss << "Failed to get field with offset " - << fieldOffset << " (Field has wrong type)"; - throw std::runtime_error(ss.str()); - } - } + std::tr1::shared_ptr getSubFieldT(std::size_t fieldOffset) const; /** * Get a boolean field with the specified name. @@ -1001,6 +976,38 @@ private: }; +template +std::tr1::shared_ptr PVStructure::getSubFieldT(const char *name) const +{ + std::tr1::shared_ptr pvField = std::tr1::dynamic_pointer_cast( + getSubFieldImpl(name)->shared_from_this()); + + if (pvField.get()) + return pvField; + else + { + std::stringstream ss; + ss << "Failed to get field: " << name << " (Field has wrong type)"; + throw std::runtime_error(ss.str()); + } +} + +template +std::tr1::shared_ptr PVStructure::getSubFieldT(std::size_t fieldOffset) const +{ + std::tr1::shared_ptr pvField = std::tr1::dynamic_pointer_cast( + getSubFieldT(fieldOffset)); + if (pvField.get()) + return pvField; + else + { + std::stringstream ss; + ss << "Failed to get field with offset " + << fieldOffset << " (Field has wrong type)"; + throw std::runtime_error(ss.str()); + } +} + /** * @brief PVUnion has a single subfield. *