Lines Matching refs:Lhs
449 template <typename Lhs,
452 (MaxExponent<Lhs>::value > MaxExponent<Rhs>::value)
457 template <typename Lhs, typename Rhs>
458 struct MaxExponentPromotion<Lhs, Rhs, LEFT_PROMOTION> {
459 using type = Lhs;
462 template <typename Lhs, typename Rhs>
463 struct MaxExponentPromotion<Lhs, Rhs, RIGHT_PROMOTION> {
468 template <typename Lhs,
471 std::is_signed<Lhs>::value
473 ? (MaxExponent<Lhs>::value > MaxExponent<Rhs>::value
479 : (MaxExponent<Lhs>::value < MaxExponent<Rhs>::value
484 template <typename Lhs, typename Rhs>
485 struct LowestValuePromotion<Lhs, Rhs, LEFT_PROMOTION> {
486 using type = Lhs;
489 template <typename Lhs, typename Rhs>
490 struct LowestValuePromotion<Lhs, Rhs, RIGHT_PROMOTION> {
496 typename Lhs,
497 typename Rhs = Lhs,
499 std::is_integral<typename MaxExponentPromotion<Lhs, Rhs>::type>::value&&
500 IntegerBitsPlusSign<typename MaxExponentPromotion<Lhs, Rhs>::type>::
504 typename MaxExponentPromotion<Lhs, Rhs>::type,
505 Lhs>::value ==
507 typename MaxExponentPromotion<Lhs, Rhs>::type,
512 template <typename Lhs, typename Rhs, bool is_intmax_type>
513 struct BigEnoughPromotion<Lhs, Rhs, is_intmax_type, true> {
514 using type = typename MaxExponentPromotion<Lhs, Rhs>::type;
519 template <typename Lhs, typename Rhs>
520 struct BigEnoughPromotion<Lhs, Rhs, false, false> {
522 typename TwiceWiderInteger<typename MaxExponentPromotion<Lhs, Rhs>::type,
523 std::is_signed<Lhs>::value ||
529 template <typename Lhs, typename Rhs>
530 struct BigEnoughPromotion<Lhs, Rhs, true, false> {
531 using type = typename MaxExponentPromotion<Lhs, Rhs>::type;
539 template <typename T, typename Lhs, typename Rhs = Lhs>
543 !std::is_floating_point<Lhs>::value &&
545 std::is_signed<T>::value >= std::is_signed<Lhs>::value &&
546 IntegerBitsPlusSign<T>::value >= (2 * IntegerBitsPlusSign<Lhs>::value) &&
553 template <typename Lhs,
556 typename std::conditional<std::is_signed<Lhs>::value ||
560 typename MaxExponentPromotion<Lhs, Rhs>::type>::value>
563 template <typename Lhs, typename Rhs>
564 struct FastIntegerArithmeticPromotion<Lhs, Rhs, true> {
566 typename TwiceWiderInteger<typename MaxExponentPromotion<Lhs, Rhs>::type,
567 std::is_signed<Lhs>::value ||
569 static_assert(IsIntegerArithmeticSafe<type, Lhs, Rhs>::value, "");
573 template <typename Lhs, typename Rhs>
574 struct FastIntegerArithmeticPromotion<Lhs, Rhs, false> {
575 using type = typename BigEnoughPromotion<Lhs, Rhs>::type;