#pragma once#ifndef GAME_LIBRARIES_EXTERNALDEPENDENCIES_ASSET_IASSET_IASSETDATA_H_#define GAME_LIBRARIES_EXTERNALDEPENDENCIES_ASSET_IASSET_IASSETDATA_H_#include<memory>#include<string>#include<string_view>#include"Thread/SimpleThreadManager/SimpleUniqueThread.h"/**************************************************** Interface for assets that support async loading* using threads***************************************************/template<classAssetClass>classIAssetData{public:usingAssetClassT=typenameAssetClass;IAssetData(std::string_viewpath):m_isLoaded(false),m_isFirstTimeLoaded(false),m_isLoadedOnlyOnce(false),m_filePath(path),m_upAssetData(std::make_unique<AssetClass>()){}virtual~IAssetData(){Release();}virtualboolLoad()=0;virtualvoidAsyncLoad(boolforce=false)final{if(!m_thread.IsEnd())return;if((!m_thread.IsExists()&&!m_isFirstTimeLoaded)||force){m_thread.CreateAutoEnd(&IAssetData::Load,this);}}virtualboolIsLoaded()constnoexceptfinal{returnm_thread.IsExists()?m_thread.IsEnd():m_isLoaded;}virtualboolIsLoadSuccessed()constnoexceptfinal{returnm_isLoadSuccessed;}virtualboolIsLoadedOnlyOnce()noexceptfinal{if(IsLoaded()&&!m_isLoadedOnlyOnce){m_isLoadedOnlyOnce=true;returntrue;}returnfalse;}virtualvoidLoadedOnlyOnceReset()noexceptfinal{m_isLoadedOnlyOnce=false;}virtualconststd::string&GetFilePath()constnoexceptfinal{returnm_filePath;}constauto&GetData()constnoexcept{returnm_upAssetData;}protected:template<classFunc>boolLoadProcess(Func&&func){m_isLoaded=false;m_isFirstTimeLoaded=true;m_isLoadSuccessed=func();m_isLoaded=true;returnm_isLoadSuccessed;}voidRelease(){if(m_thread.IsExists()){while(true){if(m_thread.IsEnd())break;}}}SimpleUniqueThreadm_thread;boolm_isLoaded=false;boolm_isLoadSuccessed=false;boolm_isFirstTimeLoaded=false;boolm_isLoadedOnlyOnce=false;conststd::stringm_filePath;conststd::unique_ptr<AssetClass>m_upAssetData=nullptr;};#endif