From f2635c7fdc6474c7b5dddbb84bbc0ec43bf034de Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Apr 2013 17:20:29 -0400 Subject: [PATCH] Convert::fromString with castUnsafe --- pvDataApp/factory/Convert.cpp | 111 +--------------------------------- pvDataApp/pv/convert.h | 10 ++- 2 files changed, 9 insertions(+), 112 deletions(-) diff --git a/pvDataApp/factory/Convert.cpp b/pvDataApp/factory/Convert.cpp index 16f8828..1949ba9 100644 --- a/pvDataApp/factory/Convert.cpp +++ b/pvDataApp/factory/Convert.cpp @@ -464,122 +464,15 @@ size_t Convert::fromString(PVStructurePtr const &pvStructure, StringArray const return processed; } - -void Convert::fromString(PVScalarPtr const &pvScalar, String const & from) -{ - ScalarConstPtr scalar = pvScalar->getScalar(); - ScalarType scalarType = scalar->getScalarType(); - switch(scalarType) { - case pvBoolean: { - PVBooleanPtr pv = static_pointer_cast(pvScalar); - bool value = - ((from.compare("true")==0) ? true : false); - pv->put(value); - return; - } - case pvByte : { - PVBytePtr pv = static_pointer_cast(pvScalar); - int ival; - sscanf(from.c_str(),"%d",&ival); - int8 value = ival; - pv->put(value); - return; - } - case pvShort : { - PVShortPtr pv = static_pointer_cast(pvScalar); - int ival; - sscanf(from.c_str(),"%d",&ival); - int16 value = ival; - pv->put(value); - return; - } - case pvInt : { - PVIntPtr pv = static_pointer_cast(pvScalar); - int ival; - sscanf(from.c_str(),"%d",&ival); - int32 value = ival; - pv->put(value); - return; - } - case pvLong : { - PVLongPtr pv = static_pointer_cast(pvScalar); - int64 ival; - sscanf(from.c_str(),"%lld",(long long *)&ival); - int64 value = ival; - pv->put(value); - return; - } - case pvUByte : { - PVUBytePtr pv = static_pointer_cast(pvScalar); - unsigned int ival; - sscanf(from.c_str(),"%u",&ival); - uint8 value = ival; - pv->put(value); - return; - } - case pvUShort : { - PVUShortPtr pv = static_pointer_cast(pvScalar); - unsigned int ival; - sscanf(from.c_str(),"%u",&ival); - uint16 value = ival; - pv->put(value); - return; - } - case pvUInt : { - PVUIntPtr pv = static_pointer_cast(pvScalar); - unsigned int ival; - sscanf(from.c_str(),"%u",&ival); - uint32 value = ival; - pv->put(value); - return; - } - case pvULong : { - PVULongPtr pv = static_pointer_cast(pvScalar); - unsigned long long ival; - sscanf(from.c_str(),"%llu",(long long unsigned int *)&ival); - uint64 value = ival; - pv->put(value); - return; - } - case pvFloat : { - PVFloatPtr pv = static_pointer_cast(pvScalar); - float value; - sscanf(from.c_str(),"%f",&value); - pv->put(value); - return; - } - case pvDouble : { - PVDoublePtr pv = static_pointer_cast(pvScalar); - double value; - sscanf(from.c_str(),"%lf",&value); - pv->put(value); - return; - } - case pvString: { - PVStringPtr value = static_pointer_cast(pvScalar); - value->put(from); - return; - } - } - String message("Convert::fromString unknown scalarType "); - ScalarTypeFunc::toString(&message,scalarType); - throw std::logic_error(message); -} - size_t Convert::fromString(PVScalarArrayPtr const &pv, String from) { if(from[0]=='[' && from[from.length()]==']') { size_t offset = from.rfind(']'); from = from.substr(1, offset); } - std::vector valueList = split(from); + std::vector valueList(split(from)); size_t length = valueList.size(); - StringArray valueArray = StringArray(length); - for(size_t i=0; isetLength(length); return length; diff --git a/pvDataApp/pv/convert.h b/pvDataApp/pv/convert.h index b66c073..a54c258 100644 --- a/pvDataApp/pv/convert.h +++ b/pvDataApp/pv/convert.h @@ -113,7 +113,7 @@ public: * If a PVField is a structure or array be prepared for a very long string. * @param indentLevel indentation level */ - void getString(StringBuilder buf,PVFieldPtr const & pvField,int indentLevel) + inline void getString(StringBuilder buf,PVFieldPtr const & pvField,int indentLevel) {getString(buf, pvField.get(), indentLevel);} /** * Convert a PVField to a string. @@ -137,7 +137,7 @@ public: * @param pv The PVField to convert to a string. * If the PVField is a structure or array be prepared for a very long string. */ - void getString(StringBuilder buf,PVField const * pvField) + inline void getString(StringBuilder buf,PVField const * pvField) {getString(buf, pvField, 0);} /** * Convert from an array of String to a PVScalar @@ -156,7 +156,11 @@ public: * @param from The String value to convert and put into a PV. * @throws std::logic_error if the String does not have a valid value. */ - void fromString(PVScalarPtr const & pv, String const & from); + void fromString(PVScalarPtr const & pv, String const & from) + { + pv->putFrom(from); + } + /** * Convert from a String to a PVScalarArray. * The String must be a comma separated set of values optionally enclosed in []