xref: /php-src/ext/dom/lexbor/lexbor/core/mraw.h (revision bffab33a)
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