#pragma once #include "CoreTypes.h" NAMESPACE_REDCRAFT_BEGIN NAMESPACE_MODULE_BEGIN(Redcraft) NAMESPACE_MODULE_BEGIN(Utility) template requires (requires(T&& Container) { Container.GetData(); }) FORCEINLINE constexpr decltype(auto) GetData(T&& Container) { return Container.GetData(); } 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; } template requires (requires(T&& Container) { Container.data(); }) FORCEINLINE constexpr decltype(auto) GetData(T&& Container) { return Container.data(); } template FORCEINLINE constexpr decltype(auto) GetData(initializer_list Container) { return Container.begin(); } template requires (requires(T&& Container) { Container.Num(); }) FORCEINLINE constexpr decltype(auto) GetNum(T&& Container) { return Container.Num(); } 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; } template requires (requires(T&& Container) { Container.size(); }) FORCEINLINE constexpr decltype(auto) GetNum(T&& Container) { return Container.size(); } template FORCEINLINE constexpr decltype(auto) GetNum(initializer_list Container) { return Container.size(); } NAMESPACE_MODULE_END(Utility) NAMESPACE_MODULE_END(Redcraft) NAMESPACE_REDCRAFT_END