|
From: <got...@us...> - 2010-09-17 21:20:44
|
Revision: 967
http://scstudio.svn.sourceforge.net/scstudio/?rev=967&view=rev
Author: gotthardp
Date: 2010-09-17 21:20:37 +0000 (Fri, 17 Sep 2010)
Log Message:
-----------
Interval numbers now support exponential form and correctly report invalid numbers.
Modified Paths:
--------------
trunk/src/data/time.cpp
trunk/src/data/time.h
trunk/tests/interval_string.cpp
Modified: trunk/src/data/time.cpp
===================================================================
--- trunk/src/data/time.cpp 2010-09-17 21:11:32 UTC (rev 966)
+++ trunk/src/data/time.cpp 2010-09-17 21:20:37 UTC (rev 967)
@@ -53,29 +53,27 @@
template <>
MscIntervalCouple<double>::MscIntervalCouple(const std::string& number, const bool& closed):
- m_closed(closed)
- ,m_value(0)
+ m_closed(closed),
+ m_value(0)
{
- int position=0;
- int neg = 1;
- if(number[0]=='-')
- {
- neg = -1;
- position=1;
- }
+ std::string lowcase_value;
+ lowcase_value.reserve(number.length());
+ // transform new_value to lowercase for case insensitive comparison
+ std::transform(number.begin(), number.end(),
+ std::back_inserter(lowcase_value), ::tolower);
- if(number[position]=='i')
- {
+ if(lowcase_value == "inf" || lowcase_value == "+inf")
m_value = std::numeric_limits<double>::infinity();
- if(neg<0)
- m_value = -m_value;
- }
+ else if(lowcase_value == "-inf")
+ m_value = -std::numeric_limits<double>::infinity();
else
{
- const char* pos = number.c_str();
- m_value = atof(pos);
- }
+ char* endptr;
+ m_value = strtod(number.c_str(), &endptr);
+ if(endptr != NULL && *endptr != 0)
+ throw MscIntervalStringConversionError(number + std::string(" is not a valid number."));
+ }
}
template <>
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2010-09-17 21:11:32 UTC (rev 966)
+++ trunk/src/data/time.h 2010-09-17 21:20:37 UTC (rev 967)
@@ -127,49 +127,6 @@
}
/**
- * \brief Check whether string is correct format of number - number or "inf"
- * Correct format of number in interval is plain number
- * \param word string to be check
- * \return true if the word is correct interval number
- */
-inline bool check_number(const std::string& word)
-{
- const std::string inf="inf";
- const std::string ninf="-inf";
-
- // its number
- int position=0;
- if(word[0]=='-')
- position=1;
- if(isdigit(word[position]))
- {
- // only one separator is allowed, false - separator has been used
- bool separator=true;
- for(unsigned i=position+1;i<word.length();i++)
- {
- if(isdigit(word[i]))
- continue;
- else if(word[i]=='.' && separator && i<word.length()-1)
- {
- separator=false;
- continue;
- }
- else
- return false;
- }
- return true;
- }
- else if(isalpha(word[position]))
- {
- if(word!=inf&&word!=ninf)
- return false;
- return true;
- }
- else
- return false;
-}
-
-/**
* Decimal scaling structure, stands for:
* m_mant*10^m_exp;
*/
@@ -588,8 +545,6 @@
// ok, start bracket is not there, what about end one?
if(!char_in_string(tmp[tmp.length()-1],")]"))
{
- if(!check_number(tmp))
- throw MscIntervalStringConversionError(tmp + std::string(" is not a valid number."));
MscIntervalCouple<T> begin(tmp,b_closed);
MscIntervalCouple<T> end(tmp,e_closed);
@@ -597,9 +552,8 @@
m_end = end;
if(!is_valid())
- {
throw MscIntervalStringConversionError(this->to_string()+std::string(" is not valid interval."));
- }
+
return;
}
else
@@ -631,11 +585,6 @@
tmp.erase(comma_pos); // erase all from comma including comma
b = std::string(tmp);
}
- // checking numbers
- if(!check_number(b))
- throw MscIntervalStringConversionError(b + std::string(" is not a valid number."));
- if(!check_number(e))
- throw MscIntervalStringConversionError(e + std::string(" is not a valid number."));
// Create MscIntervalCouples
MscIntervalCouple<T> begin(b,b_closed);
@@ -1034,10 +983,17 @@
void assign(const std::string& s_interval)
{
+ int inside = 0;
std::string tmp;
+
for(size_t i=0;i<s_interval.length();i++)
{
- if(s_interval[i]=='+')
+ if(s_interval[i]=='[' || s_interval[i]=='(')
+ inside++;
+ else if(s_interval[i]==']' || s_interval[i]==')')
+ inside--;
+
+ if(inside == 0 && s_interval[i]=='+')
{
MscTimeInterval<T> interval(tmp);
insert(interval);
Modified: trunk/tests/interval_string.cpp
===================================================================
--- trunk/tests/interval_string.cpp 2010-09-17 21:11:32 UTC (rev 966)
+++ trunk/tests/interval_string.cpp 2010-09-17 21:20:37 UTC (rev 967)
@@ -82,6 +82,8 @@
ret+=test_interval_set("10+[10]+50+[30,40)",true);
ret+=test_interval_set("(1,2) + (1.2,13]",true);
+ ret+=test_interval_set("[-1e+10,+2e-2]",true);
+ ret+=test_interval_set("(-inf,+inf)",true);
ret+=test_interval_set(" ( inf, 3.23) + [4,6543]",false);
ret+=test_interval_set("(5.431,4.876)+(1,2)",false);
ret+=test_interval_set("(0.123,inf]",false);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|