60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								// Fill out your copyright notice in the Description page of Project Settings.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#pragma once
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#include <array>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#include "CoreMinimal.h"
							 | 
						|||
| 
								 | 
							
								#include "CSUnmanagedDataStore.generated.h"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								USTRUCT()
							 | 
						|||
| 
								 | 
							
								struct FUnmanagedDataStore
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    GENERATED_BODY()
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								private:
							 | 
						|||
| 
								 | 
							
								    static constexpr size_t SmallStorageSize = 56;
							 | 
						|||
| 
								 | 
							
								    using FSmallStorage = std::array<std::byte, SmallStorageSize>;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    struct FLargeStorageDeleter 
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        void operator()(void* Ptr) const
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            FMemory::Free(Ptr);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								public:
							 | 
						|||
| 
								 | 
							
								    FUnmanagedDataStore() = default;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    void CopyDataIn(const void* InData, const size_t Size)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        if (Size <= SmallStorageSize)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            Data.Emplace<FSmallStorage>();
							 | 
						|||
| 
								 | 
							
								            FMemory::Memcpy(Data.Get<FSmallStorage>().data(), InData, Size);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        else
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            Data.Emplace<TSharedPtr<void>>(FMemory::Malloc(Size), FLargeStorageDeleter());
							 | 
						|||
| 
								 | 
							
								            FMemory::Memcpy(Data.Get<TSharedPtr<void>>().Get(), InData, Size);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    void CopyDataOut(void* OutData, const size_t Size) const
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        if (Size <= SmallStorageSize)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            FMemory::Memcpy(OutData, Data.Get<FSmallStorage>().data(), Size);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        else
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            FMemory::Memcpy(OutData, Data.Get<TSharedPtr<void>>().Get(), Size);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								private:
							 | 
						|||
| 
								 | 
							
								    TVariant<FSmallStorage, TSharedPtr<void>> Data;
							 | 
						|||
| 
								 | 
							
								    
							 | 
						|||
| 
								 | 
							
								};
							 |