# eoIntBounds.cpp

    00001 #ifdef _MSC_VER
    00002 // to avoid long name warnings
    00003 #pragma warning(disable:4786)
    00004 #endif
    00005
    00006 #ifdef HAVE_CONFIG_H
    00007 #include <config.h>
    00008 #endif
    00009
    00010 #include <ctime>
    00011 #include <sstream>
    00012
    00013 #include "eoIntBounds.h"
    00014
    00015
    00016 // the global dummy bounds
    00017 // (used for unbounded variables when bounds are required)
    00018 eoIntNoBounds eoDummyIntNoBounds;
    00019
    00021 extern bool remove_leading(std::string & _s, const std::string _delim);
    00022 extern double read_double(std::string _s);
    00023 extern long int read_int(std::string _s);
    00024
    00025
    00028 eoIntBounds* eoGeneralIntBounds::getBoundsFromString(std::string _value)
    00029 {
    00030   // now read
    00031   std::string delim(",; ");
    00032   std::string beginOrClose("[(])");
    00033   if (!remove_leading(_value, delim)) // only delimiters were left
    00034     throw std::runtime_error("Syntax error in eoGeneralIntBounds Ctor");
    00035
    00036   // look for opening char
    00037   size_t posDeb = _value.find_first_of(beginOrClose);   // allow ]a,b]
    00038   if (posDeb >= _value.size())  // nothing left to read
    00039     throw std::runtime_error("Syntax error in eoGeneralIntBounds Ctor");
    00040
    00041   // ending char: next {}() after posDeb
    00042   size_t posFin = _value.find_first_of(beginOrClose,posDeb+1);
    00043   if (posFin >= _value.size())  // not found
    00044     throw std::runtime_error("Syntax error in eoGeneralIntBounds Ctor");
    00045
    00046   // the bounds
    00047   std::string sBounds = _value.substr(posDeb+1, posFin-posDeb-1);
    00048   // and remove from original string
    00049   _value = _value.substr(posFin+1);
    00050
    00051   remove_leading(sBounds, delim);
    00052   size_t posDelim = sBounds.find_first_of(delim);
    00053   if (posDelim >= sBounds.size())
    00054     throw std::runtime_error("Syntax error in eoGeneralIntBounds Ctor");
    00055
    00056       bool minBounded=false, maxBounded=false;
    00057       long int minBound=0, maxBound=0;
    00058
    00059       // min bound
    00060       std::string sMinBounds = sBounds.substr(0,posDelim);
    00061
    00062       if ( (sMinBounds != std::string("-inf")) &&
    00063            (sMinBounds != std::string("-infinity"))
    00064            )
    00065         {
    00066           minBounded = true;
    00067           minBound = read_int(sMinBounds);
    00068         }
    00069
    00070       // max bound
    00071       size_t posEndDelim = sBounds.find_first_not_of(delim,posDelim);
    00072
    00073       std::string sMaxBounds = sBounds.substr(posEndDelim);
    00074
    00075       if ( (sMaxBounds != std::string("+inf")) &&
    00076            (sMaxBounds != std::string("+infinity"))
    00077            )
    00078         {
    00079           maxBounded = true;
    00080           maxBound = read_int(sMaxBounds);
    00081         }
    00082
    00083       // now create the embedded eoIntBounds object
    00084       eoIntBounds * locBound;
    00085       if (minBounded && maxBounded)
    00086         {
    00087           if (maxBound <= minBound)
    00088             throw std::runtime_error("Syntax error in eoGeneralIntBounds Ctor");
    00089           locBound = new eoIntInterval(minBound, maxBound);
    00090         }
    00091       else if (!minBounded && !maxBounded)      // no bound at all
    00092         locBound = new eoIntNoBounds;
    00093       else if (!minBounded && maxBounded)
    00094         locBound = new eoIntAboveBound(maxBound);
    00095       else if (minBounded && !maxBounded)
    00096         locBound = new eoIntBelowBound(minBound);
    00097       return locBound;
    00098 }