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