6#include <cx/ssdtree/ssdtreeobj.h>
9typedef struct SSDIterator SSDIterator;
10typedef struct SSDIterator_WeakRef SSDIterator_WeakRef;
11typedef struct SSDNode SSDNode;
12typedef struct SSDNode_WeakRef SSDNode_WeakRef;
18enum SSD_INDEX_MARKER {
22#define ssditeratorObj(self, clsname) objDynCast(clsname, ssditeratorObjInst(self))
23#define ssdnodeIterLocked(self) ssdnode_iterLocked(self, _ssdCurrentLockState)
25typedef struct SSDIteratorIf {
30 bool (*valid)(_In_
void* self);
31 bool (*next)(_In_
void* self);
32 bool (*get)(_In_
void* self,
stvar* out);
33 stvar* (*ptr)(_In_
void* self);
34 strref (*name)(_In_
void* self);
35 int32 (*idx)(_In_
void* self);
36 bool (*iterOut)(_In_
void* self, _When_(
return ==
true, _Out_) int32* idx, _When_(
return ==
true, _Out_) strref* name, _When_(
return ==
true, _Out_)
stvar** val);
38extern SSDIteratorIf SSDIteratorIf_tmpl;
40typedef struct SSDNodeIf {
46 bool (*get)(_In_
void* self, int32 idx, _In_opt_ strref name, _When_(
return ==
true, _Out_)
stvar* out, _Inout_ SSDLockState* _ssdCurrentLockState);
49 _Ret_opt_valid_
stvar* (*ptr)(_In_
void* self, int32 idx, _In_opt_ strref name, _Inout_ SSDLockState* _ssdCurrentLockState);
51 bool (*set)(_In_
void* self, int32 idx, _In_opt_ strref name,
stvar val, _Inout_ SSDLockState* _ssdCurrentLockState);
54 bool (*setC)(_In_
void* self, int32 idx, _In_opt_ strref name, _Inout_
stvar* val, _Inout_ SSDLockState* _ssdCurrentLockState);
56 bool (*remove)(_In_
void* self, int32 idx, _In_opt_ strref name, _Inout_ SSDLockState* _ssdCurrentLockState);
58 int32 (*count)(_In_
void* self, _Inout_ SSDLockState* _ssdCurrentLockState);
64 _Ret_valid_ SSDIterator* (*iter)(_In_
void* self);
65 SSDIterator* (*_iterLocked)(_In_
void* self, _Inout_ SSDLockState* _ssdCurrentLockState);
67extern SSDNodeIf SSDNodeIf_tmpl;
69typedef struct SSDIterator_ClassIf {
74 bool (*isHashtable)(_In_
void* self);
75 bool (*isArray)(_In_
void* self);
76 bool (*valid)(_In_
void* self);
77 bool (*next)(_In_
void* self);
78 bool (*get)(_In_
void* self,
stvar* out);
79 stvar* (*ptr)(_In_
void* self);
80 strref (*name)(_In_
void* self);
81 int32 (*idx)(_In_
void* self);
82 bool (*iterOut)(_In_
void* self, _When_(
return ==
true, _Out_) int32* idx, _When_(
return ==
true, _Out_) strref* name, _When_(
return ==
true, _Out_)
stvar** val);
84extern SSDIterator_ClassIf SSDIterator_ClassIf_tmpl;
86typedef struct SSDNode_ClassIf {
92 bool (*isHashtable)(_In_
void* self);
94 bool (*isArray)(_In_
void* self);
96 bool (*get)(_In_
void* self, int32 idx, _In_opt_ strref name, _When_(
return ==
true, _Out_)
stvar* out, _Inout_ SSDLockState* _ssdCurrentLockState);
99 _Ret_opt_valid_
stvar* (*ptr)(_In_
void* self, int32 idx, _In_opt_ strref name, _Inout_ SSDLockState* _ssdCurrentLockState);
101 bool (*set)(_In_
void* self, int32 idx, _In_opt_ strref name,
stvar val, _Inout_ SSDLockState* _ssdCurrentLockState);
104 bool (*setC)(_In_
void* self, int32 idx, _In_opt_ strref name, _Inout_
stvar* val, _Inout_ SSDLockState* _ssdCurrentLockState);
106 bool (*remove)(_In_
void* self, int32 idx, _In_opt_ strref name, _Inout_ SSDLockState* _ssdCurrentLockState);
108 int32 (*count)(_In_
void* self, _Inout_ SSDLockState* _ssdCurrentLockState);
114 _Ret_valid_ SSDIterator* (*iter)(_In_
void* self);
115 SSDIterator* (*_iterLocked)(_In_
void* self, _Inout_ SSDLockState* _ssdCurrentLockState);
117extern SSDNode_ClassIf SSDNode_ClassIf_tmpl;
119typedef struct SSDIterator {
121 SSDIterator_ClassIf* _;
122 void* _is_SSDIterator;
126 atomic(uintptr) _ref;
127 atomic(ptr) _weakref;
130 SSDLockState* lstate;
131 SSDLockState transient_lock_state;
134#define SSDIterator(inst) ((SSDIterator*)(unused_noeval((inst) && &((inst)->_is_SSDIterator)), (inst)))
135#define SSDIteratorNone ((SSDIterator*)NULL)
137typedef struct SSDIterator_WeakRef {
140 void* _is_SSDIterator_WeakRef;
141 void* _is_ObjInst_WeakRef;
143 atomic(uintptr) _ref;
145} SSDIterator_WeakRef;
146#define SSDIterator_WeakRef(inst) ((SSDIterator_WeakRef*)(unused_noeval((inst) && &((inst)->_is_SSDIterator_WeakRef)), (inst)))
148_Ret_opt_valid_
ObjInst* SSDIterator_objInst(_In_ SSDIterator* self);
150#define ssditeratorObjInst(self) SSDIterator_objInst(SSDIterator(self))
153#define ssditeratorIsHashtable(self) (self)->_->isHashtable(SSDIterator(self))
155#define ssditeratorIsArray(self) (self)->_->isArray(SSDIterator(self))
157#define ssditeratorValid(self) (self)->_->valid(SSDIterator(self))
159#define ssditeratorNext(self) (self)->_->next(SSDIterator(self))
161#define ssditeratorGet(self, out) (self)->_->get(SSDIterator(self), out)
163#define ssditeratorPtr(self) (self)->_->ptr(SSDIterator(self))
165#define ssditeratorName(self) (self)->_->name(SSDIterator(self))
167#define ssditeratorIdx(self) (self)->_->idx(SSDIterator(self))
169#define ssditeratorIterOut(self, idx, name, val) (self)->_->iterOut(SSDIterator(self), idx, name, val)
171typedef struct SSDNode {
178 atomic(uintptr) _ref;
179 atomic(ptr) _weakref;
185#define SSDNode(inst) ((SSDNode*)(unused_noeval((inst) && &((inst)->_is_SSDNode)), (inst)))
186#define SSDNodeNone ((SSDNode*)NULL)
188typedef struct SSDNode_WeakRef {
191 void* _is_SSDNode_WeakRef;
192 void* _is_ObjInst_WeakRef;
194 atomic(uintptr) _ref;
197#define SSDNode_WeakRef(inst) ((SSDNode_WeakRef*)(unused_noeval((inst) && &((inst)->_is_SSDNode_WeakRef)), (inst)))
199void SSDNode_updateModified(_In_ SSDNode* self);
201#define ssdnodeUpdateModified(self) SSDNode_updateModified(SSDNode(self))
206#define ssdnodeIsHashtable(self) (self)->_->isHashtable(SSDNode(self))
210#define ssdnodeIsArray(self) (self)->_->isArray(SSDNode(self))
214#define ssdnodeGet(self, idx, name, out, _ssdCurrentLockState) (self)->_->get(SSDNode(self), idx, name, out, _ssdCurrentLockState)
219#define ssdnodePtr(self, idx, name, _ssdCurrentLockState) (self)->_->ptr(SSDNode(self), idx, name, _ssdCurrentLockState)
223#define ssdnodeSet(self, idx, name, val, _ssdCurrentLockState) (self)->_->set(SSDNode(self), idx, name, val, _ssdCurrentLockState)
228#define ssdnodeSetC(self, idx, name, val, _ssdCurrentLockState) (self)->_->setC(SSDNode(self), idx, name, val, _ssdCurrentLockState)
232#define ssdnodeRemove(self, idx, name, _ssdCurrentLockState) (self)->_->remove(SSDNode(self), idx, name, _ssdCurrentLockState)
236#define ssdnodeCount(self, _ssdCurrentLockState) (self)->_->count(SSDNode(self), _ssdCurrentLockState)
244#define ssdnodeIter(self) (self)->_->iter(SSDNode(self))
246#define ssdnode_iterLocked(self, _ssdCurrentLockState) (self)->_->_iterLocked(SSDNode(self), _ssdCurrentLockState)
#define saDeclarePtr(name)
#define stvar(typen, val)
CX Object System - Object-oriented programming in C.
Variant type containers and type-safe variadic argument support.