diff --git a/src/include/units/pow.h b/src/include/units/pow.h new file mode 100644 index 00000000..81bc9db2 --- /dev/null +++ b/src/include/units/pow.h @@ -0,0 +1,61 @@ +// The MIT License (MIT) +// +// Copyright (c) 2018 Mateusz Pusz +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#pragma once + +#include +#include + +namespace units { + +constexpr std::intmax_t ipow10(std::intmax_t exp) +{ + assert(exp >= 0); + if (exp == 0) return 1; + std::intmax_t result = 1; + while (exp > 0) { + result *= 10; + --exp; + } + return result; +} + +template +constexpr Rep fpow10(std::intmax_t exp) +{ + if (exp == 0) return Rep(1.0); + Rep result = Rep(1.0); + if (exp < 0) { + while (exp < 0) { + result = result / Rep(10.0); + ++exp; + } + } else { + while (exp > 0) { + result = result * Rep(10.0); + --exp; + } + } + return result; +} + +} // namespace units diff --git a/src/include/units/quantity.h b/src/include/units/quantity.h index 06c46c5c..fce49bd4 100644 --- a/src/include/units/quantity.h +++ b/src/include/units/quantity.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #if COMP_MSVC || COMP_GCC >= 10 diff --git a/src/include/units/quantity_cast.h b/src/include/units/quantity_cast.h index 42f3118b..d741b319 100644 --- a/src/include/units/quantity_cast.h +++ b/src/include/units/quantity_cast.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -37,38 +38,6 @@ namespace units { -constexpr std::intmax_t ipow10(std::intmax_t exp) -{ - assert(exp >= 0); - if (exp == 0) return 1; - std::intmax_t result = 1; - while (exp > 0) { - result *= 10; - --exp; - } - return result; -} - -template -constexpr Rep fpow10(std::intmax_t exp) -{ - if (exp == 0) return Rep(1.0); - Rep result = Rep(1.0); - if (exp < 0) { - while (exp < 0) { - result = result / Rep(10.0); - ++exp; - } - } else { - while (exp > 0) { - result = result * Rep(10.0); - --exp; - } - } - return result; -} - - // QuantityOf template concept QuantityOf = Quantity && Dimension && equivalent_dim;