|
- #pragma once
-
- #include <assert.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- #if !defined(DEFAULT_CACHE_SIZE)
- #define DEFAULT_CACHE_SIZE (4 * 1024)
- #endif /* DEFAULT_CACHE_SIZE */
-
- /* NOTE(anjingyu): Non-thread-safe */
- typedef struct DynamicBuffer {
- void *buffer;
- size_t size;
- size_t capacity;
- } DynamicBuffer;
-
- typedef struct DynamicBuffer AutoReleasePool;
-
- #define DynamicBuffer_Capacity(o) ((DynamicBuffer *)(o))->capacity
- #define DynamicBuffer_Size(o) ((DynamicBuffer *)(o))->size
- #define DynamicBuffer_AppendChar(o, c) DynamicBuffer_Append(o, &c, sizeof(c))
- #define DynamicBuffer_AppendNull(o) DynamicBuffer_Append(o, "\0", 1)
- #define DynamicBuffer_AppendWNull(o) \
- do { \
- DynamicBuffer_Append(o, "\0", 1); \
- DynamicBuffer_Append(o, "\0", 1); \
- } while (0)
- #define DynamicBuffer_AppendNullWithoutSize(o) \
- do { \
- DynamicBuffer_Append(o, "\0", 1); \
- DynamicBuffer_Resize(o, DynamicBuffer_Size(o) - 1); \
- } while (0)
- #define DynamicBuffer_AppendWNullWithoutSize(o) \
- do { \
- DynamicBuffer_Append(o, "\0", 1); \
- DynamicBuffer_Append(o, "\0", 1); \
- DynamicBuffer_Resize(o, DynamicBuffer_Size(o) - 2); \
- } while (0)
- #define DynamicBuffer_Buffer(o) (uint8_t *)(((DynamicBuffer *)(o))->buffer)
- #define DynamicBuffer_BufferAt(o, idx) \
- ((uint8_t *)(((DynamicBuffer *)(o))->buffer) + idx)
- #define DynamicBuffer_BufferEnd(o) \
- ((uint8_t *)(((DynamicBuffer *)(o))->buffer) + ((DynamicBuffer *)(o))->size)
- #define DynamicBuffer_Begin(o) (uint8_t *)(((DynamicBuffer *)(o))->buffer)
- #define DynamicBuffer_Back(o) \
- ((((DynamicBuffer *)(o))->size > 0) \
- ? ((uint8_t *)(((DynamicBuffer *)(o))->buffer) + \
- ((DynamicBuffer *)(o))->size - 1) \
- : NULL)
- #define DynamicBuffer_Clear(o) ((DynamicBuffer *)(o))->size = 0
- #define DynamicBuffer_AvailableBuffer(o) \
- (((uint8_t *)((DynamicBuffer *)(o))->buffer) + ((DynamicBuffer *)(o))->size)
- #define DynamicBuffer_AvailableCapacity(o) \
- (((DynamicBuffer *)(o))->capacity - ((DynamicBuffer *)(o))->size)
- #define DynamicBuffer_AppendString(o, msg) \
- DynamicBuffer_Append((DynamicBuffer *)(o), (const char *)(msg), \
- strlen((const char *)(msg)));
-
- #define DynamicBuffer_Swap(o, buffer, size) \
- do { \
- free(((DynamicBuffer *)(o))->buffer); \
- ((DynamicBuffer *)(o))->buffer = buffer; \
- ((DynamicBuffer *)(o))->size = ((DynamicBuffer *)(o))->capacity = size; \
- } while (0)
-
- #define DynamicBuffer_ConstructWithSize(o, size) \
- do { \
- memset(o, 0, sizeof(DynamicBuffer)); \
- DynamicBuffer_Reserve(o, size); \
- } while (0)
-
- #define DynamicBuffer_Construct(o) \
- DynamicBuffer_ConstructWithSize(o, DEFAULT_CACHE_SIZE)
-
- #define DynamicBuffer_Destruct(o) \
- do { \
- free(((DynamicBuffer *)(o))->buffer); \
- memset(o, 0, sizeof(DynamicBuffer)); \
- } while (0)
-
- int DynamicBuffer_Reserve(DynamicBuffer *o, size_t new_capacity);
- int DynamicBuffer_ResetBuffer(DynamicBuffer *o, size_t position);
- int DynamicBuffer_Resize(DynamicBuffer *o, size_t new_size);
- void DynamicBuffer_Append(DynamicBuffer *o, const void *buffer, size_t size);
-
- #define AutoReleasePool_Construct(o, s) \
- DynamicBuffer_ConstructWithSize((o), (s))
- #define AutoReleasePool_Destruct(o) DynamicBuffer_Destruct((o))
- void *AutoReleasePool_Alloc(AutoReleasePool *o, size_t size);
-
- #if defined(__cplusplus)
- }
- #endif
|