TBTK
SerializableVector.h
Go to the documentation of this file.
1 /* Copyright 2017 Kristofer Bj√∂rnson
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
23 #ifndef COM_DAFER45_TBTK_SERIALIZABLE_VECTOR
24 #define COM_DAFER45_TBTK_SERIALIZABLE_VECTOR
25 
26 #include "TBTK/Serializable.h"
27 
28 #include <string>
29 #include <vector>
30 
31 #include "TBTK/json.hpp"
32 
33 namespace TBTK{
34 
35 template<typename DataType, bool = std::is_base_of<Serializable, DataType>::value>
36 class SerializableVector : public std::vector<DataType>, Serializable{
37 public:
39  SerializableVector() : std::vector<DataType>(){};
40 
43  const std::vector<DataType> &v
44  ) : std::vector<DataType>(v){};
45 
48  SerializableVector(const std::string &serialization, Mode mode);
49 
51  std::string serialize(Mode mode) const;
52 private:
53 };
54 
55 template<typename DataType>
56 class SerializableVector<DataType, true> :
57  public std::vector<DataType>, Serializable
58 {
59 public:
61  SerializableVector() : std::vector<DataType>(){};
62 
65  const std::vector<DataType> &v
66  ) : std::vector<DataType>(v){};
67 
70  SerializableVector(const std::string &serialization, Mode mode);
71 
73  std::string serialize(Mode mode) const;
74 private:
75 };
76 
77 template<typename DataType>
78 class SerializableVector<DataType, false> :
79  public std::vector<DataType>, Serializable
80 {
81 public:
83  SerializableVector() : std::vector<DataType>(){};
84 
87  const std::vector<DataType> &v
88  ) : std::vector<DataType>(v){};
89 
92  SerializableVector(const std::string &serialization, Mode mode);
93 
95  std::string serialize(Mode mode) const;
96 private:
97 };
98 
99 template<typename DataType>
101  const std::string &serialization,
102  Mode mode
103 ){
104  TBTKAssert(
105  validate(serialization, "SerializableVector", mode),
106  "SerializableVector::SerializableVector()",
107  "Unable to parse string as SerializableVector '" << serialization << "'.",
108  ""
109  );
110 
111  switch(mode){
112  case Mode::JSON:
113  try{
114  nlohmann::json j = nlohmann::json::parse(serialization);
115  nlohmann::json elements = j.at("elements");
116  for(
117  nlohmann::json::iterator it = elements.begin();
118  it < elements.end();
119  ++it
120  ){
121  DataType value;
123  *it,
124  &value,
125  mode
126  );
127  std::vector<DataType>::push_back(value);
128  }
129  }
130  catch(nlohmann::json::exception e){
131  TBTKExit(
132  "SerializableVector::SerializableVector()",
133  "Unable to parse string as SerializableVector"
134  << " '" << serialization << "'.",
135  ""
136  );
137  }
138 
139  break;
140  default:
141  TBTKExit(
142  "SerializableVector::SerializableVector()",
143  "Only SerializableVector::Mode::JSON is supported yet.",
144  ""
145  );
146  }
147 }
148 
149 template<typename DataType>
151  const std::string &serialization,
152  Mode mode
153 ){
154  TBTKAssert(
155  validate(serialization, "SerializableVector", mode),
156  "SerializableVector::SerializableVector()",
157  "Unable to parse string as SerializableVector '" << serialization << "'.",
158  ""
159  );
160 
161  switch(mode){
162  case Mode::JSON:
163  try{
164  nlohmann::json j = nlohmann::json::parse(serialization);
165  nlohmann::json elements = j.at("elements");
166  for(
167  nlohmann::json::iterator it = elements.begin();
168  it < elements.end();
169  ++it
170  ){
171  std::vector<DataType>::push_back(
172  DataType(*it, mode)
173  );
174  }
175  }
176  catch(nlohmann::json::exception e){
177  TBTKExit(
178  "SerializableVector::SerializableVector()",
179  "Unable to parse string as SerializableVector"
180  << " '" << serialization << "'.",
181  ""
182  );
183  }
184 
185  break;
186  default:
187  TBTKExit(
188  "SerializableVector::SerializableVector()",
189  "Only SerializableVector::Mode::JSON is supported yet.",
190  ""
191  );
192  }
193 }
194 
195 template<typename DataType>
197  switch(mode){
198  case Mode::JSON:
199  {
200  nlohmann::json j;
201  j["id"] = "SerializableVector";
202  j["elements"] = nlohmann::json::array();
203  for(unsigned int n = 0; n < std::vector<DataType>::size(); n++){
204  j["elements"].push_back(
206  std::vector<DataType>::at(n),
207  mode
208  )
209  );
210  }
211 
212  return j.dump();
213  }
214  default:
215  TBTKExit(
216  "SerializableVector::serialize()",
217  "Only Serializable::Mode::JSON is supported yet.",
218  ""
219  );
220  }
221 }
222 
223 template<typename DataType>
225  switch(mode){
226  case Mode::JSON:
227  {
228  nlohmann::json j;
229  j["id"] = "SerializableVector";
230  j["elements"] = nlohmann::json::array();
231  for(unsigned int n = 0; n < std::vector<DataType>::size(); n++){
232  j["elements"].push_back(
233  std::vector<DataType>::at(n).serialize(mode)
234  );
235  }
236 
237  return j.dump();
238  }
239  default:
240  TBTKExit(
241  "SerializableVector::serialize()",
242  "Only Serializable::Mode::JSON is supported yet.",
243  ""
244  );
245  }
246 }
247 
248 }; //End of namespace TBTK
249 
250 #endif
SerializableVector(const std::vector< DataType > &v)
Definition: SerializableVector.h:64
SerializableVector()
Definition: SerializableVector.h:61
SerializableVector(const std::vector< DataType > &v)
Definition: SerializableVector.h:42
SerializableVector()
Definition: SerializableVector.h:39
Definition: Serializable.h:40
SerializableVector()
Definition: SerializableVector.h:83
Definition: ModelFactory.h:35
static void deserialize(const std::string &serialization, bool *b, Mode mode)
Definition: Serializable.h:171
Mode
Definition: Serializable.h:44
Definition: SerializableVector.h:36
static bool validate(const std::string &serialization, const std::string &id, Mode mode)
virtual std::string serialize(Mode mode) const =0
Abstract base class for serializable objects.
SerializableVector(const std::vector< DataType > &v)
Definition: SerializableVector.h:86
std::string serialize(Mode mode) const