#pragma once #include "CoreTypes.h" #include "TypeTraits/Swappable.h" NAMESPACE_REDCRAFT_BEGIN NAMESPACE_MODULE_BEGIN(Redcraft) NAMESPACE_MODULE_BEGIN(Utility) /** @return The pointer or iterator to the container element storage. */ template requires (requires(T&& Container) { Container.GetData(); }) FORCEINLINE constexpr decltype(auto) GetData(T&& Container) { return Container.GetData(); } /** Overloads the GetData algorithm for arrays. */ template FORCEINLINE constexpr T* GetData( T(& Container)[N]) { return Container; } template FORCEINLINE constexpr T* GetData( T(&& Container)[N]) { return Container; } template FORCEINLINE constexpr const T* GetData(const T(& Container)[N]) { return Container; } template FORCEINLINE constexpr const T* GetData(const T(&& Container)[N]) { return Container; } /** Overloads the GetData algorithm for T::data(). */ template requires (requires(T&& Container) { Container.data(); }) FORCEINLINE constexpr decltype(auto) GetData(T&& Container) { return Container.data(); } /** Overloads the GetData algorithm for initializer_list. */ template FORCEINLINE constexpr decltype(auto) GetData(initializer_list Container) { return Container.begin(); } /** @return The number of elements in the container. */ template requires (requires(T&& Container) { Container.Num(); }) 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 T::size(). */ template requires (requires(T&& Container) { Container.size(); }) FORCEINLINE constexpr decltype(auto) GetNum(T&& Container) { return Container.size(); } /** Overloads the GetNum algorithm for initializer_list. */ template FORCEINLINE constexpr decltype(auto) 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]); } } NAMESPACE_MODULE_END(Utility) NAMESPACE_MODULE_END(Redcraft) NAMESPACE_REDCRAFT_END