14#ifndef OR_TOOLS_BASE_CONSTANT_DIVISOR_H_
15#define OR_TOOLS_BASE_CONSTANT_DIVISOR_H_
51#include "absl/numeric/int128.h"
62 : denominator_(denominator) {}
83template <
typename T,
typename MagicT,
typename Impl>
93 static_cast<const Impl*
>(
this)->div(numerator) * denominator_;
104 static_assert(
sizeof(MagicT) >= 2 *
sizeof(
value_type));
116 ConstantDivisor<uint64_t>> {
122 return MultiplyHi(
magic_, numerator);
126 static uint64_t MultiplyHi(absl::uint128 a, uint64_t b) {
127 absl::uint128 lo(absl::Uint128Low64(a));
128 absl::uint128 hi(absl::Uint128High64(a));
129 absl::uint128 bottom = (lo * b) >> 64;
130 absl::uint128 top = (hi * b);
131 return absl::Uint128High64(bottom + top);
139 ConstantDivisor<uint32_t>> {
147 return absl::Uint128High64(absl::uint128(numerator) *
magic_);
155 ConstantDivisor<uint16_t>> {
162 return static_cast<uint16_t
>(
168 static constexpr MagicValueType kShift = 32;
175 ConstantDivisor<uint8_t>> {
182 return static_cast<uint8_t
>(
188 static constexpr MagicValueType kShift = 16;
value_type div(value_type numerator) const
ConstantDivisor(value_type denominator)
ConstantDivisor(value_type denominator)
REQUIRES: denominator > 1.
value_type div(value_type numerator) const
ConstantDivisor(value_type denominator)
REQUIRES: denominator > 1.
value_type div(value_type numerator) const
value_type div(value_type numerator) const
ConstantDivisor(value_type denominator)
value_type div(value_type n) const
value_type mod(value_type n) const
ConstantDivisor(value_type denominator)
friend value_type operator%(value_type a, const ConstantDivisor &b)
friend value_type operator/(value_type a, const ConstantDivisor &b)
Common code for all specializations.
value_type denominator() const
ConstantDivisorBase(MagicT magic, value_type denominator)
friend value_type operator%(value_type a, const Impl &b)
friend value_type operator/(value_type a, const Impl &b)
value_type mod(value_type numerator) const
A collections of i/o utilities for the Graph classes in ./graph.h.