From 2c9d22fe31dc20df9fecc6322bdb7cbe56783164 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sun, 30 Dec 2012 18:28:10 +0000 Subject: Add BLI_buffer, an alternative to BLI_array BLI_buffer is a dynamic homogeneous array similar to BLI_array, but it allocates a structure that can be passed around making it possible to resize the array outside the function it was declared in. --- source/blender/blenlib/intern/buffer.c | 58 ++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 source/blender/blenlib/intern/buffer.c (limited to 'source/blender/blenlib/intern/buffer.c') diff --git a/source/blender/blenlib/intern/buffer.c b/source/blender/blenlib/intern/buffer.c new file mode 100644 index 00000000000..98151c8eebf --- /dev/null +++ b/source/blender/blenlib/intern/buffer.c @@ -0,0 +1,58 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "MEM_guardedalloc.h" + +#include "BLI_buffer.h" +#include "BLI_utildefines.h" + +#include + +void BLI_buffer_resize(BLI_Buffer *buffer, int new_count) +{ + if (new_count > buffer->alloc_count) { + if (buffer->using_static) { + void *orig = buffer->data; + buffer->data = MEM_callocN(buffer->elem_size * new_count, + "BLI_Buffer.data"); + memcpy(buffer->data, orig, buffer->elem_size * buffer->count); + buffer->alloc_count = new_count; + buffer->using_static = FALSE; + } + else { + if (new_count < buffer->alloc_count * 2) + buffer->alloc_count *= 2; + else + buffer->alloc_count = new_count; + buffer->data = MEM_reallocN(buffer->data, + (buffer->elem_size * + buffer->alloc_count)); + } + } + + buffer->count = new_count; +} + +void BLI_buffer_free(BLI_Buffer *buffer) +{ + if (!buffer->using_static) + MEM_freeN(buffer->data); + memset(buffer, 0, sizeof(*buffer)); +} -- cgit v1.2.3