Convert::fromString with castUnsafe

This commit is contained in:
Michael Davidsaver
2013-04-26 17:20:29 -04:00
parent 4d92bbe541
commit f2635c7fdc
2 changed files with 9 additions and 112 deletions

View File

@@ -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<PVBoolean>(pvScalar);
bool value =
((from.compare("true")==0) ? true : false);
pv->put(value);
return;
}
case pvByte : {
PVBytePtr pv = static_pointer_cast<PVByte>(pvScalar);
int ival;
sscanf(from.c_str(),"%d",&ival);
int8 value = ival;
pv->put(value);
return;
}
case pvShort : {
PVShortPtr pv = static_pointer_cast<PVShort>(pvScalar);
int ival;
sscanf(from.c_str(),"%d",&ival);
int16 value = ival;
pv->put(value);
return;
}
case pvInt : {
PVIntPtr pv = static_pointer_cast<PVInt>(pvScalar);
int ival;
sscanf(from.c_str(),"%d",&ival);
int32 value = ival;
pv->put(value);
return;
}
case pvLong : {
PVLongPtr pv = static_pointer_cast<PVLong>(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<PVUByte>(pvScalar);
unsigned int ival;
sscanf(from.c_str(),"%u",&ival);
uint8 value = ival;
pv->put(value);
return;
}
case pvUShort : {
PVUShortPtr pv = static_pointer_cast<PVUShort>(pvScalar);
unsigned int ival;
sscanf(from.c_str(),"%u",&ival);
uint16 value = ival;
pv->put(value);
return;
}
case pvUInt : {
PVUIntPtr pv = static_pointer_cast<PVUInt>(pvScalar);
unsigned int ival;
sscanf(from.c_str(),"%u",&ival);
uint32 value = ival;
pv->put(value);
return;
}
case pvULong : {
PVULongPtr pv = static_pointer_cast<PVULong>(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<PVFloat>(pvScalar);
float value;
sscanf(from.c_str(),"%f",&value);
pv->put(value);
return;
}
case pvDouble : {
PVDoublePtr pv = static_pointer_cast<PVDouble>(pvScalar);
double value;
sscanf(from.c_str(),"%lf",&value);
pv->put(value);
return;
}
case pvString: {
PVStringPtr value = static_pointer_cast<PVString>(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<String> valueList = split(from);
std::vector<String> valueList(split(from));
size_t length = valueList.size();
StringArray valueArray = StringArray(length);
for(size_t i=0; i<length; i++) {
String value = valueList[i];
valueArray[i] = value;
}
size_t num = fromStringArray(pv,0,length,valueArray,0);
size_t num = fromStringArray(pv,0,length,valueList,0);
if(num<length) length = num;
pv->setLength(length);
return length;

View File

@@ -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<pvString>(from);
}
/**
* Convert from a String to a PVScalarArray.
* The String must be a comma separated set of values optionally enclosed in []