// 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_
