!std::is_same<N, bool>::value &&
!std::is_same<D, bool>::value,
decltype(N{1} / D{1})>::type;
-}
+} // namespace detail
-#if defined(__arm__) && !FOLLY_A64
+#if defined(__arm__) && !FOLLY_AARCH64
constexpr auto kIntegerDivisionGivesRemainder = false;
#else
constexpr auto kIntegerDivisionGivesRemainder = true;
template <typename N, typename D>
inline constexpr detail::IdivResultType<N, D> divFloor(N num, D denom) {
using R = decltype(num / denom);
- return kIntegerDivisionGivesRemainder && std::is_signed<R>::value
- ? detail::divFloorBranchless<R>(num, denom)
- : detail::divFloorBranchful<R>(num, denom);
+ return detail::IdivResultType<N, D>(
+ kIntegerDivisionGivesRemainder && std::is_signed<R>::value
+ ? detail::divFloorBranchless<R>(num, denom)
+ : detail::divFloorBranchful<R>(num, denom));
}
/**
template <typename N, typename D>
inline constexpr detail::IdivResultType<N, D> divCeil(N num, D denom) {
using R = decltype(num / denom);
- return kIntegerDivisionGivesRemainder && std::is_signed<R>::value
- ? detail::divCeilBranchless<R>(num, denom)
- : detail::divCeilBranchful<R>(num, denom);
+ return detail::IdivResultType<N, D>(
+ kIntegerDivisionGivesRemainder && std::is_signed<R>::value
+ ? detail::divCeilBranchless<R>(num, denom)
+ : detail::divCeilBranchful<R>(num, denom));
}
/**
*/
template <typename N, typename D>
inline constexpr detail::IdivResultType<N, D> divTrunc(N num, D denom) {
- return num / denom;
+ return detail::IdivResultType<N, D>(num / denom);
}
/**
template <typename N, typename D>
inline constexpr detail::IdivResultType<N, D> divRoundAway(N num, D denom) {
using R = decltype(num / denom);
- return kIntegerDivisionGivesRemainder && std::is_signed<R>::value
- ? detail::divRoundAwayBranchless<R>(num, denom)
- : detail::divRoundAwayBranchful<R>(num, denom);
+ return detail::IdivResultType<N, D>(
+ kIntegerDivisionGivesRemainder && std::is_signed<R>::value
+ ? detail::divRoundAwayBranchless<R>(num, denom)
+ : detail::divRoundAwayBranchful<R>(num, denom));
}
} // namespace folly