diff --git a/src/coord.cpp b/src/coord.cpp index 4d6aa91201e768552af2c44d036a21eb6cd11399..fad1cf89b3626cf550d01e7250288a320e70c539 100644 --- a/src/coord.cpp +++ b/src/coord.cpp @@ -12,7 +12,6 @@ using namespace std; #include "mystd.h" #include "coord.h" -#include "range.h" #include "gar.h" CCoord::CCoord(void) diff --git a/src/dualplot.cpp b/src/dualplot.cpp index 9a10befdc6ff382131ac9783f84a295506b28531..b192a5ee710dc33dc9dcfc8ff5954e5520771d5d 100644 --- a/src/dualplot.cpp +++ b/src/dualplot.cpp @@ -17,13 +17,242 @@ #include "mystd.h" #include "plotaux.h" #include "coord.h" -#include "readln.h" +//#include "readln.h" #include "asi.h" +#include "gar.h" #include "dualplot.h" #define PSMAX 10 #define LINSIZ 80 +CRange::CRange(void) +{ + // initialize as infinite + flag = 1; + inf = 0; + sup = 0; + valid = 1; +} + +CRange::CRange( double infin, double supin ) +{ + flag = 0; + inf = infin; + sup = supin; + test(); +} + +CRange::CRange(int flagin) +{ + flag = flagin; + inf = 0; + sup = 0; + valid = 1; +} + +CRange::CRange(int flagin, double infin, double supin) +{ + flag = flagin; + inf = infin; + sup = supin; + test(); +} + +char RangeDecode( const string& resp, CRange *rval ); + +CRange::CRange( const string& text ) +{ + CRange rval; + char ok; + ok = RangeDecode( text, &rval ); + if (ok!='v') { + flag = 1; + inf = 0; + sup = 0; + valid = 0; + } else { + *this = rval; + } +} + +CRange::~CRange(void) +{ +} + +void CRange::Round(int logflag, double relmargin, double digits) +{ + if (!test()) + throw "Range::Round: illegal params: " + str(); + + if (inf==sup) { + *this = CRange(inf-1., sup+1.); + } else if (finite()) { + double margin = relmargin * (sup - inf); + double mydigits = digits; + double inf2, sup2; + do { + if (mydigits>=8.5) return; // do not round + sup2 = mystd::round_decimal( sup+margin, mydigits ); + inf2 = mystd::round_decimal( inf-margin, mydigits ); + if(sup<0 && sup2>0) sup2 = 0; + if(inf2<0 && inf>0) inf2 = 0; + mydigits += 0.5; + } while (!((inf2<inf) && (sup<sup2))); + *this = CRange(inf2, sup2); + } +} + +bool CRange::infinite() const +{ + return (flag&1); +} + +bool CRange::empty() const +{ + return (flag&2 || inf>sup || ((flag&4 || flag&8) && inf==sup)); +} + +bool CRange::finite() const +{ + return (!this->infinite() && !this->empty()); +} + +bool CRange::contained(double val) const +{ + if (this->infinite()) + return 1; + else if (this->empty()) + return 0; + else + return ((inf<val || (!(flag&4) && inf==val)) && + (sup>val || (!(flag&8) && sup==val))); +} + +bool CRange::overlap(const CRange& T2) const +{ + if (empty() || T2.empty()) + return 0; + else if (infinite() || T2.infinite()) + return 1; + else + return (contained(T2.inf) || contained(T2.sup) || + T2.contained(inf) || T2.contained(sup)); +} + +double CRange::relval(int logflag, double v) const +{ + if (flag&1 || flag&2) return 0; + if (logflag) { + if(inf<0 || v<0) return 0; + return (double) + (log(v/(double)inf) / log((double)sup/(double)inf)); + } else { + return (v-inf) / (sup-inf); + } +} + +CRange CRange::operator*(const CRange& R) +{ + CRange Z; + if (infinite() || R.infinite()) { + Z.flag = 1; + } else if (R.empty()) { + Z = *this; + } else if (empty()) { + Z = R; + } else { + // cout << " input: " << *this << " * " << R; + Z = CRange(min(inf, R.inf), max(sup, R.sup)); + // Z.flag4 = .. + // Z.flag8 = .. + // cout << " output : " << Z << endl; + } + return Z; +} + +CRange CRange::operator*=(const CRange& R) +{ + CRange Z = *this * R; + return *this = Z; +} + +bool CRange::test(void) +{ + return valid = (inf<=sup || flag&1 || flag&2); +} + +const char * CRange::helptext = + "a floating-point range:\n" + " -> <x> <y> for a closed interval (x y)\n" + " -> - for an empty range\n" + " -> * for an infinite range\n"; + +char RangeDecode( const string& resp, CRange *rval ) +{ + double r1, r2; + if ( resp=="" ) { + return 'd'; + } else if ( resp=="*" ) { + *rval = CRange(1); + return 'v'; + } else if ( resp=="-" ) { + *rval = CRange(2); + return 'v'; + } + string s1, s2; + mystd::string_extract_word(string(resp), &s1, &s2); + if (!mystd::any2dbl(s1,&r1) && !mystd::any2dbl(s2,&r2)) { + *rval = CRange(r1, r2); + if (!rval->test()) return 'h'; + return 'v'; + } + return 'h'; +} + +CRange CRange::Ask( const string& quest ) +{ + return Ask(quest, 0, CRange()); +} + +CRange CRange::Ask( const string& quest, const CRange& Def ) +{ + return Ask(quest, 1, Def); +} + +CRange CRange::Ask( const string& quest, const bool defflag, + const CRange& Def) +{ + *this = myask( quest, defflag, Def, helptext, RangeDecode ); + return *this; +} + +string CRange::str(void) const +{ + if (!valid) + return "<invalid range>"; + else if (finite()) + return ((flag&4) ? ")" : "(") + + strg(inf) + " " + strg(sup) + + ((flag&8) ? "(" : ")"); + else if (infinite()) + return "*"; + else + return "-"; +} + +ostream& operator<< (ostream &s, const CRange& R) +{ + if (!R.valid) + return s << "<invalid range>"; + else if (R.finite()) + return s << ((R.flag&4) ? ")" : "(") + << R.inf << " " << R.sup + << ((R.flag&8) ? "(" : ")"); + else if (R.infinite()) + return s << "*"; + else + return s << "-"; +} namespace NPlot { CAxis X, Y; diff --git a/src/dualplot.h b/src/dualplot.h index 7c8422630c6e8024b51ff76ac60ff369d034f2bc..88d242f7d07272c360ddb0e30a5c1d637c6b49ec 100644 --- a/src/dualplot.h +++ b/src/dualplot.h @@ -1,4 +1,46 @@ -#include "range.h" +class CRange { + public: + int flag; // 1: infinite, 2: empty, 4: exclude_inf, 8: exclude_sup + double inf, sup; + bool valid; + + CRange(void); + CRange(int flagin); + CRange(double infin, double supin); + CRange(int flagin, double infin, double supin); + CRange(const string& text); + ~CRange(void); + + bool test(void); + + bool infinite() const; + bool empty() const; + bool finite() const; + + bool contained(double val) const; + bool overlap(const CRange& T2) const; + double relval(int logflag, double v) const; + double inf_pos(void); + + void Round(int logflag, double relmargin, double digits); + + CRange operator*(const CRange& R); // Vereinigungsmenge + CRange operator*=(const CRange& R); + + CRange Ask( const string& quest); + CRange Ask( const string& quest, const CRange& Def); + CRange Ask( const string& quest, bool defflag, const CRange& Def); + string str(void) const; + inline const char* c_str(void) const + { return str().c_str(); }; + friend ostream& operator<< (ostream &s, const CRange& R); + + private: + static const char* helptext; +}; + +inline string strg(const CRange& R) { return R.str(); }; + class CAxis { public: diff --git a/src/range.cpp b/src/range.cpp deleted file mode 100644 index 1d13784250e14ecb37325012cb24a2851f1d1eea..0000000000000000000000000000000000000000 --- a/src/range.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// This is range.cpp. -// -// uses preprocessor templates to define CRange and CLimits: - -#include <math.h> -#include <string.h> -#include <iostream> -#include <algorithm> - -#include "mystd.h" -#include "range.h" -#include "gar.h" - -using namespace std; - -#define _CRANGE -#define T_CLASS CRange -#define T_TYPE double -#define ANY2TYP any2dbl -#define O_CLASS CLimits -#define T_FORM "%lg" -#define T_INFO "a floating-point range" -#include "range.cpp.tpl" -#undef _CRANGE -#undef T_CLASS -#undef T_TYPE -#undef ANY2TYP -#undef O_CLASS -#undef T_FORM -#undef T_INFO diff --git a/src/range.cpp.tpl b/src/range.cpp.tpl deleted file mode 100644 index a53baab04787fe46ac8047865bc4ce5c9ef07eaf..0000000000000000000000000000000000000000 --- a/src/range.cpp.tpl +++ /dev/null @@ -1,277 +0,0 @@ -//**************************************************************************// -//* FRIDA: fast reliable interactive data analysis *// -//* range.cpp.tpl, to be included by range.cpp *// -//* (C) Joachim Wuttke 1990-, v2(C++) 2001- *// -//* http://frida.sourceforge.net *// -//**************************************************************************// - - -T_CLASS::T_CLASS(void) -{ - // initialize as infinite - flag = 1; - inf = 0; - sup = 0; - valid = 1; -} - -T_CLASS::T_CLASS(T_TYPE infin, T_TYPE supin) -{ - flag = 0; - inf = infin; - sup = supin; - test(); -} - -T_CLASS::T_CLASS(int flagin) -{ - flag = flagin; - inf = 0; - sup = 0; - valid = 1; -} - -T_CLASS::T_CLASS(int flagin, T_TYPE infin, T_TYPE supin) -{ - flag = flagin; - inf = infin; - sup = supin; - test(); -} - -char RangeDecode( const string& resp, T_CLASS *rval ); - -T_CLASS::T_CLASS( const string& text ) -{ - T_CLASS rval; - char ok; - ok = RangeDecode( text, &rval ); - if (ok!='v') { - flag = 1; - inf = 0; - sup = 0; - valid = 0; - } else { - *this = rval; - } -} - -T_CLASS::~T_CLASS(void) -{ -} - -#ifdef _CRANGE -void T_CLASS::Round(int logflag, double relmargin, double digits) -{ - if (!test()) - throw "Range::Round: illegal params: " + str(); - - if (inf==sup) { - *this = T_CLASS(inf-1., sup+1.); - } else if (finite()) { - double margin = relmargin * (sup - inf); - double mydigits = digits; - T_TYPE inf2, sup2; - do { - if (mydigits>=8.5) return; // do not round - sup2 = mystd::round_decimal( sup+margin, mydigits ); - inf2 = mystd::round_decimal( inf-margin, mydigits ); - if(sup<0 && sup2>0) sup2 = 0; - if(inf2<0 && inf>0) inf2 = 0; - mydigits += 0.5; - } while (!((inf2<inf) && (sup<sup2))); - *this = T_CLASS(inf2, sup2); - } -} -#endif - -bool T_CLASS::infinite() const -{ - return (flag&1); -} - -bool T_CLASS::empty() const -{ - return (flag&2 || inf>sup || ((flag&4 || flag&8) && inf==sup)); -} - -bool T_CLASS::finite() const -{ - return (!this->infinite() && !this->empty()); -} - -bool T_CLASS::contained(double val) const -{ - if (this->infinite()) - return 1; - else if (this->empty()) - return 0; - else - return ((inf<val || (!(flag&4) && inf==val)) && - (sup>val || (!(flag&8) && sup==val))); -} - -#ifdef _CLIMITS -bool T_CLASS::contained(int val) const -{ - if (this->infinite()) - return 1; - else if (this->empty()) - return 0; - else - return ((inf<val || (!(flag&4) && inf==val)) && - (sup>val || (!(flag&8) && sup==val))); -} -#endif - -bool T_CLASS::overlap(const T_CLASS& T2) const -{ - if (empty() || T2.empty()) - return 0; - else if (infinite() || T2.infinite()) - return 1; - else - return (contained(T2.inf) || contained(T2.sup) || - T2.contained(inf) || T2.contained(sup)); -} - -double T_CLASS::relval(int logflag, double v) const -{ - if (flag&1 || flag&2) return 0; - if (logflag) { - if(inf<0 || v<0) return 0; - return (T_TYPE) - (log(v/(double)inf) / log((double)sup/(double)inf)); - } else { - return (v-inf) / (sup-inf); - } -} - -T_CLASS T_CLASS::operator*(const T_CLASS& R) -{ - T_CLASS Z; - if (infinite() || R.infinite()) { - Z.flag = 1; - } else if (R.empty()) { - Z = *this; - } else if (empty()) { - Z = R; - } else { - // cout << " input: " << *this << " * " << R; - Z = T_CLASS(min(inf, R.inf), max(sup, R.sup)); - // Z.flag4 = .. - // Z.flag8 = .. - // cout << " output : " << Z << endl; - } - return Z; -} - -T_CLASS T_CLASS::operator*=(const T_CLASS& R) -{ - T_CLASS Z = *this * R; - return *this = Z; -} - -T_CLASS T_CLASS::operator+=(const T_TYPE shift) -{ - if (finite()) { - inf += shift; - sup += shift; - } - return *this; -} - -T_CLASS T_CLASS::operator-=(const T_TYPE shift) -{ - return (*this += -shift); -} - -T_CLASS T_CLASS::operator+(const T_TYPE shift) -{ - T_CLASS Z = *this;; - return (Z += shift); -} - -T_CLASS T_CLASS::operator-(const T_TYPE shift) -{ - T_CLASS Z = *this; - return (Z -= shift); -} - -bool T_CLASS::test(void) -{ - return valid = (inf<=sup || flag&1 || flag&2); -} - -const char * T_CLASS::helptext = - T_INFO ":\n" - " -> <x> <y> for a closed interval (x y)\n" - " -> - for an empty range\n" - " -> * for an infinite range\n"; - -char RangeDecode( const string& resp, T_CLASS *rval ) -{ - T_TYPE r1, r2; - if ( resp=="" ) { - return 'd'; - } else if ( resp=="*" ) { - *rval = T_CLASS(1); - return 'v'; - } else if ( resp=="-" ) { - *rval = T_CLASS(2); - return 'v'; - } - string s1, s2; - mystd::string_extract_word(string(resp), &s1, &s2); - if (!mystd::ANY2TYP(s1,&r1) && !mystd::ANY2TYP(s2,&r2)) { - *rval = T_CLASS(r1, r2); - if (!rval->test()) return 'h'; - return 'v'; - } - return 'h'; -} - -T_CLASS T_CLASS::Ask( const string& quest ) -{ - return Ask(quest, 0, T_CLASS()); -} - -T_CLASS T_CLASS::Ask( const string& quest, const T_CLASS& Def ) -{ - return Ask(quest, 1, Def); -} - -T_CLASS T_CLASS::Ask( const string& quest, const bool defflag, - const T_CLASS& Def) -{ - *this = myask( quest, defflag, Def, helptext, RangeDecode ); - return *this; -} - -string T_CLASS::str(void) const -{ - if (!valid) - return "<invalid range>"; - else if (finite()) - return ((flag&4) ? ")" : "(") - + strg(inf) + " " + strg(sup) - + ((flag&8) ? "(" : ")"); - else if (infinite()) - return "*"; - else - return "-"; -} - -ostream& operator<< (ostream &s, const T_CLASS& R) -{ - if (!R.valid) - return s << "<invalid range>"; - else if (R.finite()) - return s << ((R.flag&4) ? ")" : "(") - << R.inf << " " << R.sup - << ((R.flag&8) ? "(" : ")"); - else if (R.infinite()) - return s << "*"; - else - return s << "-"; -} diff --git a/src/range.h b/src/range.h deleted file mode 100644 index 3ab226c67668ff8323b914d7338cc7334b6f70cf..0000000000000000000000000000000000000000 --- a/src/range.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef H_RANGE - -#define H_RANGE - -#define _CRANGE -#define T_CLASS CRange -#define T_TYPE double -#define O_CLASS CLimits -#include "range.h.tpl" -#undef _CRANGE -#undef T_CLASS -#undef T_TYPE -#undef O_CLASS - -#endif // H_RANGE diff --git a/src/range.h.tpl b/src/range.h.tpl deleted file mode 100644 index 5d9023ea15c6d3ad17e7f94270eeba1c971c43ea..0000000000000000000000000000000000000000 --- a/src/range.h.tpl +++ /dev/null @@ -1,58 +0,0 @@ -// This is range.tpl.h, #include'd by range.h - -class T_CLASS { - public: - int flag; // 1: infinite, 2: empty, 4: exclude_inf, 8: exclude_sup - T_TYPE inf, sup; - bool valid; - - T_CLASS(void); - T_CLASS(int flagin); - T_CLASS(T_TYPE infin, T_TYPE supin); - T_CLASS(int flagin, T_TYPE infin, T_TYPE supin); - T_CLASS(const string& text); - ~T_CLASS(void); - - bool test(void); - - bool infinite() const; - bool empty() const; - bool finite() const; - - bool contained(double val) const; -#ifdef _CLIMITS - bool contained(int val) const; -#endif - bool overlap(const T_CLASS& T2) const; - double relval(int logflag, double v) const; - T_TYPE inf_pos(void); - -#ifdef _CRANGE - void Round(int logflag, double relmargin, double digits); -#endif - - T_CLASS operator*(const T_CLASS& R); // Vereinigungsmenge - T_CLASS operator*=(const T_CLASS& R); - T_CLASS operator+(const T_TYPE); // shift - T_CLASS operator+=(const T_TYPE); - T_CLASS operator-(const T_TYPE); - T_CLASS operator-=(const T_TYPE); - - T_CLASS Ask( const string& quest); - T_CLASS Ask( const string& quest, const T_CLASS& Def); - T_CLASS Ask( const string& quest, bool defflag, const T_CLASS& Def); - string str(void) const; - inline const char* c_str(void) const - { return str().c_str(); }; - friend ostream& operator<< (ostream &s, const T_CLASS& R); - - private: - static const char* helptext; -}; - -inline string strg(const T_CLASS& R) { return R.str(); }; - - - - - diff --git a/src/scan.cpp b/src/scan.cpp index ee105e9129c1592ce7a2984086cf46346958c678..6dad2b0db1fd100d92fbeb5b6e066e559612e3b1 100644 --- a/src/scan.cpp +++ b/src/scan.cpp @@ -12,7 +12,6 @@ #include <iostream> #include "mystd.h" -#include "range.h" #include "scan.h"