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