Home | History | Annotate | Download | only in detail
      1 ///////////////////////////////////////////////////////////////////////////////////
      2 /// OpenGL Mathematics (glm.g-truc.net)
      3 ///
      4 /// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
      5 /// Permission is hereby granted, free of charge, to any person obtaining a copy
      6 /// of this software and associated documentation files (the "Software"), to deal
      7 /// in the Software without restriction, including without limitation the rights
      8 /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      9 /// copies of the Software, and to permit persons to whom the Software is
     10 /// furnished to do so, subject to the following conditions:
     11 ///
     12 /// The above copyright notice and this permission notice shall be included in
     13 /// all copies or substantial portions of the Software.
     14 ///
     15 /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16 /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17 /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     18 /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19 /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     20 /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     21 /// THE SOFTWARE.
     22 ///
     23 /// @ref core
     24 /// @file glm/core/_vectorize.hpp
     25 /// @date 2011-10-14 / 2011-10-14
     26 /// @author Christophe Riccio
     27 ///////////////////////////////////////////////////////////////////////////////////
     28 
     29 #ifndef GLM_CORE_DETAIL_INCLUDED
     30 #define GLM_CORE_DETAIL_INCLUDED
     31 
     32 #include "type_vec1.hpp"
     33 #include "type_vec2.hpp"
     34 #include "type_vec3.hpp"
     35 #include "type_vec4.hpp"
     36 
     37 #define VECTORIZE1_VEC(func)						\
     38 	template <typename T, precision P>				\
     39 	GLM_FUNC_QUALIFIER detail::tvec1<T, P> func(	\
     40 		detail::tvec1<T, P> const & v)				\
     41 	{												\
     42 		return detail::tvec1<T, P>(					\
     43 			func(v.x));								\
     44 	}
     45 
     46 #define VECTORIZE2_VEC(func)						\
     47 	template <typename T, precision P>				\
     48 	GLM_FUNC_QUALIFIER detail::tvec2<T, P> func(	\
     49 		detail::tvec2<T, P> const & v)				\
     50 	{												\
     51 		return detail::tvec2<T, P>(					\
     52 			func(v.x),								\
     53 			func(v.y));								\
     54 	}
     55 
     56 #define VECTORIZE3_VEC(func)						\
     57 	template <typename T, precision P>				\
     58 	GLM_FUNC_QUALIFIER detail::tvec3<T, P> func(	\
     59 		detail::tvec3<T, P> const & v)				\
     60 	{												\
     61 		return detail::tvec3<T, P>(					\
     62 			func(v.x),								\
     63 			func(v.y),								\
     64 			func(v.z));								\
     65 	}
     66 
     67 #define VECTORIZE4_VEC(func)						\
     68 	template <typename T, precision P>				\
     69 	GLM_FUNC_QUALIFIER detail::tvec4<T, P> func(	\
     70 		detail::tvec4<T, P> const & v)				\
     71 	{												\
     72 		return detail::tvec4<T, P>(					\
     73 			func(v.x),								\
     74 			func(v.y),								\
     75 			func(v.z),								\
     76 			func(v.w));								\
     77 	}
     78 
     79 #define VECTORIZE_VEC(func)		\
     80 	VECTORIZE1_VEC(func)		\
     81 	VECTORIZE2_VEC(func)		\
     82 	VECTORIZE3_VEC(func)		\
     83 	VECTORIZE4_VEC(func)
     84 
     85 #define VECTORIZE1_VEC_SCA(func)							\
     86 	template <typename T, precision P>						\
     87 	GLM_FUNC_QUALIFIER detail::tvec1<T, P> func				\
     88 	(														\
     89 		detail::tvec1<T, P> const & x,						\
     90 		T const & y											\
     91 	)														\
     92 	{														\
     93 		return detail::tvec1<T, P>(							\
     94 			func(x.x, y));									\
     95 	}
     96 
     97 #define VECTORIZE2_VEC_SCA(func)							\
     98 	template <typename T, precision P>						\
     99 	GLM_FUNC_QUALIFIER detail::tvec2<T, P> func				\
    100 	(														\
    101 		detail::tvec2<T, P> const & x,						\
    102 		T const & y	\
    103 	)														\
    104 	{														\
    105 		return detail::tvec2<T, P>(							\
    106 			func(x.x, y),									\
    107 			func(x.y, y));									\
    108 	}
    109 
    110 #define VECTORIZE3_VEC_SCA(func)							\
    111 	template <typename T, precision P>						\
    112 	GLM_FUNC_QUALIFIER detail::tvec3<T, P> func				\
    113 	(														\
    114 		detail::tvec3<T, P> const & x,						\
    115 		T const & y	\
    116 	)														\
    117 	{														\
    118 		return detail::tvec3<T, P>(							\
    119 			func(x.x, y),									\
    120 			func(x.y, y),									\
    121 			func(x.z, y));									\
    122 	}
    123 
    124 #define VECTORIZE4_VEC_SCA(func)							\
    125 	template <typename T, precision P>						\
    126 	GLM_FUNC_QUALIFIER detail::tvec4<T, P> func				\
    127 	(														\
    128 		detail::tvec4<T, P> const & x,						\
    129 		T const & y	\
    130 	)														\
    131 	{														\
    132 		return detail::tvec4<T, P>(							\
    133 			func(x.x, y),									\
    134 			func(x.y, y),									\
    135 			func(x.z, y),									\
    136 			func(x.w, y));									\
    137 	}
    138 
    139 #define VECTORIZE_VEC_SCA(func)		\
    140 	VECTORIZE1_VEC_SCA(func)		\
    141 	VECTORIZE2_VEC_SCA(func)		\
    142 	VECTORIZE3_VEC_SCA(func)		\
    143 	VECTORIZE4_VEC_SCA(func)
    144 
    145 #define VECTORIZE2_VEC_VEC(func)					\
    146 	template <typename T, precision P>				\
    147 	GLM_FUNC_QUALIFIER detail::tvec2<T, P> func		\
    148 	(												\
    149 		detail::tvec2<T, P> const & x,				\
    150 		detail::tvec2<T, P> const & y				\
    151 	)												\
    152 	{												\
    153 		return detail::tvec2<T, P>(					\
    154 			func(x.x, y.x),							\
    155 			func(x.y, y.y));						\
    156 	}
    157 
    158 #define VECTORIZE3_VEC_VEC(func)					\
    159 	template <typename T, precision P>				\
    160 	GLM_FUNC_QUALIFIER detail::tvec3<T, P> func		\
    161 	(												\
    162 		detail::tvec3<T, P> const & x,				\
    163 		detail::tvec3<T, P> const & y				\
    164 	)												\
    165 	{												\
    166 		return detail::tvec3<T, P>(					\
    167 			func(x.x, y.x),							\
    168 			func(x.y, y.y),							\
    169 			func(x.z, y.z));						\
    170 	}
    171 
    172 #define VECTORIZE4_VEC_VEC(func)				\
    173 	template <typename T, precision P>			\
    174 	GLM_FUNC_QUALIFIER detail::tvec4<T, P> func	\
    175 	(											\
    176 		detail::tvec4<T, P> const & x,			\
    177 		detail::tvec4<T, P> const & y			\
    178 	)											\
    179 	{											\
    180 		return detail::tvec4<T, P>(				\
    181 			func(x.x, y.x),						\
    182 			func(x.y, y.y),						\
    183 			func(x.z, y.z),						\
    184 			func(x.w, y.w));					\
    185 	}
    186 
    187 #define VECTORIZE_VEC_VEC(func)		\
    188 	VECTORIZE2_VEC_VEC(func)		\
    189 	VECTORIZE3_VEC_VEC(func)		\
    190 	VECTORIZE4_VEC_VEC(func)
    191 
    192 namespace glm{
    193 namespace detail
    194 {
    195 	template<bool C>
    196 	struct If
    197 	{
    198 		template<typename F, typename T>
    199 		static GLM_FUNC_QUALIFIER T apply(F functor, const T& val)
    200 		{
    201 			return functor(val);
    202 		}
    203 	};
    204 
    205 	template<>
    206 	struct If<false>
    207 	{
    208 		template<typename F, typename T>
    209 		static GLM_FUNC_QUALIFIER T apply(F, const T& val)
    210 		{
    211 			return val;
    212 		}
    213 	};
    214 }//namespace detail
    215 }//namespace glm
    216 
    217 #endif//GLM_CORE_DETAIL_INCLUDED
    218