CASM  1.1.0
A Clusters Approach to Statistical Mechanics
json_io.hh
Go to the documentation of this file.
1 #ifndef CASM_support_container_json_io
2 #define CASM_support_container_json_io
3 
4 #include <set>
5 #include <unordered_set>
6 
10 #include "casm/global/eigen.hh"
11 
12 //#include "casm/container/LinearAlgebra.hh"
13 
14 namespace CASM {
15 
16 // --- Array<T> ------------------------------
17 
18 template <typename T, typename... Args>
19 jsonParser &to_json(const Array<T> &value, jsonParser &json, Args &&... args) {
20  json.put_array();
21  for (Index i = 0; i < value.size(); i++) json.push_back(value[i], args...);
22  return json;
23 }
24 
26 template <typename T, typename... Args>
27 void from_json(Array<T> &value, const jsonParser &json, Args &&... args) {
28  try {
29  value.resize(json.size());
30  for (int i = 0; i < json.size(); i++) from_json(value[i], json[i], args...);
31  } catch (...) {
33  throw;
34  }
35 }
36 
37 /*
38  // --- Matrix & Vector -----------------------
39 
41  template <typename T, Index N>
42  jsonParser &to_json(const Matrix<T, N> &value, jsonParser &json) {
43  json.put_array();
44  for(Index i = 0; i < value.num_rows(); i++) {
45  jsonParser json_row;
46  json_row.put_array();
47  for(Index j = 0; j < value.num_cols(); j++) {
48  json_row.push_back(value(i, j));
49  }
50  json.push_back(json_row);
51  }
52  return json;
53  }
54 
55  template <typename T, Index N>
56  void from_json(Matrix<T, N> &value, const jsonParser &json) {
57  for(Index i = 0; i < value.num_rows(); i++) {
58  for(Index j = 0; j < value.num_cols(); j++) {
59  from_json(value.at(i, j), json[i][j]);
60  }
61  }
62  }
63 
65  template <typename T, Index N>
66  jsonParser &to_json(const Vector<T, N> &value, jsonParser &json) {
67  json.put_array();
68  for(Index i = 0; i < value.size(); i++)
69  json.push_back(value[i]);
70  return json;
71  }
72 
73  template <typename T, Index N>
74  void from_json(Vector<T, N> &value, const jsonParser &json) {
75  for(Index i = 0; i < value.size(); i++)
76  from_json(value.at(i), json[i]);
77  }
78 
79 
80  // --- Permutation ---------------------------
81 
82  class Permutation;
83 
84  jsonParser &to_json(const Permutation &perm, jsonParser &json);
85 
86  template<>
87  Permutation from_json(const jsonParser &json);
88 
89  void from_json(Permutation &perm, const jsonParser &json);
90 */
91 
97 // --- std::map<K, V> --------------
98 
100 template <typename K, typename V>
101 jsonParser &to_json(const std::map<K, V> &map, jsonParser &json) {
102  json.put_array();
103  for (const auto &val : map) {
105  tmp.push_back(val.first);
106  tmp.push_back(val.second);
107  json.push_back(tmp);
108  }
109  return json;
110 }
111 
115 template <typename K, typename V>
116 void from_json(std::map<K, V> &map, const jsonParser &json) {
117  map.clear();
118  for (auto it = json.begin(); it != json.end(); ++it) {
119  const jsonParser &tmp = *it;
120  map.emplace(tmp[0].get<K>(), tmp[1].get<V>());
121  }
122 }
123 
124 // --- std::map<std::string, T> --------------
125 
127 template <typename T, typename... Args>
128 jsonParser &to_json(const std::map<std::string, T> &map, jsonParser &json,
129  Args &&... args) {
130  return json.put_obj(map.begin(), map.end(), std::forward<Args>(args)...);
131 }
132 
136 template <typename T, typename... Args>
137 void from_json(std::map<std::string, T> &map, const jsonParser &json,
138  Args &&... args) {
139  map.clear();
140  for (auto it = json.begin(); it != json.end(); ++it) {
141  from_json(map[it.name()], *it, std::forward<Args>(args)...);
142  }
143 }
144 
145 // --- std::vector<T> --------------
146 
148 template <typename T, typename... Args>
149 jsonParser &to_json(const std::vector<T> &vec, jsonParser &json,
150  Args &&... args) {
151  return json.put_array(vec.begin(), vec.end(), std::forward<Args>(args)...);
152 }
153 
157 template <typename T, typename... Args>
158 void from_json(std::vector<T> &vec, const jsonParser &json, Args &&... args) {
159  vec.clear();
160  vec.reserve(json.size());
161  for (auto it = json.begin(); it != json.end(); ++it) {
162  vec.push_back(
163  jsonConstructor<T>::from_json(*it, std::forward<Args>(args)...));
164  }
165 }
166 
177 template <typename T>
178 void from_json(std::vector<T> &vec, const jsonParser &json, const T &initial) {
179  vec.resize(json.size(), initial);
180  int i = 0;
181  for (auto it = json.begin(); it != json.end(); ++it, ++i) {
182  from_json(vec[i], *it);
183  }
184 }
185 
186 // --- std::array<T,std::size_t N> --------------
187 
189 template <typename T, std::size_t N>
190 jsonParser &to_json(const std::array<T, N> &arr, jsonParser &json) {
191  return json.put_array(arr.begin(), arr.end());
192 }
193 
197 template <typename T, std::size_t N>
198 void from_json(std::array<T, N> &arr, const jsonParser &json) {
199  if (json.size() != N) {
200  std::ostringstream ss;
201  ss << "Attempting to to initialize std::array of size " << N
202  << " from JSON array of size " << json.size() << ":\n " << json
203  << "\n\n";
204  throw std::range_error(ss.str());
205  }
206 
207  std::size_t i = 0;
208  for (auto it = json.begin(); it != json.end(); ++it, ++i) {
209  from_json(arr[i], *it);
210  }
211 }
212 
213 // --- std::set<T> --------------
214 
216 template <typename T, typename Compare>
217 jsonParser &to_json(const std::set<T, Compare> &set, jsonParser &json) {
218  return json.put_array(set.begin(), set.end());
219 }
220 
224 template <typename T, typename Compare, typename... Args>
225 void from_json(std::set<T, Compare> &set, const jsonParser &json,
226  Args &&... args) {
227  set.clear();
228  for (auto it = json.begin(); it != json.end(); ++it) {
229  set.insert(jsonConstructor<T>::from_json(*it, args...));
230  }
231 }
232 
233 // --- std::unordered_set<T> --------------
234 
236 template <typename T, typename Compare>
237 jsonParser &to_json(const std::unordered_set<T, Compare> &set,
238  jsonParser &json) {
239  return json.put_array(set.begin(), set.end());
240 }
241 
245 template <typename T, typename Compare, typename... Args>
246 void from_json(std::unordered_set<T, Compare> &set, const jsonParser &json,
247  Args &&... args) {
248  set.clear();
249  for (auto it = json.begin(); it != json.end(); ++it) {
250  set.insert(jsonConstructor<T>::from_json(*it, args...));
251  }
252 }
253 //}
254 //
255 // namespace Eigen {
256 
258 template <typename Derived>
259 CASM::jsonParser &to_json(const Eigen::MatrixBase<Derived> &value,
260  CASM::jsonParser &json) {
261  json.put_array();
262  for (int i = 0; i < value.rows(); i++) {
263  CASM::jsonParser json_row;
264  json_row.put_array();
265  for (int j = 0; j < value.cols(); j++) {
266  json_row.push_back(value(i, j));
267  }
268  json.push_back(json_row);
269  }
270  return json;
271 }
272 
274 template <typename Derived>
275 CASM::jsonParser &to_json(const Eigen::MatrixBase<Derived> &value,
277  json.put_array();
278  if (value.rows() == 1) {
279  for (int i = 0; i < value.cols(); ++i) {
280  json.push_back(value(0, i));
281  }
282  } else if (value.cols() == 1) {
283  for (int i = 0; i < value.rows(); ++i) {
284  json.push_back(value(i, 0));
285  }
286  } else {
287  throw std::runtime_error("Error in 'to_json': Not a vector");
288  }
289  return json;
290 }
291 
293 template <typename Derived>
294 CASM::jsonParser &to_json(const Eigen::MatrixBase<Derived> &value,
295  CASM::jsonParser &json,
297  if (value.rows() == 1) {
298  if (value.cols() == 1) {
299  json = value(1, 1);
300  } else {
301  to_json(value, json, jsonParser::as_array());
302  }
303  } else if (value.cols() == 1) {
304  to_json(value, json, jsonParser::as_array());
305  } else
306  to_json(value, json);
307 
308  return json;
309 }
310 
312 template <typename Derived>
313 CASM::jsonParser &to_json_array(const Eigen::MatrixBase<Derived> &value,
314  CASM::jsonParser &json) {
315  to_json(value, json, CASM::jsonParser::as_array());
316  return json;
317 }
318 
320 template <typename Derived>
321 CASM::jsonParser to_json_array(const Eigen::MatrixBase<Derived> &value) {
322  jsonParser json;
323  to_json(value, json, CASM::jsonParser::as_array());
324  return json;
325 }
326 
330 template <typename Derived>
331 void from_json(Eigen::MatrixBase<Derived> &value,
332  const CASM::jsonParser &json) {
333  if (json.is_number()) {
334  value.derived().resize(1, 1);
335  from_json(value(0, 0), json);
336  } else if (json.is_array() && !json[0].is_array()) {
337  value.derived().resize(json.size(), 1);
338  for (int i = 0; i < value.rows(); i++) {
339  from_json(value(i, 0), json[i]);
340  }
341  } else {
342  value.derived().resize(json.size(), json[0].size());
343  for (int i = 0; i < value.rows(); i++) {
344  for (int j = 0; j < value.cols(); j++) {
345  from_json(value(i, j), json[i][j]);
346  }
347  }
348  }
349 }
350 
352 } // namespace CASM
353 
354 #endif
Basic std::vector like container (deprecated)
Definition: Array.hh:45
Index size() const
Definition: Array.hh:131
iterator begin()
Returns const_iterator to beginning of JSON object or JSON array.
Definition: jsonParser.cc:497
iterator end()
Returns iterator to end of JSON object or JSON array.
Definition: jsonParser.cc:520
size_type size() const
Definition: jsonParser.cc:487
bool is_array() const
Check if array type.
Definition: jsonParser.cc:275
static jsonParser array()
Returns an empty json array.
Definition: jsonParser.hh:409
jsonParser & put_obj()
Puts new empty JSON object.
Definition: jsonParser.hh:354
jsonParser & put_array()
Puts new empty JSON array.
Definition: jsonParser.hh:362
bool is_number() const
Check if number type (including int)
Definition: jsonParser.cc:266
void resize(Index new_N)
Definition: Array.hh:390
CASM::jsonParser & to_json_array(const Eigen::MatrixBase< Derived > &value, CASM::jsonParser &json)
Write Eigen Matrix with 1 row or 1 column to JSON array.
Definition: json_io.hh:313
jsonParser & push_back(const T &value, Args &&... args)
Definition: jsonParser.hh:684
Main CASM namespace.
Definition: APICommand.hh:8
jsonParser & to_json(const ClexDescription &desc, jsonParser &json)
void from_json(ClexDescription &desc, const jsonParser &json)
INDEX_TYPE Index
For long integer indexing:
Definition: definitions.hh:39
ProjectSettings & set
Definition: settings.cc:137
Helper struct for constructing objects that need additional data.
Definition: jsonParser.hh:548