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
10CX_C_BEGIN
11
17
18_Ret_valid_ SSDNode* _ssdCreateRoot(int crtype, _In_opt_ SSDTree* tree, uint32 flags);
19
36#define ssdCreateHashtable(...) _ssdCreateRoot(SSD_Create_Hashtable, NULL, opt_flags(__VA_ARGS__))
37
53#define ssdCreateArray(...) _ssdCreateRoot(SSD_Create_Array, NULL, opt_flags(__VA_ARGS__))
54
71#define ssdCreateSingle(...) _ssdCreateRoot(SSD_Create_Single, NULL, opt_flags(__VA_ARGS__))
72
82#define ssdCreateCustom(crtype, tree) _ssdCreateRoot(crtype, tree, 0)
83
85
91
92_Ret_opt_valid_ SSDNode* _ssdClone(_In_ SSDNode* root, _In_opt_ SSDTree* desttree,
93 _Inout_opt_ SSDLockState* lstate);
94
106#define ssdClone(root, desttree) _ssdClone(root, desttree, (SSDLockState*)_ssdCurrentLockState)
107
108_Ret_opt_valid_ SSDNode* _ssdSubtree(_In_ SSDNode* root, _In_opt_ strref path, SSDCreateType create,
109 _Inout_opt_ SSDLockState* lstate);
110
130#define ssdSubtree(root, path, create) \
131 _ssdSubtree(root, path, create, (SSDLockState*)_ssdCurrentLockState)
132
133_Ret_opt_valid_ SSDNode* _ssdSubtreeB(_In_ SSDNode* root, _In_opt_ strref path,
134 _Inout_opt_ SSDLockState* lstate);
135
147#define ssdSubtreeB(root, path) \
148 _ssdSubtreeB(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
149
151
197
203
204_Success_(return) bool _ssdGet(_In_ SSDNode* root, _In_opt_ strref path, _Out_ stvar* out,
205 _Inout_opt_ SSDLockState* lstate);
206
219#define ssdGet(root, path, out) _ssdGet(root, path, out, (SSDLockState*)_ssdCurrentLockState)
220
221_Success_(return) _meta_inline bool _ssdGetD(_In_ SSDNode* root, _In_opt_ strref path, _Out_ stvar* out,
222 stvar def, _Inout_opt_ SSDLockState* lstate)
223{
224 if (_ssdGet(root, path, out, lstate))
225 return true;
226
227 stvarCopy(out, def);
228 return false;
229}
230
242#define ssdGetD(root, path, out, def) \
243 _ssdGetD(root, path, out, def, (SSDLockState*)_ssdCurrentLockState)
244
245_Success_(return) bool _ssdCopyOut(_In_ SSDNode* root, _In_opt_ strref path, stype valtype,
246 _stCopyDest_Anno_(valtype) stgeneric* val,
247 _Inout_opt_ SSDLockState* lstate);
248
269#define ssdCopyOut(root, path, vtype, val_copy_out) \
270 _ssdCopyOut(root, \
271 path, \
272 stCheckedPtrArg(vtype, val_copy_out), \
273 (SSDLockState*)_ssdCurrentLockState)
274
275_Success_(return) bool _ssdCopyOutD(_In_ SSDNode* root, _In_opt_ strref path, stype valtype,
276 _stCopyDest_Anno_(valtype) stgeneric* val, stgeneric def,
277 _Inout_opt_ SSDLockState* lstate);
278
289#define ssdCopyOutD(root, path, vtype, val_copy_out, def) \
290 _ssdCopyOutD(root, \
291 path, \
292 stCheckedPtrArg(vtype, val_copy_out), \
293 stArg(vtype, def), \
294 (SSDLockState*)_ssdCurrentLockState)
295
297#define ssdval_spec(type) \
298 _meta_inline stTypeDef(type) \
299 _ssdVal_##type(_In_ SSDNode* root, \
300 _In_opt_ strref path, \
301 stTypeDef(type) def, \
302 _Inout_opt_ SSDLockState* lstate) \
303 { \
304 stTypeDef(type) out; \
305 _ssdCopyOutD(root, path, stCheckedPtrArg(type, &out), stArg(type, def), lstate); \
306 return out; \
307 }
308
309// clang-format off
310ssdval_spec(bool)
311ssdval_spec(int8)
312ssdval_spec(int16)
313ssdval_spec(int32)
314ssdval_spec(int64)
315ssdval_spec(uint8)
316ssdval_spec(uint16)
317ssdval_spec(uint32)
318ssdval_spec(uint64)
319ssdval_spec(float32)
320ssdval_spec(float64)
321// clang-format on
323
345#define ssdVal(type, root, path, def) \
346 _ssdVal_##type(root, path, def, (SSDLockState*)_ssdCurrentLockState)
347
348 _meta_inline bool _ssdStringOut(_In_ SSDNode* root, _In_opt_ strref path,
349 _Inout_ string* out, _Inout_opt_ SSDLockState* lstate)
350{
351 strDestroy(out);
352 return _ssdCopyOut(root, path, stCheckedPtrArg(string, out), lstate);
353}
354
365#define ssdStringOut(root, path, out) \
366 _ssdStringOut(root, path, out, (SSDLockState*)_ssdCurrentLockState)
367
368_meta_inline bool _ssdStringOutD(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ string* out,
369 _In_opt_ strref def, _Inout_opt_ SSDLockState* lstate)
370{
371 strDestroy(out);
372 return _ssdCopyOutD(root, path, stCheckedPtrArg(string, out), stArg(strref, def), lstate);
373}
374
386#define ssdStringOutD(root, path, out, def) \
387 _ssdStringOutD(root, path, out, def, (SSDLockState*)_ssdCurrentLockState)
388
390
396
397bool _ssdSet(_Inout_ SSDNode* root, _In_opt_ strref path, bool createpath, stvar val,
398 _Inout_opt_ SSDLockState* lstate);
399
417#define ssdSet(root, path, createpath, val) \
418 _ssdSet(root, path, createpath, val, (SSDLockState*)_ssdCurrentLockState)
419
420bool _ssdSetC(_Inout_ SSDNode* root, _In_opt_ strref path, bool createpath,
421 _Pre_notnull_ _Post_invalid_ stvar* val, _Inout_opt_ SSDLockState* lstate);
422
435#define ssdSetC(root, path, createpath, val) \
436 _ssdSetC(root, path, createpath, val, (SSDLockState*)_ssdCurrentLockState)
437
438bool _ssdRemove(_Inout_ SSDNode* root, _In_opt_ strref path, _Inout_opt_ SSDLockState* lstate);
439
447#define ssdRemove(root, path) _ssdRemove(root, path, (SSDLockState*)_ssdCurrentLockState)
448
450
457
458stvar* _ssdPtr(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ SSDLockState* lstate);
459
481#define ssdPtr(root, path) \
482 _ssdPtr(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
483
484_Ret_opt_valid_ _meta_inline strref
485_ssdStrRef(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ SSDLockState* lstate)
486{
487 stvar* temp = _ssdPtr(root, path, lstate);
488 return stvarIs(temp, string) ? temp->data.st_string : NULL;
489}
490
501#define ssdStrRef(root, path) \
502 _ssdStrRef(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
503
504_Must_inspect_result_ _Ret_opt_valid_ _meta_inline ObjInst*
505_ssdObjInstPtr(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ SSDLockState* lstate)
506{
507 stvar* temp = _ssdPtr(root, path, lstate);
508 return stvarIs(temp, object) ? temp->data.st_object : NULL;
509}
510
521#define ssdObjInstPtr(root, path) \
522 _ssdObjInstPtr(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
523
535#define ssdObjPtr(root, path, clsname) objDynCast(clsname, ssdObjInstPtr(root, path))
536
538
544
545bool _ssdExportArray(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ sa_stvar* out,
546 _Inout_opt_ SSDLockState* lstate);
547
559#define ssdExportArray(root, path, out) \
560 _ssdExportArray(root, path, out, (SSDLockState*)_ssdCurrentLockState)
561
562bool _ssdImportArray(_Inout_ SSDNode* root, _In_opt_ strref path, _In_ sa_stvar arr,
563 _Inout_opt_ SSDLockState* lstate);
564
575#define ssdImportArray(root, path, arr) \
576 _ssdImportArray(root, path, arr, (SSDLockState*)_ssdCurrentLockState)
577
578bool _ssdExportTypedArray(_In_ SSDNode* root, _In_opt_ strref path, stype elemtype,
579 _Inout_ sahandle out, bool strict, _Inout_opt_ SSDLockState* lstate);
580bool _ssdImportTypedArray(_Inout_ SSDNode* root, _In_opt_ strref path, stype elemtype,
581 _In_ sa_ref arr, _Inout_opt_ SSDLockState* lstate);
582
606#define ssdExportTypedArray(root, path, type, out, strict) \
607 _ssdExportTypedArray(root, \
608 path, \
609 stType(type), \
610 SAHANDLE(out), \
611 strict, \
612 (SSDLockState*)_ssdCurrentLockState)
613
623#define ssdImportTypedArray(root, path, type, arr) \
624 _ssdImportTypedArray(root, path, stType(type), SAREF(arr), (SSDLockState*)_ssdCurrentLockState)
625
626int32 _ssdCount(_In_ SSDNode* root, _In_opt_ strref path, bool arrayonly,
627 _Inout_opt_ SSDLockState* lstate);
628
637#define ssdCount(root, path, arrayonly) \
638 _ssdCount(root, path, arrayonly, (SSDLockState*)_ssdCurrentLockState)
639
640_Ret_opt_valid_ stvar* _ssdIndex(_In_ SSDNode* root, _In_opt_ strref path, int32 idx,
641 _Inout_ SSDLockState* lstate);
642
654#define ssdIndex(root, path, idx) \
655 _ssdIndex(root, path, idx, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
656
657bool _ssdAppend(_Inout_ SSDNode* root, _In_opt_ strref path, bool createpath, stvar val,
658 _Inout_opt_ SSDLockState* lstate);
659
677#define ssdAppend(root, path, createpath, val) \
678 _ssdAppend(root, path, createpath, val, (SSDLockState*)_ssdCurrentLockState)
679
681
687
688bool _ssdGraft(_Inout_ SSDNode* dest, _In_opt_ strref destpath,
689 _Inout_opt_ SSDLockState* dest_lstate, _In_ SSDNode* src, _In_opt_ strref srcpath,
690 _Inout_opt_ SSDLockState* src_lstate);
691
715#define ssdGraft(dest, destpath, src, srcpath) \
716 _ssdGraft(dest, destpath, (SSDLockState*)_ssdCurrentLockState, src, srcpath, NULL)
717
719
720CX_C_END
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:523
#define stvar(typen, val)
Definition stvar.h:162
void stvarCopy(stvar *dvar, stvar svar)
Definition stvar.h:492
#define stCheckedPtrArg(type, val)
Definition stype.h:1205
#define stArg(type, val)
Definition stype.h:1036
Dynamic arrays with type-safe generic programming.
Core string types and fundamental operations.