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