|
From: <koc...@us...> - 2009-06-21 21:11:28
|
Revision: 254
http://scstudio.svn.sourceforge.net/scstudio/?rev=254&view=rev
Author: kocianon
Date: 2009-06-21 21:11:26 +0000 (Sun, 21 Jun 2009)
Log Message:
-----------
string to number, DecScaled bug fixed
Modified Paths:
--------------
trunk/src/data/time.cpp
trunk/src/data/time.h
Added Paths:
-----------
trunk/tests/interval_string.cpp
Modified: trunk/src/data/time.cpp
===================================================================
--- trunk/src/data/time.cpp 2009-06-10 11:25:10 UTC (rev 253)
+++ trunk/src/data/time.cpp 2009-06-21 21:11:26 UTC (rev 254)
@@ -52,42 +52,81 @@
template <>
MscIntervalCouple<double>::MscIntervalCouple(const std::string& number, \
-const char& closed):
-m_value(0),m_closed(true)
+const bool& closed):
+m_value(0),m_closed(closed)
{
const char* pos = number.c_str();
m_value = atof(pos);
- if(closed == '(' || closed == ')')
- m_closed = false;
-
}
template <>
MscIntervalCouple<DecScaled>::MscIntervalCouple(const std::string &number, \
- const char& closed):
-m_value(0),m_closed(true)
+ const bool& closed):
+m_value(0),m_closed(closed)
{
DecScaled tmp(number);
- m_value = number;
- if(closed == '(' || closed == ')')
- m_closed = false;
+ m_value = tmp;
+}
+inline bool isNotIn(const char& znak,const std::string& set = "[](),")
+{
+ return set.find(znak)==std::string::npos;
}
+inline bool clean(char znak)
+{
+ return isdigit(znak)==0&&isNotIn(znak);
+}
+
template<class T>
-MscTimeInterval<T>::MscTimeInterval(const std::string& interval)
+MscTimeInterval<T>::MscTimeInterval(const std::string& interval)
+throw(MscIntervalStringConversionError)
{
- std::string tmp(interval.begin()+1,interval.end()-1);
- size_t comma_pos = tmp.find(',');
+ std::string tmp(interval);
+ bool b_closed = true;
+ bool e_closed = true;
- std::string e(tmp.substr(comma_pos+1));
- tmp.erase(comma_pos);
+ // remove all unsuitable characters; letting just numbers,commas,brackets
+ tmp.erase(remove_if(tmp.begin(),tmp.end(),clean),tmp.end());
+
+ // detect starting bracket
+ if(isNotIn(tmp[0],std::string("([")))
+ throw MscIntervalStringConversionError("No starting bracket [ or (\n");
+ if(tmp[0]=='(')
+ b_closed = false;
+ // erase it
+ tmp.erase(tmp.begin());
+
+ //detect ending bracket
+ if(isNotIn(tmp[tmp.length()-1],")]"))
+ throw MscIntervalStringConversionError("No ending bracket ) or ]\n");
+ if(tmp[tmp.length()-1]==')')
+ e_closed = false;
+ // erase it
+ tmp.erase(tmp.end()-1);
+
+
std::string b(tmp);
+ std::string e(tmp);
+
+ size_t comma_pos= tmp.find(',');
+ if(comma_pos!=std::string::npos)
+ {
+ e = std::string(tmp.substr(comma_pos+1));
+ tmp.erase(comma_pos); // erase all from comma including comma
+ b = std::string(tmp);
+ }
- MscIntervalCouple<T> begin(b,interval[0]);
- MscIntervalCouple<T> end(e,interval[interval.size()-1]);
+ MscIntervalCouple<T> begin(b,b_closed);
+ MscIntervalCouple<T> end(e,e_closed);
m_begin = begin;
m_end = end;
}
+template class MscTimeInterval<double>;
+template class MscTimeInterval<DecScaled>;
+
+
+//template MscTimeInterval<double>::MscTimeInterval();
+//template MscTimeInterval<DecScaled>::MscTimeInterval();
// $Id$
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2009-06-10 11:25:10 UTC (rev 253)
+++ trunk/src/data/time.h 2009-06-21 21:11:26 UTC (rev 254)
@@ -25,6 +25,8 @@
#include<list>
#include<cstdlib>
#include<iostream>
+#include<cctype>
+#include<string>
#if defined(_MSC_VER)
// Visual C++ does not support functions declared using exception specification.
@@ -70,7 +72,27 @@
}
};
+class MscIntervalStringConversionError:public std::exception
+{
+private:
+ std::string msg;
+public:
+
+ MscIntervalStringConversionError(const std::string& m = ""):
+ msg(std::string("Problems during string to interval conversion\n") + m)
+ {}
+
+ const char* what()
+ {
+ return msg.c_str();
+ }
+
+ ~MscIntervalStringConversionError() throw()
+ {}
+
+};
+
/**
* Decimal scaling structure, stands for:
* m_mant*10^m_exp;
@@ -84,15 +106,19 @@
// keeps number aligned to the right
void tidy()
{
- while(m_mant%10==0)
- {
- m_mant/=10;
+ while(m_mant%10==0 && m_mant!=0)
+ {
+ m_mant=m_mant/10;
m_exp++;
}
}
public:
DecScaled():m_exp(0),m_mant(0){}
- DecScaled(long mant):m_exp(0),m_mant(mant){}
+ DecScaled(long mant):m_exp(0),m_mant(mant)
+ {
+ tidy();
+ }
+
DecScaled(long mant,long exp):m_exp(exp),m_mant(mant)
{
tidy();
@@ -245,7 +271,7 @@
{
}
- MscIntervalCouple(const std::string&,const char&);
+ MscIntervalCouple(const std::string&,const bool&);
MscIntervalCouple(const bool& b,const T& d): m_closed(b),m_value(d)
{
@@ -430,8 +456,6 @@
MscTimeInterval()
{}
- MscTimeInterval(const std::string&);
-
MscTimeInterval(T value):m_begin(true,value),m_end(true,value)
{
}
@@ -453,6 +477,9 @@
{
}
+ MscTimeInterval(const std::string& interval) throw(MscIntervalStringConversionError);
+
+
MscIntervalCouple<T> get_begin() const
{
return m_begin;
@@ -720,9 +747,6 @@
}; //end of MscTimeInterval class
-template class MscTimeInterval<double>;
-template class MscTimeInterval<DecScaled>;
-
/**
* \brief List of intervals
* Keeping sorted list of intervals, dont have intersection
Added: trunk/tests/interval_string.cpp
===================================================================
--- trunk/tests/interval_string.cpp (rev 0)
+++ trunk/tests/interval_string.cpp 2009-06-21 21:11:26 UTC (rev 254)
@@ -0,0 +1,52 @@
+#include "data/time.h"
+#include<string>
+
+
+#define TEST_ASSERT(x) if(!(x)) \
+{ \
+ std::cerr << __FILE__ \
+ << ": Assertion " #x " failed on line " \
+ << __LINE__ << std::endl; return 1; \
+}
+
+int main()
+{
+ MscTimeInterval<double> dou(false,10,18,true);
+ MscTimeInterval<DecScaled> dec(false,10,18,true);
+
+ MscTimeInterval<double> inter_double(std::string("( 10 , 18] sd "));
+ MscTimeInterval<DecScaled> inter_dec(std::string(" ( 1 0 , 1 8] "));
+ std::cerr << inter_double << std::endl;
+ std::cerr << dou << std::endl;
+
+ TEST_ASSERT(dou==inter_double);
+
+ std::cerr << inter_dec << std::endl;
+ std::cerr << dec << std::endl;
+
+ TEST_ASSERT(dec==inter_dec);
+
+
+ try {
+ MscTimeInterval<double> a(std::string(" 9 9 "));
+ TEST_ASSERT(false);
+ }
+ catch(MscIntervalStringConversionError){}
+
+ try {
+ MscTimeInterval<DecScaled> b(std::string("5,4]"));
+ TEST_ASSERT(false);
+ }
+ catch(MscIntervalStringConversionError){}
+
+ try {
+ MscTimeInterval<DecScaled> c(std::string("[5,4"));
+ TEST_ASSERT(false);
+ }
+ catch(MscIntervalStringConversionError){}
+
+ MscTimeInterval<DecScaled> d("[10]");
+ std::cerr << d << std::endl;
+
+ return 0;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|