#pragma once #include "Zone/ZoneTypes.h" #include #include template class Asset { public: static constexpr bool IS_ASSET = true; static constexpr auto EnumEntry = AssetTypeEnum; using Type = AssetType; }; template class SubAsset { public: static constexpr bool IS_ASSET = false; static constexpr auto EnumEntry = AssetTypeEnum; using Type = AssetType; }; template concept HasAssetEnumEntry = std::is_integral_v; template concept HasAssetType = std::is_class_v; template concept AssetOrSubAssetDefinition = HasAssetEnumEntry && HasAssetType; template concept AssetDefinition = AssetOrSubAssetDefinition && T::IS_ASSET; template concept SubAssetDefinition = AssetOrSubAssetDefinition && !T::IS_ASSET; template struct AssetNameAccessor { // static constexpr bool IS_SINGLETON = false; // using RETURN_TYPE = const char*&; // static RETURN_TYPE GetAssetName(assetType::Type& asset) // { // throw std::runtime_error("Not implemented"); // } }; #define DEFINE_ASSET_NAME_ACCESSOR(assetType, nameProperty) \ template<> struct AssetNameAccessor \ { \ public: \ static constexpr bool IS_SINGLETON = false; \ using RETURN_TYPE = const char*&; \ \ static RETURN_TYPE GetAssetName(assetType::Type& asset) \ { \ return asset.nameProperty; \ } \ } #define DEFINE_ASSET_NAME_ACCESSOR_SINGLETON(assetType, singletonName) \ template<> struct AssetNameAccessor \ { \ public: \ static constexpr bool IS_SINGLETON = true; \ using RETURN_TYPE = const char* const&; \ \ static RETURN_TYPE GetAssetName(assetType::Type& asset) \ { \ static const char* NAME = singletonName; \ return NAME; \ } \ } template AssetNameAccessor::RETURN_TYPE AssetName(typename Asset_t::Type& asset) { return AssetNameAccessor::GetAssetName(asset); }