Split type traits for ESM4, ESM3 and unite common

depth-refraction
elsid 2 years ago
parent e1f580e7a0
commit 90ed24f4c9
No known key found for this signature in database
GPG Key ID: 4DE04C198CBA7625

@ -7,6 +7,7 @@
#include <type_traits> #include <type_traits>
#include <components/esm/esmcommon.hpp> #include <components/esm/esmcommon.hpp>
#include <components/esm/typetraits.hpp>
#include <components/esm4/reader.hpp> #include <components/esm4/reader.hpp>
#include <components/esm4/readerutils.hpp> #include <components/esm4/readerutils.hpp>
#include <components/esm4/records.hpp> #include <components/esm4/records.hpp>
@ -93,7 +94,7 @@ namespace EsmTool
std::cout << "\n Record: " << ESM::NAME(reader.hdr().record.typeId).toStringView(); std::cout << "\n Record: " << ESM::NAME(reader.hdr().record.typeId).toStringView();
if constexpr (ESM4::hasFormId<T>) if constexpr (ESM4::hasFormId<T>)
std::cout << "\n FormId: " << value.mFormId; std::cout << "\n FormId: " << value.mFormId;
if constexpr (ESM4::hasId<T>) if constexpr (ESM::hasId<T>)
std::cout << "\n Id: " << value.mId; std::cout << "\n Id: " << value.mId;
if constexpr (ESM4::hasFlags<T>) if constexpr (ESM4::hasFlags<T>)
std::cout << "\n Record flags: " << recordFlags(value.mFlags); std::cout << "\n Record flags: " << recordFlags(value.mFlags);
@ -103,7 +104,7 @@ namespace EsmTool
std::cout << "\n Parent: " << value.mParent; std::cout << "\n Parent: " << value.mParent;
if constexpr (ESM4::hasEditorId<T>) if constexpr (ESM4::hasEditorId<T>)
std::cout << "\n EditorId: " << value.mEditorId; std::cout << "\n EditorId: " << value.mEditorId;
if constexpr (ESM4::hasModel<T>) if constexpr (ESM::hasModel<T>)
std::cout << "\n Model: " << value.mModel; std::cout << "\n Model: " << value.mModel;
if constexpr (ESM4::hasNif<T>) if constexpr (ESM4::hasNif<T>)
std::cout << "\n Nif:" << WriteArray("\n - ", value.mNif); std::cout << "\n Nif:" << WriteArray("\n - ", value.mNif);

@ -11,8 +11,10 @@
#include <components/esm/defs.hpp> #include <components/esm/defs.hpp>
#include <components/esm/records.hpp> #include <components/esm/records.hpp>
#include <components/esm/typetraits.hpp>
#include <components/esm3/esmreader.hpp> #include <components/esm3/esmreader.hpp>
#include <components/esm3/esmwriter.hpp> #include <components/esm3/esmwriter.hpp>
#include <components/esm3/typetraits.hpp>
#include <components/esm4/common.hpp> #include <components/esm4/common.hpp>
#include <components/esm4/loadcell.hpp> #include <components/esm4/loadcell.hpp>
#include <components/esm4/loadligh.hpp> #include <components/esm4/loadligh.hpp>
@ -20,7 +22,6 @@
#include <components/esm4/loadstat.hpp> #include <components/esm4/loadstat.hpp>
#include <components/esm4/reader.hpp> #include <components/esm4/reader.hpp>
#include <components/esm4/readerutils.hpp> #include <components/esm4/readerutils.hpp>
#include <components/esm4/typetraits.hpp>
#include <components/files/configurationmanager.hpp> #include <components/files/configurationmanager.hpp>
#include <components/files/conversion.hpp> #include <components/files/conversion.hpp>
#include <components/loadinglistener/loadinglistener.hpp> #include <components/loadinglistener/loadinglistener.hpp>
@ -428,19 +429,6 @@ namespace
{ {
}; };
template <class T, class = std::void_t<>>
struct HasIndex : std::false_type
{
};
template <class T>
struct HasIndex<T, std::void_t<decltype(T::mIndex)>> : std::true_type
{
};
template <class T>
constexpr bool hasIndex = HasIndex<T>::value;
TYPED_TEST_SUITE_P(StoreSaveLoadTest); TYPED_TEST_SUITE_P(StoreSaveLoadTest);
TYPED_TEST_P(StoreSaveLoadTest, shouldNotChangeRefId) TYPED_TEST_P(StoreSaveLoadTest, shouldNotChangeRefId)
@ -449,7 +437,7 @@ namespace
const int index = 3; const int index = 3;
decltype(RecordType::mId) refId; decltype(RecordType::mId) refId;
if constexpr (hasIndex<RecordType> && !std::is_same_v<RecordType, ESM::LandTexture>) if constexpr (ESM::hasIndex<RecordType> && !std::is_same_v<RecordType, ESM::LandTexture>)
refId = RecordType::indexToRefId(index); refId = RecordType::indexToRefId(index);
else else
refId = ESM::StringRefId("foobar"); refId = ESM::StringRefId("foobar");
@ -465,7 +453,7 @@ namespace
record.mId = refId; record.mId = refId;
if constexpr (hasIndex<RecordType>) if constexpr (ESM::hasIndex<RecordType>)
record.mIndex = index; record.mIndex = index;
if constexpr (std::is_same_v<RecordType, ESM::Global>) if constexpr (std::is_same_v<RecordType, ESM::Global>)
@ -482,7 +470,7 @@ namespace
const RecordType* result = nullptr; const RecordType* result = nullptr;
if constexpr (std::is_same_v<RecordType, ESM::LandTexture>) if constexpr (std::is_same_v<RecordType, ESM::LandTexture>)
result = esmStore.get<RecordType>().search(index, 0); result = esmStore.get<RecordType>().search(index, 0);
else if constexpr (hasIndex<RecordType>) else if constexpr (ESM::hasIndex<RecordType>)
result = esmStore.get<RecordType>().search(index); result = esmStore.get<RecordType>().search(index);
else else
result = esmStore.get<RecordType>().search(refId); result = esmStore.get<RecordType>().search(refId);
@ -492,7 +480,7 @@ namespace
} }
} }
static_assert(hasIndex<ESM::MagicEffect>); static_assert(ESM::hasIndex<ESM::MagicEffect>);
template <class T, class = std::void_t<>> template <class T, class = std::void_t<>>
struct HasSaveFunction : std::false_type struct HasSaveFunction : std::false_type
@ -558,9 +546,9 @@ namespace
}; };
using RecordTypes = typename ToRecordTypes<MWWorld::ESMStore::StoreTuple>::Type; using RecordTypes = typename ToRecordTypes<MWWorld::ESMStore::StoreTuple>::Type;
using RecordTypesWithId = typename FilterTypes<ESM4::HasId, RecordTypes>::Type; using RecordTypesWithId = typename FilterTypes<ESM::HasId, RecordTypes>::Type;
using RecordTypesWithSave = typename FilterTypes<HasSaveFunction, RecordTypesWithId>::Type; using RecordTypesWithSave = typename FilterTypes<HasSaveFunction, RecordTypesWithId>::Type;
using RecordTypesWithModel = typename FilterTypes<ESM4::HasModel, RecordTypesWithSave>::Type; using RecordTypesWithModel = typename FilterTypes<ESM::HasModel, RecordTypesWithSave>::Type;
REGISTER_TYPED_TEST_SUITE_P(StoreSaveLoadTest, shouldNotChangeRefId); REGISTER_TYPED_TEST_SUITE_P(StoreSaveLoadTest, shouldNotChangeRefId);

