|
From: <koc...@us...> - 2009-09-25 20:45:40
|
Revision: 378
http://scstudio.svn.sourceforge.net/scstudio/?rev=378&view=rev
Author: kocianon
Date: 2009-09-25 20:45:29 +0000 (Fri, 25 Sep 2009)
Log Message:
-----------
fix of string constructors
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 2009-09-25 20:24:01 UTC (rev 377)
+++ trunk/src/data/time.cpp 2009-09-25 20:45:29 UTC (rev 378)
@@ -57,8 +57,20 @@
m_closed(closed)
,m_value(0)
{
- if(number[0]=='i')
+ int position=0;
+ int neg = 1;
+ if(number[0]=='-')
+ {
+ neg = -1;
+ position=1;
+ }
+
+ if(number[position]=='i')
+ {
m_value = std::numeric_limits<double>::infinity();
+ if(neg<0)
+ m_value = -m_value;
+ }
else
{
const char* pos = number.c_str();
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2009-09-25 20:24:01 UTC (rev 377)
+++ trunk/src/data/time.h 2009-09-25 20:45:29 UTC (rev 378)
@@ -133,13 +133,17 @@
inline bool check_number(const std::string& word)
{
const std::string inf="inf";
+ const std::string ninf="-inf";
// its number
- if(isdigit(word[0]))
+ int position=0;
+ if(word[0]=='-')
+ position=1;
+ if(isdigit(word[position]))
{
- // only one separator is allowed, false - separator has been found
+ // only one separator is allowed, false - separator has been used
bool separator=true;
- for(unsigned i=1;i<word.length();i++)
+ for(unsigned i=position+1;i<word.length();i++)
{
if(isdigit(word[i]))
continue;
@@ -153,9 +157,9 @@
}
return true;
}
- else if(isalpha(word[0]))
+ else if(isalpha(word[position]))
{
- if(word!=inf)
+ if(word!=inf&&word!=ninf)
return false;
return true;
}
@@ -564,7 +568,7 @@
if(!char_in_string(tmp[tmp.length()-1],")]"))
{
if(!check_number(tmp))
- throw MscIntervalStringConversionError(tmp + std::string(" is not valid number."));
+ throw MscIntervalStringConversionError(tmp + std::string(" is not a valid number."));
MscIntervalCouple<T> begin(tmp,b_closed);
MscIntervalCouple<T> end(tmp,e_closed);
@@ -608,9 +612,9 @@
}
// checking numbers
if(!check_number(b))
- throw MscIntervalStringConversionError(b + std::string(" is not valid number."));
+ throw MscIntervalStringConversionError(b + std::string(" is not a valid number."));
if(!check_number(e))
- throw MscIntervalStringConversionError(e + std::string(" is not valid number."));
+ throw MscIntervalStringConversionError(e + std::string(" is not a valid number."));
// Create MscIntervalCouples
MscIntervalCouple<T> begin(b,b_closed);
@@ -749,6 +753,28 @@
return !((m_begin==right.m_begin)&&(m_end==right.m_end));
}
+ /**
+ * \brief tests if the interval is valid
+ * Tests beginning and ending value
+ *
+ * * beginning value > ending value:
+ * invalid interval
+ *
+ * * beginning value < ending value:
+ * valid interval
+ *
+ * * MscIntervalException (begin == end, brackets difference)
+ * cases:
+ * (4,4], [4,4)
+ * interval is not valid in both cases.
+ *
+ * * beginning value == ending value, brackets are same
+ * cases:
+ * (4,4) - not valid
+ * [4,4] - valid interval
+ * \return true if the interval is valid
+ */
+
bool is_valid()
{
try
Modified: trunk/tests/interval_string.cpp
===================================================================
--- trunk/tests/interval_string.cpp 2009-09-25 20:24:01 UTC (rev 377)
+++ trunk/tests/interval_string.cpp 2009-09-25 20:45:29 UTC (rev 378)
@@ -8,9 +8,41 @@
<< ": Assertion " #x " failed on line " \
<< __LINE__ << std::endl; return 1; \
}
+/**
+ * \brief Trying to construct interval from string
+ * \param error says if the interval string is expected to be valid
+ * \return 0 to test successfully else 1
+ */
+int test_interval_set(std::string int_string,bool valid)
+{
+ std::cerr << "Interval set string: " << int_string << " expected to be ";
+ if(valid)
+ std::cerr << "valid";
+ else
+ std::cerr << "INvalid";
+ std::cerr << std::endl;
+ try
+ {
+ MscTimeIntervalSet<double> set(int_string);
+ std::cerr << "Interval set: " << set << std::endl;
+ }
+ catch(MscIntervalStringConversionError ex){
+ std::cerr << "Exception: " << ex.what() << std::endl;
+ if(valid)
+ std::cerr << "!!! ERROR" << std::endl;
+ std::cerr << std::endl;
+ return valid;
+ }
+ if(!valid)
+ std::cerr << "!!! ERROR" << std::endl;
+ std::cerr << std::endl;
+ return !valid;
+}
+
int main()
{
+/*
MscTimeInterval<double> dou(false,10,18,true);
MscTimeInterval<DecScaled> dec(false,10,18,true);
@@ -26,7 +58,6 @@
// TEST_ASSERT(dec==inter_dec);
-/*
try {
MscTimeInterval<double> a(std::string(" 9 9 "));
TEST_ASSERT(false);
@@ -45,18 +76,23 @@
}
catch(MscIntervalStringConversionError){}
*/
- MscTimeInterval<DecScaled> d("[ 10]");
- std::cerr << d << std::endl;
+ int ret;
+ ret = 0;
- MscTimeInterval<DecScaled> a("10");
- std::cerr << a << std::endl;
- MscTimeInterval<DecScaled> b("(10,12]");
- std::cerr << b << std::endl;
+ ret+=test_interval_set("10+[10]+50+[30,40)",true);
+ ret+=test_interval_set("(1,2) + (1.2,13]",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);
+ ret+=test_interval_set("( inf, 3.23,1) + [4,6543]",false);
+ ret+=test_interval_set("[(4)]",false);
+ ret+=test_interval_set("[-inf,1)",false);
+ ret+=test_interval_set("(-inf,1)",true);
- MscTimeIntervalSet<double> c("10+[10]+50+[30,40)");
- std::cerr << c << std::endl;
+ std::cerr << std::endl << "Number of errors: " << ret << std::endl;
+
// MscTimeInterval<DecScaled> c(std::string("405"));
- return 0;
+ return ret;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|