Program Listing for File StackMemoryBuffer.h

Return to documentation for file (Source\Common\Inc\Memory\StackMemoryBuffer.h)

#pragma once

#include <cassert>

#include "MemoryBuffer.h"
#include "Types.h"
#include "Utils/Macros.h"

namespace Azura {
namespace Memory {

template <U32 Size>
class StackMemoryBuffer final : public MemoryBuffer {
 public:
  StackMemoryBuffer();
  ~StackMemoryBuffer() = default;

  // Disabled Copy Ctor
  StackMemoryBuffer(const StackMemoryBuffer& other) = delete;
  // Disabled Copy Assignment
  StackMemoryBuffer& operator=(const StackMemoryBuffer& other) = delete;

  StackMemoryBuffer(StackMemoryBuffer&& other) noexcept = default;
  StackMemoryBuffer& operator=(StackMemoryBuffer&& other) noexcept = default;

  void* Allocate(U32 size) override;
  void Deallocate(void* address) override;

 private:
  UPTR AllocateRaw(U32 size);
  U8 m_buffer[Size];
};

template <U32 Size>
StackMemoryBuffer<Size>::StackMemoryBuffer() : MemoryBuffer(Size, reinterpret_cast<AddressPtr>(m_buffer)), m_buffer{} {}

template <U32 Size>
void* StackMemoryBuffer<Size>::Allocate(U32 size) {
  const AddressPtr addr = AllocateRaw(size);

  // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
  return reinterpret_cast<void*>(addr);
}

template <U32 Size>
void StackMemoryBuffer<Size>::Deallocate(void* address) {
  UNUSED(address);
}

template <U32 Size>
UPTR StackMemoryBuffer<Size>::AllocateRaw(U32 size) {
  // Available < Size, Can't allocate
  if (m_size - (m_currentPosition - m_memoryBlock) < size) {
    return 0u;
  }

  const AddressPtr addr = m_currentPosition;
  m_currentPosition += size;

  return addr;
}
}  // namespace Memory
}  // namespace Azura