CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
stvar.h
Go to the documentation of this file.
1#pragma once
2
5
6#include <cx/cx.h>
7#include <cx/stype/stype.h>
8
96
102
123#ifndef __cplusplus
124#define stvarInit(typen, val) { .data = { .st_##typen = val }, .type = stType(typen) }
125
153#define stvar(typen, val) ((stvar) { .data = stArg(typen, val), .type = stType(typen) })
154
169#define stvNone ((stvar) { .type = stType(none) })
170#else
171_meta_inline stvar _stvar(stype st, stgeneric val)
172{
173 stvar ret;
174 ret.data = val;
175 ret.type = st;
176 return ret;
177}
178#define stvar(typen, val) _stvar(stType(typen), stArg(typen, val))
179
180#define stvNone _stvar(0, stArg(int64, 0))
181#endif
182
184
190
209_meta_inline void stvarDestroy(stvar* stv)
210{
211 _stDestroy(stv->type, NULL, &stv->data, 0);
212 stv->type = 0;
213}
214
235_meta_inline void stvarCopy(stvar* dvar, stvar svar)
236{
237 dvar->type = svar.type;
238 _stCopy(svar.type, NULL, &dvar->data, svar.data, 0);
239}
240
242
248
267#define stvarIs(svar, type) _stvarIs(svar, stType(type))
268_meta_inline bool _stvarIs(stvar* svar, stype styp)
269{
270 return svar && stEq(svar->type, styp);
271}
272
292_meta_inline string stvarString(stvar* svar)
293{
294 if (stvarIs(svar, string))
295 return svar->data.st_string;
296 return NULL;
297}
298
318_meta_inline string* stvarStringPtr(stvar* svar)
319{
320 if (stvarIs(svar, string))
321 return &svar->data.st_string;
322 return NULL;
323}
324
343_meta_inline ObjInst* stvarObjInst(stvar* svar)
344{
345 if (stvarIs(svar, object))
346 return svar->data.st_object;
347 return NULL;
348}
349
359_meta_inline ObjInst** stvarObjInstPtr(stvar* svar)
360{
361 if (stvarIs(svar, object))
362 return &svar->data.st_object;
363 return NULL;
364}
365
386#define stvarObj(class, svar) (objDynCast(class, stvarObjInst(svar)))
387
389
425
431typedef struct stvlist {
432 int count;
433 int cursor;
436
457void stvlInit(stvlist* list, int count, stvar* vars);
458
481#define stvlInitSA(list, vararray) _stvlInitSA(list, (vararray).a)
482void _stvlInitSA(stvlist* list, stvar* vara);
483
516#define stvlNext(list, type, pvar) _stvlNext(list, stCheckedPtrArg(type, pvar))
517bool _stvlNext(stvlist* list, stype type, stgeneric* out);
518
537#define stvlNextPtr(list) _stvlNextPtr(list, stType(ptr))
538void* _stvlNextPtr(stvlist* list, stype type);
539
559#define stvlNextObj(list, class) objDynCast(class, (ObjInst*)_stvlNextPtr(list, stType(object)))
560
582void stvlRewind(stvlist* list);
583
#define stvarIs(svar, type)
Definition stvar.h:267
ObjInst * stvarObjInst(stvar *svar)
Definition stvar.h:343
string stvarString(stvar *svar)
Definition stvar.h:292
string * stvarStringPtr(stvar *svar)
Definition stvar.h:318
ObjInst ** stvarObjInstPtr(stvar *svar)
Definition stvar.h:359
#define stvar(typen, val)
Definition stvar.h:153
void stvarDestroy(stvar *stv)
Definition stvar.h:209
void stvarCopy(stvar *dvar, stvar svar)
Definition stvar.h:235
void stvlRewind(stvlist *list)
void stvlInit(stvlist *list, int count, stvar *vars)
bool stEq(stype sta, stype stb)
Definition stype.h:537
int cursor
Current position (next variant to examine)
Definition stvar.h:433
stvar * vars
Pointer to variant array.
Definition stvar.h:434
int count
Total number of variants in array.
Definition stvar.h:432
Runtime type system and type descriptor infrastructure.