source: cpp/gdk/param.h @ 88

Last change on this file since 88 was 81, checked in by Maciej Komosinski, 12 years ago

improved parsing of properties (e.g. in f0 genotypes)

  • Property svn:eol-style set to native
File size: 10.2 KB
Line 
1// This file is a part of the Framsticks GDK library.
2// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
3// Refer to http://www.framsticks.com/ 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
104int setInt(int i,const char* str);
105int setDouble(int i,const char* str);
106virtual int setInt(int,long)=0;         ///< set long value, you can only use this for "d" type prop
107virtual int setDouble(int,double)=0;    ///< set double value, you can only use this for "f" type prop
108virtual int setString(int,const SString &)=0;   ///< set string value, you can only use this for "s" type prop
109virtual int setObject(int,const ExtObject &)=0;         ///< set object reference, you can only use this for "o" type prop
110virtual int setExtValue(int,const ExtValue &)=0;        ///< 4 in 1
111
112int set(int,const ExtValue &);///< most universal set, can be used for every datatype
113
114int set(int,const char*);               ///< oldstyle set, can convert string to long or double
115
116int setIntById(const char* prop,long);///< set long value, you can only use this for "d" type prop
117int setDoubleById(const char* prop,double);///< set double value, you can only use this for "f" type prop
118int setStringById(const char* prop,const SString &);///< set string value, you can only use this for "s" type prop
119int setObjectById(const char* prop,const ExtObject &);///< set object reference, you can only use this for "o" type prop
120
121int setExtValueById(const char* prop,const ExtValue &); ///< 4 in 1
122
123/** get valid minimum, maximum and default value for property 'prop'
124    @return 0 if min/max/def information is not available */
125int getMinMax(int prop,long& minumum,long& maximum,long& def);
126/** get valid minimum, maximum and default value for property 'prop'
127    @return 0 if min/max/def information is not available */
128int getMinMax(int prop,double& minumum,double& maximum,double& def);
129
130virtual void setDefault(bool numericonly=false);
131virtual void setDefault(int i,bool numericonly=false);
132void setMin();
133void setMax();
134void setMin(int i);
135void setMax(int i);
136
137/** copy all property values from other ParamInterface object */
138void copyFrom(ParamInterface *src);
139
140/** copy all property values from compatible ParamInterface object.
141    this method is more efficient than copyFrom,
142    but can be used only if the other object has the same properties sequence, eg:
143    - any two Param objects having common paramtab
144    - any ParamInterface object and the Param with paramtab constructed by ParamObject::makeParamTab
145 */
146void quickCopyFrom(ParamInterface *src);
147
148int save(VirtFILE*,const SString* altname=0,bool force=0);
149int saveprop(VirtFILE*,int i,const char* p,bool force=0);
150void load(VirtFILE*);
151void load2(const SString &,int &);
152};
153
154// implementations:
155
156extern char MakeCodeGuardHappy;
157
158#define PROCOFFSET(_proc_) ( (void (*)(void*,ExtValue*,ExtValue*)) &(FIELDSTRUCT :: _proc_ ## _statrick))
159#define STATICPROCOFFSET(_proc_) ( (void (*)(void*,ExtValue*,ExtValue*)) &(FIELDSTRUCT :: _proc_))
160#define GETOFFSET(_proc_) ( (void (*)(void*,ExtValue*)) &(FIELDSTRUCT :: _proc_ ## _statrick))
161#define SETOFFSET(_proc_) ( (int (*)(void*,const ExtValue*)) &(FIELDSTRUCT :: _proc_ ## _statrick))
162
163#define FIELDOFFSET(_fld_) ((long)((char*)(&((FIELDSTRUCT*)&MakeCodeGuardHappy)->_fld_)-((char*)((FIELDSTRUCT*)&MakeCodeGuardHappy))))
164
165#define FIELD(_fld_) FIELDOFFSET(_fld_),0,0
166#define LONGOFFSET(_o_) (_o_),0,0
167#define PROCEDURE(_proc_) 0,(void*)PROCOFFSET(_proc_),0
168#define STATICPROCEDURE(_proc_) 0,(void*)STATICPROCOFFSET(_proc_),0
169#define GETSET(_proc_) 0,(void*)GETOFFSET(get_ ## _proc_),(void*)SETOFFSET(set_ ## _proc_)
170#define GETFIELD(_proc_) FIELDOFFSET(_proc_),(void*)GETOFFSET(get_ ## _proc_),0
171#define SETFIELD(_proc_) FIELDOFFSET(_proc_),0,(void*)SETOFFSET(set_ ## _proc_)
172#define GETONLY(_proc_) 0,(void*)GETOFFSET(get_ ## _proc_),0
173#define SETONLY(_proc_) 0,0,(void*)SETOFFSET(set_ ## _proc_)
174
175#define PARAMPROCARGS ExtValue* args,ExtValue* ret
176#define PARAMSETARGS const ExtValue* arg
177#define PARAMGETARGS ExtValue* ret
178
179#define PARAMPROCDEF(name) STATRICKDEF2(name,ExtValue*,ExtValue*)
180#define PARAMGETDEF(name) STATRICKDEF1(get_ ## name,ExtValue*)
181#define PARAMSETDEF(name) STATRICKRDEF1(int,set_ ## name,const ExtValue*)
182
183///////////////////////////////
184
185struct ParamEntry
186{
187const char *id;
188short group,flags;
189const char *name,*type;
190long offset;
191void *fun1; ///< procedure or get
192void *fun2; ///< set
193const char *help;
194};
195
196struct ParamEntryConstructor: public ParamEntry
197{
198public:
199ParamEntryConstructor(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)
200{id=_id;group=_group;flags=_flags;name=_name;type=_type;offset=_offset;fun1=_fun1;fun2=_fun2;help=_help;}
201};
202
203class SimpleAbstractParam: public virtual ParamInterface
204{
205protected:
206virtual void *getTarget(int i);
207virtual ParamEntry *entry(int i)=0;
208const char* myname;
209bool dontcheckchanges;
210
211public:
212void *object;
213
214const char* getName() {return myname;}
215void setName(const char* n) {myname=n;}
216
217/**
218        @param t ParamEntry table
219        @param o controlled object
220        @param n Param's name
221*/
222SimpleAbstractParam(void* o=0,const char*n=0):object(o),myname(n),dontcheckchanges(0) {}
223
224void select(void *o) {object=o;}
225void* getSelected() {return object;}
226
227const char *id(int i) {return (i>=getPropCount())?0:entry(i)->id;}
228const char *name(int i) {return entry(i)->name;}
229const char *type(int i) {return entry(i)->type;}
230const char *help(int i) {return entry(i)->help;}
231int flags(int i) {return entry(i)->flags;}
232int group(int i) {return entry(i)->group;}
233void call(int i,ExtValue* args,ExtValue *ret);
234
235SString getString(int);
236long getInt(int);
237double getDouble(int);
238ExtObject getObject(int);
239ExtValue getExtValue(int);
240
241int setInt(int,long);
242int setDouble(int,double);
243int setString(int,const SString &);
244int setObject(int,const ExtObject &);
245int setExtValue(int,const ExtValue &);
246
247int isequal(int i,void* defdata);
248void save2(SString&,void *defdata,bool addcr=true,bool all_names=true);
249
250virtual void setDefault(bool numericonly=false);
251virtual void setDefault(int i,bool numericonly=false);
252};
253
254class Param: public SimpleAbstractParam
255{
256protected:
257ParamEntry *entry(int i) {return tab+tab[0].group+i;}
258public:
259ParamEntry *tab;
260/**
261        @param t ParamEntry table
262        @param o controlled object
263        @param n Param's name
264*/
265
266Param(ParamEntry *t=0,void* o=0,const char*n=0):SimpleAbstractParam(o,n),tab(t)
267{if (!n&&tab) myname=tab[0].name;}
268
269const char* getDescription() {return tab[0].type;}
270
271int getGroupCount() {return tab[0].group;}
272int getPropCount() {return tab[0].flags;}
273const char *grname(int i) {return (i<getGroupCount())?tab[i].id:0;}
274int grmember(int,int);
275void setParamTab(ParamEntry *t,int dontupdatename=0) {tab=t; if ((!dontupdatename)&&tab) myname=tab[0].name; }
276ParamEntry *getParamTab() const {return tab;}
277};
278
279extern ParamEntry empty_paramtab[];
280
281#endif
Note: See TracBrowser for help on using the repository browser.