string_cast.inl 17 KB

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