Blender  V3.3
buffer.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
30 #include <string.h>
31 
32 #include "MEM_guardedalloc.h"
33 
34 #include "BLI_buffer.h"
35 #include "BLI_utildefines.h"
36 
37 #include "BLI_strict_flags.h"
38 
39 static void *buffer_alloc(BLI_Buffer *buffer, const size_t len)
40 {
41  return MEM_mallocN(buffer->elem_size * len, "BLI_Buffer.data");
42 }
43 
44 static void *buffer_realloc(BLI_Buffer *buffer, const size_t len)
45 {
46  return MEM_reallocN_id(buffer->data, buffer->elem_size * len, "BLI_Buffer.data");
47 }
48 
49 void BLI_buffer_resize(BLI_Buffer *buffer, const size_t new_count)
50 {
51  if (UNLIKELY(new_count > buffer->alloc_count)) {
52  if (buffer->flag & BLI_BUFFER_USE_STATIC) {
53  void *orig = buffer->data;
54 
55  buffer->data = buffer_alloc(buffer, new_count);
56  memcpy(buffer->data, orig, buffer->elem_size * buffer->count);
57  buffer->alloc_count = new_count;
58  buffer->flag &= ~BLI_BUFFER_USE_STATIC;
59  }
60  else {
61  if (buffer->alloc_count && (new_count < buffer->alloc_count * 2)) {
62  buffer->alloc_count *= 2;
63  }
64  else {
65  buffer->alloc_count = new_count;
66  }
67 
68  buffer->data = buffer_realloc(buffer, buffer->alloc_count);
69  }
70  }
71 
72  buffer->count = new_count;
73 }
74 
75 void BLI_buffer_reinit(BLI_Buffer *buffer, const size_t new_count)
76 {
77  if (UNLIKELY(new_count > buffer->alloc_count)) {
78  if ((buffer->flag & BLI_BUFFER_USE_STATIC) == 0) {
79  if (buffer->data) {
80  MEM_freeN(buffer->data);
81  }
82  }
83 
84  if (buffer->alloc_count && (new_count < buffer->alloc_count * 2)) {
85  buffer->alloc_count *= 2;
86  }
87  else {
88  buffer->alloc_count = new_count;
89  }
90 
91  buffer->flag &= ~BLI_BUFFER_USE_STATIC;
92  buffer->data = buffer_alloc(buffer, buffer->alloc_count);
93  }
94 
95  buffer->count = new_count;
96 }
97 
98 void _bli_buffer_append_array(BLI_Buffer *buffer, void *new_data, size_t count)
99 {
100  size_t size = buffer->count;
102 
103  uint8_t *bytes = (uint8_t *)buffer->data;
104  memcpy(bytes + size * buffer->elem_size, new_data, count * buffer->elem_size);
105 }
106 
108 {
109  if ((buffer->flag & BLI_BUFFER_USE_STATIC) == 0) {
110  if (buffer->data) {
111  MEM_freeN(buffer->data);
112  }
113  }
114  memset(buffer, 0, sizeof(*buffer));
115 }
@ BLI_BUFFER_USE_STATIC
Definition: BLI_buffer.h:22
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
#define UNLIKELY(x)
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
void BLI_buffer_resize(BLI_Buffer *buffer, const size_t new_count)
Definition: buffer.c:49
void BLI_buffer_reinit(BLI_Buffer *buffer, const size_t new_count)
Definition: buffer.c:75
void _bli_buffer_append_array(BLI_Buffer *buffer, void *new_data, size_t count)
Definition: buffer.c:98
void _bli_buffer_free(BLI_Buffer *buffer)
Definition: buffer.c:107
static void * buffer_alloc(BLI_Buffer *buffer, const size_t len)
Definition: buffer.c:39
static void * buffer_realloc(BLI_Buffer *buffer, const size_t len)
Definition: buffer.c:44
int len
Definition: draw_manager.c:108
int count
ccl_global float * buffer
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_reallocN_id)(void *vmemh, size_t len, const char *str)
Definition: mallocn.c:29
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:33
unsigned char uint8_t
Definition: stdint.h:78