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:
parent
ea455629c2
commit
b21ff469ac
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user