Skip to content

Commit cace3a3

Browse files
committed
xrGame: Refactor alife_registry_container's helper class
1 parent 038e76c commit cace3a3

File tree

1 file changed

+19
-58
lines changed

1 file changed

+19
-58
lines changed

src/xrGame/alife_registry_container.cpp

Lines changed: 19 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -12,74 +12,35 @@
1212
#include "alife_space.h"
1313
#include "Common/object_type_traits.h"
1414

15-
template <typename TContainer, typename TList>
16-
class RegistryHelper
17-
{
18-
private:
19-
ASSERT_TYPELIST(TList);
20-
using Head = typename TList::Head;
21-
using Tail = typename TList::Tail;
22-
23-
static const bool isSerializable = object_type_traits::is_base_and_derived<ISerializable, Head>::value;
24-
25-
template <bool serializable>
26-
static void LoadHead(TContainer* self, IReader& reader)
27-
{
28-
}
29-
30-
template <>
31-
static void LoadHead<true>(TContainer* self, IReader& reader)
32-
{
33-
self->Head::load(reader);
34-
}
15+
template <typename, typename>
16+
struct RegistryHelper;
3517

36-
template <bool serializable>
37-
static void SaveHead(TContainer* self, IWriter& writer)
38-
{
39-
}
40-
41-
template <>
42-
static void SaveHead<true>(TContainer* self, IWriter& writer)
43-
{
44-
self->Head::save(writer);
45-
}
46-
47-
static void LoadHead(TContainer* self, IReader& reader) { LoadHead<isSerializable>(self, reader); }
48-
static void SaveHead(TContainer* self, IWriter& writer) { SaveHead<isSerializable>(self, writer); }
49-
template <typename TListTail>
50-
static void Load(TContainer* self, IReader& reader)
51-
{
52-
RegistryHelper<TContainer, Tail>::Load(self, reader);
53-
}
18+
template <typename TContainer>
19+
struct RegistryHelper<TContainer, Loki::Typelist<>>
20+
{
21+
static void Save(TContainer*, IWriter&) {};
22+
static void Load(TContainer*, IReader&) {};
23+
};
5424

55-
template <>
56-
static void Load<Loki::EmptyType>(TContainer* self, IReader& reader)
57-
{
58-
}
25+
template <typename TContainer, typename T, typename... Ts>
26+
struct RegistryHelper<TContainer, Loki::Typelist<T, Ts...>>
27+
{
28+
static constexpr bool isSerializable = object_type_traits::is_base_and_derived<ISerializable, T>::value;
5929

60-
template <typename TListTail>
6130
static void Save(TContainer* self, IWriter& writer)
6231
{
63-
RegistryHelper<TContainer, Tail>::Save(self, writer);
64-
}
65-
66-
template <>
67-
static void Save<Loki::EmptyType>(TContainer* self, IWriter& writer)
68-
{
69-
}
32+
if constexpr (isSerializable)
33+
self->T::save(writer);
34+
RegistryHelper<TContainer, Loki::Typelist<Ts...>>::Save(self, writer);
35+
};
7036

71-
public:
7237
static void Load(TContainer* self, IReader& reader)
7338
{
74-
Load<Tail>(self, reader);
75-
LoadHead(self, reader);
39+
if constexpr (isSerializable)
40+
self->T::load(reader);
41+
RegistryHelper<TContainer, Loki::Typelist<Ts...>>::Load(self, reader);
7642
}
7743

78-
static void Save(TContainer* self, IWriter& writer)
79-
{
80-
Save<Tail>(self, writer);
81-
SaveHead(self, writer);
82-
}
8344
};
8445

8546
void CALifeRegistryContainer::load(IReader& file_stream)

0 commit comments

Comments
 (0)