QxSerializeQJson_std_tuple.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. /****************************************************************************
  2. **
  3. ** https://www.qxorm.com/
  4. ** Copyright (C) 2013 Lionel Marty (contact@qxorm.com)
  5. **
  6. ** This file is part of the QxOrm library
  7. **
  8. ** This software is provided 'as-is', without any express or implied
  9. ** warranty. In no event will the authors be held liable for any
  10. ** damages arising from the use of this software
  11. **
  12. ** Commercial Usage
  13. ** Licensees holding valid commercial QxOrm licenses may use this file in
  14. ** accordance with the commercial license agreement provided with the
  15. ** Software or, alternatively, in accordance with the terms contained in
  16. ** a written agreement between you and Lionel Marty
  17. **
  18. ** GNU General Public License Usage
  19. ** Alternatively, this file may be used under the terms of the GNU
  20. ** General Public License version 3.0 as published by the Free Software
  21. ** Foundation and appearing in the file 'license.gpl3.txt' included in the
  22. ** packaging of this file. Please review the following information to
  23. ** ensure the GNU General Public License version 3.0 requirements will be
  24. ** met : http://www.gnu.org/copyleft/gpl.html
  25. **
  26. ** If you are unsure which license is appropriate for your use, or
  27. ** if you have questions regarding the use of this file, please contact :
  28. ** contact@qxorm.com
  29. **
  30. ****************************************************************************/
  31. #ifndef _QX_NO_JSON
  32. #ifndef _QX_SERIALIZE_QJSON_STD_TUPLE_H_
  33. #define _QX_SERIALIZE_QJSON_STD_TUPLE_H_
  34. #ifdef _MSC_VER
  35. #pragma once
  36. #endif
  37. /*!
  38. * \file QxSerializeQJson_std_tuple.h
  39. * \author Lionel Marty
  40. * \ingroup QxSerialize
  41. * \brief Provide a Qt QJson serialization method (save/load) for type std::tuple<T0, T1, ..., T9> (C++11 compilation option _QX_CPP_11_TUPLE must be defined)
  42. */
  43. #include <QtCore/qjsonvalue.h>
  44. #include <QtCore/qjsonobject.h>
  45. #include <QtCore/qjsonarray.h>
  46. #include <QxConvert/QxConvert.h>
  47. #include <QxConvert/QxConvert_Impl.h>
  48. namespace qx {
  49. namespace cvt {
  50. namespace detail {
  51. template <typename T0, typename T1>
  52. struct QxConvert_ToJson< std::tuple<T0, T1> >
  53. {
  54. static inline QJsonValue toJson(const std::tuple<T0, T1> & t, const QString & format)
  55. {
  56. QJsonArray arr; QJsonValue val;
  57. val = qx::cvt::to_json(std::get<0>(t), format); arr.append(val);
  58. val = qx::cvt::to_json(std::get<1>(t), format); arr.append(val);
  59. return QJsonValue(arr);
  60. }
  61. };
  62. template <typename T0, typename T1, typename T2>
  63. struct QxConvert_ToJson< std::tuple<T0, T1, T2> >
  64. {
  65. static inline QJsonValue toJson(const std::tuple<T0, T1, T2> & t, const QString & format)
  66. {
  67. QJsonArray arr; QJsonValue val;
  68. val = qx::cvt::to_json(std::get<0>(t), format); arr.append(val);
  69. val = qx::cvt::to_json(std::get<1>(t), format); arr.append(val);
  70. val = qx::cvt::to_json(std::get<2>(t), format); arr.append(val);
  71. return QJsonValue(arr);
  72. }
  73. };
  74. template <typename T0, typename T1, typename T2, typename T3>
  75. struct QxConvert_ToJson< std::tuple<T0, T1, T2, T3> >
  76. {
  77. static inline QJsonValue toJson(const std::tuple<T0, T1, T2, T3> & t, const QString & format)
  78. {
  79. QJsonArray arr; QJsonValue val;
  80. val = qx::cvt::to_json(std::get<0>(t), format); arr.append(val);
  81. val = qx::cvt::to_json(std::get<1>(t), format); arr.append(val);
  82. val = qx::cvt::to_json(std::get<2>(t), format); arr.append(val);
  83. val = qx::cvt::to_json(std::get<3>(t), format); arr.append(val);
  84. return QJsonValue(arr);
  85. }
  86. };
  87. template <typename T0, typename T1, typename T2, typename T3, typename T4>
  88. struct QxConvert_ToJson< std::tuple<T0, T1, T2, T3, T4> >
  89. {
  90. static inline QJsonValue toJson(const std::tuple<T0, T1, T2, T3, T4> & t, const QString & format)
  91. {
  92. QJsonArray arr; QJsonValue val;
  93. val = qx::cvt::to_json(std::get<0>(t), format); arr.append(val);
  94. val = qx::cvt::to_json(std::get<1>(t), format); arr.append(val);
  95. val = qx::cvt::to_json(std::get<2>(t), format); arr.append(val);
  96. val = qx::cvt::to_json(std::get<3>(t), format); arr.append(val);
  97. val = qx::cvt::to_json(std::get<4>(t), format); arr.append(val);
  98. return QJsonValue(arr);
  99. }
  100. };
  101. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
  102. struct QxConvert_ToJson< std::tuple<T0, T1, T2, T3, T4, T5> >
  103. {
  104. static inline QJsonValue toJson(const std::tuple<T0, T1, T2, T3, T4, T5> & t, const QString & format)
  105. {
  106. QJsonArray arr; QJsonValue val;
  107. val = qx::cvt::to_json(std::get<0>(t), format); arr.append(val);
  108. val = qx::cvt::to_json(std::get<1>(t), format); arr.append(val);
  109. val = qx::cvt::to_json(std::get<2>(t), format); arr.append(val);
  110. val = qx::cvt::to_json(std::get<3>(t), format); arr.append(val);
  111. val = qx::cvt::to_json(std::get<4>(t), format); arr.append(val);
  112. val = qx::cvt::to_json(std::get<5>(t), format); arr.append(val);
  113. return QJsonValue(arr);
  114. }
  115. };
  116. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
  117. struct QxConvert_ToJson< std::tuple<T0, T1, T2, T3, T4, T5, T6> >
  118. {
  119. static inline QJsonValue toJson(const std::tuple<T0, T1, T2, T3, T4, T5, T6> & t, const QString & format)
  120. {
  121. QJsonArray arr; QJsonValue val;
  122. val = qx::cvt::to_json(std::get<0>(t), format); arr.append(val);
  123. val = qx::cvt::to_json(std::get<1>(t), format); arr.append(val);
  124. val = qx::cvt::to_json(std::get<2>(t), format); arr.append(val);
  125. val = qx::cvt::to_json(std::get<3>(t), format); arr.append(val);
  126. val = qx::cvt::to_json(std::get<4>(t), format); arr.append(val);
  127. val = qx::cvt::to_json(std::get<5>(t), format); arr.append(val);
  128. val = qx::cvt::to_json(std::get<6>(t), format); arr.append(val);
  129. return QJsonValue(arr);
  130. }
  131. };
  132. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
  133. struct QxConvert_ToJson< std::tuple<T0, T1, T2, T3, T4, T5, T6, T7> >
  134. {
  135. static inline QJsonValue toJson(const std::tuple<T0, T1, T2, T3, T4, T5, T6, T7> & t, const QString & format)
  136. {
  137. QJsonArray arr; QJsonValue val;
  138. val = qx::cvt::to_json(std::get<0>(t), format); arr.append(val);
  139. val = qx::cvt::to_json(std::get<1>(t), format); arr.append(val);
  140. val = qx::cvt::to_json(std::get<2>(t), format); arr.append(val);
  141. val = qx::cvt::to_json(std::get<3>(t), format); arr.append(val);
  142. val = qx::cvt::to_json(std::get<4>(t), format); arr.append(val);
  143. val = qx::cvt::to_json(std::get<5>(t), format); arr.append(val);
  144. val = qx::cvt::to_json(std::get<6>(t), format); arr.append(val);
  145. val = qx::cvt::to_json(std::get<7>(t), format); arr.append(val);
  146. return QJsonValue(arr);
  147. }
  148. };
  149. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
  150. struct QxConvert_ToJson< std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8> >
  151. {
  152. static inline QJsonValue toJson(const std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8> & t, const QString & format)
  153. {
  154. QJsonArray arr; QJsonValue val;
  155. val = qx::cvt::to_json(std::get<0>(t), format); arr.append(val);
  156. val = qx::cvt::to_json(std::get<1>(t), format); arr.append(val);
  157. val = qx::cvt::to_json(std::get<2>(t), format); arr.append(val);
  158. val = qx::cvt::to_json(std::get<3>(t), format); arr.append(val);
  159. val = qx::cvt::to_json(std::get<4>(t), format); arr.append(val);
  160. val = qx::cvt::to_json(std::get<5>(t), format); arr.append(val);
  161. val = qx::cvt::to_json(std::get<6>(t), format); arr.append(val);
  162. val = qx::cvt::to_json(std::get<7>(t), format); arr.append(val);
  163. val = qx::cvt::to_json(std::get<8>(t), format); arr.append(val);
  164. return QJsonValue(arr);
  165. }
  166. };
  167. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
  168. struct QxConvert_ToJson< std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >
  169. {
  170. static inline QJsonValue toJson(const std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> & t, const QString & format)
  171. {
  172. QJsonArray arr; QJsonValue val;
  173. val = qx::cvt::to_json(std::get<0>(t), format); arr.append(val);
  174. val = qx::cvt::to_json(std::get<1>(t), format); arr.append(val);
  175. val = qx::cvt::to_json(std::get<2>(t), format); arr.append(val);
  176. val = qx::cvt::to_json(std::get<3>(t), format); arr.append(val);
  177. val = qx::cvt::to_json(std::get<4>(t), format); arr.append(val);
  178. val = qx::cvt::to_json(std::get<5>(t), format); arr.append(val);
  179. val = qx::cvt::to_json(std::get<6>(t), format); arr.append(val);
  180. val = qx::cvt::to_json(std::get<7>(t), format); arr.append(val);
  181. val = qx::cvt::to_json(std::get<8>(t), format); arr.append(val);
  182. val = qx::cvt::to_json(std::get<9>(t), format); arr.append(val);
  183. return QJsonValue(arr);
  184. }
  185. };
  186. template <typename T0, typename T1>
  187. struct QxConvert_FromJson< std::tuple<T0, T1> >
  188. {
  189. static inline qx_bool fromJson(const QJsonValue & j, std::tuple<T0, T1> & t, const QString & format)
  190. {
  191. if (! j.isArray()) { return qx_bool(true); }
  192. QJsonArray arr = j.toArray();
  193. qx::cvt::from_json(arr.at(0), std::get<0>(t), format);
  194. qx::cvt::from_json(arr.at(1), std::get<1>(t), format);
  195. return qx_bool(true);
  196. }
  197. };
  198. template <typename T0, typename T1, typename T2>
  199. struct QxConvert_FromJson< std::tuple<T0, T1, T2> >
  200. {
  201. static inline qx_bool fromJson(const QJsonValue & j, std::tuple<T0, T1, T2> & t, const QString & format)
  202. {
  203. if (! j.isArray()) { return qx_bool(true); }
  204. QJsonArray arr = j.toArray();
  205. qx::cvt::from_json(arr.at(0), std::get<0>(t), format);
  206. qx::cvt::from_json(arr.at(1), std::get<1>(t), format);
  207. qx::cvt::from_json(arr.at(2), std::get<2>(t), format);
  208. return qx_bool(true);
  209. }
  210. };
  211. template <typename T0, typename T1, typename T2, typename T3>
  212. struct QxConvert_FromJson< std::tuple<T0, T1, T2, T3> >
  213. {
  214. static inline qx_bool fromJson(const QJsonValue & j, std::tuple<T0, T1, T2, T3> & t, const QString & format)
  215. {
  216. if (! j.isArray()) { return qx_bool(true); }
  217. QJsonArray arr = j.toArray();
  218. qx::cvt::from_json(arr.at(0), std::get<0>(t), format);
  219. qx::cvt::from_json(arr.at(1), std::get<1>(t), format);
  220. qx::cvt::from_json(arr.at(2), std::get<2>(t), format);
  221. qx::cvt::from_json(arr.at(3), std::get<3>(t), format);
  222. return qx_bool(true);
  223. }
  224. };
  225. template <typename T0, typename T1, typename T2, typename T3, typename T4>
  226. struct QxConvert_FromJson< std::tuple<T0, T1, T2, T3, T4> >
  227. {
  228. static inline qx_bool fromJson(const QJsonValue & j, std::tuple<T0, T1, T2, T3, T4> & t, const QString & format)
  229. {
  230. if (! j.isArray()) { return qx_bool(true); }
  231. QJsonArray arr = j.toArray();
  232. qx::cvt::from_json(arr.at(0), std::get<0>(t), format);
  233. qx::cvt::from_json(arr.at(1), std::get<1>(t), format);
  234. qx::cvt::from_json(arr.at(2), std::get<2>(t), format);
  235. qx::cvt::from_json(arr.at(3), std::get<3>(t), format);
  236. qx::cvt::from_json(arr.at(4), std::get<4>(t), format);
  237. return qx_bool(true);
  238. }
  239. };
  240. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
  241. struct QxConvert_FromJson< std::tuple<T0, T1, T2, T3, T4, T5> >
  242. {
  243. static inline qx_bool fromJson(const QJsonValue & j, std::tuple<T0, T1, T2, T3, T4, T5> & t, const QString & format)
  244. {
  245. if (! j.isArray()) { return qx_bool(true); }
  246. QJsonArray arr = j.toArray();
  247. qx::cvt::from_json(arr.at(0), std::get<0>(t), format);
  248. qx::cvt::from_json(arr.at(1), std::get<1>(t), format);
  249. qx::cvt::from_json(arr.at(2), std::get<2>(t), format);
  250. qx::cvt::from_json(arr.at(3), std::get<3>(t), format);
  251. qx::cvt::from_json(arr.at(4), std::get<4>(t), format);
  252. qx::cvt::from_json(arr.at(5), std::get<5>(t), format);
  253. return qx_bool(true);
  254. }
  255. };
  256. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
  257. struct QxConvert_FromJson< std::tuple<T0, T1, T2, T3, T4, T5, T6> >
  258. {
  259. static inline qx_bool fromJson(const QJsonValue & j, std::tuple<T0, T1, T2, T3, T4, T5, T6> & t, const QString & format)
  260. {
  261. if (! j.isArray()) { return qx_bool(true); }
  262. QJsonArray arr = j.toArray();
  263. qx::cvt::from_json(arr.at(0), std::get<0>(t), format);
  264. qx::cvt::from_json(arr.at(1), std::get<1>(t), format);
  265. qx::cvt::from_json(arr.at(2), std::get<2>(t), format);
  266. qx::cvt::from_json(arr.at(3), std::get<3>(t), format);
  267. qx::cvt::from_json(arr.at(4), std::get<4>(t), format);
  268. qx::cvt::from_json(arr.at(5), std::get<5>(t), format);
  269. qx::cvt::from_json(arr.at(6), std::get<6>(t), format);
  270. return qx_bool(true);
  271. }
  272. };
  273. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
  274. struct QxConvert_FromJson< std::tuple<T0, T1, T2, T3, T4, T5, T6, T7> >
  275. {
  276. static inline qx_bool fromJson(const QJsonValue & j, std::tuple<T0, T1, T2, T3, T4, T5, T6, T7> & t, const QString & format)
  277. {
  278. if (! j.isArray()) { return qx_bool(true); }
  279. QJsonArray arr = j.toArray();
  280. qx::cvt::from_json(arr.at(0), std::get<0>(t), format);
  281. qx::cvt::from_json(arr.at(1), std::get<1>(t), format);
  282. qx::cvt::from_json(arr.at(2), std::get<2>(t), format);
  283. qx::cvt::from_json(arr.at(3), std::get<3>(t), format);
  284. qx::cvt::from_json(arr.at(4), std::get<4>(t), format);
  285. qx::cvt::from_json(arr.at(5), std::get<5>(t), format);
  286. qx::cvt::from_json(arr.at(6), std::get<6>(t), format);
  287. qx::cvt::from_json(arr.at(7), std::get<7>(t), format);
  288. return qx_bool(true);
  289. }
  290. };
  291. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
  292. struct QxConvert_FromJson< std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8> >
  293. {
  294. static inline qx_bool fromJson(const QJsonValue & j, std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8> & t, const QString & format)
  295. {
  296. if (! j.isArray()) { return qx_bool(true); }
  297. QJsonArray arr = j.toArray();
  298. qx::cvt::from_json(arr.at(0), std::get<0>(t), format);
  299. qx::cvt::from_json(arr.at(1), std::get<1>(t), format);
  300. qx::cvt::from_json(arr.at(2), std::get<2>(t), format);
  301. qx::cvt::from_json(arr.at(3), std::get<3>(t), format);
  302. qx::cvt::from_json(arr.at(4), std::get<4>(t), format);
  303. qx::cvt::from_json(arr.at(5), std::get<5>(t), format);
  304. qx::cvt::from_json(arr.at(6), std::get<6>(t), format);
  305. qx::cvt::from_json(arr.at(7), std::get<7>(t), format);
  306. qx::cvt::from_json(arr.at(8), std::get<8>(t), format);
  307. return qx_bool(true);
  308. }
  309. };
  310. template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
  311. struct QxConvert_FromJson< std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >
  312. {
  313. static inline qx_bool fromJson(const QJsonValue & j, std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> & t, const QString & format)
  314. {
  315. if (! j.isArray()) { return qx_bool(true); }
  316. QJsonArray arr = j.toArray();
  317. qx::cvt::from_json(arr.at(0), std::get<0>(t), format);
  318. qx::cvt::from_json(arr.at(1), std::get<1>(t), format);
  319. qx::cvt::from_json(arr.at(2), std::get<2>(t), format);
  320. qx::cvt::from_json(arr.at(3), std::get<3>(t), format);
  321. qx::cvt::from_json(arr.at(4), std::get<4>(t), format);
  322. qx::cvt::from_json(arr.at(5), std::get<5>(t), format);
  323. qx::cvt::from_json(arr.at(6), std::get<6>(t), format);
  324. qx::cvt::from_json(arr.at(7), std::get<7>(t), format);
  325. qx::cvt::from_json(arr.at(8), std::get<8>(t), format);
  326. qx::cvt::from_json(arr.at(9), std::get<9>(t), format);
  327. return qx_bool(true);
  328. }
  329. };
  330. } // namespace detail
  331. } // namespace cvt
  332. } // namespace qx
  333. #endif // _QX_SERIALIZE_QJSON_STD_TUPLE_H_
  334. #endif // _QX_NO_JSON