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>
T Load(String const& assetName) {
if (assetName.empty()) return T();
auto Load(String const& assetName) {
if (assetName.empty()) {
return ReturnDefaultOrNull<T>();
}
auto obj2 = ReadAsset<T>(assetName);
@ -42,15 +44,16 @@ namespace xna {
protected:
template <typename T>
T ReadAsset(String const& assetName) {
auto ReadAsset(String const& assetName) {
auto input = OpenStream(assetName);
if (input->IsClosed())
return T();
return ReturnDefaultOrNull<T>();
auto contentReader = ContentReader::Create(this, input, assetName);
return contentReader->ReadAsset<T>();
auto asset = contentReader->ReadAsset<T>();
return asset;
}
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);
template <typename T>
T ReadAsset();
auto ReadAsset();
template <typename T>
T ReadObject();
auto ReadObject();
template <typename T>
T ReadObject(T existingInstance);
auto ReadObject(T existingInstance);
template <typename T>
T ReadObject(ContentTypeReader& typeReader);
auto ReadObject(ContentTypeReader& typeReader);
template <typename T>
T ReadObject(ContentTypeReader& typeReader, T existingInstance);
auto ReadObject(ContentTypeReader& typeReader, T existingInstance);
Vector2 ReadVector2();
Vector3 ReadVector3();
@ -49,13 +49,13 @@ namespace xna {
Int ReadHeader();
template <typename T>
T ReadObjectInternal(std::any& existingInstance, xna_error_nullarg);
auto ReadObjectInternal(std::any& existingInstance, xna_error_nullarg);
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>
T InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_nullarg);
auto InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_nullarg);
private:
ContentManager* _contentManager = nullptr;
@ -70,12 +70,12 @@ namespace xna {
};
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();
if (num == 0) {
return T();
ReturnDefaultOrNull<T>();
}
const auto index = num - 1;
@ -83,33 +83,16 @@ namespace xna {
if (index >= typeReaders.size()) {
xna_error_apply(err, XnaErrorCode::ARGUMENT_OUT_OF_RANGE);
return T();
ReturnDefaultOrNull<T>();
}
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);
}
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);
T objB;
@ -120,11 +103,11 @@ namespace xna {
return objB;
}
return T();
return ReturnDefaultOrNull<T>();
}
template<typename T>
inline T ContentReader::ReadAsset()
inline auto ContentReader::ReadAsset()
{
const auto sharedResourceCount = ReadHeader();
auto obj = ReadObject<T>();
@ -132,33 +115,33 @@ namespace xna {
}
template<typename T>
inline T ContentReader::ReadObject()
inline auto ContentReader::ReadObject()
{
auto a = std::any();
return ReadObjectInternal<T>(a);
}
template<typename T>
inline T ContentReader::ReadObject(T existingInstance)
inline auto ContentReader::ReadObject(T existingInstance)
{
return ReadObjectInternal<T>(std::any(existingInstance));
}
template<typename T>
inline T ContentReader::ReadObject(ContentTypeReader& typeReader)
inline auto ContentReader::ReadObject(ContentTypeReader& typeReader)
{
auto obj = std::any();
return ReadObjectInternal<T>(typeReader, obj);
}
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));
}
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
? InvokeReader<T>(typeReader, existingInstance, err)

View File

@ -24,10 +24,26 @@ namespace xna {
}
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;
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