Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

493 lines
17KB

  1. /// @ref gtx_string_cast
  2. /// @file glm/gtx/string_cast.inl
  3. #include <cstdarg>
  4. #include <cstdio>
  5. namespace glm{
  6. namespace detail
  7. {
  8. template <typename T>
  9. struct cast
  10. {
  11. typedef T value_type;
  12. };
  13. template <>
  14. struct cast<float>
  15. {
  16. typedef double value_type;
  17. };
  18. GLM_FUNC_QUALIFIER std::string format(const char* msg, ...)
  19. {
  20. std::size_t const STRING_BUFFER(4096);
  21. char text[STRING_BUFFER];
  22. va_list list;
  23. if(msg == GLM_NULLPTR)
  24. return std::string();
  25. va_start(list, msg);
  26. # if(GLM_COMPILER & GLM_COMPILER_VC)
  27. vsprintf_s(text, STRING_BUFFER, msg, list);
  28. # else//
  29. vsprintf(text, msg, list);
  30. # endif//
  31. va_end(list);
  32. return std::string(text);
  33. }
  34. static const char* LabelTrue = "true";
  35. static const char* LabelFalse = "false";
  36. template<typename T, bool isFloat = false>
  37. struct literal
  38. {
  39. GLM_FUNC_QUALIFIER static char const * value() {return "%d";}
  40. };
  41. template<typename T>
  42. struct literal<T, true>
  43. {
  44. GLM_FUNC_QUALIFIER static char const * value() {return "%f";}
  45. };
  46. # if GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC
  47. template<>
  48. struct literal<uint64_t, false>
  49. {
  50. GLM_FUNC_QUALIFIER static char const * value() {return "%lld";}
  51. };
  52. template<>
  53. struct literal<int64_t, false>
  54. {
  55. GLM_FUNC_QUALIFIER static char const * value() {return "%lld";}
  56. };
  57. # endif//GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC
  58. template<typename T>
  59. struct prefix{};
  60. template<>
  61. struct prefix<float>
  62. {
  63. GLM_FUNC_QUALIFIER static char const * value() {return "";}
  64. };
  65. template<>
  66. struct prefix<double>
  67. {
  68. GLM_FUNC_QUALIFIER static char const * value() {return "d";}
  69. };
  70. template<>
  71. struct prefix<bool>
  72. {
  73. GLM_FUNC_QUALIFIER static char const * value() {return "b";}
  74. };
  75. template<>
  76. struct prefix<uint8_t>
  77. {
  78. GLM_FUNC_QUALIFIER static char const * value() {return "u8";}
  79. };
  80. template<>
  81. struct prefix<int8_t>
  82. {
  83. GLM_FUNC_QUALIFIER static char const * value() {return "i8";}
  84. };
  85. template<>
  86. struct prefix<uint16_t>
  87. {
  88. GLM_FUNC_QUALIFIER static char const * value() {return "u16";}
  89. };
  90. template<>
  91. struct prefix<int16_t>
  92. {
  93. GLM_FUNC_QUALIFIER static char const * value() {return "i16";}
  94. };
  95. template<>
  96. struct prefix<uint32_t>
  97. {
  98. GLM_FUNC_QUALIFIER static char const * value() {return "u";}
  99. };
  100. template<>
  101. struct prefix<int32_t>
  102. {
  103. GLM_FUNC_QUALIFIER static char const * value() {return "i";}
  104. };
  105. template<>
  106. struct prefix<uint64_t>
  107. {
  108. GLM_FUNC_QUALIFIER static char const * value() {return "u64";}
  109. };
  110. template<>
  111. struct prefix<int64_t>
  112. {
  113. GLM_FUNC_QUALIFIER static char const * value() {return "i64";}
  114. };
  115. template<typename matType>
  116. struct compute_to_string
  117. {};
  118. template<qualifier Q>
  119. struct compute_to_string<vec<1, bool, Q> >
  120. {
  121. GLM_FUNC_QUALIFIER static std::string call(vec<1, bool, Q> const& x)
  122. {
  123. return detail::format("bvec1(%s)",
  124. x[0] ? detail::LabelTrue : detail::LabelFalse);
  125. }
  126. };
  127. template<qualifier Q>
  128. struct compute_to_string<vec<2, bool, Q> >
  129. {
  130. GLM_FUNC_QUALIFIER static std::string call(vec<2, bool, Q> const& x)
  131. {
  132. return detail::format("bvec2(%s, %s)",
  133. x[0] ? detail::LabelTrue : detail::LabelFalse,
  134. x[1] ? detail::LabelTrue : detail::LabelFalse);
  135. }
  136. };
  137. template<qualifier Q>
  138. struct compute_to_string<vec<3, bool, Q> >
  139. {
  140. GLM_FUNC_QUALIFIER static std::string call(vec<3, bool, Q> const& x)
  141. {
  142. return detail::format("bvec3(%s, %s, %s)",
  143. x[0] ? detail::LabelTrue : detail::LabelFalse,
  144. x[1] ? detail::LabelTrue : detail::LabelFalse,
  145. x[2] ? detail::LabelTrue : detail::LabelFalse);
  146. }
  147. };
  148. template<qualifier Q>
  149. struct compute_to_string<vec<4, bool, Q> >
  150. {
  151. GLM_FUNC_QUALIFIER static std::string call(vec<4, bool, Q> const& x)
  152. {
  153. return detail::format("bvec4(%s, %s, %s, %s)",
  154. x[0] ? detail::LabelTrue : detail::LabelFalse,
  155. x[1] ? detail::LabelTrue : detail::LabelFalse,
  156. x[2] ? detail::LabelTrue : detail::LabelFalse,
  157. x[3] ? detail::LabelTrue : detail::LabelFalse);
  158. }
  159. };
  160. template<typename T, qualifier Q>
  161. struct compute_to_string<vec<1, T, Q> >
  162. {
  163. GLM_FUNC_QUALIFIER static std::string call(vec<1, T, Q> const& x)
  164. {
  165. char const * PrefixStr = prefix<T>::value();
  166. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  167. std::string FormatStr(detail::format("%svec1(%s)",
  168. PrefixStr,
  169. LiteralStr));
  170. return detail::format(FormatStr.c_str(),
  171. static_cast<typename cast<T>::value_type>(x[0]));
  172. }
  173. };
  174. template<typename T, qualifier Q>
  175. struct compute_to_string<vec<2, T, Q> >
  176. {
  177. GLM_FUNC_QUALIFIER static std::string call(vec<2, T, Q> const& x)
  178. {
  179. char const * PrefixStr = prefix<T>::value();
  180. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  181. std::string FormatStr(detail::format("%svec2(%s, %s)",
  182. PrefixStr,
  183. LiteralStr, LiteralStr));
  184. return detail::format(FormatStr.c_str(),
  185. static_cast<typename cast<T>::value_type>(x[0]),
  186. static_cast<typename cast<T>::value_type>(x[1]));
  187. }
  188. };
  189. template<typename T, qualifier Q>
  190. struct compute_to_string<vec<3, T, Q> >
  191. {
  192. GLM_FUNC_QUALIFIER static std::string call(vec<3, T, Q> const& x)
  193. {
  194. char const * PrefixStr = prefix<T>::value();
  195. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  196. std::string FormatStr(detail::format("%svec3(%s, %s, %s)",
  197. PrefixStr,
  198. LiteralStr, LiteralStr, LiteralStr));
  199. return detail::format(FormatStr.c_str(),
  200. static_cast<typename cast<T>::value_type>(x[0]),
  201. static_cast<typename cast<T>::value_type>(x[1]),
  202. static_cast<typename cast<T>::value_type>(x[2]));
  203. }
  204. };
  205. template<typename T, qualifier Q>
  206. struct compute_to_string<vec<4, T, Q> >
  207. {
  208. GLM_FUNC_QUALIFIER static std::string call(vec<4, T, Q> const& x)
  209. {
  210. char const * PrefixStr = prefix<T>::value();
  211. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  212. std::string FormatStr(detail::format("%svec4(%s, %s, %s, %s)",
  213. PrefixStr,
  214. LiteralStr, LiteralStr, LiteralStr, LiteralStr));
  215. return detail::format(FormatStr.c_str(),
  216. static_cast<typename cast<T>::value_type>(x[0]),
  217. static_cast<typename cast<T>::value_type>(x[1]),
  218. static_cast<typename cast<T>::value_type>(x[2]),
  219. static_cast<typename cast<T>::value_type>(x[3]));
  220. }
  221. };
  222. template<typename T, qualifier Q>
  223. struct compute_to_string<mat<2, 2, T, Q> >
  224. {
  225. GLM_FUNC_QUALIFIER static std::string call(mat<2, 2, T, Q> const& x)
  226. {
  227. char const * PrefixStr = prefix<T>::value();
  228. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  229. std::string FormatStr(detail::format("%smat2x2((%s, %s), (%s, %s))",
  230. PrefixStr,
  231. LiteralStr, LiteralStr,
  232. LiteralStr, LiteralStr));
  233. return detail::format(FormatStr.c_str(),
  234. static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]),
  235. static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]));
  236. }
  237. };
  238. template<typename T, qualifier Q>
  239. struct compute_to_string<mat<2, 3, T, Q> >
  240. {
  241. GLM_FUNC_QUALIFIER static std::string call(mat<2, 3, T, Q> const& x)
  242. {
  243. char const * PrefixStr = prefix<T>::value();
  244. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  245. std::string FormatStr(detail::format("%smat2x3((%s, %s, %s), (%s, %s, %s))",
  246. PrefixStr,
  247. LiteralStr, LiteralStr, LiteralStr,
  248. LiteralStr, LiteralStr, LiteralStr));
  249. return detail::format(FormatStr.c_str(),
  250. static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]),
  251. static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]));
  252. }
  253. };
  254. template<typename T, qualifier Q>
  255. struct compute_to_string<mat<2, 4, T, Q> >
  256. {
  257. GLM_FUNC_QUALIFIER static std::string call(mat<2, 4, T, Q> const& x)
  258. {
  259. char const * PrefixStr = prefix<T>::value();
  260. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  261. std::string FormatStr(detail::format("%smat2x4((%s, %s, %s, %s), (%s, %s, %s, %s))",
  262. PrefixStr,
  263. LiteralStr, LiteralStr, LiteralStr, LiteralStr,
  264. LiteralStr, LiteralStr, LiteralStr, LiteralStr));
  265. return detail::format(FormatStr.c_str(),
  266. static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]),
  267. static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]));
  268. }
  269. };
  270. template<typename T, qualifier Q>
  271. struct compute_to_string<mat<3, 2, T, Q> >
  272. {
  273. GLM_FUNC_QUALIFIER static std::string call(mat<3, 2, T, Q> const& x)
  274. {
  275. char const * PrefixStr = prefix<T>::value();
  276. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  277. std::string FormatStr(detail::format("%smat3x2((%s, %s), (%s, %s), (%s, %s))",
  278. PrefixStr,
  279. LiteralStr, LiteralStr,
  280. LiteralStr, LiteralStr,
  281. LiteralStr, LiteralStr));
  282. return detail::format(FormatStr.c_str(),
  283. static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]),
  284. static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]),
  285. static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]));
  286. }
  287. };
  288. template<typename T, qualifier Q>
  289. struct compute_to_string<mat<3, 3, T, Q> >
  290. {
  291. GLM_FUNC_QUALIFIER static std::string call(mat<3, 3, T, Q> const& x)
  292. {
  293. char const * PrefixStr = prefix<T>::value();
  294. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  295. std::string FormatStr(detail::format("%smat3x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s))",
  296. PrefixStr,
  297. LiteralStr, LiteralStr, LiteralStr,
  298. LiteralStr, LiteralStr, LiteralStr,
  299. LiteralStr, LiteralStr, LiteralStr));
  300. return detail::format(FormatStr.c_str(),
  301. static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]),
  302. static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]),
  303. static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]));
  304. }
  305. };
  306. template<typename T, qualifier Q>
  307. struct compute_to_string<mat<3, 4, T, Q> >
  308. {
  309. GLM_FUNC_QUALIFIER static std::string call(mat<3, 4, T, Q> const& x)
  310. {
  311. char const * PrefixStr = prefix<T>::value();
  312. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  313. std::string FormatStr(detail::format("%smat3x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))",
  314. PrefixStr,
  315. LiteralStr, LiteralStr, LiteralStr, LiteralStr,
  316. LiteralStr, LiteralStr, LiteralStr, LiteralStr,
  317. LiteralStr, LiteralStr, LiteralStr, LiteralStr));
  318. return detail::format(FormatStr.c_str(),
  319. static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]),
  320. static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]),
  321. static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]), static_cast<typename cast<T>::value_type>(x[2][3]));
  322. }
  323. };
  324. template<typename T, qualifier Q>
  325. struct compute_to_string<mat<4, 2, T, Q> >
  326. {
  327. GLM_FUNC_QUALIFIER static std::string call(mat<4, 2, T, Q> const& x)
  328. {
  329. char const * PrefixStr = prefix<T>::value();
  330. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  331. std::string FormatStr(detail::format("%smat4x2((%s, %s), (%s, %s), (%s, %s), (%s, %s))",
  332. PrefixStr,
  333. LiteralStr, LiteralStr,
  334. LiteralStr, LiteralStr,
  335. LiteralStr, LiteralStr,
  336. LiteralStr, LiteralStr));
  337. return detail::format(FormatStr.c_str(),
  338. static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]),
  339. static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]),
  340. static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]),
  341. static_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]));
  342. }
  343. };
  344. template<typename T, qualifier Q>
  345. struct compute_to_string<mat<4, 3, T, Q> >
  346. {
  347. GLM_FUNC_QUALIFIER static std::string call(mat<4, 3, T, Q> const& x)
  348. {
  349. char const * PrefixStr = prefix<T>::value();
  350. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  351. std::string FormatStr(detail::format("%smat4x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s), (%s, %s, %s))",
  352. PrefixStr,
  353. LiteralStr, LiteralStr, LiteralStr,
  354. LiteralStr, LiteralStr, LiteralStr,
  355. LiteralStr, LiteralStr, LiteralStr,
  356. LiteralStr, LiteralStr, LiteralStr));
  357. return detail::format(FormatStr.c_str(),
  358. static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]),
  359. static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]),
  360. static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]),
  361. static_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]), static_cast<typename cast<T>::value_type>(x[3][2]));
  362. }
  363. };
  364. template<typename T, qualifier Q>
  365. struct compute_to_string<mat<4, 4, T, Q> >
  366. {
  367. GLM_FUNC_QUALIFIER static std::string call(mat<4, 4, T, Q> const& x)
  368. {
  369. char const * PrefixStr = prefix<T>::value();
  370. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  371. std::string FormatStr(detail::format("%smat4x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))",
  372. PrefixStr,
  373. LiteralStr, LiteralStr, LiteralStr, LiteralStr,
  374. LiteralStr, LiteralStr, LiteralStr, LiteralStr,
  375. LiteralStr, LiteralStr, LiteralStr, LiteralStr,
  376. LiteralStr, LiteralStr, LiteralStr, LiteralStr));
  377. return detail::format(FormatStr.c_str(),
  378. static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]),
  379. static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]),
  380. static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]), static_cast<typename cast<T>::value_type>(x[2][3]),
  381. static_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]), static_cast<typename cast<T>::value_type>(x[3][2]), static_cast<typename cast<T>::value_type>(x[3][3]));
  382. }
  383. };
  384. template<typename T, qualifier Q>
  385. struct compute_to_string<tquat<T, Q> >
  386. {
  387. GLM_FUNC_QUALIFIER static std::string call(tquat<T, Q> const& x)
  388. {
  389. char const * PrefixStr = prefix<T>::value();
  390. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  391. std::string FormatStr(detail::format("%squat(%s, {%s, %s, %s})",
  392. PrefixStr,
  393. LiteralStr, LiteralStr, LiteralStr, LiteralStr));
  394. return detail::format(FormatStr.c_str(),
  395. static_cast<typename cast<T>::value_type>(x[3]),
  396. static_cast<typename cast<T>::value_type>(x[0]),
  397. static_cast<typename cast<T>::value_type>(x[1]),
  398. static_cast<typename cast<T>::value_type>(x[2]));
  399. }
  400. };
  401. template<typename T, qualifier Q>
  402. struct compute_to_string<tdualquat<T, Q> >
  403. {
  404. GLM_FUNC_QUALIFIER static std::string call(tdualquat<T, Q> const& x)
  405. {
  406. char const * PrefixStr = prefix<T>::value();
  407. char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
  408. std::string FormatStr(detail::format("%sdualquat((%s, {%s, %s, %s}), (%s, {%s, %s, %s}))",
  409. PrefixStr,
  410. LiteralStr, LiteralStr, LiteralStr, LiteralStr));
  411. return detail::format(FormatStr.c_str(),
  412. static_cast<typename cast<T>::value_type>(x.real[3]),
  413. static_cast<typename cast<T>::value_type>(x.real[0]),
  414. static_cast<typename cast<T>::value_type>(x.real[1]),
  415. static_cast<typename cast<T>::value_type>(x.real[2]),
  416. static_cast<typename cast<T>::value_type>(x.dual[3]),
  417. static_cast<typename cast<T>::value_type>(x.dual[0]),
  418. static_cast<typename cast<T>::value_type>(x.dual[1]),
  419. static_cast<typename cast<T>::value_type>(x.dual[2]));
  420. }
  421. };
  422. }//namespace detail
  423. template<class matType>
  424. GLM_FUNC_QUALIFIER std::string to_string(matType const& x)
  425. {
  426. return detail::compute_to_string<matType>::call(x);
  427. }
  428. }//namespace glm