/*============================================================================= 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_BIT_PARITY_HPP #define SPROUT_BIT_PARITY_HPP #include #include #include #include #include namespace sprout { namespace detail { # if SPROUT_USE_BUILTIN_BIT_OPERATION inline SPROUT_CONSTEXPR int parity(unsigned x) { return __builtin_parity(x); } inline SPROUT_CONSTEXPR int parity(unsigned long x) { return __builtin_parityl(x); } inline SPROUT_CONSTEXPR int parity(unsigned long long x) { return __builtin_parityll(x); } # endif template inline SPROUT_CONSTEXPR typename std::enable_if< (N == 1), Integral >::type parity_bytes(Integral x) SPROUT_NOEXCEPT { return x; } template inline SPROUT_CONSTEXPR typename std::enable_if< (N > 1), Integral >::type parity_bytes(Integral x) SPROUT_NOEXCEPT { return sprout::detail::parity_bytes( x ^ sprout::shlr(x, N / 2 * CHAR_BIT) ); } template inline SPROUT_CONSTEXPR Integral parity_bytes(Integral x) SPROUT_NOEXCEPT { return sprout::detail::parity_bytes(x); } template inline SPROUT_CONSTEXPR Integral parity_bits4(Integral x) SPROUT_NOEXCEPT { return x ^ sprout::shlr(x, 4); } template inline SPROUT_CONSTEXPR Integral parity_bits2(Integral x) SPROUT_NOEXCEPT { return sprout::detail::parity_bits4( x ^ sprout::shlr(x, 2) ); } template inline SPROUT_CONSTEXPR Integral parity_bits1(Integral x) SPROUT_NOEXCEPT { return sprout::detail::parity_bits2( x ^ sprout::shlr(x, 1) ); } template inline SPROUT_CONSTEXPR Integral parity_bits(Integral x) SPROUT_NOEXCEPT { return sprout::detail::parity_bits1(x); } template inline SPROUT_CONSTEXPR int parity(Integral x) { return static_cast(sprout::detail::parity_bytes(sprout::detail::parity_bits(x))) & 1; } } // namespace detail // // parity // template inline SPROUT_CONSTEXPR typename std::enable_if< std::is_integral::value, int >::type parity(Integral x) { return sprout::detail::parity(x); } } // namespace sprout #endif // #ifndef SPROUT_BIT_PARITY_HPP