// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_INCLUDE_FXCRT_FX_MEMORY_H_
#define CORE_INCLUDE_FXCRT_FX_MEMORY_H_

#include "fx_system.h"

#ifdef __cplusplus
extern "C" {
#endif
// For external C libraries to malloc through PDFium. These may return NULL.
void*	FXMEM_DefaultAlloc(size_t byte_size, int flags);
void*	FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags);
void	FXMEM_DefaultFree(void* pointer, int flags);
#ifdef __cplusplus
}  // extern "C"

#include <stdlib.h>
#include <limits>
#include <new>

NEVER_INLINE void FX_OutOfMemoryTerminate();

inline void* FX_SafeRealloc(void* ptr, size_t num_members, size_t member_size) {
    if (num_members < std::numeric_limits<size_t>::max() / member_size) {
        return realloc(ptr, num_members * member_size);
    }
    return nullptr;
}

inline void* FX_AllocOrDie(size_t num_members, size_t member_size) {
    // TODO(tsepez): See if we can avoid the implicit memset(0).
    if (void* result = calloc(num_members, member_size)) {
        return result;
    }
    FX_OutOfMemoryTerminate();  // Never returns.
    return nullptr;  // Suppress compiler warning.
}

inline void* FX_AllocOrDie2D(size_t w, size_t h, size_t member_size) {
    if (w < std::numeric_limits<size_t>::max() / h) {
        return FX_AllocOrDie(w * h, member_size);
    }
    FX_OutOfMemoryTerminate();  // Never returns.
    return nullptr;  // Suppress compiler warning.
}

inline void* FX_ReallocOrDie(void* ptr, size_t num_members, size_t member_size) {
    if (void* result = FX_SafeRealloc(ptr, num_members, member_size)) {
        return result;
    }
    FX_OutOfMemoryTerminate();  // Never returns.
    return nullptr;  // Suppress compiler warning.
}

// Never returns NULL.
#define FX_Alloc(type, size) (type*)FX_AllocOrDie(size, sizeof(type))
#define FX_Alloc2D(type, w, h) (type*)FX_AllocOrDie2D(w, h, sizeof(type))
#define FX_Realloc(type, ptr, size) \
    (type*)FX_ReallocOrDie(ptr, size, sizeof(type))

// May return NULL.
#define FX_TryAlloc(type, size) (type*)calloc(size, sizeof(type))
#define FX_TryRealloc(type, ptr, size) \
    (type*)FX_SafeRealloc(ptr, size, sizeof(type))

#define FX_Free(ptr) free(ptr)

class CFX_DestructObject
{
public:

    virtual ~CFX_DestructObject() {}
};
class CFX_GrowOnlyPool
{
public:

    CFX_GrowOnlyPool(size_t trunk_size = 16384);

    ~CFX_GrowOnlyPool();

    void	SetTrunkSize(size_t trunk_size)
    {
        m_TrunkSize = trunk_size;
    }

    void*	AllocDebug(size_t size, const FX_CHAR* file, int line)
    {
        return Alloc(size);
    }

    void*	Alloc(size_t size);

    void*	ReallocDebug(void* p, size_t new_size, const FX_CHAR* file, int line)
    {
        return NULL;
    }

    void*	Realloc(void* p, size_t new_size)
    {
        return NULL;
    }

    void	Free(void*) {}

    void	FreeAll();
private:

    size_t	m_TrunkSize;

    void*	m_pFirstTrunk;
};
#endif  // __cplusplus

#endif  // CORE_INCLUDE_FXCRT_FX_MEMORY_H_
