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;
 | |
|     
 | |
| };
 |