1 /// @ref core
2 /// @file glm/detail/_vectorize.hpp
3 
4 #pragma once
5 
6 #include "type_vec1.hpp"
7 #include "type_vec2.hpp"
8 #include "type_vec3.hpp"
9 #include "type_vec4.hpp"
10 
11 namespace glm{
12 namespace detail
13 {
14 	template <typename R, typename T, precision P, template <typename, precision> class vecType>
15 	struct functor1{};
16 
17 	template <typename R, typename T, precision P>
18 	struct functor1<R, T, P, tvec1>
19 	{
callglm::detail::functor120 		GLM_FUNC_QUALIFIER static tvec1<R, P> call(R (*Func) (T x), tvec1<T, P> const & v)
21 		{
22 			return tvec1<R, P>(Func(v.x));
23 		}
24 	};
25 
26 	template <typename R, typename T, precision P>
27 	struct functor1<R, T, P, tvec2>
28 	{
callglm::detail::functor129 		GLM_FUNC_QUALIFIER static tvec2<R, P> call(R (*Func) (T x), tvec2<T, P> const & v)
30 		{
31 			return tvec2<R, P>(Func(v.x), Func(v.y));
32 		}
33 	};
34 
35 	template <typename R, typename T, precision P>
36 	struct functor1<R, T, P, tvec3>
37 	{
callglm::detail::functor138 		GLM_FUNC_QUALIFIER static tvec3<R, P> call(R (*Func) (T x), tvec3<T, P> const & v)
39 		{
40 			return tvec3<R, P>(Func(v.x), Func(v.y), Func(v.z));
41 		}
42 	};
43 
44 	template <typename R, typename T, precision P>
45 	struct functor1<R, T, P, tvec4>
46 	{
callglm::detail::functor147 		GLM_FUNC_QUALIFIER static tvec4<R, P> call(R (*Func) (T x), tvec4<T, P> const & v)
48 		{
49 			return tvec4<R, P>(Func(v.x), Func(v.y), Func(v.z), Func(v.w));
50 		}
51 	};
52 
53 	template <typename T, precision P, template <typename, precision> class vecType>
54 	struct functor2{};
55 
56 	template <typename T, precision P>
57 	struct functor2<T, P, tvec1>
58 	{
callglm::detail::functor259 		GLM_FUNC_QUALIFIER static tvec1<T, P> call(T (*Func) (T x, T y), tvec1<T, P> const & a, tvec1<T, P> const & b)
60 		{
61 			return tvec1<T, P>(Func(a.x, b.x));
62 		}
63 	};
64 
65 	template <typename T, precision P>
66 	struct functor2<T, P, tvec2>
67 	{
callglm::detail::functor268 		GLM_FUNC_QUALIFIER static tvec2<T, P> call(T (*Func) (T x, T y), tvec2<T, P> const & a, tvec2<T, P> const & b)
69 		{
70 			return tvec2<T, P>(Func(a.x, b.x), Func(a.y, b.y));
71 		}
72 	};
73 
74 	template <typename T, precision P>
75 	struct functor2<T, P, tvec3>
76 	{
callglm::detail::functor277 		GLM_FUNC_QUALIFIER static tvec3<T, P> call(T (*Func) (T x, T y), tvec3<T, P> const & a, tvec3<T, P> const & b)
78 		{
79 			return tvec3<T, P>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z));
80 		}
81 	};
82 
83 	template <typename T, precision P>
84 	struct functor2<T, P, tvec4>
85 	{
callglm::detail::functor286 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(T (*Func) (T x, T y), tvec4<T, P> const & a, tvec4<T, P> const & b)
87 		{
88 			return tvec4<T, P>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w));
89 		}
90 	};
91 
92 	template <typename T, precision P, template <typename, precision> class vecType>
93 	struct functor2_vec_sca{};
94 
95 	template <typename T, precision P>
96 	struct functor2_vec_sca<T, P, tvec1>
97 	{
callglm::detail::functor2_vec_sca98 		GLM_FUNC_QUALIFIER static tvec1<T, P> call(T (*Func) (T x, T y), tvec1<T, P> const & a, T b)
99 		{
100 			return tvec1<T, P>(Func(a.x, b));
101 		}
102 	};
103 
104 	template <typename T, precision P>
105 	struct functor2_vec_sca<T, P, tvec2>
106 	{
callglm::detail::functor2_vec_sca107 		GLM_FUNC_QUALIFIER static tvec2<T, P> call(T (*Func) (T x, T y), tvec2<T, P> const & a, T b)
108 		{
109 			return tvec2<T, P>(Func(a.x, b), Func(a.y, b));
110 		}
111 	};
112 
113 	template <typename T, precision P>
114 	struct functor2_vec_sca<T, P, tvec3>
115 	{
callglm::detail::functor2_vec_sca116 		GLM_FUNC_QUALIFIER static tvec3<T, P> call(T (*Func) (T x, T y), tvec3<T, P> const & a, T b)
117 		{
118 			return tvec3<T, P>(Func(a.x, b), Func(a.y, b), Func(a.z, b));
119 		}
120 	};
121 
122 	template <typename T, precision P>
123 	struct functor2_vec_sca<T, P, tvec4>
124 	{
callglm::detail::functor2_vec_sca125 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(T (*Func) (T x, T y), tvec4<T, P> const & a, T b)
126 		{
127 			return tvec4<T, P>(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b));
128 		}
129 	};
130 }//namespace detail
131 }//namespace glm
132