CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
serreader.h
Go to the documentation of this file.
1
3
4#pragma once
5
6#include <cx/buffer/buffer.h>
9
10CX_C_BEGIN
11
15
16typedef struct SerReader SerReader;
17
24typedef struct SerReaderOps {
25 SerNodeKind (*peek)(_Inout_ SerReader* r);
26
27 bool (*readNull)(_Inout_ SerReader* r);
28 bool (*readBool)(_Inout_ SerReader* r, _Out_ bool* out);
29
33 bool (*readInt)(_Inout_ SerReader* r, _Out_ int64* out, stype declared);
34 bool (*readUint)(_Inout_ SerReader* r, _Out_ uint64* out, stype declared);
35 bool (*readReal)(_Inout_ SerReader* r, _Out_ float64* out, stype declared);
36 bool (*readStr)(_Inout_ SerReader* r, _Inout_ string* out);
37 bool (*readBytes)(_Inout_ SerReader* r, _Inout_ Buffer* out);
38
40 bool (*arrBegin)(_Inout_ SerReader* r, _Out_ int32* count);
41 bool (*arrNext)(_Inout_ SerReader* r);
42 bool (*arrEnd)(_Inout_ SerReader* r);
44 bool (*mapBegin)(_Inout_ SerReader* r, _Out_ int32* count);
45 bool (*mapNext)(_Inout_ SerReader* r, _Inout_ string* key);
46 bool (*mapEnd)(_Inout_ SerReader* r);
47
48 bool (*readTypeTag)(_Inout_ SerReader* r, _Inout_ string* name);
49 bool (*readRef)(_Inout_ SerReader* r, _Out_ uint32* id);
50 bool (*skip)(_Inout_ SerReader* r);
51
52 void (*destroy)(_Inout_ _Post_invalid_ SerReader* r);
54
55typedef struct SerReader {
56 const SerReaderOps* ops;
57 flags_t caps;
58 flags_t flags;
59 SerError err;
60 SerTraverseState traverse;
61 sa_SerResolverEnt resolvers;
62
65 hashtable refs;
66 // backend private data follows
67} SerReader;
68
76_Ret_notnull_ SerReader* _serReaderAlloc(size_t size, _In_ const SerReaderOps* ops, flags_t caps,
77 flags_t flags);
78
84void serReaderDestroy(_Inout_ SerReader** r);
85
101void serReaderAddResolver(_Inout_ SerReader* r, SerTypeResolver fn, _Inout_opt_ void* user);
102
109bool serReaderResolve(_Out_ SerResolved* out, _Inout_ SerReader* r, _In_opt_ strref name);
110
114#define serReaderCaps(r) ((r)->caps)
115
122#define serReaderCan(r, capname) (((r)->caps & SER_Cap_##capname) != 0)
123
124// Node consumers, mirroring the emitters in serwriter.h.
125_meta_inline SerNodeKind serPeek(_Inout_ SerReader* r) { return r->ops->peek(r); }
126_meta_inline bool serReadNull(_Inout_ SerReader* r) { return r->ops->readNull(r); }
127_meta_inline bool serReadBool(_Inout_ SerReader* r, _Out_ bool* out)
128{
129 return r->ops->readBool(r, out);
130}
131_meta_inline bool serReadInt(_Inout_ SerReader* r, _Out_ int64* out, stype declared)
132{
133 return r->ops->readInt(r, out, declared);
134}
135_meta_inline bool serReadUint(_Inout_ SerReader* r, _Out_ uint64* out, stype declared)
136{
137 return r->ops->readUint(r, out, declared);
138}
139_meta_inline bool serReadReal(_Inout_ SerReader* r, _Out_ float64* out, stype declared)
140{
141 return r->ops->readReal(r, out, declared);
142}
143_meta_inline bool serReadStr(_Inout_ SerReader* r, _Inout_ string* out)
144{
145 return r->ops->readStr(r, out);
146}
147_meta_inline bool serReadBytes(_Inout_ SerReader* r, _Inout_ Buffer* out)
148{
149 return r->ops->readBytes(r, out);
150}
151_meta_inline bool serArrBeginR(_Inout_ SerReader* r, _Out_ int32* count)
152{
153 return r->ops->arrBegin(r, count);
154}
155_meta_inline bool serArrNext(_Inout_ SerReader* r) { return r->ops->arrNext(r); }
156_meta_inline bool serArrEndR(_Inout_ SerReader* r) { return r->ops->arrEnd(r); }
157_meta_inline bool serMapBeginR(_Inout_ SerReader* r, _Out_ int32* count)
158{
159 return r->ops->mapBegin(r, count);
160}
161_meta_inline bool serMapNext(_Inout_ SerReader* r, _Inout_ string* key)
162{
163 return r->ops->mapNext(r, key);
164}
165_meta_inline bool serMapEndR(_Inout_ SerReader* r) { return r->ops->mapEnd(r); }
166_meta_inline bool serSkip(_Inout_ SerReader* r) { return r->ops->skip(r); }
167
168// Prefer the serRead() macro. This takes the schema as a descriptor rather than a type name,
169// for the cases the macro cannot spell: a generated member descriptor (`memberdesc->schema`), a
170// hand-built container descriptor, or a slot whose schema and value type come from different
171// names -- a `structp` in a `structset` slot, for instance. The schema is never NULL; a dynamic
172// slot uses a leaf descriptor such as `stExt(stvar)`. The type to produce is `schema->type`.
173bool _serRead(_Inout_ SerReader* r, _In_ const STypeInfoExt* schema, _Inout_ stgeneric* val);
174
192#define serRead(r, type, pval) _serRead(r, stExt(type), stArgPtr(type, pval))
193
200bool serReaderFail(_Inout_ SerReader* r, int32 code, _In_opt_ strref msg);
201
203
204CX_C_END
Simple buffer management.
bool(* SerTypeResolver)(SerResolved *out, strref name, void *user)
Definition sertype.h:71
enum SerNodeKindEnum SerNodeKind
bool serReaderFail(SerReader *r, int32 code, strref msg)
void serReaderAddResolver(SerReader *r, SerTypeResolver fn, void *user)
void serReaderDestroy(SerReader **r)
SerReader * _serReaderAlloc(size_t size, const SerReaderOps *ops, flags_t caps, flags_t flags)
bool serReaderResolve(SerResolved *out, SerReader *r, strref name)
Hash table container with type-safe generic key-value storage.
The abstract data model, type resolution, and serialization errors.
bool(* mapNext)(SerReader *r, string *key)
false at end of map
Definition serreader.h:45
bool(* arrNext)(SerReader *r)
false once the array is exhausted
Definition serreader.h:41
bool(* readInt)(SerReader *r, int64 *out, stype declared)
Definition serreader.h:33
void(* destroy)(SerReader *r)
frees private state and the struct
Definition serreader.h:52
bool(* readReal)(SerReader *r, float64 *out, stype declared)
Definition serreader.h:35
bool(* mapBegin)(SerReader *r, int32 *count)
Definition serreader.h:44
bool(* arrBegin)(SerReader *r, int32 *count)
Definition serreader.h:40
bool(* readUint)(SerReader *r, uint64 *out, stype declared)
Definition serreader.h:34