11#pragma once
22
3- #include < Phobos.CRT.h>
43#include " Savegame.h"
54#include " Constructs.h"
65
76#include < algorithm>
8- #include < memory>
97#include < vector>
108
11- #include < ArrayClasses.h>
129#include < CCINIClass.h>
1310#include " Swizzle.h"
1411
1512template <typename T> class Enumerable
1613{
17- typedef std::vector<std::unique_ptr<T>> container_t ;
18-
1914public:
20- static container_t Array;
15+ inline static std::vector<T> Array;
2116
2217 static int FindIndex (const char * Title)
2318 {
24- auto result = std::find_if (Array.begin (), Array.end (), [Title](std::unique_ptr<T> & Item)
19+ auto result = std::find_if (Array.begin (), Array.end (), [Title](const T & Item)
2520 {
26- return !_strcmpi (Item-> Name , Title);
21+ return !_strcmpi (Item. Name , Title);
2722 });
2823
2924 if (result == Array.end ())
@@ -35,17 +30,17 @@ template <typename T> class Enumerable
3530 static T* Find (const char * Title)
3631 {
3732 auto result = FindIndex (Title);
38- return (result < 0 ) ? nullptr : Array[static_cast <size_t >(result)]. get () ;
33+ return (result < 0 ) ? nullptr : & Array[static_cast <size_t >(result)];
3934 }
4035
4136 static T* FindOrAllocate (const char * Title)
4237 {
43- if (T* find = Find (Title))
44- return find ;
45-
46- Array.push_back (std::make_unique<T>( Title) );
38+ if (T* found = Find (Title))
39+ return found ;
40+ static_assert (std::constructible_from<T, const char *>);
41+ Array.emplace_back ( Title);
4742
48- return Array.back (). get ();
43+ return & Array.back ();
4944 }
5045
5146 static void Clear ()
@@ -64,8 +59,8 @@ template <typename T> class Enumerable
6459 FindOrAllocate (Phobos::readBuffer);
6560 }
6661
67- for (const auto & item : Array)
68- item-> LoadFromINI (pINI);
62+ for (auto & item : Array)
63+ item. LoadFromINI (pINI);
6964 }
7065
7166 static bool LoadGlobals (PhobosStreamReader& Stm)
@@ -98,12 +93,12 @@ template <typename T> class Enumerable
9893 {
9994 Stm.Save (Array.size ());
10095
101- for (const auto & item : Array)
96+ for (auto & item : Array)
10297 {
10398 // write old pointer and name, then delegate
104- Stm.Save (item. get () );
105- Stm.Save (item-> Name );
106- item-> SaveToStream (Stm);
99+ Stm.Save (& item);
100+ Stm.Save (item. Name );
101+ item. SaveToStream (Stm);
107102 }
108103
109104 return true ;
@@ -124,6 +119,3 @@ template <typename T> class Enumerable
124119
125120 PhobosFixedString<32 > Name;
126121};
127-
128- template <typename T>
129- Enumerable<T>::container_t Enumerable<T>::Array;
0 commit comments