mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2026-06-06 16:52:35 +00:00
refactor: introduce subasset loading
This commit is contained in:
+28
-12
@@ -5,20 +5,39 @@
|
||||
#include <stdexcept>
|
||||
#include <type_traits>
|
||||
|
||||
struct IAssetBase
|
||||
{
|
||||
};
|
||||
|
||||
template<asset_type_t AssetTypeEnum, typename AssetType> class Asset : IAssetBase
|
||||
template<asset_type_t AssetTypeEnum, class AssetType> class Asset
|
||||
{
|
||||
public:
|
||||
static constexpr bool IS_ASSET = true;
|
||||
static constexpr auto EnumEntry = AssetTypeEnum;
|
||||
using Type = AssetType;
|
||||
};
|
||||
|
||||
template<typename AssetType> struct AssetNameAccessor
|
||||
template<asset_type_t AssetTypeEnum, class AssetType> class SubAsset
|
||||
{
|
||||
public:
|
||||
static constexpr bool IS_ASSET = false;
|
||||
static constexpr auto EnumEntry = AssetTypeEnum;
|
||||
using Type = AssetType;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
concept HasAssetEnumEntry = std::is_integral_v<decltype(T::EnumEntry)>;
|
||||
|
||||
template<typename T>
|
||||
concept HasAssetType = std::is_class_v<typename T::Type>;
|
||||
|
||||
template<typename T>
|
||||
concept AssetOrSubAssetDefinition = HasAssetEnumEntry<T> && HasAssetType<T>;
|
||||
|
||||
template<typename T>
|
||||
concept AssetDefinition = AssetOrSubAssetDefinition<T> && T::IS_ASSET;
|
||||
|
||||
template<typename T>
|
||||
concept SubAssetDefinition = AssetOrSubAssetDefinition<T> && !T::IS_ASSET;
|
||||
|
||||
template<AssetOrSubAssetDefinition> struct AssetNameAccessor
|
||||
{
|
||||
static_assert(std::is_base_of_v<IAssetBase, AssetType>);
|
||||
// static constexpr bool IS_SINGLETON = false;
|
||||
// using RETURN_TYPE = const char*&;
|
||||
|
||||
@@ -32,7 +51,6 @@ template<typename AssetType> struct AssetNameAccessor
|
||||
template<> struct AssetNameAccessor<assetType> \
|
||||
{ \
|
||||
public: \
|
||||
static_assert(std::is_base_of_v<IAssetBase, assetType>); \
|
||||
static constexpr bool IS_SINGLETON = false; \
|
||||
using RETURN_TYPE = const char*&; \
|
||||
\
|
||||
@@ -46,7 +64,6 @@ template<typename AssetType> struct AssetNameAccessor
|
||||
template<> struct AssetNameAccessor<assetType> \
|
||||
{ \
|
||||
public: \
|
||||
static_assert(std::is_base_of_v<IAssetBase, assetType>); \
|
||||
static constexpr bool IS_SINGLETON = true; \
|
||||
using RETURN_TYPE = const char* const&; \
|
||||
\
|
||||
@@ -57,8 +74,7 @@ template<typename AssetType> struct AssetNameAccessor
|
||||
} \
|
||||
}
|
||||
|
||||
template<typename AssetType> AssetNameAccessor<AssetType>::RETURN_TYPE AssetName(typename AssetType::Type& asset)
|
||||
template<AssetDefinition Asset_t> AssetNameAccessor<Asset_t>::RETURN_TYPE AssetName(typename Asset_t::Type& asset)
|
||||
{
|
||||
static_assert(std::is_base_of_v<IAssetBase, AssetType>);
|
||||
return AssetNameAccessor<AssetType>::GetAssetName(asset);
|
||||
return AssetNameAccessor<Asset_t>::GetAssetName(asset);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user