Make detail::functor1 capable to return a different argument value_type than the argument value_type

This commit is contained in:
Christophe Riccio 2014-10-20 02:22:53 +02:00
parent bf08a0e234
commit 47a6947736
4 changed files with 44 additions and 44 deletions

View File

@ -36,42 +36,42 @@
namespace glm{
namespace detail
{
template <typename T, precision P, template <typename, precision> class vecType>
template <typename R, typename T, precision P, template <typename, precision> class vecType>
struct functor1{};
template <typename T, precision P>
struct functor1<T, P, tvec1>
template <typename R, typename T, precision P>
struct functor1<R, T, P, tvec1>
{
GLM_FUNC_QUALIFIER static tvec1<T, P> call(T (*Func) (T x), tvec1<T, P> const & v)
GLM_FUNC_QUALIFIER static tvec1<R, P> call(T (*Func) (T x), tvec1<T, P> const & v)
{
return tvec1<T, P>(Func(v.x));
return tvec1<R, P>(Func(v.x));
}
};
template <typename T, precision P>
struct functor1<T, P, tvec2>
template <typename R, typename T, precision P>
struct functor1<R, T, P, tvec2>
{
GLM_FUNC_QUALIFIER static tvec2<T, P> call(T (*Func) (T x), tvec2<T, P> const & v)
GLM_FUNC_QUALIFIER static tvec2<R, P> call(T (*Func) (T x), tvec2<T, P> const & v)
{
return tvec2<T, P>(Func(v.x), Func(v.y));
return tvec2<R, P>(Func(v.x), Func(v.y));
}
};
template <typename T, precision P>
struct functor1<T, P, tvec3>
template <typename R, typename T, precision P>
struct functor1<R, T, P, tvec3>
{
GLM_FUNC_QUALIFIER static tvec3<T, P> call(T (*Func) (T x), tvec3<T, P> const & v)
GLM_FUNC_QUALIFIER static tvec3<R, P> call(T (*Func) (T x), tvec3<T, P> const & v)
{
return tvec3<T, P>(Func(v.x), Func(v.y), Func(v.z));
return tvec3<R, P>(Func(v.x), Func(v.y), Func(v.z));
}
};
template <typename T, precision P>
struct functor1<T, P, tvec4>
template <typename R, typename T, precision P>
struct functor1<R, T, P, tvec4>
{
GLM_FUNC_QUALIFIER static tvec4<T, P> call(T (*Func) (T x), tvec4<T, P> const & v)
GLM_FUNC_QUALIFIER static tvec4<R, P> call(T (*Func) (T x), tvec4<T, P> const & v)
{
return tvec4<T, P>(Func(v.x), Func(v.y), Func(v.z), Func(v.w));
return tvec4<R, P>(Func(v.x), Func(v.y), Func(v.z), Func(v.w));
}
};

View File

@ -139,7 +139,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> abs(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(abs, x);
return detail::functor1<T, T, P, vecType>::call(abs, x);
}
// sign
@ -164,7 +164,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> sign(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(sign, x);
return detail::functor1<T, T, P, vecType>::call(sign, x);
}
// floor
@ -173,7 +173,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> floor(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(::std::floor, x);
return detail::functor1<T, T, P, vecType>::call(::std::floor, x);
}
// trunc
@ -192,7 +192,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> trunc(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(::std::trunc, x);
return detail::functor1<T, T, P, vecType>::call(::std::trunc, x);
}
// round
@ -211,7 +211,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> round(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(round, x);
return detail::functor1<T, T, P, vecType>::call(round, x);
}
/*
@ -260,7 +260,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> roundEven(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(roundEven, x);
return detail::functor1<T, T, P, vecType>::call(roundEven, x);
}
// ceil
@ -269,7 +269,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> ceil(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(::std::ceil, x);
return detail::functor1<T, T, P, vecType>::call(::std::ceil, x);
}
// fract
@ -284,7 +284,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> fract(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(fract, x);
return detail::functor1<T, T, P, vecType>::call(fract, x);
}
// mod

View File

@ -91,7 +91,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> exp(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(::std::exp, x);
return detail::functor1<T, T, P, vecType>::call(::std::exp, x);
}
// log
@ -99,7 +99,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> log(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(::std::log, x);
return detail::functor1<T, T, P, vecType>::call(::std::log, x);
}
//exp2, ln2 = 0.69314718055994530941723212145818f
@ -114,7 +114,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> exp2(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(exp2, x);
return detail::functor1<T, T, P, vecType>::call(exp2, x);
}
// log2, ln2 = 0.69314718055994530941723212145818f
@ -131,7 +131,7 @@ namespace detail
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> log2(vecType<T, P> const & x)
{
return detail::functor1<T, P, vecType>::call(log2, x);
return detail::functor1<T, T, P, vecType>::call(log2, x);
}
// sqrt
@ -140,7 +140,7 @@ namespace detail
GLM_FUNC_QUALIFIER vecType<T, P> sqrt(vecType<T, P> const & x)
{
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'sqrt' only accept floating-point inputs");
return detail::functor1<T, P, vecType>::call(sqrt, x);
return detail::functor1<T, T, P, vecType>::call(sqrt, x);
}
// inversesqrt

View File

@ -44,7 +44,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> radians(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(radians, v);
return detail::functor1<T, T, P, vecType>::call(radians, v);
}
// degrees
@ -59,7 +59,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> degrees(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(degrees, v);
return detail::functor1<T, T, P, vecType>::call(degrees, v);
}
// sin
@ -68,7 +68,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> sin(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(sin, v);
return detail::functor1<T, T, P, vecType>::call(sin, v);
}
// cos
@ -77,7 +77,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> cos(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(cos, v);
return detail::functor1<T, T, P, vecType>::call(cos, v);
}
// tan
@ -86,7 +86,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> tan(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(tan, v);
return detail::functor1<T, T, P, vecType>::call(tan, v);
}
// asin
@ -95,7 +95,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> asin(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(asin, v);
return detail::functor1<T, T, P, vecType>::call(asin, v);
}
// acos
@ -104,7 +104,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> acos(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(acos, v);
return detail::functor1<T, T, P, vecType>::call(acos, v);
}
// atan
@ -127,7 +127,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> atan(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(atan, v);
return detail::functor1<T, T, P, vecType>::call(atan, v);
}
// sinh
@ -136,7 +136,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> sinh(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(sinh, v);
return detail::functor1<T, T, P, vecType>::call(sinh, v);
}
// cosh
@ -145,7 +145,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> cosh(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(cosh, v);
return detail::functor1<T, T, P, vecType>::call(cosh, v);
}
// tanh
@ -154,7 +154,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> tanh(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(tanh, v);
return detail::functor1<T, T, P, vecType>::call(tanh, v);
}
// asinh
@ -173,7 +173,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> asinh(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(asinh, v);
return detail::functor1<T, T, P, vecType>::call(asinh, v);
}
// acosh
@ -194,7 +194,7 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> acosh(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(acosh, v);
return detail::functor1<T, T, P, vecType>::call(acosh, v);
}
// atanh
@ -215,6 +215,6 @@ namespace glm
template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_QUALIFIER vecType<T, P> atanh(vecType<T, P> const & v)
{
return detail::functor1<T, P, vecType>::call(atanh, v);
return detail::functor1<T, T, P, vecType>::call(atanh, v);
}
}//namespace glm