Veritable Lasagna
An Allocator & Data Structure Library for C.
Loading...
Searching...
No Matches
vl_msgpack.h
Go to the documentation of this file.
1
14#ifndef VL_MSGPACK_H
15#define VL_MSGPACK_H
16
17#include <string.h>
18
19#include "vl_arena.h"
20#include "vl_buffer.h"
21#include "vl_hashtable.h"
22
23#define VL_MSGPACK_ITER_INVALID VL_HASHTABLE_ITER_INVALID
24#define VL_MSGPACK_EXT_NONE -127
25
26#define VL_MSGPACK_FOREACH_CHILD(packPtr, parentIter, childIterSymbol) \
27 for (vl_msgpack_iter childIterSymbol = vlMsgPackFirstChild((packPtr), (parentIter)); \
28 childIterSymbol != VL_MSGPACK_ITER_INVALID; \
29 childIterSymbol = vlMsgPackNextSibling((packPtr), (childIterSymbol)))
30
32
89
114typedef struct vl_msgpack_
115{
116 vl_hashtable nodes; // hierarchy
118 vl_msgpack_iter root; // root node
119} vl_msgpack;
120
137VL_API void vlMsgPackInit(vl_msgpack* pack);
138
157VL_API void vlMsgPackFree(vl_msgpack* pack);
158
177VL_API vl_msgpack* vlMsgPackNew(void);
178
198VL_API void vlMsgPackDelete(vl_msgpack* pack);
199
209VL_API void vlMsgPackClear(vl_msgpack* pack);
210
227
237
246
256
266
276
285
294VL_API vl_int8_t vlMsgPackExtType(vl_msgpack* pack, vl_msgpack_iter iter);
295
314VL_API vl_msgpack_iter vlMsgPackInsertExt(vl_msgpack* pack, vl_msgpack_type type, vl_int8_t subType,
315 vl_msgpack_iter parent, const void* keyPtr, vl_memsize_t keyLen,
316 const void* dataPtr, vl_memsize_t dataLen);
317
334 const void* keyPtr, vl_memsize_t keyLen, const void* dataPtr,
335 vl_memsize_t dataLen)
336{
337 return vlMsgPackInsertExt(pack, type, VL_MSGPACK_EXT_NONE, parent, keyPtr, keyLen, dataPtr, dataLen);
338}
339
349VL_API void vlMsgPackRemove(vl_msgpack* pack, vl_msgpack_iter iter);
350
364VL_API vl_msgpack_iter vlMsgPackFindChild(vl_msgpack* pack, vl_msgpack_iter parent, const void* key,
365 vl_memsize_t keyLen);
366
380static inline vl_msgpack_iter vlMsgPackFindChildNamed(vl_msgpack* pack, vl_msgpack_iter parent, const char* name)
381{
382 return vlMsgPackFindChild(pack, parent, name, strlen(name));
383}
384
398
411VL_API const vl_transient* vlMsgPackSampleKey(vl_msgpack* pack, vl_msgpack_iter iter, vl_memsize_t* size);
412
423static inline vl_dsidx_t vlMsgPackSampleKeyIndex(vl_msgpack* pack, vl_msgpack_iter iter)
424{
425 return *((const vl_dsidx_t*)vlMsgPackSampleKey(pack, iter, NULL));
426}
427
440VL_API vl_transient* vlMsgPackSampleValue(vl_msgpack* pack, vl_msgpack_iter iter, vl_memsize_t* size);
441
442#ifndef vlMsgPackRoot
452#define vlMsgPackRoot(packPtr) ((packPtr)->root)
453#endif
454
467static inline vl_msgpack_iter vlMsgPackSetMapNamed(vl_msgpack* pack, vl_msgpack_iter parent, const char* key)
468{
469 return vlMsgPackInsert(pack, VL_MSGPACK_MAP, parent, key, strlen(key), NULL, 0);
470}
471
484static inline vl_msgpack_iter vlMsgPackSetMapIndexed(vl_msgpack* pack, vl_msgpack_iter parent, vl_dsidx_t idx)
485{
486 return vlMsgPackInsert(pack, VL_MSGPACK_MAP, parent, &idx, sizeof(vl_dsidx_t), NULL, 0);
487}
488
502static inline vl_msgpack_iter vlMsgPackSetArrayNamed(vl_msgpack* pack, vl_msgpack_iter parent, vl_dsidx_t arrayLen,
503 const char* key)
504{
505 return vlMsgPackInsert(pack, VL_MSGPACK_ARRAY, parent, key, strlen(key), &arrayLen, sizeof(vl_dsidx_t));
506}
507
521static inline vl_msgpack_iter vlMsgPackSetArrayIndexed(vl_msgpack* pack, vl_msgpack_iter parent, vl_dsidx_t arrayLen,
522 vl_dsidx_t idx)
523{
524 return vlMsgPackInsert(pack, VL_MSGPACK_ARRAY, parent, &idx, sizeof(vl_dsidx_t), &arrayLen, sizeof(vl_dsidx_t));
525}
526
540static inline vl_msgpack_iter vlMsgPackSetBoolNamed(vl_msgpack* pack, vl_msgpack_iter parent, vl_bool_t value,
541 const char* key)
542{
543 return vlMsgPackInsert(pack, VL_MSGPACK_BOOL, parent, key, strlen(key), &value, sizeof(vl_bool_t));
544}
545
559static inline vl_msgpack_iter vlMsgPackSetBoolIndexed(vl_msgpack* pack, vl_msgpack_iter parent, vl_bool_t value,
560 vl_dsidx_t idx)
561{
562 return vlMsgPackInsert(pack, VL_MSGPACK_BOOL, parent, &idx, sizeof(vl_dsidx_t), &value, sizeof(vl_bool_t));
563}
564
578static inline vl_msgpack_iter vlMsgPackSetIntNamed(vl_msgpack* pack, vl_msgpack_iter parent, vl_ilarge_t value,
579 const char* key)
580{
581 return vlMsgPackInsert(pack, VL_MSGPACK_INT, parent, key, strlen(key), &value, sizeof(vl_ilarge_t));
582}
583
597static inline vl_msgpack_iter vlMsgPackSetIntIndexed(vl_msgpack* pack, vl_msgpack_iter parent, vl_ilarge_t value,
598 vl_dsidx_t idx)
599{
600 return vlMsgPackInsert(pack, VL_MSGPACK_INT, parent, &idx, sizeof(vl_dsidx_t), &value, sizeof(vl_ilarge_t));
601}
602
616static inline vl_msgpack_iter vlMsgPackSetUIntNamed(vl_msgpack* pack, vl_msgpack_iter parent, vl_ularge_t value,
617 const char* key)
618{
619 return vlMsgPackInsert(pack, VL_MSGPACK_UINT, parent, key, strlen(key), &value, sizeof(vl_ularge_t));
620}
621
634static inline vl_msgpack_iter vlMsgPackSetUIntIndexed(vl_msgpack* pack, vl_msgpack_iter parent, vl_ularge_t value,
635 vl_dsidx_t idx)
636{
637 return vlMsgPackInsert(pack, VL_MSGPACK_UINT, parent, &idx, sizeof(vl_dsidx_t), &value, sizeof(vl_ularge_t));
638}
639
652static inline vl_msgpack_iter vlMsgPackSetFloat32Named(vl_msgpack* pack, vl_msgpack_iter parent, vl_float32_t value,
653 const char* key)
654{
655 return vlMsgPackInsert(pack, VL_MSGPACK_FLOAT32, parent, key, strlen(key), &value, sizeof(vl_float32_t));
656}
657
671static inline vl_msgpack_iter vlMsgPackSetFloat32Indexed(vl_msgpack* pack, vl_msgpack_iter parent, vl_float32_t value,
672 vl_dsidx_t idx)
673{
674 return vlMsgPackInsert(pack, VL_MSGPACK_FLOAT32, parent, &idx, sizeof(vl_dsidx_t), &value, sizeof(vl_float32_t));
675}
676
689static inline vl_msgpack_iter vlMsgPackSetFloat64Named(vl_msgpack* pack, vl_msgpack_iter parent, vl_float64_t value,
690 const char* key)
691{
692 return vlMsgPackInsert(pack, VL_MSGPACK_FLOAT64, parent, key, strlen(key), &value, sizeof(vl_float64_t));
693}
694
708static inline vl_msgpack_iter vlMsgPackSetFloat64Indexed(vl_msgpack* pack, vl_msgpack_iter parent, vl_float64_t value,
709 vl_dsidx_t idx)
710{
711 return vlMsgPackInsert(pack, VL_MSGPACK_FLOAT64, parent, &idx, sizeof(vl_dsidx_t), &value, sizeof(vl_float64_t));
712}
713
727static inline vl_msgpack_iter vlMsgPackSetStringNamed(vl_msgpack* pack, vl_msgpack_iter parent, const char* value,
728 const char* key)
729{
730 return vlMsgPackInsert(pack, VL_MSGPACK_STRING, parent, key, strlen(key), value, strlen(value));
731}
732
746static inline vl_msgpack_iter vlMsgPackSetStringIndexed(vl_msgpack* pack, vl_msgpack_iter parent, const char* value,
747 vl_dsidx_t idx)
748{
749 return vlMsgPackInsert(pack, VL_MSGPACK_STRING, parent, &idx, sizeof(vl_dsidx_t), value, strlen(value));
750}
751
766static inline vl_msgpack_iter vlMsgPackSetBinaryNamed(vl_msgpack* pack, vl_msgpack_iter parent, const void* value,
767 vl_memsize_t valLen, const char* key)
768{
769 return vlMsgPackInsert(pack, VL_MSGPACK_BINARY, parent, key, strlen(key), value, valLen);
770}
771
786static inline vl_msgpack_iter vlMsgPackSetBinaryIndexed(vl_msgpack* pack, vl_msgpack_iter parent, const void* value,
787 vl_memsize_t valLen, vl_dsidx_t idx)
788{
789 return vlMsgPackInsert(pack, VL_MSGPACK_BINARY, parent, &idx, sizeof(vl_dsidx_t), value, valLen);
790}
791
805static inline vl_bool_t vlMsgPackGetBool(vl_msgpack* pack, vl_msgpack_iter iter, vl_bool_t defaultValue)
806{
807 if (iter == VL_MSGPACK_ITER_INVALID)
808 return defaultValue;
809 if ((vlMsgPackType(pack, iter) != VL_MSGPACK_BOOL))
810 return defaultValue;
811
812 return *((const vl_bool_t*)vlMsgPackSampleValue(pack, iter, NULL));
813}
814
828static inline vl_ilarge_t vlMsgPackGetInt(vl_msgpack* pack, vl_msgpack_iter iter, vl_ilarge_t defaultValue)
829{
830 if (iter == VL_MSGPACK_ITER_INVALID)
831 return defaultValue;
832 if ((vlMsgPackType(pack, iter) != VL_MSGPACK_INT))
833 return defaultValue;
834
835 return *((const vl_ilarge_t*)vlMsgPackSampleValue(pack, iter, NULL));
836}
837
852static inline vl_ilarge_t vlMsgPackGetUInt(vl_msgpack* pack, vl_msgpack_iter iter, vl_ularge_t defaultValue)
853{
854 if (iter == VL_MSGPACK_ITER_INVALID)
855 return defaultValue;
856 if ((vlMsgPackType(pack, iter) != VL_MSGPACK_UINT))
857 return defaultValue;
858
859 return *((const vl_ularge_t*)vlMsgPackSampleValue(pack, iter, NULL));
860}
861
876static inline vl_float32_t vlMsgPackGetFloat32(vl_msgpack* pack, vl_msgpack_iter iter, vl_float32_t defaultValue)
877{
878 if (iter == VL_MSGPACK_ITER_INVALID)
879 return defaultValue;
880 if (vlMsgPackType(pack, iter) != VL_MSGPACK_FLOAT32)
881 return defaultValue;
882
883 return *((const vl_float32_t*)vlMsgPackSampleValue(pack, iter, NULL));
884}
885
900static inline vl_float64_t vlMsgPackGetFloat64(vl_msgpack* pack, vl_msgpack_iter iter, vl_float64_t defaultValue)
901{
902 if (iter == VL_MSGPACK_ITER_INVALID)
903 return defaultValue;
904 if (vlMsgPackType(pack, iter) != VL_MSGPACK_FLOAT64)
905 return defaultValue;
906
907 return *((const vl_float64_t*)vlMsgPackSampleValue(pack, iter, NULL));
908}
909
910#endif // VL_MSGPACK_H
An arena allocator for efficient memory management.
Definition vl_arena.h:84
vl_arena_ptr vl_hash_iter
Definition vl_hashtable.h:40
A dynamically-sized hash table with variable-sized keys and values.
Definition vl_hashtable.h:79
VL_MEMORY_T vl_transient
Definition vl_memory.h:118
vl_msgpack_iter vlMsgPackInsert(vl_msgpack *pack, vl_msgpack_type type, vl_msgpack_iter parent, const void *keyPtr, vl_memsize_t keyLen, const void *dataPtr, vl_memsize_t dataLen)
VL_API vl_msgpack * vlMsgPackClone(vl_msgpack *src, vl_msgpack *dest)
Clones the specified MessagePack DOM to another.
Definition vl_msgpack.c:313
VL_API vl_msgpack_iter vlMsgPackInsertExt(vl_msgpack *pack, vl_msgpack_type type, vl_int8_t subType, vl_msgpack_iter parent, const void *keyPtr, vl_memsize_t keyLen, const void *dataPtr, vl_memsize_t dataLen)
Inserts a new element into the MessagePack DOM with an extended type.
Definition vl_msgpack.c:378
VL_API vl_msgpack_iter vlMsgPackNextSibling(vl_msgpack *pack, vl_msgpack_iter iter)
Retrieves the next sibling of a given node.
Definition vl_msgpack.c:358
vl_hashtable nodes
Definition vl_msgpack.h:116
VL_API vl_msgpack * vlMsgPackNew(void)
Allocates and initializes a MessagePack DOM.
Definition vl_msgpack.c:292
VL_API void vlMsgPackClear(vl_msgpack *pack)
Clears the MessagePack DOM, resetting it for reuse.
Definition vl_msgpack.c:305
vl_hash_iter vl_msgpack_iter
Definition vl_msgpack.h:31
VL_API vl_dsidx_t vlMsgPackTotalChildren(vl_msgpack *pack, vl_msgpack_iter iter)
Retrieves the total number of children of a given node.
Definition vl_msgpack.c:330
VL_API void vlMsgPackDelete(vl_msgpack *pack)
Deletes the specified MessagePack DOM.
Definition vl_msgpack.c:299
VL_API void vlMsgPackFree(vl_msgpack *pack)
Frees the specified MessagePack DOM.
Definition vl_msgpack.c:285
VL_API const vl_transient * vlMsgPackSampleKey(vl_msgpack *pack, vl_msgpack_iter iter, vl_memsize_t *size)
Retrieves the key associated with an element.
Definition vl_msgpack.c:606
VL_API vl_int8_t vlMsgPackExtType(vl_msgpack *pack, vl_msgpack_iter iter)
Retrieves the extension type of a MessagePack EXT node.
Definition vl_msgpack.c:373
VL_API vl_msgpack_iter vlMsgPackFirstChild(vl_msgpack *pack, vl_msgpack_iter iter)
Retrieves the first child of a given node.
Definition vl_msgpack.c:344
VL_API void vlMsgPackRemove(vl_msgpack *pack, vl_msgpack_iter iter)
Removes an element from the MessagePack DOM.
Definition vl_msgpack.c:500
VL_API vl_msgpack_iter vlMsgPackFindChild(vl_msgpack *pack, vl_msgpack_iter parent, const void *key, vl_memsize_t keyLen)
Finds a child element by key.
Definition vl_msgpack.c:574
vl_msgpack_type
All MessagePack Types.
Definition vl_msgpack.h:37
@ VL_MSGPACK_MAP
MessagePack Map. A collection of node key-value pairs of an arbitrary size.
Definition vl_msgpack.h:81
@ VL_MSGPACK_ARRAY
MessagePack Array. A sequence of dynamically-typed nodes of a well-determined length.
Definition vl_msgpack.h:75
@ VL_MSGPACK_UINT
MessagePack Unsigned Integer. Implemented as vl_ularge_t.
Definition vl_msgpack.h:53
@ VL_MSGPACK_FLOAT64
MessagePack 64-bit Float. Implemented as vl_float64_t.
Definition vl_msgpack.h:61
@ VL_MSGPACK_STRING
MessagePack String. Must have UTF-8 encoding.
Definition vl_msgpack.h:65
@ VL_MSGPACK_BOOL
MessagePack Boolean. Either True (1) or False (0).
Definition vl_msgpack.h:45
@ VL_MSGPACK_EXT
MessagePack Extension Type. Has a type identifier in range of 0...127 and arbitrary data.
Definition vl_msgpack.h:87
@ VL_MSGPACK_FLOAT32
MessagePack 32-bit Float. Implemented as vl_float32_t.
Definition vl_msgpack.h:57
@ VL_MSGPACK_INT
MessagePack Signed Integer. Implemented as vl_ilarge_t.
Definition vl_msgpack.h:49
@ VL_MSGPACK_BINARY
MessagePack Binary. An arbitrary sequence of bytes with a well-defined length.
Definition vl_msgpack.h:70
@ VL_MSGPACK_NIL
MessagePack type equivalent to NIL. Has no data associated with it.
Definition vl_msgpack.h:41
VL_API vl_msgpack_type vlMsgPackType(vl_msgpack *pack, vl_msgpack_iter iter)
Retrieves the type of a given node in the MessagePack DOM.
Definition vl_msgpack.c:368
vl_msgpack_iter root
Definition vl_msgpack.h:118
VL_API vl_msgpack_iter vlMsgPackParent(vl_msgpack *pack, vl_msgpack_iter iter)
Retrieves the parent node of a given node in the MessagePack DOM.
Definition vl_msgpack.c:325
VL_API vl_msgpack_iter vlMsgPackPrevSibling(vl_msgpack *pack, vl_msgpack_iter iter)
Retrieves the previous sibling of a given node.
Definition vl_msgpack.c:363
VL_API void vlMsgPackInit(vl_msgpack *pack)
Initializes the specified MessagePack DOM.
Definition vl_msgpack.c:275
VL_API vl_transient * vlMsgPackSampleValue(vl_msgpack *pack, vl_msgpack_iter iter, vl_memsize_t *size)
Retrieves the value associated with an element.
Definition vl_msgpack.c:614
#define VL_MSGPACK_ITER_INVALID
Definition vl_msgpack.h:23
#define VL_MSGPACK_EXT_NONE
Definition vl_msgpack.h:24
VL_API vl_msgpack_iter vlMsgPackFindChildIndexed(vl_msgpack *pack, vl_msgpack_iter iter, vl_dsidx_t idx)
Finds a child element by index.
Definition vl_msgpack.c:595
vl_arena values
Definition vl_msgpack.h:117
MessagePack Document Object Model.
Definition vl_msgpack.h:115
VL_BOOL_T vl_bool_t
Definition vl_numtypes.h:191
VL_STRUCTURE_INDEX_T vl_dsidx_t
Index type for data structures.
Definition vl_numtypes.h:75
VL_F32_T vl_float32_t
32-bit floating point number type.
Definition vl_numtypes.h:173
VL_ULARGE_T vl_ularge_t
Largest available unsigned integer type.
Definition vl_numtypes.h:136
VL_ILARGE_T vl_ilarge_t
Largest available signed integer type.
Definition vl_numtypes.h:140