16 struct Units {
double amount; };
19 using Value = std::variant<Units, Fraction, All>;
22 static QuantityIntent
units(
double amount) {
return QuantityIntent(Units{amount}); }
25 throw std::invalid_argument(
"quantity fraction requires a positive finite denominator");
28 static QuantityIntent
all() {
return QuantityIntent(All{}); }
30 double units()
const {
return std::get<Units>(value_).amount; }
31 double numerator()
const {
return std::get<Fraction>(value_).numerator; }
32 double denominator()
const {
return std::get<Fraction>(value_).denominator; }
47 const std::optional<QuantityIntent>&
intent()
const {
return intent_; }
48 const std::optional<QuantityReservation>&
reservation()
const {
return reservation_; }
53 void reserve(
double units,
double basis_units) {
54 if (!intent_)
throw std::logic_error(
"quantity reservation requires an original request");
58 return intent_ && intent_->kind() == QuantityIntent::Kind::All;
62 bool is_partial(
double units_tolerance,
double fraction_tolerance)
const {
64 return reservation_->units < reservation_->basis_units - units_tolerance;
65 return intent_ && intent_->kind() == QuantityIntent::Kind::Fraction
66 && intent_->numerator() < intent_->denominator() - fraction_tolerance;
70 std::optional<QuantityIntent> intent_;
71 std::optional<QuantityReservation> reservation_;
static QuantityIntent fraction(double numerator, double denominator)
static QuantityIntent units(double amount)
double denominator() const
static QuantityIntent all()
bool is_partial(double units_tolerance, double fraction_tolerance) const
void request(QuantityIntent intent)
void reserve(double units, double basis_units)
const std::optional< QuantityReservation > & reservation() const
bool requests_all() const
const std::optional< QuantityIntent > & intent() const