maths: move functions inline, remove ipp
This commit is contained in:
parent
eb2722bfa4
commit
486cefc4c6
@ -168,7 +168,6 @@ UTIL_FILES = \
|
||||
log.ipp \
|
||||
maths.cpp \
|
||||
maths.hpp \
|
||||
maths.ipp \
|
||||
matrix.cpp \
|
||||
matrix2.cpp \
|
||||
matrix3.cpp \
|
||||
|
29
maths.hpp
29
maths.hpp
@ -59,7 +59,10 @@ namespace util {
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
template <typename T>
|
||||
constexpr T
|
||||
pow [[gnu::const]] (T x, unsigned y);
|
||||
pow [[gnu::const]] (T x, unsigned y)
|
||||
{
|
||||
return y == 0 ? T{1} : x * pow (x, y - 1);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
@ -133,9 +136,24 @@ namespace util {
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
constexpr int sign (int);
|
||||
constexpr float sign (float);
|
||||
constexpr double sign (double);
|
||||
template <typename T>
|
||||
constexpr std::enable_if_t<
|
||||
std::is_signed<T>::value && std::is_integral<T>::value, T
|
||||
>
|
||||
sign (T t)
|
||||
{
|
||||
return t < 0 ? -1 : 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
template <typename T>
|
||||
constexpr std::enable_if_t<
|
||||
std::is_floating_point<T>::value, T
|
||||
>
|
||||
sign (T t)
|
||||
{
|
||||
return std::signbit (t) ? -1 : 1;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@ -546,7 +564,4 @@ namespace util {
|
||||
}
|
||||
|
||||
|
||||
//#include "types/string.hpp"
|
||||
#include "maths.ipp"
|
||||
|
||||
#endif // __MATHS_HPP
|
||||
|
64
maths.ipp
64
maths.ipp
@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright 2014 Danny Robson <danny@nerdcruft.net>
|
||||
*/
|
||||
|
||||
#ifndef __UTIL_MATHS_IPP
|
||||
#define __UTIL_MATHS_IPP
|
||||
#else
|
||||
#error "Include only once"
|
||||
#endif
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
template <typename T>
|
||||
constexpr T
|
||||
util::pow (T x, unsigned y)
|
||||
{
|
||||
if (y == 0)
|
||||
return T(1);
|
||||
|
||||
return x * util::pow (x, y - 1);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Return a unit type with a sign that matches the provided value
|
||||
///
|
||||
/// We were using __builtin_signbit for the potential speedboost, but it causes
|
||||
/// problems with constexpr under clang. If you need speed then you'll probably
|
||||
/// have to handcode something.
|
||||
constexpr int
|
||||
util::sign (int v)
|
||||
{
|
||||
return std::signbit (v) ? -1 : 1;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
constexpr float
|
||||
util::sign (float v)
|
||||
{
|
||||
return std::signbit (v) ? -1.f : 1.f;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
constexpr double
|
||||
util::sign (double v)
|
||||
{
|
||||
return std::signbit (v) ? -1. : 1.f;
|
||||
}
|
Loading…
Reference in New Issue
Block a user