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:
parent
75d0b6e355
commit
1523a067c9
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user