@ -0,0 +1,35 @@
#ifndef OPENMW_COMPONENTS_ESM_TYPETRAITS
#define OPENMW_COMPONENTS_ESM_TYPETRAITS
#include <type_traits>
namespace ESM
{
template <class T, class = std::void_t<>>
struct HasId : std::false_type
{
};
template <class T>
struct HasId<T, std::void_t<decltype(T::mId)>> : std::true_type
{
};
template <class T>
inline constexpr bool hasId = HasId<T>::value;
template <class T, class = std::void_t<>>
struct HasModel : std::false_type
{
};
template <class T>
struct HasModel<T, std::void_t<decltype(T::mModel)>> : std::true_type
{
};
template <class T>
inline constexpr bool hasModel = HasModel<T>::value;
}
#endif // OPENMW_COMPONENTS_ESM_TYPETRAITS

@ -0,0 +1,22 @@
#ifndef OPENMW_COMPONENTS_ESM3_TYPETRAITS
#define OPENMW_COMPONENTS_ESM3_TYPETRAITS
#include <type_traits>
namespace ESM
{
template <class T, class = std::void_t<>>
struct HasIndex : std::false_type
{
};
template <class T>
struct HasIndex<T, std::void_t<decltype(T::mIndex)>> : std::true_type
{
};
template <class T>
inline constexpr bool hasIndex = HasIndex<T>::value;
}
#endif // OPENMW_COMPONENTS_ESM3_TYPETRAITS

@ -18,19 +18,6 @@ namespace ESM4
template <class T> template <class T>
inline constexpr bool hasFormId = HasFormId<T>::value; inline constexpr bool hasFormId = HasFormId<T>::value;
template <class T, class = std::void_t<>>
struct HasId : std::false_type
{
};
template <class T>
struct HasId<T, std::void_t<decltype(T::mId)>> : std::true_type
{
};
template <class T>
inline constexpr bool hasId = HasId<T>::value;
template <class T, class = std::void_t<>> template <class T, class = std::void_t<>>
struct HasParentFormId : std::false_type struct HasParentFormId : std::false_type
{ {
@ -83,19 +70,6 @@ namespace ESM4
template <class T> template <class T>
inline constexpr bool hasEditorId = HasEditorId<T>::value; inline constexpr bool hasEditorId = HasEditorId<T>::value;
template <class T, class = std::void_t<>>
struct HasModel : std::false_type
{
};
template <class T>
struct HasModel<T, std::void_t<decltype(T::mModel)>> : std::true_type
{
};
template <class T>
inline constexpr bool hasModel = HasModel<T>::value;
template <class T, class = std::void_t<>> template <class T, class = std::void_t<>>
struct HasNif : std::false_type struct HasNif : std::false_type
{ {

Loading…
Cancel
Save