7#include <cx/ssdtree/node/ssdnode.h>
16_Ret_valid_ SSDNode* _ssdCreateRoot(
int crtype, _In_opt_ SSDTree* tree, uint32 flags);
34#define ssdCreateHashtable(...) _ssdCreateRoot(SSD_Create_Hashtable, NULL, opt_flags(__VA_ARGS__))
51#define ssdCreateArray(...) _ssdCreateRoot(SSD_Create_Array, NULL, opt_flags(__VA_ARGS__))
69#define ssdCreateSingle(...) _ssdCreateRoot(SSD_Create_Single, NULL, opt_flags(__VA_ARGS__))
80#define ssdCreateCustom(crtype, tree) _ssdCreateRoot(crtype, tree, 0)
90_Ret_opt_valid_ SSDNode* _ssdClone(_In_ SSDNode* root, _In_opt_ SSDTree* desttree,
91 _Inout_opt_ SSDLockState* lstate);
104#define ssdClone(root, desttree) _ssdClone(root, desttree, (SSDLockState*)_ssdCurrentLockState)
106_Ret_opt_valid_ SSDNode* _ssdSubtree(_In_ SSDNode* root, _In_opt_ strref path,
SSDCreateType create,
107 _Inout_opt_ SSDLockState* lstate);
128#define ssdSubtree(root, path, create) \
129 _ssdSubtree(root, path, create, (SSDLockState*)_ssdCurrentLockState)
131_Ret_opt_valid_ SSDNode* _ssdSubtreeB(_In_ SSDNode* root, _In_opt_ strref path,
132 _Inout_opt_ SSDLockState* lstate);
145#define ssdSubtreeB(root, path) \
146 _ssdSubtreeB(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
202_Success_(
return)
bool _ssdGet(_In_ SSDNode* root, _In_opt_ strref path, _Out_
stvar* out,
203 _Inout_opt_ SSDLockState* lstate);
217#define ssdGet(root, path, out) _ssdGet(root, path, out, (SSDLockState*)_ssdCurrentLockState)
219_Success_(
return) _meta_inline
bool _ssdGetD(_In_ SSDNode* root, _In_opt_ strref path, _Out_
stvar* out,
220 stvar def, _Inout_opt_ SSDLockState* lstate)
222 if (_ssdGet(root, path, out, lstate))
240#define ssdGetD(root, path, out, def) \
241 _ssdGetD(root, path, out, def, (SSDLockState*)_ssdCurrentLockState)
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);
267#define ssdCopyOut(root, path, vtype, val_copy_out) \
270 stCheckedPtrArg(vtype, val_copy_out), \
271 (SSDLockState*)_ssdCurrentLockState)
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);
287#define ssdCopyOutD(root, path, vtype, val_copy_out, def) \
290 stCheckedPtrArg(vtype, val_copy_out), \
292 (SSDLockState*)_ssdCurrentLockState)
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) \
302 stTypeDef(type) out; \
303 _ssdCopyOutD(root, path, stCheckedPtrArg(type, &out), stArg(type, def), lstate); \
343#define ssdVal(type, root, path, def) \
344 _ssdVal_##type(root, path, def, (SSDLockState*)_ssdCurrentLockState)
346 _meta_inline
bool _ssdStringOut(_In_ SSDNode* root, _In_opt_ strref path,
347 _Inout_
string* out, _Inout_opt_ SSDLockState* lstate)
363#define ssdStringOut(root, path, out) \
364 _ssdStringOut(root, path, out, (SSDLockState*)_ssdCurrentLockState)
366_meta_inline
bool _ssdStringOutD(_In_ SSDNode* root, _In_opt_ strref path, _Inout_
string* out,
367 _In_opt_ strref def, _Inout_opt_ SSDLockState* lstate)
384#define ssdStringOutD(root, path, out, def) \
385 _ssdStringOutD(root, path, out, def, (SSDLockState*)_ssdCurrentLockState)
395bool _ssdSet(_Inout_ SSDNode* root, _In_opt_ strref path,
bool createpath,
stvar val,
396 _Inout_opt_ SSDLockState* lstate);
415#define ssdSet(root, path, createpath, val) \
416 _ssdSet(root, path, createpath, val, (SSDLockState*)_ssdCurrentLockState)
418bool _ssdSetC(_Inout_ SSDNode* root, _In_opt_ strref path,
bool createpath,
419 _Pre_notnull_ _Post_invalid_
stvar* val, _Inout_opt_ SSDLockState* lstate);
433#define ssdSetC(root, path, createpath, val) \
434 _ssdSetC(root, path, createpath, val, (SSDLockState*)_ssdCurrentLockState)
436bool _ssdRemove(_Inout_ SSDNode* root, _In_opt_ strref path, _Inout_opt_ SSDLockState* lstate);
445#define ssdRemove(root, path) _ssdRemove(root, path, (SSDLockState*)_ssdCurrentLockState)
456stvar* _ssdPtr(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ SSDLockState* lstate);
479#define ssdPtr(root, path) \
480 _ssdPtr(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
482_Ret_opt_valid_ _meta_inline strref
483_ssdStrRef(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ SSDLockState* lstate)
485 stvar* temp = _ssdPtr(root, path, lstate);
486 return stvarIs(temp,
string) ? temp->data.st_string : NULL;
499#define ssdStrRef(root, path) \
500 _ssdStrRef(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
502_Must_inspect_result_ _Ret_opt_valid_ _meta_inline
ObjInst*
503_ssdObjInstPtr(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ SSDLockState* lstate)
505 stvar* temp = _ssdPtr(root, path, lstate);
506 return stvarIs(temp,
object) ? temp->data.st_object : NULL;
519#define ssdObjInstPtr(root, path) \
520 _ssdObjInstPtr(root, path, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
533#define ssdObjPtr(root, path, clsname) objDynCast(clsname, ssdObjInstPtr(root, path))
543bool _ssdExportArray(_In_ SSDNode* root, _In_opt_ strref path, _Inout_ sa_stvar* out,
544 _Inout_opt_ SSDLockState* lstate);
557#define ssdExportArray(root, path, out) \
558 _ssdExportArray(root, path, out, (SSDLockState*)_ssdCurrentLockState)
560bool _ssdImportArray(_Inout_ SSDNode* root, _In_opt_ strref path, _In_ sa_stvar arr,
561 _Inout_opt_ SSDLockState* lstate);
573#define ssdImportArray(root, path, arr) \
574 _ssdImportArray(root, path, arr, (SSDLockState*)_ssdCurrentLockState)
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);
604#define ssdExportTypedArray(root, path, type, out, strict) \
605 _ssdExportTypedArray(root, \
610 (SSDLockState*)_ssdCurrentLockState)
621#define ssdImportTypedArray(root, path, type, arr) \
622 _ssdImportTypedArray(root, path, stType(type), SAREF(arr), (SSDLockState*)_ssdCurrentLockState)
624int32 _ssdCount(_In_ SSDNode* root, _In_opt_ strref path,
bool arrayonly,
625 _Inout_opt_ SSDLockState* lstate);
635#define ssdCount(root, path, arrayonly) \
636 _ssdCount(root, path, arrayonly, (SSDLockState*)_ssdCurrentLockState)
638_Ret_opt_valid_
stvar* _ssdIndex(_In_ SSDNode* root, _In_opt_ strref path, int32 idx,
639 _Inout_ SSDLockState* lstate);
652#define ssdIndex(root, path, idx) \
653 _ssdIndex(root, path, idx, (SSDLockState*)&_ssdCurrentLockState->_is_SSDLockState)
655bool _ssdAppend(_Inout_ SSDNode* root, _In_opt_ strref path,
bool createpath,
stvar val,
656 _Inout_opt_ SSDLockState* lstate);
675#define ssdAppend(root, path, createpath, val) \
676 _ssdAppend(root, path, createpath, val, (SSDLockState*)_ssdCurrentLockState)
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);
713#define ssdGraft(dest, destpath, src, srcpath) \
714 _ssdGraft(dest, destpath, (SSDLockState*)_ssdCurrentLockState, src, srcpath, NULL)
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)
#define stvar(typen, val)
void stvarCopy(stvar *dvar, stvar svar)
#define stCheckedPtrArg(type, val)
Dynamic arrays with type-safe generic programming.
Core string types and fundamental operations.