CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
ssdsinglenode.h
1#pragma once
2// This header file is auto-generated!
3// Do not make changes to this file or they will be overwritten.
4// clang-format off
5#include <cx/obj.h>
6#include <cx/struct.h>
7#include <cx/ssdtree/node/ssdnode.h>
8
9CX_C_BEGIN
10
11typedef struct SSDSingleNode SSDSingleNode;
12typedef struct SSDSingleNode_WeakRef SSDSingleNode_WeakRef;
13typedef struct SSDSingleIter SSDSingleIter;
14typedef struct SSDSingleIter_WeakRef SSDSingleIter_WeakRef;
15saDeclarePtr(SSDSingleNode);
16saDeclarePtr(SSDSingleNode_WeakRef);
17#define _sti_SSDSingleNode _sti_object
18#define SType_SSDSingleNode SSDSingleNode*
19#define STStorageType_SSDSingleNode SSDSingleNode*
20#define STypeArg_SSDSingleNode(type, val) stgeneric(object, (ObjInst*)objInstCheckClass(SSDSingleNode, val))
21#define STypeArgPtr_SSDSingleNode(type, val) (stgeneric*)objInstCheckClassPtr(SSDSingleNode, val)
22#define STypeCheckedArg_SSDSingleNode(type, val) stType(type), stArg(type, val)
23#define STypeCheckedPtrArg_SSDSingleNode(type, val) stType(type), stArgPtr(type, val)
24saDeclarePtr(SSDSingleIter);
25saDeclarePtr(SSDSingleIter_WeakRef);
26#define _sti_SSDSingleIter _sti_object
27#define SType_SSDSingleIter SSDSingleIter*
28#define STStorageType_SSDSingleIter SSDSingleIter*
29#define STypeArg_SSDSingleIter(type, val) stgeneric(object, (ObjInst*)objInstCheckClass(SSDSingleIter, val))
30#define STypeArgPtr_SSDSingleIter(type, val) (stgeneric*)objInstCheckClassPtr(SSDSingleIter, val)
31#define STypeCheckedArg_SSDSingleIter(type, val) stType(type), stArg(type, val)
32#define STypeCheckedPtrArg_SSDSingleIter(type, val) stType(type), stArgPtr(type, val)
33
34typedef struct SSDSingleNode_ClassIf {
35 ObjIface* _implements;
36 ObjIface* _parent;
37 size_t _size;
38
39 // This node is an object that contains values or objects by name
40 bool (*isHashtable)(_In_ void* self);
41 // This node is an array that contains values or objects by array index
42 bool (*isArray)(_In_ void* self);
43 // Gets a value. Caller owns the value and must destroy it with stDestroy!
44 bool (*get)(_In_ void* self, int32 idx, _In_opt_ strref name, _When_(return == true, _Out_) stvar* out, _Inout_ SSDLockState* _ssdCurrentLockState);
45 // Gets a pointer to a value. This points to the internal storage within the node
46 // so it is only guaranteed to be valid while the read lock is held.
47 _Ret_opt_valid_ stvar* (*ptr)(_In_ void* self, int32 idx, _In_opt_ strref name, _Inout_ SSDLockState* _ssdCurrentLockState);
48 // Sets the given value
49 bool (*set)(_In_ void* self, int32 idx, _In_opt_ strref name, stvar val, _Inout_ SSDLockState* _ssdCurrentLockState);
50 // Same as setValue but consumes the value
51 // (consumes even on failure)
52 bool (*setC)(_In_ void* self, int32 idx, _In_opt_ strref name, _Inout_ stvar* val, _Inout_ SSDLockState* _ssdCurrentLockState);
53 // Removes a value
54 bool (*remove)(_In_ void* self, int32 idx, _In_opt_ strref name, _Inout_ SSDLockState* _ssdCurrentLockState);
55 // How many values / objects does this node contain?
56 int32 (*count)(_In_ void* self, _Inout_ SSDLockState* _ssdCurrentLockState);
57 // IMPORTANT NOTE: The generic object iterator interface cannot take any parameters;
58 // thus it always acquires a transient read lock and holds it until the iterator is
59 // destroyed. The caller MUST NOT already have an SSDLock held.
60 // If you want to use iterators inside a larger locked transaction or modify the tree,
61 // use iterLocked() instead.
62 _Ret_valid_ SSDIterator* (*iter)(_In_ void* self);
63 SSDIterator* (*_iterLocked)(_In_ void* self, _Inout_ SSDLockState* _ssdCurrentLockState);
64} SSDSingleNode_ClassIf;
65extern SSDSingleNode_ClassIf SSDSingleNode_ClassIf_tmpl;
66
67typedef struct SSDSingleIter_ClassIf {
68 ObjIface* _implements;
69 ObjIface* _parent;
70 size_t _size;
71
72 bool (*isHashtable)(_In_ void* self);
73 bool (*isArray)(_In_ void* self);
74 bool (*valid)(_In_ void* self);
75 bool (*next)(_In_ void* self);
76 bool (*get)(_In_ void* self, stvar* out);
77 stvar* (*ptr)(_In_ void* self);
78 strref (*name)(_In_ void* self);
79 int32 (*idx)(_In_ void* self);
80 bool (*iterOut)(_In_ void* self, _When_(return == true, _Out_) int32* idx, _When_(return == true, _Out_) strref* name, _When_(return == true, _Out_) stvar** val);
81} SSDSingleIter_ClassIf;
82extern SSDSingleIter_ClassIf SSDSingleIter_ClassIf_tmpl;
83
84typedef struct SSDSingleNode {
85 union {
86 SSDSingleNode_ClassIf* _;
87 void* _is_SSDSingleNode;
88 void* _is_SSDNode;
89 void* _is_ObjInst;
90 };
91 ObjClassInfo* _clsinfo;
92 atomic(uintptr) _ref;
93 atomic(ptr) _weakref;
94
95 SSDTree* tree;
96 int64 modified; // The timestamp this node was last modified
97 stvar storage;
98} SSDSingleNode;
99extern ObjClassInfo SSDSingleNode_clsinfo;
100#define SSDSingleNode(inst) objInstCheckClass(SSDSingleNode, inst)
101#define SSDSingleNodeNone ((SSDSingleNode*)NULL)
102
103typedef struct SSDSingleNode_WeakRef {
104 union {
105 ObjInst* _inst;
106 void* _is_SSDSingleNode_WeakRef;
107 void* _is_SSDNode_WeakRef;
108 void* _is_ObjInst_WeakRef;
109 };
110 atomic(uintptr) _ref;
111 RWLock _lock;
112} SSDSingleNode_WeakRef;
113#define SSDSingleNode_WeakRef(inst) objWeakRefCheckClass(SSDSingleNode, inst)
114
115_objfactory_guaranteed SSDSingleNode* SSDSingleNode__create(SSDTree* tree);
116// SSDSingleNode* ssdsinglenode_create(SSDTree* tree);
117#define ssdsinglenode_create(tree) SSDSingleNode__create(SSDTree(tree))
118
119// void ssdsinglenodeUpdateModified(SSDSingleNode* self);
120#define ssdsinglenodeUpdateModified(self) SSDNode_updateModified(SSDNode(self))
121
122// bool ssdsinglenodeIsHashtable(SSDSingleNode* self);
123//
124// This node is an object that contains values or objects by name
125#define ssdsinglenodeIsHashtable(self) (self)->_->isHashtable(SSDSingleNode(self))
126// bool ssdsinglenodeIsArray(SSDSingleNode* self);
127//
128// This node is an array that contains values or objects by array index
129#define ssdsinglenodeIsArray(self) (self)->_->isArray(SSDSingleNode(self))
130// bool ssdsinglenodeGet(SSDSingleNode* self, int32 idx, strref name, stvar* out, SSDLockState* _ssdCurrentLockState);
131//
132// Gets a value. Caller owns the value and must destroy it with stDestroy!
133#define ssdsinglenodeGet(self, idx, name, out, _ssdCurrentLockState) (self)->_->get(SSDSingleNode(self), idx, name, out, _ssdCurrentLockState)
134// stvar* ssdsinglenodePtr(SSDSingleNode* self, int32 idx, strref name, SSDLockState* _ssdCurrentLockState);
135//
136// Gets a pointer to a value. This points to the internal storage within the node
137// so it is only guaranteed to be valid while the read lock is held.
138#define ssdsinglenodePtr(self, idx, name, _ssdCurrentLockState) (self)->_->ptr(SSDSingleNode(self), idx, name, _ssdCurrentLockState)
139// bool ssdsinglenodeSet(SSDSingleNode* self, int32 idx, strref name, stvar val, SSDLockState* _ssdCurrentLockState);
140//
141// Sets the given value
142#define ssdsinglenodeSet(self, idx, name, val, _ssdCurrentLockState) (self)->_->set(SSDSingleNode(self), idx, name, val, _ssdCurrentLockState)
143// bool ssdsinglenodeSetC(SSDSingleNode* self, int32 idx, strref name, stvar* val, SSDLockState* _ssdCurrentLockState);
144//
145// Same as setValue but consumes the value
146// (consumes even on failure)
147#define ssdsinglenodeSetC(self, idx, name, val, _ssdCurrentLockState) (self)->_->setC(SSDSingleNode(self), idx, name, val, _ssdCurrentLockState)
148// bool ssdsinglenodeRemove(SSDSingleNode* self, int32 idx, strref name, SSDLockState* _ssdCurrentLockState);
149//
150// Removes a value
151#define ssdsinglenodeRemove(self, idx, name, _ssdCurrentLockState) (self)->_->remove(SSDSingleNode(self), idx, name, _ssdCurrentLockState)
152// int32 ssdsinglenodeCount(SSDSingleNode* self, SSDLockState* _ssdCurrentLockState);
153//
154// How many values / objects does this node contain?
155#define ssdsinglenodeCount(self, _ssdCurrentLockState) (self)->_->count(SSDSingleNode(self), _ssdCurrentLockState)
156// SSDIterator* ssdsinglenodeIter(SSDSingleNode* self);
157//
158// IMPORTANT NOTE: The generic object iterator interface cannot take any parameters;
159// thus it always acquires a transient read lock and holds it until the iterator is
160// destroyed. The caller MUST NOT already have an SSDLock held.
161// If you want to use iterators inside a larger locked transaction or modify the tree,
162// use iterLocked() instead.
163#define ssdsinglenodeIter(self) (self)->_->iter(SSDSingleNode(self))
164// SSDIterator* ssdsinglenode_iterLocked(SSDSingleNode* self, SSDLockState* _ssdCurrentLockState);
165#define ssdsinglenode_iterLocked(self, _ssdCurrentLockState) (self)->_->_iterLocked(SSDSingleNode(self), _ssdCurrentLockState)
166
167typedef struct SSDSingleIter {
168 union {
169 SSDSingleIter_ClassIf* _;
170 void* _is_SSDSingleIter;
171 void* _is_SSDIterator;
172 void* _is_ObjInst;
173 };
174 ObjClassInfo* _clsinfo;
175 atomic(uintptr) _ref;
176 atomic(ptr) _weakref;
177
178 SSDNode* node;
179 SSDLockState* lstate;
180 SSDLockState transient_lock_state;
181 bool done;
182} SSDSingleIter;
183extern ObjClassInfo SSDSingleIter_clsinfo;
184#define SSDSingleIter(inst) objInstCheckClass(SSDSingleIter, inst)
185#define SSDSingleIterNone ((SSDSingleIter*)NULL)
186
187typedef struct SSDSingleIter_WeakRef {
188 union {
189 ObjInst* _inst;
190 void* _is_SSDSingleIter_WeakRef;
191 void* _is_SSDIterator_WeakRef;
192 void* _is_ObjInst_WeakRef;
193 };
194 atomic(uintptr) _ref;
195 RWLock _lock;
196} SSDSingleIter_WeakRef;
197#define SSDSingleIter_WeakRef(inst) objWeakRefCheckClass(SSDSingleIter, inst)
198
199_objfactory_guaranteed SSDSingleIter* SSDSingleIter_create(SSDSingleNode* node, SSDLockState* lstate);
200// SSDSingleIter* ssdsingleiterCreate(SSDSingleNode* node, SSDLockState* lstate);
201#define ssdsingleiterCreate(node, lstate) SSDSingleIter_create(SSDSingleNode(node), lstate)
202
203// ObjInst* ssdsingleiterObjInst(SSDSingleIter* self);
204#define ssdsingleiterObjInst(self) SSDIterator_objInst(SSDIterator(self))
205
206// bool ssdsingleiterIsHashtable(SSDSingleIter* self);
207#define ssdsingleiterIsHashtable(self) (self)->_->isHashtable(SSDSingleIter(self))
208// bool ssdsingleiterIsArray(SSDSingleIter* self);
209#define ssdsingleiterIsArray(self) (self)->_->isArray(SSDSingleIter(self))
210// bool ssdsingleiterValid(SSDSingleIter* self);
211#define ssdsingleiterValid(self) (self)->_->valid(SSDSingleIter(self))
212// bool ssdsingleiterNext(SSDSingleIter* self);
213#define ssdsingleiterNext(self) (self)->_->next(SSDSingleIter(self))
214// bool ssdsingleiterGet(SSDSingleIter* self, stvar* out);
215#define ssdsingleiterGet(self, out) (self)->_->get(SSDSingleIter(self), out)
216// stvar* ssdsingleiterPtr(SSDSingleIter* self);
217#define ssdsingleiterPtr(self) (self)->_->ptr(SSDSingleIter(self))
218// strref ssdsingleiterName(SSDSingleIter* self);
219#define ssdsingleiterName(self) (self)->_->name(SSDSingleIter(self))
220// int32 ssdsingleiterIdx(SSDSingleIter* self);
221#define ssdsingleiterIdx(self) (self)->_->idx(SSDSingleIter(self))
222// bool ssdsingleiterIterOut(SSDSingleIter* self, int32* idx, strref* name, stvar** val);
223#define ssdsingleiterIterOut(self, idx, name, val) (self)->_->iterOut(SSDSingleIter(self), idx, name, val)
224
225CX_C_END
#define saDeclarePtr(name)
Definition sarray.h:100
#define _objfactory_guaranteed
Definition objimpl.h:106
#define stvar(typen, val)
Definition stvar.h:162
CX Struct System - Introspectable, serializable POD structures in C.
CX Object System - Object-oriented programming in C.