Changeset 104 for cpp/gdk/extvalue.h


Ignore:
Timestamp:
07/23/13 18:15:30 (11 years ago)
Author:
sz
Message:

introducing object de/serialization - see serialtest.cpp
the core GDK classes can be now used in multiple threads (ifdef MULTITHREADED)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/gdk/extvalue.h

    r92 r104  
    88#include "sstring.h"
    99#include "param.h"
     10#include "nonstd_stl.h"
     11#include "threads.h"
    1012
    1113#define EXTVALUEUNION
     
    4850void* operator new(size_t s) {return malloc(sizeof(ExtObject));}
    4951void operator delete(void* mem) {free(mem);}
    50 
    51 ParamInterface *getParamInterface() const  {if(subtype&2){param->select(object);return param;} return paraminterface;}
    52 const char* interfaceName() const {if (isEmpty()) return "Empty"; return getParamInterface()->getName();}
     52///@param tmp_param can be used for temporary storage, the result ParamInterface* is only valid for as long as tmp_param is valid
     53ParamInterface *getParamInterface(Param &tmp_param) const  {if(subtype&2){tmp_param.setParamTab(param->getParamTab());tmp_param.select(object);return &tmp_param;} return paraminterface;}
     54const char* interfaceName() const {if (isEmpty()) return "Empty"; return (subtype&2)?param->getName():paraminterface->getName();}
     55bool matchesInterfaceName(ParamInterface* pi) const {return !strcmp(interfaceName(),pi->getName());}
    5356void* getTarget() const {return (subtype&1)?dbobject:object;}
    5457void* getTarget(const char* classname) const {return strcmp(interfaceName(),classname)?0:getTarget();}
     58void setEmpty() {decref();subtype=0;param=NULL;object=NULL;}
    5559int isEmpty() const {return !param;}
    5660ExtObject(const ExtObject& src)      {src.incref();copyFrom(src);}
    5761void operator=(const ExtObject& src) {src.incref();decref();copyFrom(src);}
    5862
    59 int operator==(const ExtObject& src) {if (object!=src.object) return 0; return (object==0)?(param==src.param):1;}
     63int operator==(const ExtObject& src) const {if (object!=src.object) return 0; return (object==0)?(!strcmp(param->getName(),src.param->getName())):1;}
    6064
    6165SString toString() const;
     66SString serialize_inner() const;
     67SString serialize() const;
    6268
    6369ExtObject(Param *p,void *o):subtype(2),object(o),param(p){}
     
    6773
    6874~ExtObject(){decref();}
     75
     76class Serialization
     77{
     78std::vector<ExtObject> refs;
     79int level;
     80  public:
     81void begin();
     82void end();
     83int add(const ExtObject& o);
     84void replace(const ExtObject& o,const ExtObject& other);
     85void remove(const ExtObject& o);
     86const ExtObject* get(int ref);
    6987};
    7088
     89static ThreadSingleton<Serialization> serialization;
     90};
    7191
    7292class ExtValue
     
    124144double getDouble() const;
    125145SString getString() const;
     146SString serialize() const;
    126147ExtObject getObject() const;
     148const char* parseNumber(const char* in);
     149const char* deserialize(const char* in);//< @return first character after the succesfully parsed string or NULL if failed
     150const char* deserialize_inner(const char* in);
     151static PtrListTempl<ParamInterface*> deserializable_classes;
     152static ParamInterface *findDeserializableClass(const char* name);
     153static void initDeserializableClasses();
    127154
    128155ExtValue getExtType();
Note: See TracChangeset for help on using the changeset viewer.