From dcb56d79a87966d93fe0509e64ab51eb90c1d486 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 20 Oct 2015 14:39:08 +0200 Subject: BLI: add new 'memory_utils' module with func checking a whole memory chunk is filled of zero, and an helper to ensure all memory of a given structure passed a given member is filled of zero. --- source/blender/blenlib/BLI_memory_utils.h | 34 +++++++++++++++++++ source/blender/blenlib/BLI_utildefines.h | 11 ++++++ source/blender/blenlib/CMakeLists.txt | 2 ++ source/blender/blenlib/intern/memory_utils.c | 50 ++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 source/blender/blenlib/BLI_memory_utils.h create mode 100644 source/blender/blenlib/intern/memory_utils.c (limited to 'source') diff --git a/source/blender/blenlib/BLI_memory_utils.h b/source/blender/blenlib/BLI_memory_utils.h new file mode 100644 index 00000000000..32bbdf8a7b5 --- /dev/null +++ b/source/blender/blenlib/BLI_memory_utils.h @@ -0,0 +1,34 @@ +/* + * ***** 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 ***** + */ + +#ifndef __BLI_MEMORY_UTILS_H__ +#define __BLI_MEMORY_UTILS_H__ + +/** \file BLI_memory_utils.h + * \ingroup bli + * \brief Generic memory manipulation API. + */ + +/* it may be defined already */ +#ifndef __BLI_UTILDEFINES_H__ +bool BLI_memory_is_zero(const void *arr, const size_t size); +#endif + +#endif /* __BLI_MEMORY_UTILS_H__ */ diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index df6f578f3f2..31852fa0f43 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -513,6 +513,17 @@ extern "C" { sizeof(*(struct_var)) - OFFSETOF_STRUCT(struct_var, member)); \ } (void)0 +/* defined + * in memory_utils.c for now. I do not know where we should put it actually... */ +#ifndef __BLI_MEMORY_UTILS_H__ +extern bool BLI_memory_is_zero(const void *arr, const size_t arr_size); +#endif + +#define MEMCMP_STRUCT_OFS_IS_ZERO(struct_var, member) \ + (BLI_memory_is_zero( \ + (char *)(struct_var) + OFFSETOF_STRUCT(struct_var, member), \ + sizeof(*(struct_var)) - OFFSETOF_STRUCT(struct_var, member))) + /* Warning-free macros for storing ints in pointers. Use these _only_ * for storing an int in a pointer, not a pointer in an int (64bit)! */ #define SET_INT_IN_POINTER(i) ((void *)(intptr_t)(i)) diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index dcf7c3b5d39..0de614a5ca7 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -88,6 +88,7 @@ set(SRC intern/math_statistics.c intern/math_vector.c intern/math_vector_inline.c + intern/memory_utils.c intern/noise.c intern/path_util.c intern/polyfill2d.c @@ -169,6 +170,7 @@ set(SRC BLI_math_statistics.h BLI_math_vector.h BLI_memarena.h + BLI_memory_utils.h BLI_mempool.h BLI_noise.h BLI_path_util.h diff --git a/source/blender/blenlib/intern/memory_utils.c b/source/blender/blenlib/intern/memory_utils.c new file mode 100644 index 00000000000..2ebb8be5bb4 --- /dev/null +++ b/source/blender/blenlib/intern/memory_utils.c @@ -0,0 +1,50 @@ +/* + * ***** 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 ***** + */ + +/** \file blender/blenlib/intern/memory_utils.c + * \ingroup bli + * \brief Generic memory manipulation API. + * + * This is to extend on existing functions + * such as ``memcpy`` & ``memcmp``. + */ +#include + +#include "BLI_sys_types.h" +#include "BLI_utildefines.h" + +#include "BLI_memory_utils.h" + +#include "BLI_strict_flags.h" + +/** + * Check if memory is zero'd, as with memset(s, 0, nbytes) + */ +bool BLI_memory_is_zero(const void *s, const size_t nbytes) +{ + const char *s_byte = s; + const char *s_end = (const char *)s + nbytes; + + while ((s_byte != s_end) && (*s_byte == 0)) { + s_byte++; + } + + return (s_byte == s_end); +} -- cgit v1.2.3