Skip to content
This repository has been archived by the owner on Jan 28, 2021. It is now read-only.

Commit

Permalink
Added support for NaN and inf in Tango properties (tango-controls#360)
Browse files Browse the repository at this point in the history
  • Loading branch information
bourtemb committed Apr 13, 2017
1 parent 12fa8d8 commit 29ae315
Showing 1 changed file with 86 additions and 28 deletions.
114 changes: 86 additions & 28 deletions cppapi/client/dbapi_datum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -651,7 +651,7 @@ void DbDatum::operator << (float datum)

bool DbDatum::operator >> (float& datum)
{
bool ret;
bool ret = true;
if (value_string.size() == 0)
{
if (exceptions_flags.test(isempty_flag))
Expand All @@ -668,13 +668,29 @@ bool DbDatum::operator >> (float& datum)
istream >> datum;
if (!istream)
{
if (exceptions_flags.test(wrongtype_flag))
if(TG_strcasecmp("nan",value_string[0].c_str()) == 0)
{
datum = std::numeric_limits<float>::quiet_NaN();
}
else if (TG_strcasecmp("-inf",value_string[0].c_str()) == 0)
{
datum = -std::numeric_limits<float>::infinity();
}
else if ((TG_strcasecmp("inf",value_string[0].c_str()) == 0) ||
(TG_strcasecmp("+inf",value_string[0].c_str()) == 0))
{
datum = std::numeric_limits<float>::infinity();
}
else if (exceptions_flags.test(wrongtype_flag))
{
ApiDataExcept::throw_exception((const char *)API_IncompatibleArgumentType,
(const char *)"Cannot extract, data in DbDatum is not a float",
(const char *)"DbDatum::operator >>(float)");
(const char *)"Cannot extract, data in DbDatum is not a float",
(const char *)"DbDatum::operator >>(float)");
}
else
{
ret = false;
}
ret = false;
}
else
ret = true;
Expand Down Expand Up @@ -709,7 +725,7 @@ void DbDatum::operator << (double datum)

bool DbDatum::operator >> (double& datum)
{
bool ret;
bool ret = true;
if (value_string.size() == 0)
{
if (exceptions_flags.test(isempty_flag))
Expand All @@ -726,13 +742,29 @@ bool DbDatum::operator >> (double& datum)
istream >> std::setprecision(TANGO_FLOAT_PRECISION) >> datum;
if (!istream)
{
if (exceptions_flags.test(wrongtype_flag))
if(TG_strcasecmp("nan",value_string[0].c_str()) == 0)
{
datum = std::numeric_limits<double>::quiet_NaN();
}
else if (TG_strcasecmp("-inf",value_string[0].c_str()) == 0)
{
datum = -std::numeric_limits<double>::infinity();
}
else if ((TG_strcasecmp("inf",value_string[0].c_str()) == 0) ||
(TG_strcasecmp("+inf",value_string[0].c_str()) == 0))
{
datum = std::numeric_limits<double>::infinity();
}
else if (exceptions_flags.test(wrongtype_flag))
{
ApiDataExcept::throw_exception((const char *)API_IncompatibleArgumentType,
(const char *)"Cannot extract, data in DbDatum is not a double",
(const char *)"DbDatum::operator >>(double)");
(const char *)"Cannot extract, data in DbDatum is not a double",
(const char *)"DbDatum::operator >>(double)");
}
else
{
ret = false;
}
ret = false;
}
else
ret = true;
Expand Down Expand Up @@ -1330,29 +1362,42 @@ bool DbDatum::operator >> (vector<float>& datum)
else
{
stringstream iostream;

datum.resize(value_string.size());
for (unsigned int i=0; i<value_string.size(); i++)
{
iostream.seekp (0); iostream.seekg(0); iostream.clear();
iostream.clear(); iostream.seekp(0); iostream.seekg(0);
iostream << value_string[i] << ends;
iostream >> datum[i];
if (!iostream)
{
if (exceptions_flags.test(wrongtype_flag))
if(TG_strcasecmp("nan",value_string[i].c_str()) == 0)
{
datum[i] = std::numeric_limits<float>::quiet_NaN();
} else if (TG_strcasecmp("-inf",value_string[i].c_str()) == 0)
{
datum[i] = -std::numeric_limits<float>::infinity();
}
else if ((TG_strcasecmp("inf",value_string[i].c_str()) == 0) ||
(TG_strcasecmp("+inf",value_string[i].c_str()) == 0))
{
datum[i] = std::numeric_limits<float>::infinity();
}
else if (exceptions_flags.test(wrongtype_flag))
{
TangoSys_OMemStream desc;
desc << "Cannot extract float vector, elt number ";
desc << i+1 << " is not a float" << ends;

ApiDataExcept::throw_exception((const char*)API_IncompatibleArgumentType,
desc.str(),
(const char*)"DbDatum::operator >>(vector<float>)");
desc.str(),
(const char*)"DbDatum::operator >>(vector<float>)");
}
else
{
ret = false;
break;
}
ret = false;
break;
}
}
} // for (unsigned int i=0; i<value_string.size(); i++)
}

return ret;
Expand Down Expand Up @@ -1407,27 +1452,40 @@ bool DbDatum::operator >> (vector<double>& datum)
datum.resize(value_string.size());
for (unsigned int i=0; i<value_string.size(); i++)
{
iostream.seekp (0); iostream.seekg(0); iostream.clear();
iostream.clear(); iostream.seekp(0); iostream.seekg(0);
iostream << value_string[i] << ends;
iostream >> std::setprecision(TANGO_FLOAT_PRECISION) >> datum[i];
if (!iostream)
{
if (exceptions_flags.test(wrongtype_flag))
if(TG_strcasecmp("nan",value_string[i].c_str()) == 0)
{
datum[i] = std::numeric_limits<double>::quiet_NaN();
} else if (TG_strcasecmp("-inf",value_string[i].c_str()) == 0)
{
datum[i] = -std::numeric_limits<double>::infinity();
}
else if ((TG_strcasecmp("inf",value_string[i].c_str()) == 0) ||
(TG_strcasecmp("+inf",value_string[i].c_str()) == 0))
{
datum[i] = std::numeric_limits<double>::infinity();
}
else if (exceptions_flags.test(wrongtype_flag))
{
TangoSys_OMemStream desc;
desc << "Cannot extract double vector, elt number ";
desc << i+1 << " is not a double" << ends;

ApiDataExcept::throw_exception((const char*)API_IncompatibleArgumentType,
desc.str(),
(const char*)"DbDatum::operator >>(vector<double>)");
desc.str(),
(const char*)"DbDatum::operator >>(vector<double>)");
}
else
{
ret = false;
break;
}
ret = false;
break;
}
}
} // for (unsigned int i=0; i<value_string.size(); i++)
}

return ret;
}

Expand Down

0 comments on commit 29ae315

Please sign in to comment.