1
0
mirror of https://github.com/borgesdan/xn65 synced 2024-12-29 21:54:47 +01:00

Implementa retorno auto em Content

This commit is contained in:
Danilo 2024-06-01 20:33:35 -03:00
parent ea455629c2
commit b21ff469ac
3 changed files with 45 additions and 43 deletions

View File

@ -32,8 +32,10 @@ namespace xna {
} }
template <typename T> template <typename T>
T Load(String const& assetName) { auto Load(String const& assetName) {
if (assetName.empty()) return T(); if (assetName.empty()) {
return ReturnDefaultOrNull<T>();
}
auto obj2 = ReadAsset<T>(assetName); auto obj2 = ReadAsset<T>(assetName);
@ -42,15 +44,16 @@ namespace xna {
protected: protected:
template <typename T> template <typename T>
T ReadAsset(String const& assetName) { auto ReadAsset(String const& assetName) {
auto input = OpenStream(assetName); auto input = OpenStream(assetName);
if (input->IsClosed()) if (input->IsClosed())
return T(); return ReturnDefaultOrNull<T>();
auto contentReader = ContentReader::Create(this, input, assetName); auto contentReader = ContentReader::Create(this, input, assetName);
return contentReader->ReadAsset<T>(); auto asset = contentReader->ReadAsset<T>();
return asset;
} }
sptr<Stream> OpenStream(String const& assetName) { sptr<Stream> OpenStream(String const& assetName) {

View File

@ -15,19 +15,19 @@ namespace xna {
static sptr<ContentReader> Create(ContentManager* contentManager, sptr<Stream>& input, String const& assetName); static sptr<ContentReader> Create(ContentManager* contentManager, sptr<Stream>& input, String const& assetName);
template <typename T> template <typename T>
T ReadAsset(); auto ReadAsset();
template <typename T> template <typename T>
T ReadObject(); auto ReadObject();
template <typename T> template <typename T>
T ReadObject(T existingInstance); auto ReadObject(T existingInstance);
template <typename T> template <typename T>
T ReadObject(ContentTypeReader& typeReader); auto ReadObject(ContentTypeReader& typeReader);
template <typename T> template <typename T>
T ReadObject(ContentTypeReader& typeReader, T existingInstance); auto ReadObject(ContentTypeReader& typeReader, T existingInstance);
Vector2 ReadVector2(); Vector2 ReadVector2();
Vector3 ReadVector3(); Vector3 ReadVector3();
@ -49,13 +49,13 @@ namespace xna {
Int ReadHeader(); Int ReadHeader();
template <typename T> template <typename T>
T ReadObjectInternal(std::any& existingInstance, xna_error_nullarg); auto ReadObjectInternal(std::any& existingInstance, xna_error_nullarg);
template <typename T> template <typename T>
T ReadObjectInternal(ContentTypeReader& typeReader, std::any& existingInstance, xna_error_nullarg); auto ReadObjectInternal(ContentTypeReader& typeReader, std::any& existingInstance, xna_error_nullarg);
template <typename T> template <typename T>
T InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_nullarg); auto InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_nullarg);
private: private:
ContentManager* _contentManager = nullptr; ContentManager* _contentManager = nullptr;
@ -70,12 +70,12 @@ namespace xna {
}; };
template<typename T> template<typename T>
inline T ContentReader::ReadObjectInternal(std::any& existingInstance, xna_error_ptr_arg) inline auto ContentReader::ReadObjectInternal(std::any& existingInstance, xna_error_ptr_arg)
{ {
const auto num = Read7BitEncodedInt(); const auto num = Read7BitEncodedInt();
if (num == 0) { if (num == 0) {
return T(); ReturnDefaultOrNull<T>();
} }
const auto index = num - 1; const auto index = num - 1;
@ -83,33 +83,16 @@ namespace xna {
if (index >= typeReaders.size()) { if (index >= typeReaders.size()) {
xna_error_apply(err, XnaErrorCode::ARGUMENT_OUT_OF_RANGE); xna_error_apply(err, XnaErrorCode::ARGUMENT_OUT_OF_RANGE);
return T(); ReturnDefaultOrNull<T>();
} }
auto reader = typeReaders[index]; auto reader = typeReaders[index];
//Verificação necessária pois a depender da situação é encontrado um reader errado
/*auto typeT = typeof<T>();
auto typeThash = typeT->GetHashCode();
auto readerType = reader->TargetType();
if (readerType->GetHashCode() != typeThash) {
for (auto const& item : typeReaders) {
if (item->TargetType()->GetHashCode() == typeThash) {
reader = item;
break;
}
}
if(reader->TargetType()->GetHashCode() != typeThash)
throw std::runtime_error("ContentReader::ReadObjectInternal: wrong reader!");
} */
return InvokeReader<T>(*reader, existingInstance, err); return InvokeReader<T>(*reader, existingInstance, err);
} }
template<typename T> template<typename T>
inline T ContentReader::InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_ptr_arg) inline auto ContentReader::InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_ptr_arg)
{ {
auto contentTypeReader = reinterpret_cast<ContentTypeReaderT<T>*>(&reader); auto contentTypeReader = reinterpret_cast<ContentTypeReaderT<T>*>(&reader);
T objB; T objB;
@ -120,11 +103,11 @@ namespace xna {
return objB; return objB;
} }
return T(); return ReturnDefaultOrNull<T>();
} }
template<typename T> template<typename T>
inline T ContentReader::ReadAsset() inline auto ContentReader::ReadAsset()
{ {
const auto sharedResourceCount = ReadHeader(); const auto sharedResourceCount = ReadHeader();
auto obj = ReadObject<T>(); auto obj = ReadObject<T>();
@ -132,33 +115,33 @@ namespace xna {
} }
template<typename T> template<typename T>
inline T ContentReader::ReadObject() inline auto ContentReader::ReadObject()
{ {
auto a = std::any(); auto a = std::any();
return ReadObjectInternal<T>(a); return ReadObjectInternal<T>(a);
} }
template<typename T> template<typename T>
inline T ContentReader::ReadObject(T existingInstance) inline auto ContentReader::ReadObject(T existingInstance)
{ {
return ReadObjectInternal<T>(std::any(existingInstance)); return ReadObjectInternal<T>(std::any(existingInstance));
} }
template<typename T> template<typename T>
inline T ContentReader::ReadObject(ContentTypeReader& typeReader) inline auto ContentReader::ReadObject(ContentTypeReader& typeReader)
{ {
auto obj = std::any(); auto obj = std::any();
return ReadObjectInternal<T>(typeReader, obj); return ReadObjectInternal<T>(typeReader, obj);
} }
template<typename T> template<typename T>
inline T ContentReader::ReadObject(ContentTypeReader& typeReader, T existingInstance) inline auto ContentReader::ReadObject(ContentTypeReader& typeReader, T existingInstance)
{ {
return ReadObjectInternal<T>(typeReader, std::any(existingInstance)); return ReadObjectInternal<T>(typeReader, std::any(existingInstance));
} }
template<typename T> template<typename T>
inline T ContentReader::ReadObjectInternal(ContentTypeReader& typeReader, std::any& existingInstance, xna_error_ptr_arg) inline auto ContentReader::ReadObjectInternal(ContentTypeReader& typeReader, std::any& existingInstance, xna_error_ptr_arg)
{ {
return typeReader.TargetIsValueType return typeReader.TargetIsValueType
? InvokeReader<T>(typeReader, existingInstance, err) ? InvokeReader<T>(typeReader, existingInstance, err)

View File

@ -24,10 +24,26 @@ namespace xna {
} }
template <class T> template <class T>
static constexpr void XnaHHashCombine(std::size_t& seed, const T& v) { constexpr void XnaHHashCombine(std::size_t& seed, const T& v) {
std::hash<T> hasher; std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
} }
template<typename T> struct is_shared_ptr : std::false_type {};
template<typename T> struct is_shared_ptr<std::shared_ptr<T>> : std::true_type {};
template<typename T>
inline auto ReturnDefaultOrNull() {
if constexpr (is_shared_ptr<T>::value)
return (T)nullptr;
else
return T();
}
/*template<typename T>
inline auto ReturnAuto(T& value) {
return value;
}*/
} }
#endif #endif