Changeset 104


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)

Location:
cpp/gdk
Files:
10 added
32 edited

Legend:

Unmodified
Added
Removed
  • cpp/gdk/Makefile

    r89 r104  
    1414#   defassign-f0_neuroconn.h f0def.xml neurocls-library.h neurocls-factory.h model.def
    1515
    16 TARGETS=convtest gdktest genotest neurotest loadertest f0def.xml model.def
     16TARGETS=convtest gdktest genotest neurotest loadertest serialtest f0def.xml model.def
    1717
    1818all: $(TARGETS)
     
    2828GDKOBJS=list.o advlist.o param.o sstring.o 3d.o model.o modelparts.o errmanager.o \
    2929        neurolibrary.o geno.o genoconv.o extvalue.o framsg.o callbacks.o syntparam.o \
    30         multirange.o multimap.o paramtabobj.o defgenoconv.o sstringutils.o paramobj.o rndutil.o \
     30        multirange.o multimap.o paramtabobj.o defgenoconv.o sstringutils.o paramobj.o \
     31        rndutil.o collectionobj.o hashtable.o stderrors.o 3dobject.o \
    3132        $(CONVMODULES)
    3233
     
    5859loadertest: libgdk.a $(LOADERTESTOBJS)
    5960        g++ $(LOADERTESTOBJS) -L. -lgdk -o $@
     61
     62SERIALTESTOBJS=serialtest.o virtfile.o stdiofile-autoinit.o stdiofile.o nonstd_stdio.o
     63
     64serialtest: libgdk.a $(SERIALTESTOBJS)
     65        g++ $(SERIALTESTOBJS) -L. -lgdk -o $@
    6066
    6167neurocls-library.h: f0.def neurocls-library.m4
     
    103109# DO NOT DELETE
    104110
    105 3d.o: nonstd.h 3d.h framsg.h
     1113d.o: nonstd_math.h framsg.h 3d.h
     1123dobject.o: 3d.h 3dobject.h extvalue.h sstring.h param.h list.h nonstd.h
     1133dobject.o: statrick.h virtfile.h framsg.h nonstd_stl.h threads.h
     1143dobject.o: collectionobj.h hashtable.h
    106115advlist.o: advlist.h list.h nonstd.h callbacks.h statrick.h
    107116callbacks.o: callbacks.h list.h nonstd.h statrick.h
     117collectionobj.o: collectionobj.h param.h sstring.h list.h nonstd.h statrick.h
     118collectionobj.o: virtfile.h framsg.h extvalue.h nonstd_stl.h threads.h
     119collectionobj.o: hashtable.h 3d.h nonstd_math.h stderrors.h sstringutils.h
    108120conv_f1.o: conv_f1.h genoconv.h geno.h sstring.h extvalue.h param.h list.h
    109 conv_f1.o: nonstd.h statrick.h virtfile.h model.h modelparts.h 3d.h
    110 conv_f1.o: sstringutils.h syntparam.h usertags.h paramtabobj.h advlist.h
    111 conv_f1.o: callbacks.h framsg.h multirange.h multimap.h
     121conv_f1.o: nonstd.h statrick.h virtfile.h framsg.h nonstd_stl.h threads.h
     122conv_f1.o: model.h nonstd_math.h modelparts.h 3d.h sstringutils.h syntparam.h
     123conv_f1.o: usertags.h paramtabobj.h advlist.h callbacks.h multirange.h
     124conv_f1.o: multimap.h
    112125convtest.o: genoconv.h geno.h sstring.h extvalue.h param.h list.h nonstd.h
    113 convtest.o: statrick.h virtfile.h model.h modelparts.h 3d.h sstringutils.h
    114 convtest.o: syntparam.h usertags.h paramtabobj.h advlist.h callbacks.h
    115 convtest.o: multimap.h multirange.h conv_f1.h printconvmap.h stdouterr.h
    116 convtest.o: errmanager.h framsg.h
     126convtest.o: statrick.h virtfile.h framsg.h nonstd_stl.h threads.h model.h
     127convtest.o: nonstd_math.h modelparts.h 3d.h sstringutils.h syntparam.h
     128convtest.o: usertags.h paramtabobj.h advlist.h callbacks.h multimap.h
     129convtest.o: multirange.h conv_f1.h printconvmap.h stdouterr.h errmanager.h
    117130defgenoconv.o: defgenoconv.h genoconv.h geno.h sstring.h extvalue.h param.h
    118 defgenoconv.o: list.h nonstd.h statrick.h virtfile.h gen-config.h conv_f1.h
    119 defgenoconv.o: model.h modelparts.h 3d.h sstringutils.h syntparam.h
    120 defgenoconv.o: usertags.h paramtabobj.h advlist.h callbacks.h
    121 errmanager.o: errmanager.h list.h nonstd.h sstring.h framsg.h
     131defgenoconv.o: list.h nonstd.h statrick.h virtfile.h framsg.h nonstd_stl.h
     132defgenoconv.o: threads.h
     133errmanager.o: errmanager.h list.h nonstd.h sstring.h framsg.h threads.h
    122134extvalue.o: extvalue.h sstring.h param.h list.h nonstd.h statrick.h
    123 extvalue.o: virtfile.h framsg.h
    124 framsg.o: nonstd.h framsg.h
    125 gdktest.o: model.h modelparts.h 3d.h genoconv.h geno.h sstring.h extvalue.h
    126 gdktest.o: param.h list.h nonstd.h statrick.h virtfile.h sstringutils.h
    127 gdktest.o: syntparam.h usertags.h paramtabobj.h advlist.h callbacks.h
    128 gdktest.o: defgenoconv.h stdouterr.h errmanager.h framsg.h
     135extvalue.o: virtfile.h framsg.h nonstd_stl.h threads.h sstringutils.h
     136extvalue.o: collectionobj.h hashtable.h 3d.h 3dobject.h
     137framsg.o: framsg.h nonstd_stdio.h
     138fullprops.o: stdiofile.h virtfile.h sstring.h nonstd_dir.h model.h
     139fullprops.o: nonstd_math.h modelparts.h 3d.h genoconv.h geno.h extvalue.h
     140fullprops.o: param.h list.h nonstd.h statrick.h framsg.h nonstd_stl.h
     141fullprops.o: threads.h sstringutils.h syntparam.h usertags.h paramtabobj.h
     142fullprops.o: advlist.h callbacks.h defgenoconv.h stdouterr.h errmanager.h
     143gdktest.o: stdiofile.h virtfile.h sstring.h nonstd_dir.h model.h
     144gdktest.o: nonstd_math.h modelparts.h 3d.h genoconv.h geno.h extvalue.h
     145gdktest.o: param.h list.h nonstd.h statrick.h framsg.h nonstd_stl.h threads.h
     146gdktest.o: sstringutils.h syntparam.h usertags.h paramtabobj.h advlist.h
     147gdktest.o: callbacks.h defgenoconv.h stdouterr.h errmanager.h
    129148genoconv.o: nonstd.h genoconv.h geno.h sstring.h extvalue.h param.h list.h
    130 genoconv.o: statrick.h virtfile.h multimap.h multirange.h
     149genoconv.o: statrick.h virtfile.h framsg.h nonstd_stl.h threads.h multimap.h
     150genoconv.o: multirange.h
    131151geno.o: geno.h sstring.h extvalue.h param.h list.h nonstd.h statrick.h
    132 geno.o: virtfile.h genoconv.h model.h modelparts.h 3d.h sstringutils.h
    133 geno.o: syntparam.h usertags.h paramtabobj.h advlist.h callbacks.h
     152geno.o: virtfile.h framsg.h nonstd_stl.h threads.h genoconv.h model.h
     153geno.o: nonstd_math.h modelparts.h 3d.h sstringutils.h syntparam.h usertags.h
     154geno.o: paramtabobj.h advlist.h callbacks.h
    134155genotest.o: geno.h sstring.h extvalue.h param.h list.h nonstd.h statrick.h
    135 genotest.o: virtfile.h genoconv.h stdiofile.h sstringutils.h defgenoconv.h
     156genotest.o: virtfile.h framsg.h nonstd_stl.h threads.h genoconv.h stdiofile.h
     157genotest.o: nonstd_dir.h sstringutils.h defgenoconv.h
    136158genotypeloader.o: genotypeloader.h sstring.h multiparamload.h param.h list.h
    137 genotypeloader.o: nonstd.h statrick.h virtfile.h
     159genotypeloader.o: nonstd.h statrick.h virtfile.h framsg.h extvalue.h
     160genotypeloader.o: nonstd_stl.h threads.h
     161hashtable.o: hashtable.h sstring.h
    138162list.o: list.h nonstd.h
    139163loadertest.o: genotypeloader.h sstring.h multiparamload.h param.h list.h
    140 loadertest.o: nonstd.h statrick.h virtfile.h
    141 model.o: nonstd.h model.h modelparts.h 3d.h genoconv.h geno.h sstring.h
    142 model.o: extvalue.h param.h list.h statrick.h virtfile.h sstringutils.h
    143 model.o: syntparam.h usertags.h paramtabobj.h advlist.h callbacks.h framsg.h
    144 model.o: multimap.h multirange.h errmanager.h
     164loadertest.o: nonstd.h statrick.h virtfile.h framsg.h extvalue.h nonstd_stl.h
     165loadertest.o: threads.h
     166model.o: nonstd_math.h model.h modelparts.h 3d.h genoconv.h geno.h sstring.h
     167model.o: extvalue.h param.h list.h nonstd.h statrick.h virtfile.h framsg.h
     168model.o: nonstd_stl.h threads.h sstringutils.h syntparam.h usertags.h
     169model.o: paramtabobj.h advlist.h callbacks.h multimap.h multirange.h
     170model.o: errmanager.h
    145171modelparts.o: modelparts.h 3d.h genoconv.h geno.h sstring.h extvalue.h
    146 modelparts.o: param.h list.h nonstd.h statrick.h virtfile.h sstringutils.h
    147 modelparts.o: syntparam.h usertags.h paramtabobj.h model.h advlist.h
    148 modelparts.o: callbacks.h neurolibrary.h multirange.h defassign-f0_neuro.h
     172modelparts.o: param.h list.h nonstd.h statrick.h virtfile.h framsg.h
     173modelparts.o: nonstd_stl.h threads.h sstringutils.h syntparam.h usertags.h
     174modelparts.o: paramtabobj.h model.h nonstd_math.h advlist.h callbacks.h
     175modelparts.o: neurolibrary.h multirange.h defassign-f0_neuro.h
    149176modelparts.o: defassign-f0_part.h defassign-f0_joint.h f0classes.h
    150177modelparts.o: defassign-f0_neuroconn.h
    151178multimap.o: multimap.h multirange.h list.h nonstd.h
    152179multiparamload.o: multiparamload.h param.h sstring.h list.h nonstd.h
    153 multiparamload.o: statrick.h virtfile.h framsg.h
    154 multirange.o: multirange.h list.h nonstd.h
     180multiparamload.o: statrick.h virtfile.h framsg.h extvalue.h nonstd_stl.h
     181multiparamload.o: threads.h
     182multirange.o: multirange.h list.h nonstd.h nonstd_stl.h
    155183neurofactory.o: neurofactory.h modelparts.h 3d.h genoconv.h geno.h sstring.h
    156184neurofactory.o: extvalue.h param.h list.h nonstd.h statrick.h virtfile.h
    157 neurofactory.o: sstringutils.h syntparam.h usertags.h paramtabobj.h
    158 neurofactory.o: neuroimpl.h model.h advlist.h callbacks.h framsg.h
    159 neurofactory.o: neuroimplfiles.h neuroimpl-simple.h neuroimpl-channels.h
    160 neurofactory.o: neuroimpl-fuzzy.h neuroimpl-body-gdk.h neurocls-factory.h
    161 neuroimpl-channels.o: neuroimpl-channels.h neuroimpl.h model.h modelparts.h
    162 neuroimpl-channels.o: 3d.h genoconv.h geno.h sstring.h extvalue.h param.h
    163 neuroimpl-channels.o: list.h nonstd.h statrick.h virtfile.h sstringutils.h
    164 neuroimpl-channels.o: syntparam.h usertags.h paramtabobj.h advlist.h
    165 neuroimpl-channels.o: callbacks.h framsg.h
    166 neuroimpl.o: neuroimpl.h model.h modelparts.h 3d.h genoconv.h geno.h
    167 neuroimpl.o: sstring.h extvalue.h param.h list.h nonstd.h statrick.h
    168 neuroimpl.o: virtfile.h sstringutils.h syntparam.h usertags.h paramtabobj.h
    169 neuroimpl.o: advlist.h callbacks.h framsg.h neurofactory.h
    170 neuroimpl-fuzzy.o: neuroimpl-fuzzy.h neuroimpl.h model.h modelparts.h 3d.h
    171 neuroimpl-fuzzy.o: genoconv.h geno.h sstring.h extvalue.h param.h list.h
    172 neuroimpl-fuzzy.o: nonstd.h statrick.h virtfile.h sstringutils.h syntparam.h
    173 neuroimpl-fuzzy.o: usertags.h paramtabobj.h advlist.h callbacks.h framsg.h
     185neurofactory.o: framsg.h nonstd_stl.h threads.h sstringutils.h syntparam.h
     186neurofactory.o: usertags.h paramtabobj.h neuroimpl.h model.h nonstd_math.h
     187neurofactory.o: advlist.h callbacks.h neurolibrary.h
     188neuroimpl-channels.o: neuroimpl-channels.h neuroimpl.h model.h nonstd_math.h
     189neuroimpl-channels.o: modelparts.h 3d.h genoconv.h geno.h sstring.h
     190neuroimpl-channels.o: extvalue.h param.h list.h nonstd.h statrick.h
     191neuroimpl-channels.o: virtfile.h framsg.h nonstd_stl.h threads.h
     192neuroimpl-channels.o: sstringutils.h syntparam.h usertags.h paramtabobj.h
     193neuroimpl-channels.o: advlist.h callbacks.h
     194neuroimpl.o: neuroimpl.h model.h nonstd_math.h modelparts.h 3d.h genoconv.h
     195neuroimpl.o: geno.h sstring.h extvalue.h param.h list.h nonstd.h statrick.h
     196neuroimpl.o: virtfile.h framsg.h nonstd_stl.h threads.h sstringutils.h
     197neuroimpl.o: syntparam.h usertags.h paramtabobj.h advlist.h callbacks.h
     198neuroimpl.o: neurofactory.h rndutil.h
     199neuroimpl-fuzzy.o: neuroimpl-fuzzy.h neuroimpl.h model.h nonstd_math.h
     200neuroimpl-fuzzy.o: modelparts.h 3d.h genoconv.h geno.h sstring.h extvalue.h
     201neuroimpl-fuzzy.o: param.h list.h nonstd.h statrick.h virtfile.h framsg.h
     202neuroimpl-fuzzy.o: nonstd_stl.h threads.h sstringutils.h syntparam.h
     203neuroimpl-fuzzy.o: usertags.h paramtabobj.h advlist.h callbacks.h
    174204neuroimpl-fuzzy.o: neuroimpl-fuzzy-f0.h
    175 neuroimpl-fuzzy-f0.o: neuroimpl-fuzzy-f0.h sstring.h nonstd.h
    176 neuroimpl-simple.o: neuroimpl-simple.h neuroimpl.h model.h modelparts.h 3d.h
    177 neuroimpl-simple.o: genoconv.h geno.h sstring.h extvalue.h param.h list.h
    178 neuroimpl-simple.o: nonstd.h statrick.h virtfile.h sstringutils.h syntparam.h
    179 neuroimpl-simple.o: usertags.h paramtabobj.h advlist.h callbacks.h framsg.h
     205neuroimpl-fuzzy-f0.o: neuroimpl-fuzzy-f0.h sstring.h nonstd_stl.h
     206neuroimpl-simple.o: neuroimpl-simple.h neuroimpl.h model.h nonstd_math.h
     207neuroimpl-simple.o: modelparts.h 3d.h genoconv.h geno.h sstring.h extvalue.h
     208neuroimpl-simple.o: param.h list.h nonstd.h statrick.h virtfile.h framsg.h
     209neuroimpl-simple.o: nonstd_stl.h threads.h sstringutils.h syntparam.h
     210neuroimpl-simple.o: usertags.h paramtabobj.h advlist.h callbacks.h
    180211neurolibrary.o: neurolibrary.h advlist.h list.h nonstd.h callbacks.h
    181 neurolibrary.o: statrick.h param.h sstring.h virtfile.h modelparts.h 3d.h
    182 neurolibrary.o: genoconv.h geno.h extvalue.h sstringutils.h syntparam.h
    183 neurolibrary.o: usertags.h paramtabobj.h neurocls-library.h
     212neurolibrary.o: statrick.h param.h sstring.h virtfile.h framsg.h modelparts.h
     213neurolibrary.o: 3d.h genoconv.h geno.h extvalue.h nonstd_stl.h threads.h
     214neurolibrary.o: sstringutils.h syntparam.h usertags.h paramtabobj.h
    184215neurotest.o: geno.h sstring.h extvalue.h param.h list.h nonstd.h statrick.h
    185 neurotest.o: virtfile.h genoconv.h stdiofile.h sstringutils.h defgenoconv.h
    186 neurotest.o: neuroimpl.h model.h modelparts.h 3d.h syntparam.h usertags.h
    187 neurotest.o: paramtabobj.h advlist.h callbacks.h framsg.h neurofactory.h
     216neurotest.o: virtfile.h framsg.h nonstd_stl.h threads.h genoconv.h
     217neurotest.o: stdiofile.h nonstd_dir.h sstringutils.h defgenoconv.h
     218neurotest.o: neuroimpl.h model.h nonstd_math.h modelparts.h 3d.h syntparam.h
     219neurotest.o: usertags.h paramtabobj.h advlist.h callbacks.h neurofactory.h
    188220neurotest.o: stdouterr.h errmanager.h
    189 param.o: param.h sstring.h list.h nonstd.h statrick.h virtfile.h extvalue.h
    190 param.o: framsg.h sstringutils.h
     221nonstd_stdio.o: nonstd_stdio.h
     222param.o: param.h sstring.h list.h nonstd.h statrick.h virtfile.h framsg.h
     223param.o: extvalue.h nonstd_stl.h threads.h sstringutils.h
    191224paramobj.o: paramobj.h param.h sstring.h list.h nonstd.h statrick.h
    192 paramobj.o: virtfile.h extvalue.h
     225paramobj.o: virtfile.h framsg.h extvalue.h nonstd_stl.h threads.h
    193226paramtabobj.o: paramtabobj.h param.h sstring.h list.h nonstd.h statrick.h
    194 paramtabobj.o: virtfile.h
     227paramtabobj.o: virtfile.h framsg.h
    195228printconvmap.o: printconvmap.h sstring.h multimap.h multirange.h list.h
    196229printconvmap.o: nonstd.h
    197 sstring.o: sstring.h nonstd.h
     230rndutil.o: rndutil.h nonstd.h nonstd_math.h
     231serialtest.o: collectionobj.h param.h sstring.h list.h nonstd.h statrick.h
     232serialtest.o: virtfile.h framsg.h extvalue.h nonstd_stl.h threads.h
     233serialtest.o: hashtable.h 3d.h
     234sstring.o: sstring.h nonstd_stl.h extvalue.h param.h list.h nonstd.h
     235sstring.o: statrick.h virtfile.h framsg.h threads.h
    198236sstringutils.o: sstringutils.h sstring.h virtfile.h framsg.h
    199 stdiofile-autoinit.o: stdiofile.h virtfile.h sstring.h
    200 stdiofile.o: stdiofile.h virtfile.h sstring.h nonstd.h nonstd_io.h
     237stderrors.o: stderrors.h list.h nonstd.h sstring.h sstringutils.h virtfile.h
     238stderrors.o: framsg.h
     239stdiofile-autoinit.o: stdiofile.h virtfile.h sstring.h nonstd_dir.h
     240stdiofile.o: stdiofile.h virtfile.h sstring.h nonstd_dir.h nonstd_stdio.h
     241stdiofile.o: framsg.h
    201242stdouterr.o: stdouterr.h errmanager.h list.h nonstd.h sstring.h framsg.h
     243stdouterr.o: threads.h virtfile.h
    202244syntparam.o: nonstd.h syntparam.h param.h sstring.h list.h statrick.h
    203 syntparam.o: virtfile.h paramobj.h
     245syntparam.o: virtfile.h framsg.h paramobj.h
    204246virtfile.o: virtfile.h
  • cpp/gdk/callbacks.h

    r66 r104  
    3939void (*fun)(void*,long);
    4040  public:
    41 FunctionCallbackNode(void (*f)(void*,long),void *d):fun(f),userdata(d) {}
     41FunctionCallbackNode(void (*f)(void*,long),void *d):userdata(d),fun(f) {}
    4242void action(long calldata) {(*fun)(userdata,calldata);}
    4343int equals(CallbackNode*);
     
    5151void (*fun)(void*,void*,long);
    5252  public:
    53 StatrickCallbackNode(void *o,void (*f)(void*,void*,long),void *d):object(o),fun(f),userdata(d) {}
     53StatrickCallbackNode(void *o,void (*f)(void*,void*,long),void *d):object(o),userdata(d),fun(f) {}
    5454void action(long calldata) {(*fun)(object,userdata,calldata);}
    5555int equals(CallbackNode*);
  • cpp/gdk/conv_f1.cpp

    r95 r104  
    261261lastNeuroClassParam();
    262262if (neuro_cls_param)
    263         neuro_cls_param->setById(name,ExtValue(value));
     263        {
     264        ExtValue e(value);
     265        const ExtValue &re(e);
     266        neuro_cls_param->setById(name,re);
     267        }
    264268}
    265269
  • cpp/gdk/errmanager.cpp

    r66 r104  
    55#include "errmanager.h"
    66
    7 ErrorManager globalErrorManager;
    87
    98void FramMessage(const char *o,const char *m,const char *bl,int w)
    109{
    11 globalErrorManager.send(o,m,bl,w);
     10ErrorManager::instance.getref().send(o,m,bl,w);
    1211}
     12
     13ThreadSingleton<ErrorManager> ErrorManager::instance;
    1314
    1415void ErrorManager::send(int level,const char *o,const char *m,const char *bl,int w)
     
    7677{
    7778if (isEnabled()) return;
    78 globalErrorManager.add(this);
     79ErrorManager::instance.getref().add(this);
    7980}
    8081
     
    8283{
    8384if (!isEnabled()) return;
    84 globalErrorManager.remove(this);
     85ErrorManager::instance.getref().remove(this);
    8586}
    8687
  • cpp/gdk/errmanager.h

    r66 r104  
    99#include "sstring.h"
    1010#include "framsg.h"
     11#include "threads.h"
    1112
    1213class ErrorHandlerBase;
     
    2627        {send(handlers.size()-1,o,m,bl,w);}
    2728~ErrorManager() {removeAll();}
     29
     30static ThreadSingleton<ErrorManager> instance;
    2831};
    29 
    30 extern ErrorManager globalErrorManager;
    3132
    3233////////////////////////////////////////
     
    5152void disable();
    5253
    53 ErrorHandlerBase(int opts=0):options(opts),mgr(0)
     54ErrorHandlerBase(int opts=0):mgr(0),options(opts)
    5455        {if (!(options&DontEnable)) enable();}
    5556~ErrorHandlerBase()
     
    8788};
    8889
     90class ErrorRedirector: public ErrorHandlerBase
     91{
     92        ErrorManager *other_mgr;
     93public:
     94        ErrorRedirector(ErrorManager *om)
     95                :ErrorHandlerBase(),other_mgr(om) {}
     96
     97        void handle(const char *o,const char *m,const char *bl,int w)
     98                {
     99                other_mgr->send(o,m,bl,w);
     100                }
     101};
     102
    89103#endif
    90104
  • cpp/gdk/extvalue.cpp

    r92 r104  
    55#include "extvalue.h"
    66#include "param.h"
     7#include "sstringutils.h"
    78#include <math.h>
     9#include <ctype.h>
     10#include "collectionobj.h"
     11#include "3dobject.h"
    812
    913SString ExtObject::toString() const
    1014{
    1115if (isEmpty()) return SString("<empty object>");
    12 ParamInterface *p=getParamInterface();
     16Param tmp_param;
     17ParamInterface *p=getParamInterface(tmp_param);
    1318int tostr=p->findId("toString");
    1419if (tostr>=0)
     
    2530        return tmp;
    2631        }
     32}
     33
     34ThreadSingleton<ExtObject::Serialization> ExtObject::serialization;
     35
     36void ExtObject::Serialization::begin()
     37{
     38if (level==0)
     39        refs.clear();
     40level++;
     41}
     42
     43int ExtObject::Serialization::add(const ExtObject &o)
     44{
     45if (o.isEmpty()) return -1;
     46for(int i=0;i<refs.size();i++)
     47        {
     48        ExtObject& r=refs[i];
     49        if (r==o) return i;
     50        }
     51refs.push_back(o);
     52return -1;
     53}
     54
     55void ExtObject::Serialization::replace(const ExtObject& o,const ExtObject& other)
     56{
     57if (o.isEmpty()) return;
     58for(int i=0;i<refs.size();i++)
     59        {
     60        ExtObject& r=refs[i];
     61        if (r==o)
     62                {
     63                r=other;
     64                return;
     65                }
     66        }
     67}
     68
     69void ExtObject::Serialization::remove(const ExtObject& o)
     70{
     71if (o.isEmpty()) return;
     72for(int i=0;i<refs.size();i++)
     73        {
     74        ExtObject& r=refs[i];
     75        if (o==r) refs.erase(refs.begin()+i);
     76        }
     77}
     78
     79const ExtObject* ExtObject::Serialization::get(int ref)
     80{
     81if (ref<0) return NULL;
     82if (ref>=refs.size()) return NULL;
     83return &refs[ref];
     84}
     85
     86void ExtObject::Serialization::end()
     87{
     88level--;
     89if (level==0)
     90        refs.clear();
     91}
     92
     93SString ExtObject::serialize_inner() const
     94{
     95int ref=serialization.getref().add(*this);
     96if (ref>=0)
     97        {
     98        SString ret;
     99        sprintf(ret.directAppend(20),"^%d",ref);ret.endAppend();
     100        return ret;
     101        }
     102
     103if (isEmpty()) return SString();
     104VectorObject *vec=VectorObject::fromObject(*this);
     105if (vec)
     106        return vec->serialize();
     107DictionaryObject *dic=DictionaryObject::fromObject(*this);
     108if (dic)
     109        return dic->serialize();
     110Param tmp_param;
     111ParamInterface *p=getParamInterface(tmp_param);
     112int m=p->findId("toVector");
     113if (m<0)
     114        m=p->findId("toDictionary");
     115if (m>=0)
     116        {
     117        ExtObject o(p->getObject(m));
     118        SString ret=SString(interfaceName())+o.serialize();
     119        return ret;
     120        }
     121m=p->findId("toString");
     122if (m>=0)
     123        {
     124        SString str=p->getString(m);
     125        sstringQuote(str);
     126        SString ret=SString(interfaceName())+"\""+str+"\"";
     127        return ret;
     128        }
     129
     130SString ret=interfaceName();
     131sprintf(ret.directAppend(30),"<%p>",object?object:paraminterface);ret.endAppend();
     132return ret;
     133}
     134
     135SString ExtObject::serialize() const
     136{
     137serialization.getref().begin();
     138SString ret=serialize_inner();
     139serialization.getref().end();
     140return ret;
    27141}
    28142
     
    297411}
    298412
     413SString ExtValue::serialize() const
     414{
     415switch(type)
     416        {
     417        case TString:
     418                {
     419                SString q=sdata();
     420                sstringQuote(q);
     421                return SString("\"")+q+SString("\"");
     422                }
     423        case TInt:
     424                {
     425                SString tmp;
     426                sprintf(tmp.directAppend(20),"%d",idata());
     427                tmp.endAppend();
     428                return tmp;
     429                }
     430        case TDouble:
     431                {
     432                SString tmp;
     433                sprintf(tmp.directAppend(20),"%.15g",ddata());
     434                tmp.endAppend();
     435                if ((!strchr(tmp,'.'))&&(!strchr(tmp,'e'))) tmp+=".0";
     436                return tmp;
     437                }
     438        case TObj:
     439                return odata().serialize();
     440        case TInvalid:
     441                return SString("undefined");
     442        default:
     443                return SString("null");
     444        }
     445}
     446
     447//returns the first character after the parsed number or NULL if not a number
     448const char* ExtValue::parseNumber(const char* in)
     449{
     450if (isdigit(*in)||((*in=='-')&&(isdigit(in[1]))))
     451        {
     452        const char* p=in;
     453        if (*p=='-') p++;
     454        while(isdigit(*p)) p++;
     455        bool fp=false;
     456        if ((*p=='.') && isdigit(p[1]))
     457                {
     458                p++;
     459                while(isdigit(*p)) p++;
     460                fp=true;
     461                }
     462        if (((*p=='e')||(*p=='E')) && (isdigit(p[1]) || (((p[1]=='-') || (p[1]=='+')) && isdigit(p[2]))))
     463                {
     464                p++;
     465                if ((*p=='-')||(*p=='+')) p++;
     466                while(isdigit(*p)) p++;
     467                fp=true;
     468                }
     469
     470        if (fp)
     471                {
     472                setDouble(atof(in));
     473                return p;
     474                }
     475        else
     476                {
     477                setInt(atol(in));
     478                return p;
     479                }
     480        }
     481return NULL;
     482}
     483
     484PtrListTempl<ParamInterface*> ExtValue::deserializable_classes;
     485
     486void ExtValue::initDeserializableClasses()
     487{
     488deserializable_classes+=&Pt3D_Ext::getStaticParam();
     489deserializable_classes+=&Orient_Ext::getStaticParam();
     490}
     491
     492ParamInterface *ExtValue::findDeserializableClass(const char* name)
     493{
     494FOREACH(ParamInterface*,cls,deserializable_classes)
     495        if (!strcmp(cls->getName(),name))
     496                return cls;
     497return NULL;
     498}
     499
     500static const char* skipWord(const char* in)
     501{
     502while(isalpha(*in))
     503        in++;
     504return in;
     505}
     506
     507//returns the first character after the parsed portion or NULL if invalid format
     508const char* ExtValue::deserialize_inner(const char* in)
     509{
     510const char* ret=parseNumber(in);
     511if (ret)
     512        return ret;
     513else if (*in=='\"')
     514        {
     515        ret=skipQuoteString(in+1,NULL);
     516        SString s(in+1,ret-(in+1));
     517        sstringUnquote(s);
     518        setString(s);
     519        if (*ret=='\"')
     520                return ret+1;
     521        else
     522                return NULL;
     523        }
     524else if (*in=='[')
     525        {
     526        VectorObject *vec=new VectorObject;
     527        ExtObject o(&VectorObject::par,vec);
     528        ExtObject::serialization.getref().add(o);
     529        const char* p=in+1;
     530        ExtValue tmp;
     531        while(*p)
     532                {
     533                if (*p==']') {p++;break;}
     534                ret=tmp.deserialize(p);
     535                if (ret)
     536                        {
     537                        vec->data+=new ExtValue(tmp);
     538                        p=ret;
     539                        if (*p==',') p++;
     540                        }
     541                else
     542                        {
     543                        p=NULL;
     544                        break;
     545                        }
     546                }
     547        setObject(o);
     548        return p;
     549        }
     550else if (*in=='{')
     551        {
     552        DictionaryObject *dic=new DictionaryObject;
     553        ExtObject o(&DictionaryObject::par,dic);
     554        ExtObject::serialization.getref().add(o);
     555        const char* p=in+1;
     556        ExtValue args[2]/*={value,key}*/, dummy_ret;
     557        while(*p)
     558                {
     559                if (*p=='}') {p++;break;}
     560                ret=args[1].deserialize(p);
     561                if ((!ret)||(args[1].getType()!=TString)) {p=NULL;break;}
     562                p=ret;
     563                if (*p!=':') {p=NULL;break;}
     564                p++;
     565                ret=args[0].deserialize(p);
     566                if (!ret) {p=NULL;break;}
     567                p=ret;
     568                dic->p_set(args,&dummy_ret);
     569                if (*p==',') p++;
     570                }
     571        setObject(o);
     572        return p;
     573        }
     574else if (!strncmp(in,"null",4))
     575        {
     576        setEmpty();
     577        return in+4;
     578        }
     579else if (!strncmp(in,"undefined",9))
     580        {
     581        setInvalid();
     582        return in+9;
     583        }
     584else if (*in=='<')
     585        { //unserializable object
     586        setInvalid();
     587        while(*in)
     588                if (*in=='>')
     589                        return in+1;
     590                else in++;
     591        return in;
     592        }
     593else if (*in=='^')
     594        {
     595        in++;
     596        ExtValue ref;
     597        ret=ref.parseNumber(in);
     598        if (ret && (ref.getType()==TInt))
     599                {
     600                const ExtObject* o=ExtObject::serialization.getref().get(ref.getInt());
     601                if (o)
     602                        {
     603                        setObject(*o);
     604                        return ret;
     605                        }
     606                }
     607        return NULL;
     608        }
     609else if ((ret=skipWord(in))&&(ret!=in))
     610        {
     611        SString clsname(in,ret-in);
     612        ExtValue tmp;
     613        ret=tmp.deserialize(ret);
     614        ParamInterface *cls=findDeserializableClass(clsname);
     615        if (cls && (tmp.getType()!=TUnknown) && (tmp.getType()!=TInvalid))
     616                {
     617                VectorObject *vec=VectorObject::fromObject(tmp.getObject());
     618                if (vec)
     619                        {
     620                        int m=cls->findId("newFromVector");
     621                        if (m>=0)
     622                                {
     623                                cls->call(m,&tmp,this);
     624                                ExtObject::serialization.getref().replace(tmp.getObject(),getObject());
     625                                return ret;
     626                                }
     627                        }
     628                DictionaryObject *dic=DictionaryObject::fromObject(tmp.getObject());
     629                if (dic)
     630                        {
     631                        int m=cls->findId("newFromDictionary");
     632                        if (m>=0)
     633                                {
     634                                cls->call(m,&tmp,this);
     635                                ExtObject::serialization.getref().replace(tmp.getObject(),getObject());
     636                                return ret;
     637                                }
     638                        }
     639                if (tmp.getType()==TString)
     640                        {
     641                        int m=cls->findId("newFromString");
     642                        if (m>=0)
     643                                {
     644                                cls->call(m,&tmp,this);
     645                                ExtObject::serialization.getref().replace(tmp.getObject(),getObject());
     646                                return ret;
     647                                }
     648                        }
     649                ExtObject::serialization.getref().remove(tmp.getObject());
     650                setEmpty();
     651                }
     652        FMprintf("ExtValue","deserialize",FMLV_WARN,"object of class \"%s\" could not be deserialized",(const char*)clsname);
     653        return ret;
     654        }
     655return NULL;
     656}
     657
     658const char* ExtValue::deserialize(const char* in)
     659{
     660ExtObject::serialization.getref().begin();
     661const char* ret=deserialize_inner(in);
     662ExtObject::serialization.getref().end();
     663return ret;
     664}
     665
    299666ExtObject ExtValue::getObject() const
    300667{
     
    307674if (getType()!=TObj) return ExtValue((long)getType());
    308675ExtObject& o=odata();
    309 return ExtValue(SString(o.isEmpty()?"":o.getParamInterface()->getName()));
    310 }
     676return ExtValue(SString(o.isEmpty()?"":o.interfaceName()));
     677}
  • 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();
  • cpp/gdk/framsg.cpp

    r82 r104  
    1111#endif
    1212
    13 static const char *warn="[warn] ";
    14 static const char *err="[ERROR] ";
     13char* MSG_LEVEL[]={"DEBUG","INFO","WARN","ERROR","CRITICAL"};
    1514
    1615/* TODO integracja z error managerem
    1716void FramMessage(const char *o,const char *m,const char *bl,int w)
    1817{
    19   const char *lvl="";
    20   if (w==1) lvl=warn; else if (w>1) lvl=err;
     18  const char *lvl=MSG_LEVEL[w+1];
    2119#ifdef SHP
    2220  //jesli chcemy zeby nawet w trybie release wysylal komunikaty:
  • cpp/gdk/framsg.h

    r82 r104  
    44#include <stdarg.h>
    55
     6extern char* MSG_LEVEL[];
     7
    68void FMprintf(const char *o,const char *m,int w,const char *bl, ...);
    79void FMprintf(const char *o,const char *m,int w,const char *bl,va_list va);
    8 void FMprintf(const char *bl,...); //dla leniwych - zastepuje printf
     10void FMprintf(const char *bl,...); //for lazy people - instead of printf
    911void FramMessage(const char *o,const char *m,const char *bl,int w);
    1012
     
    1719/*
    1820w: weight (importance) of a message
    19 -1:debugging information, not needed for final users
    20 0: information
    21 1: warning or corrected error
    22 2: uncorrected error. can cause malfunction
    23 3: serious error, causes side effects. user should save what can be
    24    saved and restart the application
     21
     22-1: debugging information, not needed for final users
     23 0: information
     24 1: warning or corrected error
     25 2: uncorrected error. can cause malfunction
     26 3: serious error, causes side effects. user should save what can be saved and restart the application
    2527*/
    2628
  • cpp/gdk/gdktest.cpp

    r81 r104  
    2828       "    ########################################\n",title);
    2929}
    30 void printProperties(ParamInterface &pi)
     30void printProperties(Param &pi)
    3131{
    3232printf(" #        id                      type  name        group (%d properties)\n",pi.getPropCount());
     
    3939}
    4040
    41 void changeOneProperty(ParamInterface &pi)
     41#define PRINT_PROPERTIES(p) {Param tmp_param(p); printProperties(tmp_param);}
     42
     43void changeOneProperty(Param &pi)
    4244{
    4345if (pi.getPropCount()<=0) return;
     
    5456}
    5557
     58#define CHANGE_ONE_PROPERTY(p) {Param tmp_param(p); changeOneProperty(tmp_param);}
     59
    5660void moreAboutPart(Part* p)
    5761{
     
    6165       "and should be handled with care, because they influence other elements of the model.\n\n"
    6266       " [this data is provided by Part::properties() ]\n");
    63 printProperties(p->properties());
     67PRINT_PROPERTIES(p->properties());
    6468printf("\nHowever, there is a subset of properties which may be modified more freely.\n"
    6569       "Properties on this list are related only to this part and can be changed\n"
     
    6771       "will be silently repaired.\n"
    6872       "\n [this data is provided by Part::extraProperties() ]\n");
    69 printProperties(p->extraProperties());
     73PRINT_PROPERTIES(p->extraProperties());
    7074printf("\nThis set of properties can vary from release to release,\n"
    7175       "but can be safely accessed by using extraProperties() call.\n"
     
    7478       "Now we will try to change some of properties:\n\n");
    7579p->getModel().open();
    76 changeOneProperty(p->extraProperties());
     80CHANGE_ONE_PROPERTY(p->extraProperties());
    7781p->getModel().close();
    7882printf("\nLet's see f0... (check out part #%d !)\n\n%s\n", p->refno, (const char*)p->getModel().getF0Geno().getGene());
     
    127131{
    128132printf("Similarly as with Part, the full list of properties comes first:\n\n");
    129 printProperties(j->properties());
     133CHANGE_ONE_PROPERTY(j->properties());
    130134printf("\nActually, there are two kinds of Joints: delta and absolute.\n"
    131135       "For this object, Joint::isDelta() returns %d, so this is the %s Joint.\n",
     
    147151       "The other properties are available from Joint::extraProperties()\n"
    148152       "and at the moment are defined as follows:\n\n");
    149 printProperties(j->extraProperties());
     153PRINT_PROPERTIES(j->extraProperties());
    150154printf("\nThey can be changed just like Part's extra properties:\n");
    151155j->getModel().open();
    152 changeOneProperty(j->extraProperties());
     156CHANGE_ONE_PROPERTY(j->extraProperties());
    153157j->getModel().close();
    154158printf("And after that we have this genotype:\n\n%s\n", (const char*)j->getModel().getF0Geno().getGene());
     
    161165printf("Basic features of Neuro object are similar to those of Part and Joint.\n"
    162166       "We can request a property list:\n\n");
    163 printProperties(n->properties());
     167PRINT_PROPERTIES(n->properties());
    164168printf("\n...and extra properties (which are designed to be always valid and easy to change):\n\n");
    165 printProperties(n->extraProperties());
     169PRINT_PROPERTIES(n->extraProperties());
    166170printf("\nAs usual, we will change something:\n");
    167171n->getModel().open();
    168 changeOneProperty(n->extraProperties());
     172CHANGE_ONE_PROPERTY(n->extraProperties());
    169173n->getModel().close();
    170174printf("Each neuron can have any number of inputs = weighted connections\n with other neurons.\n"
  • cpp/gdk/genoconv.cpp

    r82 r104  
    3232{
    3333if (i>=gcm->converters.size()) return 0;
    34 static char t[20];
    35 sprintf(t,"genkonw%d",i);
    36 return t;
     34sprintf(tmp_id,"genkonw%d",i);
     35return tmp_id;
    3736}
    3837
     
    174173{
    175174if (in.getFormat()==format) return in;
    176 static char path[10];
     175char path[10];
    177176int dep;
    178177char *ret;
  • cpp/gdk/genoconv.h

    r66 r104  
    2121GenoConvManager *gcm;
    2222std::vector<std::string> gcnames;
     23char tmp_id[20];
    2324void freetab();
    2425public:
  • cpp/gdk/genotypeloader.cpp

    r66 r104  
    2222void MiniGenotypeLoader::init()
    2323{
    24 addClass(&genotype_param);
     24addObject(&genotype_param);
    2525breakOn(MultiParamLoader::OnError + MultiParamLoader::AfterObject);
    2626}
     
    2929{
    3030genotype_object.clear();
    31 if ((go()==AfterObject)&&(getClass()==&genotype_param))
     31if ((go()==AfterObject)&&(getObject().matchesInterfaceName(&genotype_param)))
    3232        return &genotype_object;
    3333else
  • cpp/gdk/list.h

    r66 r104  
    5757SListTempl(const SListTempl<T>& src):have(0),used(0),mem(0),pos(0)
    5858        {(*this)=src;}
    59 SListTempl():have(0),used(0),mem(0),pos(0)
     59SListTempl():have(0),used(0),pos(0),mem(0)
    6060        {}
    6161~SListTempl()
  • cpp/gdk/model.cpp

    r89 r104  
    382382SString gen;
    383383
    384 static Param modelparam(f0_model_paramtab);
    385 static Param partparam(f0_part_paramtab);
    386 static Param jointparam(f0_joint_paramtab);
    387 static Param neuroparam(f0_neuro_paramtab);
    388 static Param connparam(f0_neuroconn_paramtab);
     384Param modelparam(f0_model_paramtab);
     385Param partparam(f0_part_paramtab);
     386Param jointparam(f0_joint_paramtab);
     387Param neuroparam(f0_neuro_paramtab);
     388Param connparam(f0_neuroconn_paramtab);
    389389
    390390static Part defaultpart;
     
    563563if (!strncmp(t,"p:",2))
    564564        {
    565         static Param partparam(f0_part_paramtab);
     565        Param partparam(f0_part_paramtab);
    566566        Part *p=new Part();
    567567        partparam.select(p);
     
    576576if (!strncmp(t,"m:",2))
    577577        {
    578         static Param modelparam(f0_model_paramtab);
     578        Param modelparam(f0_model_paramtab);
    579579        modelparam.select(this);
    580580        pos+=2;
     
    584584else if (!strncmp(t,"j:",2))
    585585        {
    586         static Param jointparam(f0_joint_paramtab);
     586        Param jointparam(f0_joint_paramtab);
    587587        Joint *j=new Joint();
    588588        jointparam.select(j);
     
    610610else if (!strncmp(t,"n:",2)) // neuro (or the old neuro object as the special case)
    611611        {
    612         static Param neuroparam(f0_neuro_paramtab);
     612        Param neuroparam(f0_neuro_paramtab);
    613613        Neuro *nu=new Neuro();
    614614        neuroparam.select(nu);
     
    674674else if (!strncmp(t,"c:",2)) // add input
    675675        {
    676         static Param ncparam(f0_neuroconn_paramtab);
     676        Param ncparam(f0_neuroconn_paramtab);
    677677        NeuroConn c;
    678678        ncparam.select(&c);
     
    696696        {
    697697        // we always use old layout for "ni:"
    698         static Param neuroitemparam(f0_neuroitem_paramtab);
     698        Param neuroitemparam(f0_neuroitem_paramtab);
    699699        Neuro *nu=new Neuro();
    700700        neuroitemparam.select(nu);
     
    10851085}
    10861086
    1087 const Geno& Model::getF0Geno()
    1088 {
    1089 static Geno invalidgeno("",'0',"","invalid");
     1087const Geno Model::getF0Geno()
     1088{
    10901089if (buildstatus==building)
    10911090        FMprintf("Model","getGeno",FMLV_WARN,"model was not completed - missing close()");
    10921091if (buildstatus!=valid)
    1093         return invalidgeno;
     1092        return Geno("",'0',"","invalid");
    10941093if (!f0genoknown)
    10951094        {
  • cpp/gdk/model.h

    r82 r104  
    212212    don't use between open()-close()
    213213*/
    214 const Geno &getF0Geno();
     214const Geno getF0Geno();
    215215
    216216/// make f0 genotype from current construction (low level version of getF0Geno)
  • cpp/gdk/modelparts.cpp

    r81 r104  
    9797                       int _prefinputs,int _prefoutput,int _preflocation,
    9898                       int *_vectordata,bool own_vd,int vhints)
    99         :longname(_props->id),
    100          name(_props->name),
    101          description(_description),
     99        :ownedvectordata(own_vd),
     100         name(_props->name),longname(_props->id),description(_description),
    102101         props(_props),
    103102         prefinputs(_prefinputs),
    104103         prefoutput(_prefoutput),
    105104         preflocation(_preflocation),
    106          vectordata(_vectordata),ownedvectordata(own_vd),
    107          visualhints(vhints),impl(0),active(1),genactive(0)
     105         vectordata(_vectordata),
     106         visualhints(vhints),impl_count(0),/*impl(0),*/active(1),genactive(0)
    108107{}
    109108
     
    114113
    115114NeuroClass::NeuroClass()
    116         :name("Invalid"),props(empty_paramtab),
     115        :ownedvectordata(0),
     116         name("Invalid"),
     117         props(empty_paramtab),
    117118         prefinputs(0), prefoutput(0),
    118          preflocation(0), vectordata(0), ownedvectordata(0),
    119          impl(0), active(1), genactive(0)
     119         preflocation(0), vectordata(0),
     120         visualhints(0),impl_count(0), /*impl(0),*/ active(1), genactive(0)
    120121{}
    121122
     
    176177
    177178Neuro::Neuro(double _state,double _inertia,double _force,double _sigmo)
    178         :state(_state),PartBase(getDefaultStyle())
     179        :PartBase(getDefaultStyle()),state(_state)
    179180#ifdef MODEL_V1_COMPATIBLE
    180181,inertia(_inertia),force(_force),sigmo(_sigmo)
     
    187188myclass=0;
    188189knownclass=1;
     190part_refno=-1; joint_refno=-1;
    189191}
    190192
     
    204206#endif
    205207flags=0;
     208part_refno=-1; joint_refno=-1;
    206209}
    207210
     
    614617///////////////////////////////////////
    615618
    616 const SString& Part::getDefaultStyle()
    617 {static SString s("part"); return s;}
    618 const SString& Joint::getDefaultStyle()
    619 {static SString s("joint"); return s;}
     619SString Part::getDefaultStyle()
     620{return SString("part");}
     621SString Joint::getDefaultStyle()
     622{return SString("joint");}
    620623/*
    621624const SString& Neuro::getDefaultStyle()
     
    624627{static SString s("neuroitem"); return s;}
    625628*/
    626 const SString& Neuro::getDefaultStyle()
    627 {static SString s("neuro"); return s;}
     629SString Neuro::getDefaultStyle()
     630{return SString("neuro");}
    628631
    629632Part::Part():PartBase(getDefaultStyle())
     
    776779};
    777780
    778 static Param staticparam;
    779 
    780 ParamInterface &Part::extraProperties()
    781 {
    782 staticparam.setParamTab(f0_part_xtra_paramtab);
    783 staticparam.select(this);
    784 return staticparam;
    785 }
    786 
    787 ParamInterface &Joint::extraProperties()
    788 {
    789 staticparam.setParamTab(f0_joint_xtra_paramtab);
    790 staticparam.select(this);
    791 return staticparam;
    792 }
    793 
    794 ParamInterface &Neuro::extraProperties()
    795 {
    796 staticparam.setParamTab(f0_neuro_xtra_paramtab);
    797 staticparam.select(this);
    798 return staticparam;
    799 }
    800 
    801 ParamInterface &Part::properties()
    802 {
    803 staticparam.setParamTab(f0_part_paramtab);
    804 staticparam.select(this);
    805 return staticparam;
    806 }
    807 
    808 ParamInterface &Joint::properties()
    809 {
    810 staticparam.setParamTab(usedelta?f0_joint_paramtab:f0_nodeltajoint_paramtab);
    811 staticparam.select(this);
    812 return staticparam;
    813 }
    814 
    815 ParamInterface &Neuro::properties()
    816 {
    817 staticparam.setParamTab(f0_neuro_paramtab);
    818 staticparam.select(this);
    819 return staticparam;
     781Param Part::extraProperties()
     782{
     783return Param(f0_part_xtra_paramtab,this);
     784}
     785
     786Param Joint::extraProperties()
     787{
     788return Param(f0_joint_xtra_paramtab,this);
     789}
     790
     791Param Neuro::extraProperties()
     792{
     793return Param(f0_neuro_xtra_paramtab,this);
     794}
     795
     796Param Part::properties()
     797{
     798return Param(f0_part_paramtab,this);
     799}
     800
     801Param Joint::properties()
     802{
     803return Param(usedelta?f0_joint_paramtab:f0_nodeltajoint_paramtab,this);
     804}
     805
     806Param Neuro::properties()
     807{
     808return Param(f0_neuro_paramtab,this);
    820809}
    821810
  • cpp/gdk/modelparts.h

    r81 r104  
    3535PartBase(const SString& s):vis_style(s),mapped(0) {}
    3636~PartBase();
    37 static const SString& getDefaultStyle(){static SString s("none"); return s;}
     37static SString getDefaultStyle(){return SString("none");}
    3838MultiRange *mapped;
    3939enum PartBaseFlags { Selected=1 };
     
    6868{
    6969friend class Model;
    70 static const SString& getDefaultStyle();
     70static SString getDefaultStyle();
    7171Part(double _mass,double _size,double _density,double _friction,double _ingest,double _assim)
    72         :mass(_mass),size(_size),density(_density),friction(_friction),ingest(_ingest),assim(_assim),
    73         PartBase(getDefaultStyle())
     72        :PartBase(getDefaultStyle()),mass(_mass),size(_size),density(_density),friction(_friction),ingest(_ingest),assim(_assim)
    7473        {}
    7574public:
     
    7877Orient o;  ///< orientation in 3d space (rotation matrix)
    7978/// ParamInterface object is preferred way to get/set other properties.
    80 ParamInterface &extraProperties();
    81 ParamInterface &properties();
     79Param extraProperties();
     80Param properties();
    8281long refno;
    8382Pt3D rot;
     
    104103{
    105104friend class Model;
    106 static const SString& getDefaultStyle();
     105SString getDefaultStyle();
    107106Joint(double _stamina,double _stif,double _rotstif,double _d)
    108         :stamina(_stamina),stif(_stif),rotstif(_rotstif),PartBase(getDefaultStyle())
     107        :PartBase(getDefaultStyle()),stamina(_stamina),stif(_stif),rotstif(_rotstif)
    109108        {d=Pt3D(_d,0,0);}
    110109public:
     
    144143
    145144/// ParamInterface object is preferred way to get/set other properties.
    146 ParamInterface &extraProperties();
    147 ParamInterface &properties();
     145Param extraProperties();
     146Param properties();
    148147
    149148// do not touch these:
     
    182181long visualhints;
    183182
    184 void *impl;
     183//void *impl;
     184int impl_count;
    185185bool active;
    186186int genactive;
     
    290290{
    291291friend class Model;
    292 static const SString& getDefaultStyle();
     292static SString getDefaultStyle();
    293293
    294294struct NInput { Neuro *n; double weight; SString *info;
     
    307307public:
    308308enum NeuroFlags { HoldState=2 };
    309 ParamInterface &properties();
    310 ParamInterface &extraProperties();
     309Param properties();
     310Param extraProperties();
    311311
    312312void setInputInfo(int i,const SString& name,const SString &value);
  • cpp/gdk/multiparamload.cpp

    r81 r104  
    1919breakcond=OnError;
    2020emptyparam.setParamTab(empty_paramtab);
     21}
     22
     23int MultiParamLoader::findObject(const ExtObject &o)
     24{
     25for(int i=0;i<objects.size();i++)
     26        if ((*objects(i))==o)
     27                return i;
     28return -1;
     29}
     30
     31void MultiParamLoader::removeObject(const ExtObject &o)
     32{
     33int i=findObject(o);
     34if (i>=0)
     35        {
     36        delete objects(i);
     37        objects-=i;
     38        }
     39}
     40
     41void MultiParamLoader::clearObjects()
     42{
     43FOREACH(ExtObject*,o,objects)
     44        delete o;
     45objects.clear();
    2146}
    2247
     
    102127while (!finished())
    103128        {
    104         if ((status==BeforeObject) || ((status==BeforeUnknown)&&lastclass))
    105                 {
    106                 lastclass->load(file);
     129        if ((status==BeforeObject) || ((status==BeforeUnknown) && !lastobject.isEmpty()))
     130                {
     131                Param tmp_param;
     132                ParamInterface *pi=lastobject.getParamInterface(tmp_param);
     133                pi->load(file);
    107134                if ((status!=Finished) && maybeBreak(AfterObject))
    108135                        break;
     
    155182                lastunknown=0;
    156183                lastunknown.append(t,linlen-1);
    157                 lastclass=0;
    158                 FOREACH(ParamInterface*,pi,params)
    159                         {
    160                         if (!strcmp(pi->getName(),lastunknown)) { lastclass=pi; break; }
    161                         }
    162                         if (lastclass)
     184                lastobject.setEmpty();
     185                FOREACH(ExtObject*,o,objects)
     186                        {
     187                        if (!strcmp(o->interfaceName(),lastunknown)) {lastobject=*o; break;}
     188                        }
     189                        if (!lastobject.isEmpty())
    163190                                {
    164191                                if (maybeBreak(BeforeObject))
     
    244271}
    245272
    246 int MultiParamLoader::loadObjectNow(ParamInterface *pi)
    247 {
     273int MultiParamLoader::loadObjectNow(const ExtObject& o)
     274{
     275Param tmp_param;
     276ParamInterface *pi=o.getParamInterface(tmp_param);
    248277pi->load(file);
    249278status=AfterObject;
  • cpp/gdk/multiparamload.h

    r74 r104  
    99#include "param.h"
    1010#include "virtfile.h"
     11#include "extvalue.h"
    1112
    1213/** This is the general "framsticks-format" file parser for loading multiple objects.
     
    3738SListTempl<VirtFILE*> filestack;
    3839char ownfile;
    39 SList params;
     40PtrListTempl<ExtObject*> objects;
    4041int status;
    4142SString lasterror, lastcomment, lastunknown;
    42 ParamInterface *lastclass;
     43ExtObject lastobject;
    4344int breakcond;
    4445Param emptyparam;
    4546
    4647void init();
    47 void load();
    4848
    4949int maybeBreak(int cond)
     
    5858MultiParamLoader(const char* filename) {init(); load(filename);}
    5959
    60 ~MultiParamLoader() {abort();}
     60~MultiParamLoader() {abort();clearObjects();}
    6161
    6262void reset();
    6363
     64void load(); //< use previously opened file
    6465void load(VirtFILE *f);
    6566void load(const char* filename);
     
    6970    Note that registered classes will only work when the record name matches the class name, otherwise breakOn(BeforeUnknown) must be used and then getClassName() to check for the expected record.
    7071 */
    71 void addClass(ParamInterface *pi) {params+=pi;}
    72 void removeClass(ParamInterface *pi) {params-=pi;}
    73 void clearClasses() {params.clear();}
     72void addObject(ParamInterface *pi) {objects+=new ExtObject(pi);}
     73void removeObject(ParamInterface *pi) {removeObject(ExtObject(pi));}
     74void addObject(const ExtObject &o) {objects+=new ExtObject(o);}
     75void removeObject(const ExtObject &o);
     76int findObject(const ExtObject &o);
     77void clearObjects();
    7478
    7579/** To be used in the main loop: while(event=loader.go()) { ... }
     
    107111
    108112/** Can be used BeforeObject and AfterObject */
    109 ParamInterface *getClass() {return lastclass;}
     113ExtObject &getObject() {return lastobject;}
    110114/** Can be used BeforeUnknown, BeforeObject, AfterObject */
    111 const SString& getClassName() {return lastunknown;}
    112 const void setClassName(SString n) {lastunknown=n;}
     115const SString& getObjectName() {return lastunknown;}
     116const void setObjectName(SString n) {lastunknown=n;}
    113117/** Unknown object will be loaded if you set its class BeforeUnknown */
    114 void setClass(ParamInterface *pi) {lastclass=pi;}
     118void setObject(ParamInterface *pi) {lastobject=ExtObject(pi);}
     119void setObject(const ExtObject& o) {lastobject=o;}
    115120/** Can be used OnComment */
    116121const SString& getComment() {return lastcomment;}
     
    118123const SString& getError() {return lasterror;}
    119124/** Can be used BeforeObject and BeforeUnknown */
    120 int loadObjectNow(ParamInterface *pi);
     125int loadObjectNow(ParamInterface *pi) {return loadObjectNow(ExtObject(pi));}
     126int loadObjectNow(const ExtObject &o);
    121127/** Can be used BeforeObject */
    122 int loadObjectNow() {return loadObjectNow(getClass());}
     128int loadObjectNow() {return loadObjectNow(getObject());}
    123129/** Can be used BeforeObject and BeforeUnknown.
    124130    Object data will not be loaded. */
  • cpp/gdk/neurofactory.cpp

    r81 r104  
    77#include "param.h"
    88#include "neuroimpl.h"
     9#include "neurolibrary.h"
     10
    911#include NEURO_IMPL_FILES
    1012
    11 int NeuroFactory::used=0;
     13NeuroImpl* NeuroFactory::getImplementation(NeuroClass *nc)
     14{
     15if (nc!=NULL)
     16        {
     17        std::map<NeuroClass*,NeuroImpl*>::iterator it=impl.find(nc);
     18        if (it!=impl.end())
     19                return it->second;
     20        }
     21return NULL;
     22}
    1223
    1324NeuroImpl* NeuroFactory::createNeuroImpl(NeuroClass *nc)
     
    1526if (!nc) return 0;
    1627if (!nc->active) return 0;
    17 NeuroImpl* ni=(NeuroImpl*)nc->impl;
     28NeuroImpl* ni=getImplementation(nc);
    1829if (!ni) return 0;
    1930ni=ni->makeNew();
     
    3142NeuroImpl* NeuroFactory::setImplementation(NeuroClass *nc,NeuroImpl *ni,bool deleteold)
    3243{
    33 NeuroImpl* old_ni=(NeuroImpl*)nc->impl;
    34 nc->impl=ni;
     44if (nc==NULL) return NULL;
     45std::map<NeuroClass*,NeuroImpl*>::iterator it=impl.find(nc);
     46NeuroImpl* old_ni=NULL;
     47if (it==impl.end())
     48        {
     49        if (ni!=NULL)
     50                {
     51                impl[nc]=ni;
     52                nc->impl_count++;
     53                }
     54        return NULL;
     55        }
     56else
     57        {
     58        old_ni=it->second;
     59        if (ni)
     60                it->second=ni;
     61        else
     62                {
     63                impl.erase(it);
     64                nc->impl_count--;
     65                }
     66        }
    3567if (deleteold && old_ni) delete old_ni;
    3668return old_ni;
     
    3971#include NEURO_CLS_FACTORY
    4072
    41 void NeuroFactory::setImplementation()
     73void NeuroFactory::setStandardImplementation()
    4274{
    43 if (!used)
    44         {
    45         SETIMPLEMENTATION
    46         }
    47 used++;
     75SETIMPLEMENTATION
    4876}
    4977
    5078void NeuroFactory::freeImplementation()
    5179{
    52 used--;
    53 if (!used)
    54         {
    55         for(int i=0;i<Neuro::getClassCount();i++)
    56                 setImplementation(Neuro::getClass(i),0);
    57         }
     80for(int i=0;i<Neuro::getClassCount();i++)
     81        setImplementation(Neuro::getClass(i),0);
    5882}
    5983
     84void NeuroFactory::removeUnimplemented()
     85{
     86SString removed;
     87for(int i=0;i<Neuro::getClassCount();i++)
     88        {
     89        NeuroClass *nc=Neuro::getClass(i);
     90        if (nc->impl_count==0)
     91                {
     92                removed+=nc->getName();
     93                removed+=" ";
     94                NeuroLibrary::staticlibrary.classes-=i;
     95                i--;
     96                delete nc;
     97                }
     98        }
     99if (removed.len())
     100        FMprintf("NeuroFactory","removeUninmplemented",FMLV_INFO,
     101         "Removed Neuro classes: %s",(const char*)removed);
     102}
     103
  • cpp/gdk/neurofactory.h

    r66 r104  
    77
    88#include "modelparts.h"
     9#include <map>
    910
    1011class NeuroImpl;
     
    1213class NeuroFactory
    1314{
     15std::map<NeuroClass*,NeuroImpl*> impl;
    1416public:
    15 static NeuroImpl* setImplementation(NeuroClass *nc,NeuroImpl *ni,bool deleteold=1);
    16 static NeuroImpl* setImplementation(const SString& classname,NeuroImpl *ni,bool deleteold=1);
    17 static class NeuroImpl* createNeuroImpl(Neuro *n)
     17NeuroImpl* setImplementation(NeuroClass *nc,NeuroImpl *ni,bool deleteold=1);
     18NeuroImpl* setImplementation(const SString& classname,NeuroImpl *ni,bool deleteold=1);
     19NeuroImpl* getImplementation(NeuroClass *nc);
     20class NeuroImpl* createNeuroImpl(Neuro *n)
    1821        {NeuroClass *nc=n->getClass(); if (!nc) return 0; return createNeuroImpl(nc);}
    19 static class NeuroImpl* createNeuroImpl(NeuroClass *nc);
     22class NeuroImpl* createNeuroImpl(NeuroClass *nc);
    2023
    21 static int used;
    22 static void setImplementation();
    23 static void freeImplementation();
     24void setStandardImplementation();
     25void freeImplementation();
     26void removeUnimplemented();
    2427};
    2528
  • cpp/gdk/neuroimpl.cpp

    r81 r104  
    3232#undef FIELDSTRUCT
    3333
    34 NeuroNetConfig::NeuroNetConfig()
     34NeuroNetConfig::NeuroNetConfig(NeuroFactory *fac)
    3535        :par(nncfg_paramtab,this),
    3636         randominit(0.01),
    3737         nnoise(0),
    38          touchrange(1)
     38         touchrange(1),
     39         factory(fac)
    3940{}
    40 
    41 NeuroNetConfig& NeuroNetConfig::getGlobalConfig()
    42 {
    43 static NeuroNetConfig globalconfig;
    44 return globalconfig;
    45 }
    4641
    4742/////////////////////////////////////////////////////////////////
     
    7469for (i=0;n=mod.getNeuro(i);i++)
    7570        {
    76         ni=NeuroFactory::createNeuroImpl(n);
     71        ni=conf.factory->createNeuroImpl(n);
    7772        n->userdata[mytags_id]=ni;
    7873        if (!ni) { errorcount++;
     
    205200                chstate=chnewstate;
    206201        neuro->state=newstate;
    207         if (NeuroNetConfig::getGlobalConfig().nnoise>0.0)
     202        if (owner->getConfig().nnoise>0.0)
    208203                {
    209                 neuro->state+=RndGen.GaussStd()*NeuroNetConfig::getGlobalConfig().nnoise;
     204                neuro->state+=RndGen.GaussStd()*owner->getConfig().nnoise;
    210205                if (channels>1)
    211206                        for(int i=0;i<chstate.size();i++)
    212                                 chstate(0)+=RndGen.GaussStd()*NeuroNetConfig::getGlobalConfig().nnoise;
     207                                chstate(0)+=RndGen.GaussStd()*owner->getConfig().nnoise;
    213208                }
    214209        }
     
    272267void NeuroImpl::readParam()
    273268{
    274 static Param par;
     269Param par;
    275270if (!paramentries) return;
    276271par.setParamTab(paramentries);
  • cpp/gdk/neuroimpl.h

    r81 r104  
    1717
    1818class Creature;
     19class NeuroLibrary;
     20class NeuroFactory;
    1921
    2022class NeuroNetConfig
    2123{
    2224public:
    23 NeuroNetConfig();
     25NeuroNetConfig(NeuroFactory *fac);
    2426
    2527Param par;
     
    2830double touchrange;
    2931
    30 static NeuroNetConfig& getGlobalConfig();
     32NeuroFactory *factory;
     33//static NeuroNetConfig& getGlobalConfig();
    3134};
    3235
     
    4043  public:
    4144
    42 NeuroSignals(NeuroImpl *n):owner(n),cr(0) {}
     45NeuroSignals(NeuroImpl *n):cr(0),owner(n) {}
    4346
    4447#define STATRICKCLASS NeuroSignals
     
    7477static double getStateFromNeuro(Neuro *n);
    7578int getErrorCount() {return errorcount;}
    76 NeuroNetImpl(Model& model, NeuroNetConfig& conf = NeuroNetConfig::getGlobalConfig()
     79NeuroNetConfig &getConfig() {return config;}
     80NeuroNetImpl(Model& model, NeuroNetConfig& conf
    7781#ifdef NEURO_SIGNALS
    7882, ChannelSpace *ch=0
     
    198202/** don't access directly */
    199203double newstate;
     204NeuroNetImpl *owner;
     205/** will be used by readParam() method, if not null  */
     206ParamEntry *paramentries; // no extra properties if ==0
    200207
    201208#ifdef NEURO_SIGNALS
    202209NeuroSignals sigs;
    203 #endif
    204 NeuroNetImpl *owner;
    205210ExtObject sigs_obj;
     211#endif
    206212
    207213/** "virtual constructor" - NeuroFactory uses this method to create the proper implementation object.
    208214    subclasses must return new object here. */
    209215virtual NeuroImpl* makeNew() {return 0;} //
    210 /** will be used by readParam() method, if not null  */
    211 ParamEntry *paramentries; // no extra properties if ==0
    212216/** read additional properties from "moredata" field of the originating Neuro */
    213217void readParam();
     
    247251void validateNeuroState(double& st) {if (st<=-1e10) st=-1e10; else if (st>1e10) st=1e10;}
    248252
    249 NeuroImpl():owner(0),neuro(0),newstate(0),paramentries(0),simorder(1),status(BeforeInit),channels(1),fields_param(0),fields_object(0)
     253NeuroImpl():simorder(1),channels(1),fields_param(0),fields_object(0),status(BeforeInit),neuro(0),newstate(0),owner(0),paramentries(0)
    250254#ifdef NEURO_SIGNALS
    251255,sigs(this),sigs_obj(&NeuroSignals::getStaticParam(),&sigs)
  • cpp/gdk/neurolibrary.cpp

    r81 r104  
    2525if (i<0) return 0;
    2626return getClass(i);
     27}
     28
     29SString NeuroLibrary::getClassName(int classindex)
     30{
     31NeuroClass *cl=getClass(classindex);
     32return cl? cl->getName() : SString();
    2733}
    2834
  • cpp/gdk/neurolibrary.h

    r66 r104  
    2222int findClassIndex(const SString& classname, bool activeonly=1);
    2323NeuroClass* getClass(int classindex) {return (NeuroClass*)classes(classindex);}
     24SString getClassName(int classindex);
    2425int getClassCount() {return classes.size();}
    2526void removeClass(int i);
  • cpp/gdk/neurotest.cpp

    r70 r104  
    8080if (!m.getNeuroCount()) {puts("no neural network");return 1;}
    8181printf("%d neurons,",m.getNeuroCount());
    82 NeuroFactory::setImplementation();
    83 NeuroNetImpl *nn=new NeuroNetImpl(m);
     82NeuroFactory neurofac;
     83neurofac.setStandardImplementation();
     84NeuroNetConfig nn_config(&neurofac);
     85NeuroNetImpl *nn=new NeuroNetImpl(m,nn_config);
    8486int i; Neuro *n;
    8587if (!nn->getErrorCount()) printf(" no errors\n");
     
    138140        nn->simulateNeuroNet();
    139141        }
    140 NeuroFactory::freeImplementation();
     142neurofac.freeImplementation();
    141143}
  • cpp/gdk/param.cpp

    r93 r104  
    231231}
    232232
     233const char* ParamInterface::SERIALIZATION_PREFIX="@Serialized:";
     234
    233235int ParamInterface::saveprop(VirtFILE* f,int i,const char* p,bool force)
    234236{
     
    243245err|=(fputs(p,f)==EOF); fputc(':',f);
    244246cr=0;
    245 ws=get(i);
     247if (*typ=='x')
     248        {
     249        ExtValue ex;
     250        get(i,ex);
     251        ws=SString(SERIALIZATION_PREFIX)+ex.serialize();
     252        }
     253else
     254        ws=get(i);
    246255quoteTilde(ws);
    247256w=ws;
     
    497506        {
    498507        ExtValue e;
    499         if (isdigit(*v)||((*v=='-')&&isdigit(v[1])))
    500                 {
    501                 if (strchr(v,'.')) e.setDouble(atof(v));
    502                 else e.setInt(atol(v));
     508        const char* after;
     509        if (!strncmp(v,SERIALIZATION_PREFIX,strlen(SERIALIZATION_PREFIX)))
     510                {
     511                after=e.deserialize(v+strlen(SERIALIZATION_PREFIX));
     512                if ((after==NULL)||(*after))
     513                        FMprintf("ParamInterface","set",FMLV_WARN,"serialization format mismatch in %s.%s",(getName()?getName():"<Unknown>"),id(i));
     514                }
     515        else if ((after=e.parseNumber(v))&&(*after==0)) //consumed the whole string
     516                {
     517                //OK!
    503518                }
    504519        else
     
    566581long SimpleAbstractParam::getInt(int i)
    567582{
    568 static ExtValue v;
     583ExtValue v;
    569584ParamEntry *pe=entry(i);
    570585if (pe->fun1)
     
    582597double SimpleAbstractParam::getDouble(int i)
    583598{
    584 static ExtValue v;
     599ExtValue v;
    585600ParamEntry *pe=entry(i);
    586601if (pe->fun1)
     
    598613SString SimpleAbstractParam::getString(int i)
    599614{
    600 static ExtValue v;
     615ExtValue v;
    601616ParamEntry *pe=entry(i);
    602617if (pe->fun1)
     
    614629ExtObject SimpleAbstractParam::getObject(int i)
    615630{
    616 static ExtValue v;
     631ExtValue v;
    617632ParamEntry *pe=entry(i);
    618633if (pe->fun1)
     
    630645ExtValue SimpleAbstractParam::getExtValue(int i)
    631646{
    632 static ExtValue v;
     647ExtValue v;
    633648ParamEntry *pe=entry(i);
    634649if (pe->fun1)
     
    649664int SimpleAbstractParam::setInt(int i,long x)
    650665{
    651 static ExtValue v;
     666ExtValue v;
    652667ParamEntry *pe=entry(i);
    653668if (pe->flags&PARAM_READONLY) return PSET_RONLY;
    654 long xcopy=x; //only needed for helpful printed messages: retain original, requested value of x because it may be changed below
     669long xcopy=x; //only needed for messageOnExceedRange(): retain original, requested value of x because it may be changed below
    655670long a=0,b=0;
    656671int result=0;
     
    684699int SimpleAbstractParam::setDouble(int i,double x)
    685700{
    686 static ExtValue v;
     701ExtValue v;
    687702ParamEntry *pe=entry(i);
    688703if (pe->flags&PARAM_READONLY) return PSET_RONLY;
    689 double xcopy=x; //only needed for helpful printed messages: retain original, requested value of x because it may be changed below
     704double xcopy=x; //only needed for messageOnExceedRange(): retain original, requested value of x because it may be changed below
    690705double a=0,b=0;
    691706int result=0;
     
    719734int SimpleAbstractParam::setString(int i,const SString& x)
    720735{
    721 static ExtValue v;
    722 static SString vs;
     736ExtValue v;
     737SString vs;
    723738const SString *xx=&x;
    724739ParamEntry *pe=entry(i);
    725740if (pe->flags&PARAM_READONLY) return PSET_RONLY;
    726 SString xcopy=x; //only needed for helpful printed messages: retain original, requested value of x because it may be changed below
     741SString xcopy=x; //only needed for messageOnExceedRange(): retain original, requested value of x because it may be changed below
    727742const char* t=pe->type+1;
    728743while(*t) if (*t==' ') break; else t++;
     
    759774int SimpleAbstractParam::setObject(int i,const ExtObject& x)
    760775{
    761 static ExtValue v;
     776ExtValue v;
    762777ParamEntry *pe=entry(i);
    763778if (pe->flags&PARAM_READONLY) return PSET_RONLY;
    764 ExtObject xcopy=x; //only needed for helpful printed messages: retain original, requested value of x because it may be changed below
     779ExtObject xcopy=x; //only needed for messageOnExceedRange(): retain original, requested value of x because it may be changed below
    765780if (pe->fun2)
    766781        {
  • cpp/gdk/param.h

    r93 r104  
    151151void load(VirtFILE*);
    152152void load2(const SString &,int &);
     153
     154static const char* SERIALIZATION_PREFIX;
    153155};
    154156
     
    221223        @param n Param's name
    222224*/
    223 SimpleAbstractParam(void* o=0,const char*n=0):object(o),myname(n),dontcheckchanges(0) {}
     225SimpleAbstractParam(void* o=0,const char*n=0):myname(n),dontcheckchanges(0),object(o) {}
     226void setDontCheckChanges(bool x) {dontcheckchanges=x;}
    224227
    225228void select(void *o) {object=o;}
  • cpp/gdk/sstring.cpp

    r92 r104  
    77#include "nonstd_stl.h"
    88#include "extvalue.h"
     9
     10#ifdef MULTITHREADED
     11#include <pthread.h>
     12static pthread_mutex_t sstring_ref_lock;
     13#define REF_LOCK pthread_mutex_lock(&sstring_ref_lock);
     14#define REF_UNLOCK pthread_mutex_unlock(&sstring_ref_lock)
     15#else
     16#define REF_LOCK
     17#define REF_UNLOCK
     18#endif
    919
    1020static int guessMemSize(int request, int memhint)
     
    96106SString::~SString()
    97107{
     108REF_LOCK;
    98109detach();
     110REF_UNLOCK;
    99111}
    100112
     
    102114{
    103115buf=new SBuf(x);
     116memhint=-1;
    104117}
    105118
     
    113126SString::SString(const SString &from)
    114127{
    115 buf=from.buf;
    116 if (buf->size) buf->refcount++;
     128if (from.buf==&SBuf::empty())
     129        buf=&SBuf::empty();
     130else
     131        {
     132        REF_LOCK;
     133        buf=from.buf;
     134        if (buf->size)
     135                buf->refcount++;
     136        REF_UNLOCK;
     137        }
    117138memhint=-1;
    118139}
     
    163184{
    164185if (ensuresize<0) ensuresize=len();
     186REF_LOCK;
    165187detachCopy(ensuresize);
     188REF_UNLOCK;
    166189appending=buf->used;
    167190return buf->txt;
     
    176199char *SString::directAppend(int maxappend)
    177200{
     201REF_LOCK;
    178202detachCopy(buf->used+maxappend);
     203REF_UNLOCK;
    179204appending=buf->used;
    180205return buf->txt+appending;
     
    208233{
    209234if (!count) return;
     235REF_LOCK;
    210236detachCopy(buf->used+count);
     237REF_UNLOCK;
    211238buf->append(txt,count);
    212239}
     
    230257if (!ch) chlen=0;
    231258else if (chlen<0) chlen=strlen(ch);
     259REF_LOCK;
    232260detachEmpty(chlen);
     261REF_UNLOCK;
    233262memcpy(buf->txt,ch,chlen);
    234263buf->txt[chlen]=0; buf->used=chlen;
     
    243272{
    244273if (s.buf==buf) return;
     274REF_LOCK;
    245275detach();
    246276buf=s.buf;
    247277if (buf->size) buf->refcount++;
     278REF_UNLOCK;
    248279}
    249280///////////////////////////////////////
     
    306337}
    307338
    308 const SString& SString::valueOf(int i)
    309 {
    310 static SString t;
     339SString SString::valueOf(int i)
     340{
     341SString t;
    311342sprintf(t.directWrite(20),"%d",i); t.endWrite();
    312343return t;
    313344}
    314 const SString& SString::valueOf(long i)
    315 {
    316 static SString t;
     345SString SString::valueOf(long i)
     346{
     347SString t;
    317348sprintf(t.directWrite(20),"%d",i); t.endWrite();
    318349return t;
    319350}
    320 const SString& SString::valueOf(double d)
    321 {
    322 static SString t;
     351SString SString::valueOf(double d)
     352{
     353SString t;
    323354sprintf(t.directWrite(20),"%g",d); t.endWrite();
    324355return t;
    325356}
    326 const SString& SString::valueOf(const SString& s)
     357SString SString::valueOf(const SString& s)
    327358{
    328359return s;
  • cpp/gdk/sstring.h

    r92 r104  
    157157char charAt(int pos) const {return buf->txt[pos];}
    158158
    159 static const SString& valueOf(int);
    160 static const SString& valueOf(long);
    161 static const SString& valueOf(double);
    162 static const SString& valueOf(const SString&); //tylko do kompletu zeby mozna uzyc tej funkcji nie martwiac sie o typ argumentu
     159static SString valueOf(int);
     160static SString valueOf(long);
     161static SString valueOf(double);
     162static SString valueOf(const SString&); //tylko do kompletu zeby mozna uzyc tej funkcji nie martwiac sie o typ argumentu
    163163static SString valueOf(const ExtValue&); //tylko do kompletu zeby mozna uzyc tej funkcji nie martwiac sie o typ argumentu
    164164static SString valueOf(const ExtObject&); //tylko do kompletu zeby mozna uzyc tej funkcji nie martwiac sie o typ argumentu
  • cpp/gdk/stdouterr.cpp

    r81 r104  
    11// This file is a part of the Framsticks GDK library.
    2 // Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
     2// Copyright (C) 2002-2013  Szymon Ulatowski.  See LICENSE.txt for details.
    33// Refer to http://www.framsticks.com/ for further information.
    44
     
    1212void StdoutErrorHandler::handle(const char *o,const char *m,const char *bl,int w)
    1313{
    14 static char* level[]={"DEBUG","INFO","WARN","ERROR","CRITICAL"};
    1514if (w<-1) w=-1; else if (w>3) w=3;
    1615#ifdef SHP
    17 AppLog("[%s] %s::%s - %s\n",level[w+1],o,m,bl);
     16AppLog("[%s] %s::%s - %s\n",MSG_LEVEL[w+1],o,m,bl);
    1817#else
    1918if (file)
    20         file->printf("[%s] %s::%s - %s\n",level[w+1],o,m,bl);
     19        file->printf("[%s] %s::%s - %s\n",MSG_LEVEL[w+1],o,m,bl);
    2120else
    22         printf("[%s] %s::%s - %s\n",level[w+1],o,m,bl);
     21        printf("[%s] %s::%s - %s\n",MSG_LEVEL[w+1],o,m,bl);
    2322#endif
    2423}
Note: See TracChangeset for help on using the changeset viewer.