1 /*
2 * Copyright (C) 2018 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7 #ifndef LEXBOR_MRAW_H
8 #define LEXBOR_MRAW_H
9
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13
14 #include <string.h>
15
16 #include "lexbor/core/base.h"
17 #include "lexbor/core/mem.h"
18 #include "lexbor/core/bst.h"
19
20
21 #define lexbor_mraw_meta_size() \
22 (((sizeof(size_t) % LEXBOR_MEM_ALIGN_STEP) != 0) \
23 ? sizeof(size_t) \
24 + (LEXBOR_MEM_ALIGN_STEP - (sizeof(size_t) % LEXBOR_MEM_ALIGN_STEP)) \
25 : sizeof(size_t))
26
27
28 typedef struct {
29 lexbor_mem_t *mem;
30 lexbor_bst_t *cache;
31 size_t ref_count;
32 }
33 lexbor_mraw_t;
34
35
36 LXB_API lexbor_mraw_t *
37 lexbor_mraw_create(void);
38
39 LXB_API lxb_status_t
40 lexbor_mraw_init(lexbor_mraw_t *mraw, size_t chunk_size);
41
42 LXB_API void
43 lexbor_mraw_clean(lexbor_mraw_t *mraw);
44
45 LXB_API lexbor_mraw_t *
46 lexbor_mraw_destroy(lexbor_mraw_t *mraw, bool destroy_self);
47
48
49 LXB_API void *
50 lexbor_mraw_alloc(lexbor_mraw_t *mraw, size_t size);
51
52 LXB_API void *
53 lexbor_mraw_calloc(lexbor_mraw_t *mraw, size_t size);
54
55 LXB_API void *
56 lexbor_mraw_realloc(lexbor_mraw_t *mraw, void *data, size_t new_size);
57
58 LXB_API void *
59 lexbor_mraw_free(lexbor_mraw_t *mraw, void *data);
60
61
62 /*
63 * Inline functions
64 */
65 lxb_inline size_t
lexbor_mraw_data_size(void * data)66 lexbor_mraw_data_size(void *data)
67 {
68 return *((size_t *) (((uint8_t *) data) - lexbor_mraw_meta_size()));
69 }
70
71 lxb_inline void
lexbor_mraw_data_size_set(void * data,size_t size)72 lexbor_mraw_data_size_set(void *data, size_t size)
73 {
74 data = (((uint8_t *) data) - lexbor_mraw_meta_size());
75 memcpy(data, &size, sizeof(size_t));
76 }
77
78 lxb_inline void *
lexbor_mraw_dup(lexbor_mraw_t * mraw,const void * src,size_t size)79 lexbor_mraw_dup(lexbor_mraw_t *mraw, const void *src, size_t size)
80 {
81 void *data = lexbor_mraw_alloc(mraw, size);
82
83 if (data != NULL) {
84 memcpy(data, src, size);
85 }
86
87 return data;
88 }
89
90 lxb_inline size_t
lexbor_mraw_reference_count(lexbor_mraw_t * mraw)91 lexbor_mraw_reference_count(lexbor_mraw_t *mraw)
92 {
93 return mraw->ref_count;
94 }
95
96
97 /*
98 * No inline functions for ABI.
99 */
100 LXB_API size_t
101 lexbor_mraw_data_size_noi(void *data);
102
103 LXB_API void
104 lexbor_mraw_data_size_set_noi(void *data, size_t size);
105
106 LXB_API void *
107 lexbor_mraw_dup_noi(lexbor_mraw_t *mraw, const void *src, size_t size);
108
109
110 #ifdef __cplusplus
111 } /* extern "C" */
112 #endif
113
114 #endif /* LEXBOR_MRAW_H */
115