/*============================================================================= Copyright (c) 2011-2017 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #ifndef SPROUT_MATH_QUATERNION_POW_HPP #define SPROUT_MATH_QUATERNION_POW_HPP #include #include namespace sprout { namespace math { // // pow // namespace detail { template inline SPROUT_CONSTEXPR sprout::math::quaternion pow_q_impl(sprout::math::quaternion const& q, int n, int m, sprout::math::quaternion const& result) { return n != m << 1 ? result * result * q : result * result ; } } // namespace detail template inline SPROUT_CONSTEXPR sprout::math::quaternion pow(sprout::math::quaternion const& q, int n) { return n > 1 ? sprout::math::detail::pow_q_impl( q, n, n >> 1, sprout::math::pow(q, n >> 1) ) : n == 1 ? q : n == 0 ? sprout::math::quaternion(static_cast(1)) : sprout::math::pow(sprout::math::quaternion(static_cast(1)) / q, -n) ; } } // namespace math using sprout::math::pow; } // namespace sprout #endif // #ifndef SPROUT_MATH_QUATERNION_POW_HPP