From 021dbb4cd41d66ec1c36f35139728e4f84b64333 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 13 Oct 2016 19:39:24 +0200 Subject: [PATCH] Change negatable_left_shift and negatable_right_shift to inline funcs * This avoids an internal compile error on VS2010 possibly related to std::enable_if use. --- SPIRV/hex_float.h | 52 +++++++++++++++++++++------------------------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/SPIRV/hex_float.h b/SPIRV/hex_float.h index a051b2f..31b9f9e 100644 --- a/SPIRV/hex_float.h +++ b/SPIRV/hex_float.h @@ -456,33 +456,23 @@ class HexFloat { // constant_number < 0? 0: constant_number // These convert the negative left-shifts into right shifts. - template - struct negatable_left_shift { - static uint_type val(uint_type val) { - return static_cast(val >> -N); - } - }; + template + uint_type negatable_left_shift(int_type N, uint_type val) + { + if(N >= 0) + return val << N; - template - struct negatable_left_shift= 0>::type> { - static uint_type val(uint_type val) { - return static_cast(val << N); - } - }; + return val >> -N; + } - template - struct negatable_right_shift { - static uint_type val(uint_type val) { - return static_cast(val << -N); - } - }; + template + uint_type negatable_right_shift(int_type N, uint_type val) + { + if(N >= 0) + return val >> N; - template - struct negatable_right_shift= 0>::type> { - static uint_type val(uint_type val) { - return static_cast(val >> N); - } - }; + return val << -N; + } // Returns the significand, rounded to fit in a significand in // other_T. This is shifted so that the most significant @@ -499,11 +489,11 @@ class HexFloat { static const uint_type last_significant_bit = (num_throwaway_bits < 0) ? 0 - : negatable_left_shift::val(1u); + : negatable_left_shift(num_throwaway_bits, 1u); static const uint_type first_rounded_bit = (num_throwaway_bits < 1) ? 0 - : negatable_left_shift::val(1u); + : negatable_left_shift(num_throwaway_bits - 1, 1u); static const uint_type throwaway_mask_bits = num_throwaway_bits > 0 ? num_throwaway_bits : 0; @@ -525,7 +515,7 @@ class HexFloat { // do. if ((significand & throwaway_mask) == 0) { return static_cast( - negatable_right_shift::val(significand)); + negatable_right_shift(num_throwaway_bits, significand)); } bool round_away_from_zero = false; @@ -562,11 +552,11 @@ class HexFloat { if (round_away_from_zero) { return static_cast( - negatable_right_shift::val(incrementSignificand( + negatable_right_shift(num_throwaway_bits, incrementSignificand( significand, last_significant_bit, carry_bit))); } else { return static_cast( - negatable_right_shift::val(significand)); + negatable_right_shift(num_throwaway_bits, significand)); } } @@ -620,9 +610,9 @@ class HexFloat { if (is_nan) { typename other_T::uint_type shifted_significand; shifted_significand = static_cast( - negatable_left_shift< + negatable_left_shift( static_cast(other_T::num_fraction_bits) - - static_cast(num_fraction_bits)>::val(significand)); + static_cast(num_fraction_bits), significand)); // We are some sort of Nan. We try to keep the bit-pattern of the Nan // as close as possible. If we had to shift off bits so we are 0, then we -- 2.7.4