#pragma once #include "CoreTypes.h" #include "Templates/TypeHash.h" #include "TypeTraits/Swappable.h" #include "Memory/ObserverPointer.h" NAMESPACE_REDCRAFT_BEGIN NAMESPACE_MODULE_BEGIN(Redcraft) NAMESPACE_MODULE_BEGIN(Utility) /** @return The pointer to the container element storage. */ template requires (requires(T&& Container) { { Container.GetData() } -> CTObserverPtr; }) FORCEINLINE constexpr decltype(auto) GetData(T&& Container) { return Container.GetData(); } /** Overloads the GetData algorithm for arrays. */ template FORCEINLINE constexpr TObserverPtr< T[]> GetData( T(& Container)[N]) { return TObserverPtr< T[]>(Container); } template FORCEINLINE constexpr TObserverPtr< T[]> GetData( T(&& Container)[N]) { return TObserverPtr< T[]>(Container); } template FORCEINLINE constexpr TObserverPtr GetData(const T(& Container)[N]) { return TObserverPtr(Container); } template FORCEINLINE constexpr TObserverPtr GetData(const T(&& Container)[N]) { return TObserverPtr(Container); } /** Overloads the GetData algorithm for initializer_list. */ template FORCEINLINE constexpr TObserverPtr GetData(initializer_list Container) { return TObserverPtr(Container.begin()); } /** @return The number of elements in the container. */ template requires (requires(T&& Container) { { Container.Num() } -> CConvertibleTo; }) FORCEINLINE constexpr decltype(auto) GetNum(T&& Container) { return Container.Num(); } /** Overloads the GetNum algorithm for arrays. */ template FORCEINLINE constexpr size_t GetNum( T(& Container)[N]) { return N; } template FORCEINLINE constexpr size_t GetNum( T(&& Container)[N]) { return N; } template FORCEINLINE constexpr size_t GetNum(const T(& Container)[N]) { return N; } template FORCEINLINE constexpr size_t GetNum(const T(&& Container)[N]) { return N; } /** Overloads the GetNum algorithm for initializer_list. */ template FORCEINLINE constexpr size_t GetNum(initializer_list Container) { return Container.size(); } /** Overloads the Swap algorithm for arrays. */ template requires (CSwappable>) FORCEINLINE constexpr void Swap(T(&A)[N], T(&B)[N]) { for (size_t Index = 0; Index < N; ++Index) { Swap(A[Index], B[Index]); } } /** Overloads the GetTypeHash algorithm for arrays. */ template requires (CHashable>) FORCEINLINE constexpr size_t GetTypeHash(T(&A)[N]) { size_t Result = 3516520171; for (size_t Index = 0; Index < N; ++Index) { Result = HashCombine(Result, GetTypeHash(A[Index])); } return Result; } NAMESPACE_MODULE_END(Utility) NAMESPACE_MODULE_END(Redcraft) NAMESPACE_REDCRAFT_END