#pragma once #include #include #include "common/attributes.h" #if FF_HAVE_MALLOC_USABLE_SIZE || FF_HAVE_MSVC_MSIZE #if __has_include() #include #else #include // For DragonFly BSD #endif #elif FF_HAVE_MALLOC_SIZE #include #endif FF_A_ALWAYS_INLINE FF_A_NONNULL(1) static inline void ffWrapFree(const void* pPtr) { assert(pPtr); if (*(void**) pPtr) { free(*(void**) pPtr); } } #define FF_AUTO_FREE FF_A_CLEANUP(ffWrapFree) // ptr MUST be a malloc'ed pointer static inline size_t ffMallocUsableSize(const void* ptr) { assert(ptr); #if FF_HAVE_MALLOC_USABLE_SIZE return malloc_usable_size((void*) ptr); #elif FF_HAVE_MALLOC_SIZE return malloc_size((void*) ptr); #elif FF_HAVE_MSVC_MSIZE return _msize((void*) ptr); #else (void) ptr; return 0; // Not supported #endif }