Lines Matching refs:Lhs
447 template <typename Lhs,
450 (MaxExponent<Lhs>::value > MaxExponent<Rhs>::value)
455 template <typename Lhs, typename Rhs>
456 struct MaxExponentPromotion<Lhs, Rhs, LEFT_PROMOTION> {
457 using type = Lhs;
460 template <typename Lhs, typename Rhs>
461 struct MaxExponentPromotion<Lhs, Rhs, RIGHT_PROMOTION> {
466 template <typename Lhs,
469 std::is_signed<Lhs>::value
471 ? (MaxExponent<Lhs>::value > MaxExponent<Rhs>::value
477 : (MaxExponent<Lhs>::value < MaxExponent<Rhs>::value
482 template <typename Lhs, typename Rhs>
483 struct LowestValuePromotion<Lhs, Rhs, LEFT_PROMOTION> {
484 using type = Lhs;
487 template <typename Lhs, typename Rhs>
488 struct LowestValuePromotion<Lhs, Rhs, RIGHT_PROMOTION> {
494 typename Lhs,
495 typename Rhs = Lhs,
497 std::is_integral<typename MaxExponentPromotion<Lhs, Rhs>::type>::value&&
498 IntegerBitsPlusSign<typename MaxExponentPromotion<Lhs, Rhs>::type>::
502 typename MaxExponentPromotion<Lhs, Rhs>::type,
503 Lhs>::value ==
505 typename MaxExponentPromotion<Lhs, Rhs>::type,
510 template <typename Lhs, typename Rhs, bool is_intmax_type>
511 struct BigEnoughPromotion<Lhs, Rhs, is_intmax_type, true> {
512 using type = typename MaxExponentPromotion<Lhs, Rhs>::type;
517 template <typename Lhs, typename Rhs>
518 struct BigEnoughPromotion<Lhs, Rhs, false, false> {
520 typename TwiceWiderInteger<typename MaxExponentPromotion<Lhs, Rhs>::type,
521 std::is_signed<Lhs>::value ||
527 template <typename Lhs, typename Rhs>
528 struct BigEnoughPromotion<Lhs, Rhs, true, false> {
529 using type = typename MaxExponentPromotion<Lhs, Rhs>::type;
537 template <typename T, typename Lhs, typename Rhs = Lhs>
541 !std::is_floating_point<Lhs>::value &&
543 std::is_signed<T>::value >= std::is_signed<Lhs>::value &&
544 IntegerBitsPlusSign<T>::value >= (2 * IntegerBitsPlusSign<Lhs>::value) &&
551 template <typename Lhs,
554 typename std::conditional<std::is_signed<Lhs>::value ||
558 typename MaxExponentPromotion<Lhs, Rhs>::type>::value>
561 template <typename Lhs, typename Rhs>
562 struct FastIntegerArithmeticPromotion<Lhs, Rhs, true> {
564 typename TwiceWiderInteger<typename MaxExponentPromotion<Lhs, Rhs>::type,
565 std::is_signed<Lhs>::value ||
567 static_assert(IsIntegerArithmeticSafe<type, Lhs, Rhs>::value, "");
571 template <typename Lhs, typename Rhs>
572 struct FastIntegerArithmeticPromotion<Lhs, Rhs, false> {
573 using type = typename BigEnoughPromotion<Lhs, Rhs>::type;