OpenAstra
 
Loading...
Searching...
No Matches
quantity.hpp
1#ifndef QUANTITY_H
2#define QUANTITY_H
3
4#include <cmath>
5
6#include "json.hpp"
7
8class Quantity
9{
10public:
11 static constexpr double precision = 0.01;
12
13 Quantity()
14 : _value( 0.0 )
15 , _max( 0.0 ) {}
16
17 Quantity(double value, double max )
18 : _value( value )
19 , _max( max ) {}
20
21 Quantity( const Quantity& other )
22 : _value( other._value )
23 , _max( other._max ) {}
24
25 double operator += ( const Quantity &b) {
26 _value += b._value;
27 return _enforceCap();
28 }
29
30 double operator += ( double b ) {
31 _value += b;
32 return _enforceCap();
33 }
34
35 double operator -= ( const Quantity &b ) {
36 _value -= b._value;
37 return _enforceCap();
38 }
39
40 double operator -= ( double b ) {
41 _value -= b;
42 return _enforceCap();
43 }
44
45 const Quantity &operator =( const Quantity &b ) {
46 _max = b._max;
47 _value = b._value;
48 return *this;
49 }
50
51 const Quantity &operator =( double b ) {
52 _value = b;
53 _enforceCap();
54 return *this;
55 }
56
57 const Quantity & makeEqual( const Quantity& b ) {
58 _max = b._max;
59 _value = b._value;
60 return *this;
61 }
62
63 double availability() const {
64 return _max - _value;
65 }
66
67 void fill() {
68 _value = _max;
69 }
70
71 void empty() {
72 _value = 0.0;
73 }
74
75 double addValue( double b ) {
76 _value += b;
77 return _enforceCap();
78 }
79
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; }
84
85 bool isNaN() const {
86 return (_value == NAN) || (_max == NAN);
87 }
88
89 friend void to_json(nlohmann::json& j, const Quantity& s) {
90 j = nlohmann::json{
91 {"value", s.value()},
92 {"max", s.max()}
93 };
94 }
95
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>());
99 }
100
101 friend bool operator < (const Quantity &a, const Quantity &b) {
102 if ( a.value() < b.value() )
103 return true;
104 return false;
105 }
106
107 friend bool operator == (const Quantity &a, const Quantity &b) {
108 double delta = std::fabs( a.value() - b.value() );
109 if ( delta <= Quantity::precision )
110 return true;
111 return false;
112 }
113
114 friend bool operator != (const Quantity &a, const Quantity &b) {
115 double delta = std::fabs( a.value() - b.value() );
116 if ( delta > Quantity::precision )
117 return true;
118 return false;
119 }
120
121private:
122 inline double _enforceCap() {
123 double spill = 0.0;
124 if ( _value > _max ) {
125 spill = _value - _max;
126 _value = _max;
127 }
128 return spill;
129 }
130 double _value;
131 double _max;
132
133};
134
135#endif // QUANTITY_H