@@ -1327,10 +1327,65 @@ #endif #ifdef __cplusplus extern "C" { #endif +/** + * @brief Allocates memory for the specified number of items. + * + * Throws @ref OFOutOfMemoryException if allocating failed and + * @ref OFOutOfRangeException if the requested size exceeds the address space. + * + * @param count The number of items to allocate + * @param size The size of each item to allocate + * @return A pointer to the allocated memory. May return NULL if the specified + * size or count is 0. + */ +extern void *_Nullable of_malloc(size_t count, size_t size) + OF_WARN_UNUSED_RESULT; + +/** + * @brief Allocates memory for the specified number of items and initializes it + * with zeros. + * + * Throws @ref OFOutOfMemoryException if allocating failed and + * @ref OFOutOfRangeException if the requested size exceeds the address space. + * + * @param size The size of each item to allocate + * @param count The number of items to allocate + * @return A pointer to the allocated memory. May return NULL if the specified + * size or count is 0. + */ +extern void *_Nullable of_calloc(size_t count, size_t size) + OF_WARN_UNUSED_RESULT; + +/** + * @brief Resizes memory to the specific number of items of the specified size. + * + * If the pointer is NULL, this is equivalent to allocating memory. + * If the size or number of items is 0, this is equivalent to freeing memory. + * + * Throws @ref OFOutOfMemoryException if allocating failed and + * @ref OFOutOfRangeException if the requested size exceeds the address space. + * + * @param pointer A pointer to the already allocated memory + * @param size The size of each item to resize to + * @param count The number of items to resize to + * @return A pointer to the resized memory chunk + */ +extern void *_Nullable of_realloc(void *_Nullable pointer, size_t count, + size_t size) OF_WARN_UNUSED_RESULT; + +/** + * @brief Frees allocated memory. + * + * Does nothing if the pointer is NULL. + * + * @param pointer A pointer to the allocated memory + */ +extern void of_free(void *_Nullable pointer); + #ifdef OF_APPLE_RUNTIME extern void *_Null_unspecified objc_autoreleasePoolPush(void); extern void objc_autoreleasePoolPop(void *_Null_unspecified pool); # ifndef __OBJC2__ extern id _Nullable objc_constructInstance(Class _Nullable class_,