57 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
#pragma once
 | 
						|
 | 
						|
#if !defined(MIJIN_MEMORY_VIRTUAL_ALLOCATOR_HPP_INCLUDED)
 | 
						|
#define MIJIN_MEMORY_VIRTUAL_ALLOCATOR_HPP_INCLUDED 1
 | 
						|
 | 
						|
#include "../internal/common.hpp"
 | 
						|
#include "../util/annot.hpp"
 | 
						|
 | 
						|
namespace mijin
 | 
						|
{
 | 
						|
template<typename T>
 | 
						|
class VirtualAllocator
 | 
						|
{
 | 
						|
public:
 | 
						|
    virtual ~VirtualAllocator() noexcept = default;
 | 
						|
 | 
						|
    [[nodiscard]]
 | 
						|
    virtual owner_t<T*> allocate(std::size_t count) noexcept;
 | 
						|
    virtual void deallocate(owner_t<T*> ptr, std::size_t count) noexcept;
 | 
						|
};
 | 
						|
 | 
						|
template<typename T, typename TImpl>
 | 
						|
class WrappedVirtualAllocator : public VirtualAllocator<T>
 | 
						|
{
 | 
						|
private:
 | 
						|
    [[no_unique_address]] TImpl mImpl;
 | 
						|
public:
 | 
						|
    explicit constexpr WrappedVirtualAllocator(TImpl impl = {}) MIJIN_NOEXCEPT_IF(std::is_nothrow_move_constructible_v<TImpl>)
 | 
						|
            : mImpl(std::move(impl)) {}
 | 
						|
    constexpr WrappedVirtualAllocator(const WrappedVirtualAllocator&) = default;
 | 
						|
    constexpr WrappedVirtualAllocator(WrappedVirtualAllocator&&) = default;
 | 
						|
 | 
						|
    WrappedVirtualAllocator& operator=(const WrappedVirtualAllocator&) = default;
 | 
						|
    WrappedVirtualAllocator& operator=(WrappedVirtualAllocator&&) = default;
 | 
						|
 | 
						|
    [[nodiscard]]
 | 
						|
    owner_t<T*> allocate(std::size_t count) noexcept override
 | 
						|
    {
 | 
						|
        return mImpl.allocate(count);
 | 
						|
    }
 | 
						|
 | 
						|
    void deallocate(owner_t<T*> ptr, std::size_t count) noexcept override
 | 
						|
    {
 | 
						|
        mImpl.deallocate(ptr, count);
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
template<typename T>
 | 
						|
WrappedVirtualAllocator<typename T::value_type, T> makeVirtualAllocator(T allocator) MIJIN_NOEXCEPT_IF(std::is_nothrow_move_constructible_v<T>)
 | 
						|
{
 | 
						|
    return WrappedVirtualAllocator<typename T::value_type, T>(std::move(allocator));
 | 
						|
}
 | 
						|
} // namespace mijin
 | 
						|
 | 
						|
#endif // !defined(MIJIN_MEMORY_VIRTUAL_ALLOCATOR_HPP_INCLUDED)
 |