Changeset 144 for cpp/frams/util


Ignore:
Timestamp:
02/26/14 20:04:49 (10 years ago)
Author:
sz
Message:

Param and ExtValue? improvements (better control on conversions, "load" returns the number of loaded fields)

Location:
cpp/frams/util
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/util/extvalue.cpp

    r121 r144  
    250250}
    251251
     252static long compareNull(const ExtValue& v)
     253{
     254switch(v.type)
     255        {
     256        case TDouble: return v.getDouble()!=0.0;
     257        case TInt: return v.getInt()?1:0;
     258        case TString: return 1;
     259        default: return !v.isNull();
     260        }
     261}
     262
    252263long ExtValue::compare(const ExtValue& src) const
    253264{
    254265if (type==TUnknown)
    255         {
    256         if (src.type==TDouble)
    257                 return (src.getDouble()!=0.0);
    258         if (src.type==TString)
    259                 return 1;
    260         return src.getInt()?1:0;
    261         }
     266        return compareNull(src);
    262267else if (src.type==TUnknown)
    263         {
    264         if (type==TDouble)
    265                 return (getDouble()!=0.0);
    266         if (type==TString)
    267                 return 1;
    268         return getInt()?1:0;
    269         }
     268        return compareNull(*this);
    270269switch(type)
    271270        {
     
    545544}
    546545
     546long ExtValue::getInt(const char* s)
     547{
     548if ((s[0]=='0')&&(s[1]=='x'))
     549        {
     550        long val;
     551        sscanf(s+2,"%lx",&val);
     552        return val;
     553        }
     554else
     555        {
     556        if (strchr(s,'e')||(strchr(s,'E')))
     557                return (long)atof(s);
     558        else
     559                return atol(s);
     560        }
     561}
     562
     563double ExtValue::getDouble(const char* s)
     564{
     565if ((s[0]=='0')&&(s[1]=='x'))
     566        {
     567        long val;
     568        sscanf(s+2,"%lx",&val);
     569        return val;
     570        }
     571else
     572        return atof(s);
     573}
     574
    547575long ExtValue::getInt() const
    548576{
     
    551579        case TInt: return idata();
    552580        case TDouble: return (int)ddata();
    553         case TString:
    554         {
    555         const char* s=(const char*)sdata();
    556         if ((s[0]=='0')&&(s[1]=='x'))
    557                 {
    558                 long val;
    559                 sscanf(s+2,"%lx",&val);
    560                 return val;
    561                 }
    562         else
    563                 {
    564                 if (strchr(s,'e')||(strchr(s,'E')))
    565                         return (long)atof(s);
    566                 else
    567                         return atol(s);
    568                 }
    569         }
    570         case TObj: return (long)odata().param;
     581        case TString: return getInt((const char*)sdata());
     582        case TObj:
     583                FMprintf("ExtValue","getInt",FMLV_WARN,"Getting integer value from object reference (%s)",(const char*)getString());
     584                return (long)odata().param;
    571585        default:;
    572586        }
    573587return 0;
    574588}
     589
    575590double ExtValue::getDouble() const
    576591{
     
    579594        case TDouble: return ddata();
    580595        case TInt: return (double)idata();
    581         case TString:
    582         {
    583         const char* s=(const char*)sdata();
    584         if ((s[0]=='0')&&(s[1]=='x'))
    585                 {
    586                 long val;
    587                 sscanf(s+2,"%lx",&val);
    588                 return val;
    589                 }
    590         else
    591                 return atof(s);
    592         }
    593         case TObj: return (double)(long)odata().param;
     596        case TString: return getDouble((const char*)sdata());
     597        case TObj:
     598                FMprintf("ExtValue","getDouble",FMLV_WARN,"Getting floating point value from object reference (%s)",(const char*)getString());
     599                return (double)(long)odata().param;
    594600        default:;
    595601        }
  • cpp/frams/util/extvalue.h

    r121 r144  
    147147void setString(const SString &v) {if (type!=TString) setrs(v); else sdata()=v;}
    148148void setObject(const ExtObject &src) {if (type!=TObj) setro(src); else odata()=src;}
     149static long getInt(const char* s);
     150static double getDouble(const char* s);
    149151long getInt() const;
    150152double getDouble() const;
     
    153155SString serialize() const;
    154156ExtObject getObject() const;
     157bool isNull() const {return (type==TUnknown)||((type==TObj)&&odata().isEmpty());}
    155158const char* parseNumber(const char* in);
    156159const char* deserialize(const char* in);//< @return first character after the succesfully parsed string or NULL if failed
Note: See TracChangeset for help on using the changeset viewer.