From c7c83282ee9299e3d83bfe3fdd1a21e56f15b60d Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 7 Sep 2017 15:55:21 -0500 Subject: [PATCH] parseJSON() more forgiving scalar array handling Allow eg. to initialize array of integers with [1.0, 2.0] --- src/json/parseinto.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/json/parseinto.cpp b/src/json/parseinto.cpp index 00bb25c..e433cc3 100644 --- a/src/json/parseinto.cpp +++ b/src/json/parseinto.cpp @@ -68,18 +68,28 @@ void valueAssign(context *self, typename PVScalarT::value_type val) // structure at the top of the stack } else if(type==pvd::scalarArray) { - PVArrayT* arrfld(dynamic_cast(back.fld.get())); - if(!arrfld) - throw std::invalid_argument("wrong type for scalar array"); + pvd::PVScalarArray *fld(static_cast(back.fld.get())); - typename PVArrayT::const_svector carr; - arrfld->swap(carr); + pvd::shared_vector carr; + fld->getAs(carr); - typename PVArrayT::svector arr(pvd::thaw(carr)); + switch(carr.original_type()) + { +#define CASE_STRING +#define CASE_REAL_INT64 +#define CASE(BASETYPE, PVATYPE, DBFTYPE, PVACODE) case epics::pvData::pv##PVACODE: { \ + pvd::shared_vector arr(pvd::static_shared_vector_cast(carr)); \ + pvd::shared_vector tarr(pvd::thaw(arr)); \ + tarr.push_back(pvd::castUnsafe(val)); \ + carr = pvd::static_shared_vector_cast(pvd::freeze(tarr)); \ + } break; +#include +#undef CASE +#undef CASE_REAL_INT64 +#undef CASE_STRING + } - arr.push_back(val); - - arrfld->replace(pvd::freeze(arr)); + fld->putFrom(carr); // leave array field at top of stack