24 #ifndef COM_DAFER45_TBTK_SERIALIZABLE_VECTOR
25 #define COM_DAFER45_TBTK_SERIALIZABLE_VECTOR
32 #ifndef TBTK_DISABLE_NLOHMANN_JSON
33 # include "TBTK/json.hpp"
38 template<typename DataType, bool = std::is_base_of<Serializable, DataType>::value>
39 class SerializableVector :
public std::vector<DataType>, Serializable{
42 SerializableVector() : std::vector<DataType>(){};
46 const std::vector<DataType> &v
47 ) : std::vector<DataType>(v){};
51 SerializableVector(
const std::string &serialization, Mode mode);
54 std::string serialize(Mode mode)
const;
58 template<
typename DataType>
59 class SerializableVector<DataType, true> :
60 public std::vector<DataType>, Serializable
64 SerializableVector() : std::vector<DataType>(){};
68 const std::vector<DataType> &v
69 ) : std::vector<DataType>(v){};
73 SerializableVector(
const std::string &serialization, Mode mode);
76 std::string serialize(Mode mode)
const;
80 template<
typename DataType>
81 class SerializableVector<DataType, false> :
82 public std::vector<DataType>, Serializable
86 SerializableVector() : std::vector<DataType>(){};
90 const std::vector<DataType> &v
91 ) : std::vector<DataType>(v){};
95 SerializableVector(
const std::string &serialization, Mode mode);
98 std::string serialize(Mode mode)
const;
102 #ifndef TBTK_DISABLE_NLOHMANN_JSON
104 template<
typename DataType>
105 SerializableVector<DataType, false>::SerializableVector(
106 const std::string &serialization,
110 validate(serialization,
"SerializableVector", mode),
111 "SerializableVector::SerializableVector()",
112 "Unable to parse string as SerializableVector '" << serialization <<
"'.",
119 nlohmann::json j = nlohmann::json::parse(serialization);
120 nlohmann::json elements = j.at(
"elements");
122 nlohmann::json::iterator it = elements.begin();
126 std::vector<DataType>::push_back(
127 Serializable::deserialize<DataType>(*it, mode)
131 catch(nlohmann::json::exception &e){
133 "SerializableVector::SerializableVector()",
134 "Unable to parse string as SerializableVector"
135 <<
" '" << serialization <<
"'.",
143 "SerializableVector::SerializableVector()",
144 "Only SerializableVector::Mode::JSON is supported yet.",
150 template<
typename DataType>
151 SerializableVector<DataType, true>::SerializableVector(
152 const std::string &serialization,
156 validate(serialization,
"SerializableVector", mode),
157 "SerializableVector::SerializableVector()",
158 "Unable to parse string as SerializableVector '" << serialization <<
"'.",
165 nlohmann::json j = nlohmann::json::parse(serialization);
166 nlohmann::json elements = j.at(
"elements");
168 nlohmann::json::iterator it = elements.begin();
172 std::vector<DataType>::push_back(
177 catch(nlohmann::json::exception &e){
179 "SerializableVector::SerializableVector()",
180 "Unable to parse string as SerializableVector"
181 <<
" '" << serialization <<
"'.",
189 "SerializableVector::SerializableVector()",
190 "Only SerializableVector::Mode::JSON is supported yet.",
196 template<
typename DataType>
197 std::string SerializableVector<DataType, false>::serialize(Mode mode)
const{
202 j[
"id"] =
"SerializableVector";
203 j[
"elements"] = nlohmann::json::array();
204 for(
unsigned int n = 0; n < std::vector<DataType>::size(); n++){
205 j[
"elements"].push_back(
207 std::vector<DataType>::at(n),
217 "SerializableVector::serialize()",
218 "Only Serializable::Mode::JSON is supported yet.",
224 template<
typename DataType>
225 std::string SerializableVector<DataType, true>::serialize(Mode mode)
const{
230 j[
"id"] =
"SerializableVector";
231 j[
"elements"] = nlohmann::json::array();
232 for(
unsigned int n = 0; n < std::vector<DataType>::size(); n++){
233 j[
"elements"].push_back(
234 std::vector<DataType>::at(n).serialize(mode)
242 "SerializableVector::serialize()",
243 "Only Serializable::Mode::JSON is supported yet.",