1
+ /*
2
+ ** EPITECH PROJECT, 2018
3
+ ** NETiles
4
+ ** File description:
5
+ ** Tiles / LevelFactory.hpp
6
+ */
7
+
8
+ #pragma once
9
+
10
+ // //////////////////////////////////////////////////////////////////////////////
11
+
12
+ namespace Tiles {
13
+ namespace priv {}
14
+
15
+ class LevelFactory ;
16
+ }
17
+
18
+ // //////////////////////////////////////////////////////////////////////////////
19
+
20
+ #include < cstddef>
21
+ #include < iostream>
22
+ #include < vector>
23
+
24
+ #include " Tiles/ILevelReader.hpp"
25
+ #include " Tiles/ILevelWriter.hpp"
26
+ #include " Tiles/LevelReaderLVL2.hpp"
27
+
28
+ // //////////////////////////////////////////////////////////////////////////////
29
+
30
+ namespace Tiles
31
+ {
32
+
33
+ namespace priv
34
+ {
35
+ template <typename T>
36
+ ILevelReader *createReader () {
37
+ return new T ();
38
+ }
39
+
40
+ template <typename T>
41
+ ILevelWriter *createWriter () {
42
+ return new T ();
43
+ }
44
+ }
45
+
46
+ class LevelFactory
47
+ {
48
+ public:
49
+ template <typename T>
50
+ static void registerReader ()
51
+ {
52
+ unregisterReader<T>();
53
+
54
+ FactoryReader factory;
55
+ factory.check = &T::check;
56
+ factory.create = &priv::createReader<T>;
57
+
58
+ s_readers.push_back (factory);
59
+ }
60
+
61
+ template <typename T>
62
+ static void unregisterReader ()
63
+ {
64
+ for (ReaderFactoryArray::iterator it = s_readers.begin (); it != s_readers.end (); ) {
65
+ if (it->create == &priv::createReader<T>)
66
+ it = s_readers.erase (it);
67
+ else
68
+ ++it;
69
+ }
70
+ }
71
+
72
+ template <typename T>
73
+ static void registerWriter ()
74
+ {
75
+ unregisterWriter<T>();
76
+
77
+ FactoryWriter factory;
78
+ factory.check = &T::check;
79
+ factory.create = &priv::createWriter<T>;
80
+
81
+ s_writers.push_back (factory);
82
+ }
83
+
84
+ template <typename T>
85
+ static void unregisterWriter ()
86
+ {
87
+ for (WriterFactoryArray::iterator it = s_writers.begin (); it != s_writers.end (); ) {
88
+ if (it->create == &priv::createWriter<T>)
89
+ it = s_writers.erase (it);
90
+ else
91
+ ++it;
92
+ }
93
+ }
94
+
95
+
96
+ static ILevelReader *getReaderFromStream (std::ifstream &stream);
97
+ static ILevelWriter *getLastestWriter ();
98
+
99
+ private:
100
+ struct FactoryReader
101
+ {
102
+ bool (*check)(std::ifstream &stream);
103
+ ILevelReader *(*create)();
104
+ };
105
+ typedef std::vector<FactoryReader> ReaderFactoryArray;
106
+
107
+ struct FactoryWriter
108
+ {
109
+ bool (*check)();
110
+ ILevelWriter *(*create)();
111
+ };
112
+ typedef std::vector<FactoryWriter> WriterFactoryArray;
113
+
114
+ static ReaderFactoryArray s_readers;
115
+ static WriterFactoryArray s_writers;
116
+ };
117
+
118
+ }
0 commit comments