/*
 * @file	mymalloc.h
 * @author	zsx
 * @date	2003-12-15
 * @version	1.0
 * @brief	本文件为使用ACL库时的高级内存分配接口，用户应该主要使用此接口来
 *		进行内存的分配及释放, 用户可以先行调用 acl_mem_hook.h 中的函数
 *		接口注册自己的内存分配与释放等管理接口，这样再调用 acl_myxxx 类
 *		的宏时便自动切换到用户自己的内存管理接口调用上
 */

#ifndef	ACL_MYMALLOC_INCLUDE_H
#define	ACL_MYMALLOC_INCLUDE_H

#ifdef  __cplusplus
extern "C" {
#endif

#include "acl_define.h"
#include "acl_malloc.h"

/**
 * 动态分配内存的宏定义，不初始化新分配的内存空间
 * @param size {size_t} 分配长度
 * @return {void *}
 */
#define acl_mymalloc(size) acl_malloc_glue(__FILE__, __LINE__, size)

/**
 * 动态分配内存的宏定义，初始化新分配的内存空间为零
 * @param nmemb {size_t} 元素个数
 * @param size {size_t} 每个元素的长度
 * @return {void *}
 */
#define acl_mycalloc(nmemb, size) acl_calloc_glue(__FILE__, __LINE__, nmemb, size)

/**
 * 重新动态分配内存的宏定义
 * @param ptr {void*} 原内存地址
 * @param size {size_t} 新分配内存时要求的长度
 * @return {void *}
 */
#define acl_myrealloc(ptr, size) acl_realloc_glue(__FILE__, __LINE__, (ptr), size)

/**
 * 动态复制字符串宏定义
 * @param str {const char*} 源字符串
 * @return {char*} 新的字符串，需用 acl_myfree 释放
 */
#define acl_mystrdup(str) acl_strdup_glue(__FILE__, __LINE__, (str))

/**
 * 动态复制字符串宏定义，并限定最大内存空间大小
 * @param str {const char*} 源字符串
 * @param len {size_t} 新字符串最大内存空间大小限制值
 * @return {char*} 新的字符串，需用 acl_myfree 释放
 */
#define acl_mystrndup(str, len) acl_strndup_glue(__FILE__, __LINE__, (str), len)

/**
 * 动态复制内存宏定义
 * @param ptr {const void*} 源内存地址
 * @param len {size_t} 源内存大小
 * @return {void*} 新的字符串，需用 acl_myfree 释放
 */
#define acl_mymemdup(ptr, len) acl_memdup_glue(__FILE__, __LINE__, (ptr), len)

/**
 * 释放动态分配的内存空间
 * @param _ptr_ {void*} 动态内存地址
 */
#define acl_myfree(_ptr_) do {  \
	acl_free_glue(__FILE__, __LINE__, (_ptr_));  \
	(_ptr_) = NULL;  \
} while (0)

/**
 * XXX: 因为该函数用于回调函数，所以无法进行宏定义转换, 将来再完善此函数
 */
#define	acl_myfree_fn acl_free_fn_glue

#ifdef  __cplusplus
}
#endif

#endif

