#ifndef _DEMEMORY_H
#define _DEMEMORY_H
/*-------------------------------------------------------------------------
 * drawElements Base Portability Library
 * -------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Memory management.
 *//*--------------------------------------------------------------------*/

#include "deDefs.h"

#include <string.h>

DE_BEGIN_EXTERN_C

#define DE_NEW(TYPE) ((TYPE *)deMalloc(sizeof(TYPE)))
#define DE_DELETE(TYPE, PTR) deFree(PTR)

void *deMalloc(size_t numBytes);
void *deCalloc(size_t numBytes);
void *deRealloc(void *ptr, size_t numBytes);
void deFree(void *ptr);

void *deAlignedMalloc(size_t numBytes, size_t alignBytes);
void *deAlignedRealloc(void *ptr, size_t numBytes, size_t alignBytes);
void deAlignedFree(void *ptr);

char *deStrdup(const char *str);

/*--------------------------------------------------------------------*//*!
 * \brief Fill a block of memory with an 8-bit value.
 * \param ptr        Pointer to memory to free.
 * \param value        Value to fill with.
 * \param numBytes    Number of bytes to write.
 *//*--------------------------------------------------------------------*/
DE_INLINE void deMemset(void *ptr, int value, size_t numBytes)
{
    DE_ASSERT((value & 0xFF) == value);
    memset(ptr, value, numBytes);
}

DE_INLINE int deMemCmp(const void *a, const void *b, size_t numBytes)
{
    return memcmp(a, b, numBytes);
}

/*--------------------------------------------------------------------*//*!
 * \brief Copy bytes between buffers
 * \param dst        Destination buffer
 * \param src        Source buffer
 * \param numBytes    Number of bytes to copy
 * \return Destination buffer.
 *//*--------------------------------------------------------------------*/
DE_INLINE void *deMemcpy(void *dst, const void *src, size_t numBytes)
{
    return memcpy(dst, src, numBytes);
}

DE_INLINE void *deMemmove(void *dst, const void *src, size_t numBytes)
{
    return memmove(dst, src, numBytes);
}

void deMemory_selfTest(void);

DE_END_EXTERN_C

#endif /* _DEMEMORY_H */
