source: cpp/gdk/param.h @ 57

Last change on this file since 57 was 5, checked in by sz, 16 years ago

added the GDK (Genotype Development Kit)

File size: 10.1 KB
Line 
1// This file is a part of Framsticks GDK library.
2// Copyright (C) 2002-2006  Szymon Ulatowski.  See LICENSE.txt for details.
3// Refer to http://www.frams.alife.pl/ for further information.
4
5#ifndef _PARAM_H_
6#define _PARAM_H_
7
8#include <stdio.h>
9#include "sstring.h"
10#include "list.h"
11#include "statrick.h"
12#include "virtfile.h"
13
14class ExtValue;
15class ExtObject;
16
17// ParamInterface flags:
18#define PARAM_READONLY  1
19#define PARAM_DONTSAVE  2
20#define PARAM_SETLEVEL(x) (((x)&3)<<2)
21#define PARAM_LEVEL(x) (((x)>>2)&3)
22#define PARAM_USERREADONLY 16
23#define PARAM_USERHIDDEN 32
24// for mutableparam (private!)
25#define MUTPARAM_ALLOCENTRY 64
26#define MUTPARAM_ALLOCDATA 128
27#define PARAM_NOSTATIC 256
28#define PARAM_CONST 512
29#define PARAM_CANOMITNAME 1024
30#define PARAM_DONTLOAD  2048
31
32// wynik z param::set() to kombinacja bitow:
33
34#define PSET_RONLY      1
35// oznacza,ze nie mozna zmienic
36
37#define PSET_CHANGED    2
38// zaawansowane: wartosc zostala zmieniona
39
40#define PSET_HITMIN     4
41#define PSET_HITMAX     8
42// wartosc zostala dopasowana do min lub max
43
44#define PSET_WARN (PSET_RONLY | PSET_HITMIN | PSET_HITMAX)
45// pozyteczna kombinacja - oznacza, ze nalezy pobrac i wyswietlic
46// wartosc, zeby uzytkownik wiedzial, ze jego propozycja jest odrzucona
47
48#define PSET_NOPROPERTY 16
49
50/** Property get/set interface - runtime access to named properties */
51class ParamInterface
52{
53public:
54virtual int getGroupCount()=0; ///< @return number of property groups
55virtual int getPropCount()=0; ///< @return number of properties
56
57virtual const char* getName()=0;
58virtual const char* getDescription() {return 0;}
59
60int findId(const char *n);      ///< find id number for internal name
61int findIdn(const char *naz,int n);
62
63virtual const char *id(int i)=0;        ///< get internal name
64virtual const char *name(int i)=0;      ///< get human readable name
65
66/** get type description.
67    first character defines basic datatype:
68    - d = integer
69    - f = floating point
70    - s = string
71    - o = ExtObject
72    - x = ExtValue (universal datatype)
73 */
74virtual const char *type(int i)=0;     
75
76virtual const char *help(int i)=0;      ///< get long description (tooltip)
77
78virtual int flags(int i)=0;             ///< get flags
79
80virtual int group(int i)=0;             ///< get group id for a property
81virtual const char *grname(int gi)=0;   ///< get group name
82virtual int grmember(int gi,int n)=0;   ///< get property id for n'th member of group "gi"
83
84virtual void call(int i,ExtValue* args,ExtValue *ret)=0;
85
86void get(int,ExtValue &retval); ///< most universal get, can be used for every datatype
87
88virtual SString getString(int)=0;       ///< get string value, you can only use this for "s" type property
89virtual long getInt(int)=0;     ///< get long value, you can only use this for "d" type property
90virtual double getDouble(int)=0;        ///< get double value, you can only use this for "f" type property
91virtual ExtObject getObject(int)=0;     ///< get object reference, you can only use this for "o" type property
92virtual ExtValue getExtValue(int)=0;    ///< get extvalue object, you can only use this for "x" type property
93
94SString get(int);               ///< old style get, can convert long or double to string
95SString getText(int);           ///< like getString, returns enumeration label for subtype "d 0 n ~enum1~enum2...
96
97SString getStringById(const char*prop);  ///< get string value, you can only use this for "s" type property
98long getIntById(const char* prop);    ///< get long value, you can only use this for "d" type property
99double getDoubleById(const char* prop);///< get double value, you can only use this for "f" type property
100ExtObject getObjectById(const char* prop);///< get object reference, you can only use this for "o" type property
101ExtValue getExtValueById(const char* prop);///< get extvalue object, you can only use this for "x" type property
102ExtValue getById(const char* prop);
103
104virtual int setInt(int,long)=0;         ///< set long value, you can only use this for "d" type prop
105virtual int setDouble(int,double)=0;    ///< set double value, you can only use this for "f" type prop
106virtual int setString(int,const SString &)=0;   ///< set string value, you can only use this for "s" type prop
107virtual int setObject(int,const ExtObject &)=0;         ///< set object reference, you can only use this for "o" type prop
108virtual int setExtValue(int,const ExtValue &)=0;        ///< 4 in 1
109
110int set(int,const ExtValue &);///< most universal set, can be used for every datatype
111
112int set(int,const char*);               ///< oldstyle set, can convert string to long or double
113
114int setIntById(const char* prop,long);///< set long value, you can only use this for "d" type prop
115int setDoubleById(const char* prop,double);///< set double value, you can only use this for "f" type prop
116int setStringById(const char* prop,const SString &);///< set string value, you can only use this for "s" type prop
117int setObjectById(const char* prop,const ExtObject &);///< set object reference, you can only use this for "o" type prop
118
119int setExtValueById(const char* prop,const ExtValue &); ///< 4 in 1
120
121/** get valid minimum, maximum and default value for property 'prop'
122    @return 0 if min/max/def information is not available */
123int getMinMax(int prop,long& minumum,long& maximum,long& def);
124/** get valid minimum, maximum and default value for property 'prop'
125    @return 0 if min/max/def information is not available */
126int getMinMax(int prop,double& minumum,double& maximum,double& def);
127
128virtual void setDefault(bool numericonly=false);
129virtual void setDefault(int i,bool numericonly=false);
130void setMin();
131void setMax();
132void setMin(int i);
133void setMax(int i);
134
135/** copy all property values from other ParamInterface object */
136void copyFrom(ParamInterface *src);
137
138/** copy all property values from compatible ParamInterface object.
139    this method is more efficient than copyFrom,
140    but can be used only if the other object has the same properties sequence, eg:
141    - any two Param objects having common paramtab
142    - any ParamInterface object and the Param with paramtab constructed by ParamObject::makeParamTab
143 */
144void quickCopyFrom(ParamInterface *src);
145
146int save(VirtFILE*,const SString* altname=0,bool force=0);
147int saveprop(VirtFILE*,int i,const char* p,bool force=0);
148void load(VirtFILE*);
149void load2(const SString &,int &);
150};
151
152// implementations:
153
154extern char MakeCodeGuardHappy;
155
156#define PROCOFFSET(_proc_) ( (void (*)(void*,ExtValue*,ExtValue*)) &(FIELDSTRUCT :: _proc_ ## _statrick))
157#define STATICPROCOFFSET(_proc_) ( (void (*)(void*,ExtValue*,ExtValue*)) &(FIELDSTRUCT :: _proc_))
158#define GETOFFSET(_proc_) ( (void (*)(void*,ExtValue*)) &(FIELDSTRUCT :: _proc_ ## _statrick))
159#define SETOFFSET(_proc_) ( (int (*)(void*,const ExtValue*)) &(FIELDSTRUCT :: _proc_ ## _statrick))
160
161#define FIELDOFFSET(_fld_) ((long)((char*)(&((FIELDSTRUCT*)&MakeCodeGuardHappy)->_fld_)-((char*)((FIELDSTRUCT*)&MakeCodeGuardHappy))))
162
163#define FIELD(_fld_) FIELDOFFSET(_fld_),0,0
164#define LONGOFFSET(_o_) (_o_),0,0
165#define PROCEDURE(_proc_) 0,(void*)PROCOFFSET(_proc_),0
166#define STATICPROCEDURE(_proc_) 0,(void*)STATICPROCOFFSET(_proc_),0
167#define GETSET(_proc_) 0,(void*)GETOFFSET(get_ ## _proc_),(void*)SETOFFSET(set_ ## _proc_)
168#define GETFIELD(_proc_) FIELDOFFSET(_proc_),(void*)GETOFFSET(get_ ## _proc_),0
169#define SETFIELD(_proc_) FIELDOFFSET(_proc_),0,(void*)SETOFFSET(set_ ## _proc_)
170#define GETONLY(_proc_) 0,(void*)GETOFFSET(get_ ## _proc_),0
171#define SETONLY(_proc_) 0,0,(void*)SETOFFSET(set_ ## _proc_)
172
173#define PARAMPROCARGS ExtValue* args,ExtValue* ret
174#define PARAMSETARGS const ExtValue* arg
175#define PARAMGETARGS ExtValue* ret
176
177#define PARAMPROCDEF(name) STATRICKDEF2(name,ExtValue*,ExtValue*)
178#define PARAMGETDEF(name) STATRICKDEF1(get_ ## name,ExtValue*)
179#define PARAMSETDEF(name) STATRICKRDEF1(int,set_ ## name,const ExtValue*)
180
181///////////////////////////////
182
183struct ParamEntry
184{
185const char *id;
186short group,flags;
187const char *name,*type;
188long offset;
189void *fun1; ///< procedure or get
190void *fun2; ///< set
191const char *help;
192};
193
194struct ParamEntryConstructor: public ParamEntry
195{
196public:
197ParamEntryConstructor(const char *_id,short _group=0,short _flags=0,const char *_name=0,const char *_type=0,long _offset=0,void *_fun1=0, void *_fun2=0, const char *_help=0)
198{id=_id;group=_group;flags=_flags;name=_name;type=_type;offset=_offset;fun1=_fun1;fun2=_fun2;help=_help;}
199};
200
201class SimpleAbstractParam: public virtual ParamInterface
202{
203protected:
204virtual void *getTarget(int i);
205virtual ParamEntry *entry(int i)=0;
206const char* myname;
207bool dontcheckchanges;
208
209public:
210void *object;
211
212const char* getName() {return myname;}
213void setName(const char* n) {myname=n;}
214
215/**
216        @param t ParamEntry table
217        @param o controlled object
218        @param n Param's name
219*/
220SimpleAbstractParam(void* o=0,const char*n=0):object(o),myname(n),dontcheckchanges(0) {}
221
222void select(void *o) {object=o;}
223void* getSelected() {return object;}
224
225const char *id(int i) {return (i>=getPropCount())?0:entry(i)->id;}
226const char *name(int i) {return entry(i)->name;}
227const char *type(int i) {return entry(i)->type;}
228const char *help(int i) {return entry(i)->help;}
229int flags(int i) {return entry(i)->flags;}
230int group(int i) {return entry(i)->group;}
231void call(int i,ExtValue* args,ExtValue *ret);
232
233SString getString(int);
234long getInt(int);
235double getDouble(int);
236ExtObject getObject(int);
237ExtValue getExtValue(int);
238
239int setInt(int,long);
240int setDouble(int,double);
241int setString(int,const SString &);
242int setObject(int,const ExtObject &);
243int setExtValue(int,const ExtValue &);
244
245int isequal(int i,void* defdata);
246void save2(SString&,void *defdata,int addcr=1);
247
248virtual void setDefault(bool numericonly=false);
249virtual void setDefault(int i,bool numericonly=false);
250};
251
252class Param: public SimpleAbstractParam
253{
254protected:
255ParamEntry *entry(int i) {return tab+tab[0].group+i;}
256public:
257ParamEntry *tab;
258/**
259        @param t ParamEntry table
260        @param o controlled object
261        @param n Param's name
262*/
263
264Param(ParamEntry *t=0,void* o=0,const char*n=0):SimpleAbstractParam(o,n),tab(t)
265{if (!n&&tab) myname=tab[0].name;}
266
267const char* getDescription() {return tab[0].type;}
268
269int getGroupCount() {return tab[0].group;}
270int getPropCount() {return tab[0].flags;}
271const char *grname(int i) {return (i<getGroupCount())?tab[i].id:0;}
272int grmember(int,int);
273void setParamTab(ParamEntry *t,int dontupdatename=0) {tab=t; if ((!dontupdatename)&&tab) myname=tab[0].name; }
274ParamEntry *getParamTab() const {return tab;}
275};
276
277extern ParamEntry empty_paramtab[];
278
279#endif
Note: See TracBrowser for help on using the repository browser.