Home | History | Annotate | Download | only in gtx
      1 ///////////////////////////////////////////////////////////////////////////////////////////////////
      2 // OpenGL Mathematics Copyright (c) 2006 G-Truc Creation (www.g-truc.net)
      3 ///////////////////////////////////////////////////////////////////////////////////////////////////
      4 // Created : 2008-04-27
      5 // Updated : 2008-05-24
      6 // Licence : This source is under MIT License
      7 // File    : glm/gtx/string_cast.hpp
      8 ///////////////////////////////////////////////////////////////////////////////////////////////////
      9 
     10 #include <cstdarg>
     11 #include <cstdio>
     12 
     13 namespace glm{
     14 namespace detail
     15 {
     16 	GLM_FUNC_QUALIFIER std::string format(const char* msg, ...)
     17 	{
     18 		std::size_t const STRING_BUFFER(4096);
     19 		char text[STRING_BUFFER];
     20 		va_list list;
     21 
     22 		if(msg == 0)
     23 			return std::string();
     24 
     25 		va_start(list, msg);
     26 #		if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC8))
     27 			vsprintf_s(text, STRING_BUFFER, msg, list);
     28 #		else//
     29 			vsprintf(text, msg, list);
     30 #		endif//
     31 		va_end(list);
     32 
     33 		return std::string(text);
     34 	}
     35 
     36 	static const char* True = "true";
     37 	static const char* False = "false";
     38 }//namespace detail
     39 
     40 	////////////////////////////////
     41 	// Scalars
     42 
     43 	GLM_FUNC_QUALIFIER std::string to_string(float x)
     44 	{
     45 		return detail::format("float(%f)", x);
     46 	}
     47 
     48 	GLM_FUNC_QUALIFIER std::string to_string(double x)
     49 	{
     50 		return detail::format("double(%f)", x);
     51 	}
     52 
     53 	GLM_FUNC_QUALIFIER std::string to_string(int x)
     54 	{
     55 		return detail::format("int(%d)", x);
     56 	}
     57 
     58 	GLM_FUNC_QUALIFIER std::string to_string(unsigned int x)
     59 	{
     60 		return detail::format("uint(%d)", x);
     61 	}
     62 
     63 	////////////////////////////////
     64 	// Bool vectors
     65 
     66 	template <precision P>
     67 	GLM_FUNC_QUALIFIER std::string to_string
     68 	(
     69 		detail::tvec2<bool, P> const & v
     70 	)
     71 	{
     72 		return detail::format("bvec2(%s, %s)",
     73 			v.x ? detail::True : detail::False,
     74 			v.y ? detail::True : detail::False);
     75 	}
     76 
     77 	template <precision P>
     78 	GLM_FUNC_QUALIFIER std::string to_string
     79 	(
     80 		detail::tvec3<bool, P> const & v
     81 	)
     82 	{
     83 		return detail::format("bvec3(%s, %s, %s)",
     84 			v.x ? detail::True : detail::False,
     85 			v.y ? detail::True : detail::False,
     86 			v.z ? detail::True : detail::False);
     87 	}
     88 
     89 	template <precision P>
     90 	GLM_FUNC_QUALIFIER std::string to_string
     91 	(
     92 		detail::tvec4<bool, P> const & v
     93 	)
     94 	{
     95 		return detail::format("bvec4(%s, %s, %s, %s)",
     96 			v.x ? detail::True : detail::False,
     97 			v.y ? detail::True : detail::False,
     98 			v.z ? detail::True : detail::False,
     99 			v.w ? detail::True : detail::False);
    100 	}
    101 
    102 	////////////////////////////////
    103 	// Float vectors
    104 
    105 	template <precision P>
    106 	GLM_FUNC_QUALIFIER std::string to_string
    107 	(
    108 		detail::tvec2<float, P> const & v
    109 	)
    110 	{
    111 		return detail::format("fvec2(%f, %f)", v.x, v.y);
    112 	}
    113 
    114 	template <precision P>
    115 	GLM_FUNC_QUALIFIER std::string to_string
    116 	(
    117 		detail::tvec3<float, P> const & v
    118 	)
    119 	{
    120 		return detail::format("fvec3(%f, %f, %f)", v.x, v.y, v.z);
    121 	}
    122 
    123 	template <precision P>
    124 	GLM_FUNC_QUALIFIER std::string to_string
    125 	(
    126 		detail::tvec4<float, P> const & v
    127 	)
    128 	{
    129 		return detail::format("fvec4(%f, %f, %f, %f)", v.x, v.y, v.z, v.w);
    130 	}
    131 
    132 	////////////////////////////////
    133 	// Double vectors
    134 
    135 	template <precision P>
    136 	GLM_FUNC_QUALIFIER std::string to_string
    137 	(
    138 		detail::tvec2<double, P> const & v
    139 	)
    140 	{
    141 		return detail::format("dvec2(%f, %f)", v.x, v.y);
    142 	}
    143 
    144 	template <precision P>
    145 	GLM_FUNC_QUALIFIER std::string to_string
    146 	(
    147 		detail::tvec3<double, P> const & v
    148 	)
    149 	{
    150 		return detail::format("dvec3(%f, %f, %f)", v.x, v.y, v.z);
    151 	}
    152 
    153 	template <precision P>
    154 	GLM_FUNC_QUALIFIER std::string to_string
    155 	(
    156 		detail::tvec4<double, P> const & v
    157 	)
    158 	{
    159 		return detail::format("dvec4(%f, %f, %f, %f)", v.x, v.y, v.z, v.w);
    160 	}
    161 
    162 	////////////////////////////////
    163 	// Int vectors
    164 
    165 	template <precision P>
    166 	GLM_FUNC_QUALIFIER std::string to_string
    167 	(
    168 		detail::tvec2<int, P> const & v
    169 	)
    170 	{
    171 		return detail::format("ivec2(%d, %d)", v.x, v.y);
    172 	}
    173 
    174 	template <precision P>
    175 	GLM_FUNC_QUALIFIER std::string to_string
    176 	(
    177 		detail::tvec3<int, P> const & v
    178 	)
    179 	{
    180 		return detail::format("ivec3(%d, %d, %d)", v.x, v.y, v.z);
    181 	}
    182 
    183 	template <precision P>
    184 	GLM_FUNC_QUALIFIER std::string to_string
    185 	(
    186 		detail::tvec4<int, P> const & v
    187 	)
    188 	{
    189 		return detail::format("ivec4(%d, %d, %d, %d)", v.x, v.y, v.z, v.w);
    190 	}
    191 
    192 	////////////////////////////////
    193 	// Unsigned int vectors
    194 
    195 	template <precision P>
    196 	GLM_FUNC_QUALIFIER std::string to_string
    197 	(
    198 		detail::tvec2<unsigned int, P> const & v
    199 	)
    200 	{
    201 		return detail::format("uvec2(%d, %d)", v.x, v.y);
    202 	}
    203 
    204 	template <precision P>
    205 	GLM_FUNC_QUALIFIER std::string to_string
    206 	(
    207 		detail::tvec3<unsigned int, P> const & v
    208 	)
    209 	{
    210 		return detail::format("uvec3(%d, %d, %d)", v.x, v.y, v.z);
    211 	}
    212 
    213 	template <precision P>
    214 	GLM_FUNC_QUALIFIER std::string to_string
    215 	(
    216 		detail::tvec4<unsigned int, P> const & v
    217 	)
    218 	{
    219 		return detail::format("uvec4(%d, %d, %d, %d)", v.x, v.y, v.z, v.w);
    220 	}
    221 
    222 	////////////////////////////////
    223 	// Float matrices
    224 
    225 	template <precision P>
    226 	GLM_FUNC_QUALIFIER std::string to_string
    227 	(
    228 		detail::tmat2x2<float, P> const & x
    229 	)
    230 	{
    231 		return detail::format("mat2x2((%f, %f), (%f, %f))", 
    232 			x[0][0], x[0][1], 
    233 			x[1][0], x[1][1]);
    234 	}
    235 
    236 	template <precision P>
    237 	GLM_FUNC_QUALIFIER std::string to_string
    238 	(
    239 		detail::tmat2x3<float, P> const & x
    240 	)
    241 	{
    242 		return detail::format("mat2x3((%f, %f, %f), (%f, %f, %f))", 
    243 			x[0][0], x[0][1], x[0][2], 
    244 			x[1][0], x[1][1], x[1][2]);
    245 	}
    246 
    247 	template <precision P>
    248 	GLM_FUNC_QUALIFIER std::string to_string
    249 	(
    250 		detail::tmat2x4<float, P> const & x
    251 	)
    252 	{
    253 		return detail::format("mat2x4((%f, %f, %f, %f), (%f, %f, %f, %f))", 
    254 			x[0][0], x[0][1], x[0][2], x[0][3], 
    255 			x[1][0], x[1][1], x[1][2], x[1][3]);
    256 	}
    257 
    258 	template <precision P>
    259 	GLM_FUNC_QUALIFIER std::string to_string
    260 	(
    261 		detail::tmat3x2<float, P> const & x
    262 	)
    263 	{
    264 		return detail::format("mat3x2((%f, %f), (%f, %f), (%f, %f))", 
    265 			x[0][0], x[0][1], 
    266 			x[1][0], x[1][1], 
    267 			x[2][0], x[2][1]);
    268 	}
    269 
    270 	template <precision P>
    271 	GLM_FUNC_QUALIFIER std::string to_string
    272 	(
    273 		detail::tmat3x3<float, P> const & x
    274 	)
    275 	{
    276 		return detail::format("mat3x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", 
    277 			x[0][0], x[0][1], x[0][2], 
    278 			x[1][0], x[1][1], x[1][2],
    279 			x[2][0], x[2][1], x[2][2]);
    280 	}
    281 
    282 	template <precision P>
    283 	GLM_FUNC_QUALIFIER std::string to_string
    284 	(
    285 		detail::tmat3x4<float, P> const & x
    286 	)
    287 	{
    288 		return detail::format("mat3x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", 
    289 			x[0][0], x[0][1], x[0][2], x[0][3], 
    290 			x[1][0], x[1][1], x[1][2], x[1][3], 
    291 			x[2][0], x[2][1], x[2][2], x[2][3]);
    292 	}
    293 
    294 	template <precision P>
    295 	GLM_FUNC_QUALIFIER std::string to_string
    296 	(
    297 		detail::tmat4x2<float, P> const & x
    298 	)
    299 	{
    300 		return detail::format("mat4x2((%f, %f), (%f, %f), (%f, %f), (%f, %f))", 
    301 			x[0][0], x[0][1], 
    302 			x[1][0], x[1][1], 
    303 			x[2][0], x[2][1], 
    304 			x[3][0], x[3][1]);
    305 	}
    306 
    307 	template <precision P>
    308 	GLM_FUNC_QUALIFIER std::string to_string
    309 	(
    310 		detail::tmat4x3<float, P> const & x
    311 	)
    312 	{
    313 		return detail::format("mat4x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", 
    314 			x[0][0], x[0][1], x[0][2],
    315 			x[1][0], x[1][1], x[1][2], 
    316 			x[2][0], x[2][1], x[2][2],
    317 			x[3][0], x[3][1], x[3][2]);
    318 	}
    319 
    320 	template <precision P>
    321 	GLM_FUNC_QUALIFIER std::string to_string
    322 	(
    323 		detail::tmat4x4<float, P> const & x
    324 	)
    325 	{
    326 		return detail::format("mat4x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", 
    327 			x[0][0], x[0][1], x[0][2], x[0][3],
    328 			x[1][0], x[1][1], x[1][2], x[1][3],
    329 			x[2][0], x[2][1], x[2][2], x[2][3],
    330 			x[3][0], x[3][1], x[3][2], x[3][3]);
    331 	}
    332 
    333 	////////////////////////////////
    334 	// Double matrices
    335 
    336 	template <precision P>
    337 	GLM_FUNC_QUALIFIER std::string to_string
    338 	(
    339 		detail::tmat2x2<double, P> const & x
    340 	)
    341 	{
    342 		return detail::format("dmat2x2((%f, %f), (%f, %f))",
    343 			x[0][0], x[0][1], 
    344 			x[1][0], x[1][1]);
    345 	}
    346 
    347 	template <precision P>
    348 	GLM_FUNC_QUALIFIER std::string to_string
    349 	(
    350 		detail::tmat2x3<double, P> const & x
    351 	)
    352 	{
    353 		return detail::format("dmat2x3((%f, %f, %f), (%f, %f, %f))",
    354 			x[0][0], x[0][1], x[0][2], 
    355 			x[1][0], x[1][1], x[1][2]);
    356 	}
    357 
    358 	template <precision P>
    359 	GLM_FUNC_QUALIFIER std::string to_string
    360 	(
    361 		detail::tmat2x4<double, P> const & x
    362 	)
    363 	{
    364 		return detail::format("dmat2x4((%f, %f, %f, %f), (%f, %f, %f, %f))",
    365 			x[0][0], x[0][1], x[0][2], x[0][3], 
    366 			x[1][0], x[1][1], x[1][2], x[1][3]);
    367 	}
    368 
    369 	template <precision P>
    370 	GLM_FUNC_QUALIFIER std::string to_string
    371 	(
    372 		detail::tmat3x2<double, P> const & x
    373 	)
    374 	{
    375 		return detail::format("dmat3x2((%f, %f), (%f, %f), (%f, %f))",
    376 			x[0][0], x[0][1], 
    377 			x[1][0], x[1][1],
    378 			x[2][0], x[2][1]);
    379 	}
    380 
    381 	template <precision P>
    382 	GLM_FUNC_QUALIFIER std::string to_string
    383 	(
    384 		detail::tmat3x3<double, P> const & x
    385 	)
    386 	{
    387 		return detail::format("dmat3x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f))",
    388 			x[0][0], x[0][1], x[0][2], 
    389 			x[1][0], x[1][1], x[1][2],
    390 			x[2][0], x[2][1], x[2][2]);
    391 	}
    392 
    393 	template <precision P>
    394 	GLM_FUNC_QUALIFIER std::string to_string
    395 	(
    396 		detail::tmat3x4<double, P> const & x
    397 	)
    398 	{
    399 		return detail::format("dmat3x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))",
    400 			x[0][0], x[0][1], x[0][2], x[0][3], 
    401 			x[1][0], x[1][1], x[1][2], x[1][3],
    402 			x[2][0], x[2][1], x[2][2], x[2][3]);
    403 	}
    404 
    405 	template <precision P>
    406 	GLM_FUNC_QUALIFIER std::string to_string
    407 	(
    408 		detail::tmat4x2<double, P> const & x
    409 	)
    410 	{
    411 		return detail::format("dmat4x2((%f, %f), (%f, %f), (%f, %f), (%f, %f))",
    412 			x[0][0], x[0][1], 
    413 			x[1][0], x[1][1], 
    414 			x[2][0], x[2][1], 
    415 			x[3][0], x[3][1]);
    416 	}
    417 
    418 	template <precision P>
    419 	GLM_FUNC_QUALIFIER std::string to_string
    420 	(
    421 		detail::tmat4x3<double, P> const & x
    422 	)
    423 	{
    424 		return detail::format("dmat4x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f), (%f, %f, %f))",
    425 			x[0][0], x[0][1], x[0][2], 
    426 			x[1][0], x[1][1], x[1][2], 
    427 			x[2][0], x[2][1], x[2][2], 
    428 			x[3][0], x[3][1], x[3][2]);
    429 	}
    430 
    431 	template <precision P>
    432 	GLM_FUNC_QUALIFIER std::string to_string
    433 	(
    434 		detail::tmat4x4<double, P> const & x
    435 	)
    436 	{
    437 		return detail::format("dmat4x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))",
    438 			x[0][0], x[0][1], x[0][2], x[0][3],
    439 			x[1][0], x[1][1], x[1][2], x[1][3],
    440 			x[2][0], x[2][1], x[2][2], x[2][3],
    441 			x[3][0], x[3][1], x[3][2], x[3][3]);
    442 	}
    443 
    444 }//namespace glm
    445