11 static constexpr double precision = 0.01;
17 Quantity(
double value,
double max )
21 Quantity(
const Quantity& other )
22 : _value( other._value )
23 , _max( other._max ) {}
25 double operator += (
const Quantity &b) {
30 double operator += (
double b ) {
35 double operator -= (
const Quantity &b ) {
40 double operator -= (
double b ) {
45 const Quantity &operator =(
const Quantity &b ) {
51 const Quantity &operator =(
double b ) {
57 const Quantity & makeEqual(
const Quantity& b ) {
63 double availability()
const {
75 double addValue(
double b ) {
80 double value()
const {
return _value; }
81 double max()
const {
return _max; }
82 double value(
double value ) { _value = value; _enforceCap();
return _value; }
83 double max(
double max ) { _max = max; _enforceCap();
return _max; }
86 return (_value == NAN) || (_max == NAN);
89 friend void to_json(nlohmann::json& j,
const Quantity& s) {
96 friend void from_json(
const nlohmann::json& j, Quantity& s) {
97 s.max(j.at(
"max").get<
double>());
98 s.value(j.at(
"value").get<
double>());
101 friend bool operator < (
const Quantity &a,
const Quantity &b) {
102 if ( a.value() < b.value() )
107 friend bool operator == (
const Quantity &a,
const Quantity &b) {
108 double delta = std::fabs( a.value() - b.value() );
109 if ( delta <= Quantity::precision )
114 friend bool operator != (
const Quantity &a,
const Quantity &b) {
115 double delta = std::fabs( a.value() - b.value() );
116 if ( delta > Quantity::precision )
122 inline double _enforceCap() {
124 if ( _value > _max ) {
125 spill = _value - _max;