mirror of
https://github.com/g-truc/glm.git
synced 2024-11-25 18:04:34 +00:00
Optimized sign for vector types #271
This commit is contained in:
parent
883d328fb8
commit
b0b84a3dc1
@ -156,16 +156,20 @@ namespace detail
|
|||||||
GLM_FUNC_QUALIFIER genFIType sign(genFIType x)
|
GLM_FUNC_QUALIFIER genFIType sign(genFIType x)
|
||||||
{
|
{
|
||||||
GLM_STATIC_ASSERT(
|
GLM_STATIC_ASSERT(
|
||||||
std::numeric_limits<genFIType>::is_iec559 ||
|
std::numeric_limits<genFIType>::is_iec559 || (std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer),
|
||||||
(std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer), "'sign' only accept signed inputs");
|
"'sign' only accept signed inputs");
|
||||||
|
|
||||||
return genFIType(genFIType(0) < x) - (x < genFIType(0));
|
return static_cast<genFIType>(static_cast<genFIType>(0) < x) - static_cast<genFIType>(x < static_cast<genFIType>(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, precision P, template <typename, precision> class vecType>
|
template <typename T, precision P, template <typename, precision> class vecType>
|
||||||
GLM_FUNC_QUALIFIER vecType<T, P> sign(vecType<T, P> const & x)
|
GLM_FUNC_QUALIFIER vecType<T, P> sign(vecType<T, P> const & x)
|
||||||
{
|
{
|
||||||
return detail::functor1<T, T, P, vecType>::call(sign, x);
|
GLM_STATIC_ASSERT(
|
||||||
|
std::numeric_limits<T>::is_iec559 || (std::numeric_limits<T>::is_signed && std::numeric_limits<T>::is_integer),
|
||||||
|
"'sign' only accept signed inputs");
|
||||||
|
|
||||||
|
return vecType<T, P>(glm::lessThan(vecType<T, P>(0), x)) - vecType<T, P>(glm::lessThan(x, vecType<T, P>(0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// floor
|
// floor
|
||||||
|
@ -855,6 +855,12 @@ namespace sign
|
|||||||
|
|
||||||
int Error = 0;
|
int Error = 0;
|
||||||
|
|
||||||
|
for(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)
|
||||||
|
{
|
||||||
|
glm::int32 Result = glm::sign(Data[i].Value);
|
||||||
|
Error += Data[i].Return == Result ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
for(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)
|
for(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)
|
||||||
{
|
{
|
||||||
glm::int32 Result = sign_cmp(Data[i].Value);
|
glm::int32 Result = sign_cmp(Data[i].Value);
|
||||||
@ -888,11 +894,36 @@ namespace sign
|
|||||||
return Error;
|
return Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int test_i32vec4()
|
||||||
|
{
|
||||||
|
type<glm::i32vec4> const Data[] =
|
||||||
|
{
|
||||||
|
{glm::i32vec4( 1), glm::i32vec4( 1)},
|
||||||
|
{glm::i32vec4( 0), glm::i32vec4( 0)},
|
||||||
|
{glm::i32vec4( 2), glm::i32vec4( 1)},
|
||||||
|
{glm::i32vec4( 3), glm::i32vec4( 1)},
|
||||||
|
{glm::i32vec4(-1), glm::i32vec4(-1)},
|
||||||
|
{glm::i32vec4(-2), glm::i32vec4(-1)},
|
||||||
|
{glm::i32vec4(-3), glm::i32vec4(-1)}
|
||||||
|
};
|
||||||
|
|
||||||
|
int Error = 0;
|
||||||
|
|
||||||
|
for(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::i32vec4>); ++i)
|
||||||
|
{
|
||||||
|
glm::i32vec4 Result = glm::sign(Data[i].Value);
|
||||||
|
Error += glm::all(glm::equal(Data[i].Return, Result)) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Error;
|
||||||
|
}
|
||||||
|
|
||||||
int test()
|
int test()
|
||||||
{
|
{
|
||||||
int Error = 0;
|
int Error = 0;
|
||||||
|
|
||||||
Error += test_int32();
|
Error += test_int32();
|
||||||
|
Error += test_i32vec4();
|
||||||
|
|
||||||
return Error;
|
return Error;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user