PVStructure::getSubField() const propagation

This commit is contained in:
Michael Davidsaver
2017-08-08 16:51:37 +02:00
parent b84ed964f9
commit 08a92468fe
2 changed files with 53 additions and 10 deletions

View File

@@ -788,13 +788,25 @@ public:
* @endcode
*/
template<typename PVT = PVField>
FORCE_INLINE std::tr1::shared_ptr<PVT> getSubField(std::string const &fieldName) const
FORCE_INLINE std::tr1::shared_ptr<PVT> getSubField(std::string const &fieldName)
{
return this->getSubField<PVT>(fieldName.c_str());
}
template<typename PVT = PVField>
std::tr1::shared_ptr<PVT> getSubField(const char *name) const
FORCE_INLINE std::tr1::shared_ptr<const PVT> getSubField(std::string const &fieldName) const
{
return this->getSubField<PVT>(fieldName.c_str());
}
template<typename PVT = PVField>
std::tr1::shared_ptr<PVT> getSubField(const char *name)
{
return std::tr1::dynamic_pointer_cast<PVT>(getSubFieldImpl(name, false));
}
template<typename PVT = PVField>
std::tr1::shared_ptr<const PVT> getSubField(const char *name) const
{
return std::tr1::dynamic_pointer_cast<PVT>(getSubFieldImpl(name, false));
}
@@ -805,7 +817,12 @@ public:
* @return Pointer to the field or null if field does not exist.
*/
template<typename PVT = PVField>
std::tr1::shared_ptr<PVT> getSubField(std::size_t fieldOffset) const
std::tr1::shared_ptr<PVT> getSubField(std::size_t fieldOffset)
{
return std::tr1::dynamic_pointer_cast<PVT>(getSubFieldImpl(fieldOffset, false));
}
template<typename PVT = PVField>
std::tr1::shared_ptr<const PVT> getSubField(std::size_t fieldOffset) const
{
return std::tr1::dynamic_pointer_cast<PVT>(getSubFieldImpl(fieldOffset, false));
}
@@ -820,7 +837,13 @@ public:
* @endcode
*/
template<typename PVT = PVField>
FORCE_INLINE std::tr1::shared_ptr<PVT> getSubFieldT(std::string const &fieldName) const
FORCE_INLINE std::tr1::shared_ptr<PVT> getSubFieldT(std::string const &fieldName)
{
return this->getSubFieldT<PVT>(fieldName.c_str());
}
template<typename PVT = PVField>
FORCE_INLINE std::tr1::shared_ptr<const PVT> getSubFieldT(std::string const &fieldName) const
{
return this->getSubFieldT<PVT>(fieldName.c_str());
}
@@ -830,7 +853,17 @@ private:
public:
template<typename PVT = PVField>
std::tr1::shared_ptr<PVT> getSubFieldT(const char *name) const
std::tr1::shared_ptr<PVT> getSubFieldT(const char *name)
{
std::tr1::shared_ptr<PVT> pvField(std::tr1::dynamic_pointer_cast<PVT>(
getSubFieldImpl(name, true)));
if(!pvField)
throwBadFieldType(name);
return pvField;
}
template<typename PVT = PVField>
std::tr1::shared_ptr<const PVT> getSubFieldT(const char *name) const
{
std::tr1::shared_ptr<PVT> pvField(std::tr1::dynamic_pointer_cast<PVT>(
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<typename PVT = PVField>
std::tr1::shared_ptr<PVT> getSubFieldT(std::size_t fieldOffset) const
std::tr1::shared_ptr<PVT> getSubFieldT(std::size_t fieldOffset)
{
std::tr1::shared_ptr<PVT> pvField = std::tr1::dynamic_pointer_cast<PVT>(
getSubFieldImpl(fieldOffset, true));
if(!pvField)
throwBadFieldType(fieldOffset);
return pvField;
}
template<typename PVT = PVField>
std::tr1::shared_ptr<const PVT> getSubFieldT(std::size_t fieldOffset) const
{
std::tr1::shared_ptr<PVT> pvField = std::tr1::dynamic_pointer_cast<PVT>(
getSubFieldImpl(fieldOffset, true));

View File

@@ -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<PVScalar*>(sub.get()));
const PVScalar* subs(static_cast<const PVScalar*>(sub.get()));
ScalarType stype = subs->getScalar()->getScalarType();
switch(stype) {
#define STYPE(stype) case pv##stype: { PV ##stype* ptr(static_cast<PV##stype*>(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<const PV##stype*>(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<PVStructure*>(sub.get()));
self._add(*it, *static_cast<const PVStructure*>(sub.get()));
break;
default:
THROW_EXCEPTION2(std::runtime_error, "ValueBuilder can only clone scalar and structure");