#pragma once

#include <Core/Common/CoreTypes.h>
#include <Graphics/D3D12/D3D12Buffer.h>
#include <Juliet.h>

namespace Juliet
{
    namespace Memory
    {
        Byte* OS_Reserve(size_t size);
        bool  OS_Commit(Byte* ptr, size_t size);
        void  OS_Release(Byte* ptr, size_t size);

        template <typename Type>
        Type* OS_Reserve(size_t size)
        {
            return reinterpret_cast<Type*>(OS_Reserve(size));
        }

        template <typename Type>
        bool OS_Commit(Type* ptr, size_t size)
        {
            return OS_Commit(reinterpret_cast<Byte*>(ptr), size);
        }

        template <typename Type>
        void OS_Release(Type* ptr, size_t size)
        {
            OS_Release(reinterpret_cast<Byte*>(ptr), size);
        }

    } // namespace Memory

    namespace Debug
    {
        JULIET_API bool IsDebuggerPresent();
    } // namespace Debug

    using EntryPointFunc = int (*)(int, wchar_t**);
    JULIET_API int Bootstrap(EntryPointFunc entryPointFunc, int argc, wchar_t** argv);
} // namespace Juliet
