@ -4,25 +4,38 @@
# pragma once
# include "common/common_funcs.h"
# include <utility>
namespace Common {
void * AllocateMemoryPages ( std : : size_t size ) ;
void FreeMemoryPages ( void * base , std : : size_t size ) ;
void * AllocateMemoryPages ( std : : size_t size ) noexcept ;
void FreeMemoryPages ( void * base , std : : size_t size ) noexcept ;
template < typename T >
class VirtualBuffer final : NonCopyable {
class VirtualBuffer final {
public :
constexpr VirtualBuffer ( ) = default ;
explicit VirtualBuffer ( std : : size_t count ) : alloc_size { count * sizeof ( T ) } {
base_ptr = reinterpret_cast < T * > ( AllocateMemoryPages ( alloc_size ) ) ;
}
~ VirtualBuffer ( ) {
~ VirtualBuffer ( ) noexcept {
FreeMemoryPages ( base_ptr , alloc_size ) ;
}
VirtualBuffer ( const VirtualBuffer & ) = delete ;
VirtualBuffer & operator = ( const VirtualBuffer & ) = delete ;
VirtualBuffer ( VirtualBuffer & & other ) noexcept
: alloc_size { std : : exchange ( other . alloc_size , 0 ) } , base_ptr { std : : exchange ( other . base_ptr ) ,
nullptr } { }
VirtualBuffer & operator = ( VirtualBuffer & & other ) noexcept {
alloc_size = std : : exchange ( other . alloc_size , 0 ) ;
base_ptr = std : : exchange ( other . base_ptr , nullptr ) ;
return * this ;
}
void resize ( std : : size_t count ) {
FreeMemoryPages ( base_ptr , alloc_size ) ;