1 /* 2 * Copyright (C) 2018 Alexander Borisov 3 * 4 * Author: Alexander Borisov <borisov@lexbor.com> 5 */ 6 7 #ifndef LEXBOR_DOBJECT_H 8 #define LEXBOR_DOBJECT_H 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif 13 14 #include "lexbor/core/base.h" 15 #include "lexbor/core/mem.h" 16 #include "lexbor/core/array.h" 17 18 19 typedef struct { 20 lexbor_mem_t *mem; 21 lexbor_array_t *cache; 22 23 size_t allocated; 24 size_t struct_size; 25 } 26 lexbor_dobject_t; 27 28 29 LXB_API lexbor_dobject_t * 30 lexbor_dobject_create(void); 31 32 LXB_API lxb_status_t 33 lexbor_dobject_init(lexbor_dobject_t *dobject, 34 size_t chunk_size, size_t struct_size); 35 36 LXB_API void 37 lexbor_dobject_clean(lexbor_dobject_t *dobject); 38 39 LXB_API lexbor_dobject_t * 40 lexbor_dobject_destroy(lexbor_dobject_t *dobject, bool destroy_self); 41 42 43 LXB_API uint8_t * 44 lexbor_dobject_init_list_entries(lexbor_dobject_t *dobject, size_t pos); 45 46 47 LXB_API void * 48 lexbor_dobject_alloc(lexbor_dobject_t *dobject); 49 50 LXB_API void * 51 lexbor_dobject_calloc(lexbor_dobject_t *dobject); 52 53 LXB_API void * 54 lexbor_dobject_free(lexbor_dobject_t *dobject, void *data); 55 56 57 LXB_API void * 58 lexbor_dobject_by_absolute_position(lexbor_dobject_t *dobject, size_t pos); 59 60 61 /* 62 * Inline functions 63 */ 64 lxb_inline size_t lexbor_dobject_allocated(lexbor_dobject_t * dobject)65lexbor_dobject_allocated(lexbor_dobject_t *dobject) 66 { 67 return dobject->allocated; 68 } 69 70 lxb_inline size_t lexbor_dobject_cache_length(lexbor_dobject_t * dobject)71lexbor_dobject_cache_length(lexbor_dobject_t *dobject) 72 { 73 return lexbor_array_length(dobject->cache); 74 } 75 76 /* 77 * No inline functions for ABI. 78 */ 79 LXB_API size_t 80 lexbor_dobject_allocated_noi(lexbor_dobject_t *dobject); 81 82 LXB_API size_t 83 lexbor_dobject_cache_length_noi(lexbor_dobject_t *dobject); 84 85 86 #ifdef __cplusplus 87 } /* extern "C" */ 88 #endif 89 90 #endif /* LEXBOR_DOBJECT_H */ 91 92 93