1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-04-10 15:45:37 +00:00

Use concepts and aggregate initialization

This commit is contained in:
Evil Eye 2024-02-12 17:32:43 +01:00
parent 75d0b6e355
commit 1523a067c9

View File

@ -90,18 +90,17 @@ namespace ESM
constexpr std::uint32_t fakeRecordId = fourCC("FAKE"); constexpr std::uint32_t fakeRecordId = fourCC("FAKE");
template <class T, class = std::void_t<>> template <class T>
struct HasSave : std::false_type concept HasSave = requires(T v, ESMWriter& w)
{ {
v.save(w);
}; };
template <class T> template <class T>
struct HasSave<T, std::void_t<decltype(std::declval<T>().save(std::declval<ESMWriter&>()))>> : std::true_type concept NotHasSave = !HasSave<T>;
{
};
template <class T> template <HasSave T>
auto save(const T& record, ESMWriter& writer) -> std::enable_if_t<HasSave<std::decay_t<T>>::value> auto save(const T& record, ESMWriter& writer)
{ {
record.save(writer); record.save(writer);
} }
@ -111,8 +110,8 @@ namespace ESM
record.save(writer, true); record.save(writer, true);
} }
template <class T> template <NotHasSave T>
auto save(const T& record, ESMWriter& writer) -> std::enable_if_t<!HasSave<std::decay_t<T>>::value> auto save(const T& record, ESMWriter& writer)
{ {
writer.writeComposite(record); writer.writeComposite(record);
} }
@ -130,36 +129,29 @@ namespace ESM
return stream; return stream;
} }
template <class T, class = std::void_t<>> template <class T>
struct HasLoad : std::false_type concept HasLoad = requires(T v, ESMReader& r)
{ {
v.load(r);
}; };
template <class T> template <class T>
struct HasLoad<T, std::void_t<decltype(std::declval<T>().load(std::declval<ESMReader&>()))>> : std::true_type concept HasLoadWithDelete = requires(T v, ESMReader& r, bool& d)
{ {
v.load(r, d);
}; };
template <class T> template <class T>
auto load(ESMReader& reader, T& record) -> std::enable_if_t<HasLoad<std::decay_t<T>>::value> concept NotHasLoad = !HasLoad<T> && !HasLoadWithDelete<T>;
template <HasLoad T>
void load(ESMReader& reader, T& record)
{ {
record.load(reader); record.load(reader);
} }
template <class T, class = std::void_t<>> template <HasLoadWithDelete T>
struct HasLoadWithDelete : std::false_type void load(ESMReader& reader, T& record)
{
};
template <class T>
struct HasLoadWithDelete<T,
std::void_t<decltype(std::declval<T>().load(std::declval<ESMReader&>(), std::declval<bool&>()))>>
: std::true_type
{
};
template <class T>
auto load(ESMReader& reader, T& record) -> std::enable_if_t<HasLoadWithDelete<std::decay_t<T>>::value>
{ {
bool deleted = false; bool deleted = false;
record.load(reader, deleted); record.load(reader, deleted);
@ -171,8 +163,8 @@ namespace ESM
record.load(reader, deleted, true); record.load(reader, deleted, true);
} }
template <class T> template <NotHasLoad T>
auto load(ESMReader& reader, T& record) -> std::enable_if_t<!HasSave<std::decay_t<T>>::value> void load(ESMReader& reader, T& record)
{ {
reader.getComposite(record); reader.getComposite(record);
} }
@ -515,12 +507,13 @@ namespace ESM
TEST_P(Esm3SaveLoadRecordTest, aiDataShouldNotChange) TEST_P(Esm3SaveLoadRecordTest, aiDataShouldNotChange)
{ {
AIData record; AIData record = {
record.mHello = 1; .mHello = 1,
record.mFight = 2; .mFight = 2,
record.mFlee = 3; .mFlee = 3,
record.mAlarm = 4; .mAlarm = 4,
record.mServices = 5; .mServices = 5,
};
AIData result; AIData result;
saveAndLoadRecord(record, GetParam(), result); saveAndLoadRecord(record, GetParam(), result);