/*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
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