CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
ssdtree.h
Go to the documentation of this file.
1
3
4#pragma once
5
7#include <cx/ssdtree/node/ssdnode.h>
8#include <cx/string/strbase.h>
9
15
16_Ret_valid_ SSDNode* _ssdCreateRoot(int crtype, _In_opt_ SSDTree* tree, uint32 flags);
17
34#define ssdCreateHashtable(...) _ssdCreateRoot(SSD_Create_Hashtable, NULL, opt_flags(__VA_ARGS__))
35
51#define ssdCreateArray(...) _ssdCreateRoot(SSD_Create_Array, NULL, opt_flags(__VA_ARGS__))
52
69#define ssdCreateSingle(...) _ssdCreateRoot(SSD_Create_Single, NULL, opt_flags(__VA_ARGS__))
70
80#define ssdCreateCustom(crtype, tree) _ssdCreateRoot(crtype, tree, 0)
81
83
89
90_Ret_opt_valid_ SSDNode* _ssdClone(_In_ SSDNode* root, _In_opt_ SSDTree* desttree,
91 _Inout_opt_ SSDLockState* lstate);
92
104#define ssdClone(root, desttree) _ssdClone(root, desttree, (SSDLockState*)_ssdCurrentLockState)
105
106_Ret_opt_valid_ SSDNode* _ssdSubtree(_In_ SSDNode* root, _In_opt_ strref path, SSDCreateType create,
107 _Inout_opt_ SSDLockState* lstate);
108
128#define ssdSubtree(root, path, create) \
129 _ssdSubtree(root, path, create, (SSDLockState*)_ssdCurrentLockState)
130
131_Ret_opt_valid_ SSDNode* _ssdSubtreeB(_In_ SSDNode* root, _In_opt_ strref path,
132 _Inout_opt_ SSDLockState* lstate);
133
145#define ssdSubtreeB(root, path) \
146 _ssdSubtreeB(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
147
149
195
201
202_Success_(return) bool _ssdGet(_In_ SSDNode* root, _In_opt_ strref path, _Out_ stvar* out,
203 _Inout_opt_ SSDLockState* lstate);
204
217#define ssdGet(root, path, out) _ssdGet(root, path, out, (SSDLockState*)_ssdCurrentLockState)
218
219_Success_(return) _meta_inline bool _ssdGetD(_In_ SSDNode* root, _In_opt_ strref path, _Out_ stvar* out,
220 stvar def, _Inout_opt_ SSDLockState* lstate)
221{
222 if (_ssdGet(root, path, out, lstate))
223 return true;
224
225 stvarCopy(out, def);
226 return false;
227}
228
240#define ssdGetD(root, path, out, def) \
241 _ssdGetD(root, path, out, def, (SSDLockState*)_ssdCurrentLockState)
242
243_Success_(return) bool _ssdCopyOut(_In_ SSDNode* root, _In_opt_ strref path, stype valtype,
244 _stCopyDest_Anno_(valtype) stgeneric* val,
245 _Inout_opt_ SSDLockState* lstate);
246
267#define ssdCopyOut(root, path, vtype, val_copy_out) \
268 _ssdCopyOut(root, \
269 path, \
270 stCheckedPtrArg(vtype, val_copy_out), \
271 (SSDLockState*)_ssdCurrentLockState)
272
273_Success_(return) bool _ssdCopyOutD(_In_ SSDNode* root, _In_opt_ strref path, stype valtype,
274 _stCopyDest_Anno_(valtype) stgeneric* val, stgeneric def,
275 _Inout_opt_ SSDLockState* lstate);
276
287#define ssdCopyOutD(root, path, vtype, val_copy_out, def) \
288 _ssdCopyOutD(root, \
289 path, \
290 stCheckedPtrArg(vtype, val_copy_out), \
291 stArg(vtype, def), \
292 (SSDLockState*)_ssdCurrentLockState)
293
295#define ssdval_spec(type) \
296 _meta_inline stTypeDef(type) \
297 _ssdVal_##type(_In_ SSDNode* root, \
298 _In_opt_ strref path, \
299 stTypeDef(type) def, \
300 _Inout_opt_ SSDLockState* lstate) \
301 { \
302 stTypeDef(type) out; \
303 _ssdCopyOutD(root, path, stCheckedPtrArg(type, &out), stArg(type, def), lstate); \
304 return out; \
305 }
306
307// clang-format off
308ssdval_spec(bool)
309ssdval_spec(int8)
310ssdval_spec(int16)
311ssdval_spec(int32)
312ssdval_spec(int64)
313ssdval_spec(uint8)
314ssdval_spec(uint16)
315ssdval_spec(uint32)
316ssdval_spec(uint64)
317ssdval_spec(float32)
318ssdval_spec(float64)
319// clang-format on
321
343#define ssdVal(type, root, path, def) \
344 _ssdVal_##type(root, path, def, (SSDLockState*)_ssdCurrentLockState)
345
346 _meta_inline bool _ssdStringOut(_In_ SSDNode* root, _In_opt_ strref path,
347 _Inout_ string* out, _Inout_opt_ SSDLockState* lstate)
348{
349 strDestroy(out);
350 return _ssdCopyOut(root, path, stCheckedPtrArg(string, out), lstate);
351}
352
363#define ssdStringOut(root, path, out) \
364 _ssdStringOut(root, path, out, (SSDLockState*)_ssdCurrentLockState)
365
366_meta_inline bool _ssdStringOutD(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ string* out,
367 _In_opt_ strref def, _Inout_opt_ SSDLockState* lstate)
368{
369 strDestroy(out);
370 return _ssdCopyOutD(root, path, stCheckedPtrArg(string, out), stArg(strref, def), lstate);
371}
372
384#define ssdStringOutD(root, path, out, def) \
385 _ssdStringOutD(root, path, out, def, (SSDLockState*)_ssdCurrentLockState)
386
388
394
395bool _ssdSet(_Inout_ SSDNode* root, _In_opt_ strref path, bool createpath, stvar val,
396 _Inout_opt_ SSDLockState* lstate);
397
415#define ssdSet(root, path, createpath, val) \
416 _ssdSet(root, path, createpath, val, (SSDLockState*)_ssdCurrentLockState)
417
418bool _ssdSetC(_Inout_ SSDNode* root, _In_opt_ strref path, bool createpath,
419 _Pre_notnull_ _Post_invalid_ stvar* val, _Inout_opt_ SSDLockState* lstate);
420
433#define ssdSetC(root, path, createpath, val) \
434 _ssdSetC(root, path, createpath, val, (SSDLockState*)_ssdCurrentLockState)
435
436bool _ssdRemove(_Inout_ SSDNode* root, _In_opt_ strref path, _Inout_opt_ SSDLockState* lstate);
437
445#define ssdRemove(root, path) _ssdRemove(root, path, (SSDLockState*)_ssdCurrentLockState)
446
448
455
456stvar* _ssdPtr(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ SSDLockState* lstate);
457
479#define ssdPtr(root, path) \
480 _ssdPtr(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
481
482_Ret_opt_valid_ _meta_inline strref
483_ssdStrRef(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ SSDLockState* lstate)
484{
485 stvar* temp = _ssdPtr(root, path, lstate);
486 return stvarIs(temp, string) ? temp->data.st_string : NULL;
487}
488
499#define ssdStrRef(root, path) \
500 _ssdStrRef(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
501
502_Must_inspect_result_ _Ret_opt_valid_ _meta_inline ObjInst*
503_ssdObjInstPtr(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ SSDLockState* lstate)
504{
505 stvar* temp = _ssdPtr(root, path, lstate);
506 return stvarIs(temp, object) ? temp->data.st_object : NULL;
507}
508
519#define ssdObjInstPtr(root, path) \
520 _ssdObjInstPtr(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
521
533#define ssdObjPtr(root, path, clsname) objDynCast(clsname, ssdObjInstPtr(root, path))
534
536
542
543bool _ssdExportArray(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ sa_stvar* out,
544 _Inout_opt_ SSDLockState* lstate);
545
557#define ssdExportArray(root, path, out) \
558 _ssdExportArray(root, path, out, (SSDLockState*)_ssdCurrentLockState)
559
560bool _ssdImportArray(_Inout_ SSDNode* root, _In_opt_ strref path, _In_ sa_stvar arr,
561 _Inout_opt_ SSDLockState* lstate);
562
573#define ssdImportArray(root, path, arr) \
574 _ssdImportArray(root, path, arr, (SSDLockState*)_ssdCurrentLockState)
575
576bool _ssdExportTypedArray(_In_ SSDNode* root, _In_opt_ strref path, stype elemtype,
577 _Inout_ sahandle out, bool strict, _Inout_opt_ SSDLockState* lstate);
578bool _ssdImportTypedArray(_Inout_ SSDNode* root, _In_opt_ strref path, stype elemtype,
579 _In_ sa_ref arr, _Inout_opt_ SSDLockState* lstate);
580
604#define ssdExportTypedArray(root, path, type, out, strict) \
605 _ssdExportTypedArray(root, \
606 path, \
607 stType(type), \
608 SAHANDLE(out), \
609 strict, \
610 (SSDLockState*)_ssdCurrentLockState)
611
621#define ssdImportTypedArray(root, path, type, arr) \
622 _ssdImportTypedArray(root, path, stType(type), SAREF(arr), (SSDLockState*)_ssdCurrentLockState)
623
624int32 _ssdCount(_In_ SSDNode* root, _In_opt_ strref path, bool arrayonly,
625 _Inout_opt_ SSDLockState* lstate);
626
635#define ssdCount(root, path, arrayonly) \
636 _ssdCount(root, path, arrayonly, (SSDLockState*)_ssdCurrentLockState)
637
638_Ret_opt_valid_ stvar* _ssdIndex(_In_ SSDNode* root, _In_opt_ strref path, int32 idx,
639 _Inout_ SSDLockState* lstate);
640
652#define ssdIndex(root, path, idx) \
653 _ssdIndex(root, path, idx, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
654
655bool _ssdAppend(_Inout_ SSDNode* root, _In_opt_ strref path, bool createpath, stvar val,
656 _Inout_opt_ SSDLockState* lstate);
657
675#define ssdAppend(root, path, createpath, val) \
676 _ssdAppend(root, path, createpath, val, (SSDLockState*)_ssdCurrentLockState)
677
679
685
686bool _ssdGraft(_Inout_ SSDNode* dest, _In_opt_ strref destpath,
687 _Inout_opt_ SSDLockState* dest_lstate, _In_ SSDNode* src, _In_opt_ strref srcpath,
688 _Inout_opt_ SSDLockState* src_lstate);
689
713#define ssdGraft(dest, destpath, src, srcpath) \
714 _ssdGraft(dest, destpath, (SSDLockState*)_ssdCurrentLockState, src, srcpath, NULL)
715
enum SSD_CREATE_TYPE_ENUM SSDCreateType
Node creation types for specifying which kind of node to create.
void strDestroy(strhandle ps)
#define stvarIs(svar, type)
Definition stvar.h:267
#define stvar(typen, val)
Definition stvar.h:153
void stvarCopy(stvar *dvar, stvar svar)
Definition stvar.h:235
#define stCheckedPtrArg(type, val)
Definition stype.h:1100
#define stArg(type, val)
Definition stype.h:937
Dynamic arrays with type-safe generic programming.
Core string types and fundamental operations.