Memory.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. JPH_NAMESPACE_BEGIN
  6. #ifndef JPH_DISABLE_CUSTOM_ALLOCATOR
  7. // Normal memory allocation, must be at least 8 byte aligned on 32 bit platform and 16 byte aligned on 64 bit platform
  8. using AllocateFunction = void *(*)(size_t inSize);
  9. using ReallocateFunction = void *(*)(void *inBlock, size_t inOldSize, size_t inNewSize);
  10. using FreeFunction = void (*)(void *inBlock);
  11. // Aligned memory allocation
  12. using AlignedAllocateFunction = void *(*)(size_t inSize, size_t inAlignment);
  13. using AlignedFreeFunction = void (*)(void *inBlock);
  14. // User defined allocation / free functions
  15. JPH_EXPORT extern AllocateFunction Allocate;
  16. JPH_EXPORT extern ReallocateFunction Reallocate;
  17. JPH_EXPORT extern FreeFunction Free;
  18. JPH_EXPORT extern AlignedAllocateFunction AlignedAllocate;
  19. JPH_EXPORT extern AlignedFreeFunction AlignedFree;
  20. /// Register platform default allocation / free functions
  21. JPH_EXPORT void RegisterDefaultAllocator();
  22. /// Macro to override the new and delete functions
  23. #define JPH_OVERRIDE_NEW_DELETE \
  24. JPH_INLINE void *operator new (size_t inCount) { return JPH::Allocate(inCount); } \
  25. JPH_INLINE void operator delete (void *inPointer) noexcept { JPH::Free(inPointer); } \
  26. JPH_INLINE void *operator new[] (size_t inCount) { return JPH::Allocate(inCount); } \
  27. JPH_INLINE void operator delete[] (void *inPointer) noexcept { JPH::Free(inPointer); } \
  28. JPH_INLINE void *operator new (size_t inCount, std::align_val_t inAlignment) { return JPH::AlignedAllocate(inCount, static_cast<size_t>(inAlignment)); } \
  29. JPH_INLINE void operator delete (void *inPointer, [[maybe_unused]] std::align_val_t inAlignment) noexcept { JPH::AlignedFree(inPointer); } \
  30. JPH_INLINE void *operator new[] (size_t inCount, std::align_val_t inAlignment) { return JPH::AlignedAllocate(inCount, static_cast<size_t>(inAlignment)); } \
  31. JPH_INLINE void operator delete[] (void *inPointer, [[maybe_unused]] std::align_val_t inAlignment) noexcept { JPH::AlignedFree(inPointer); } \
  32. JPH_INLINE void *operator new ([[maybe_unused]] size_t inCount, void *inPointer) noexcept { return inPointer; } \
  33. JPH_INLINE void operator delete ([[maybe_unused]] void *inPointer, [[maybe_unused]] void *inPlace) noexcept { /* Do nothing */ } \
  34. JPH_INLINE void *operator new[] ([[maybe_unused]] size_t inCount, void *inPointer) noexcept { return inPointer; } \
  35. JPH_INLINE void operator delete[] ([[maybe_unused]] void *inPointer, [[maybe_unused]] void *inPlace) noexcept { /* Do nothing */ }
  36. #else
  37. // Directly define the allocation functions
  38. JPH_EXPORT void *Allocate(size_t inSize);
  39. JPH_EXPORT void *Reallocate(void *inBlock, size_t inOldSize, size_t inNewSize);
  40. JPH_EXPORT void Free(void *inBlock);
  41. JPH_EXPORT void *AlignedAllocate(size_t inSize, size_t inAlignment);
  42. JPH_EXPORT void AlignedFree(void *inBlock);
  43. // Don't implement allocator registering
  44. inline void RegisterDefaultAllocator() { }
  45. // Don't override new/delete
  46. #define JPH_OVERRIDE_NEW_DELETE
  47. #endif // !JPH_DISABLE_CUSTOM_ALLOCATOR
  48. JPH_NAMESPACE_END