diff --git a/Makefile.am b/Makefile.am index d64fe46b..9aef778e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -168,7 +168,6 @@ UTIL_FILES = \ log.ipp \ maths.cpp \ maths.hpp \ - maths.ipp \ matrix.cpp \ matrix2.cpp \ matrix3.cpp \ diff --git a/maths.hpp b/maths.hpp index ac0c4768..e9499a82 100644 --- a/maths.hpp +++ b/maths.hpp @@ -59,7 +59,10 @@ namespace util { /////////////////////////////////////////////////////////////////////////// template 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 + constexpr std::enable_if_t< + std::is_signed::value && std::is_integral::value, T + > + sign (T t) + { + return t < 0 ? -1 : 1; + } + + //------------------------------------------------------------------------- + template + constexpr std::enable_if_t< + std::is_floating_point::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 diff --git a/maths.ipp b/maths.ipp deleted file mode 100644 index f4b03558..00000000 --- a/maths.ipp +++ /dev/null @@ -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 - */ - -#ifndef __UTIL_MATHS_IPP -#define __UTIL_MATHS_IPP -#else -#error "Include only once" -#endif - -#include - - -/////////////////////////////////////////////////////////////////////////////// -template -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; -}