void DecayCounter::encode(bufferlist& bl) const
{
- ENCODE_START(4, 4, bl);
+ decay(rate);
+ ENCODE_START(5, 4, bl);
encode(val, bl);
- encode(delta, bl);
encode(vel, bl);
ENCODE_FINISH(bl);
}
void DecayCounter::decode(bufferlist::const_iterator &p)
{
- DECODE_START_LEGACY_COMPAT_LEN(4, 4, 4, p);
+ DECODE_START_LEGACY_COMPAT_LEN(5, 4, 4, p);
if (struct_v < 2) {
double half_life = 0.0;
decode(half_life, p);
decode(k, p);
}
decode(val, p);
- decode(delta, p);
+ if (struct_v < 5) {
+ double delta;
+ decode(delta, p);
+ val += delta;
+ }
decode(vel, p);
last_decay = clock::now();
DECODE_FINISH(p);
{
decay(rate);
f->dump_float("value", val);
- f->dump_float("delta", delta);
f->dump_float("velocity", vel);
}
{
DecayCounter *counter = new DecayCounter();
counter->val = 3.0;
- counter->delta = 2.0;
counter->vel = 1.0;
ls.push_back(counter);
counter = new DecayCounter();
return; /* no need to decay for small differences */
// calculate new value
- double newval = (val+delta) * exp(el * rate.k);
+ double newval = val * exp(el * rate.k);
if (newval < .01) {
newval = 0.0;
}
vel *= exp(el * rate.k);
val = newval;
- delta = 0;
last_decay = now;
}
}
double get() const {
decay(rate);
- return val+delta;
+ return val;
}
double get_last() const {
double hit(double v = 1.0) {
decay(rate);
- delta += v;
- return val+delta;
+ val += v;
+ return val;
}
void adjust(double a) {
void scale(double f) {
val *= f;
- delta *= f;
vel *= f;
}
void reset() {
last_decay = clock::now();
- val = delta = 0;
+ val = vel = 0;
}
protected:
private:
mutable double val = 0.0; // value
- mutable double delta = 0.0; // delta since last decay
mutable double vel = 0.0; // recent velocity
mutable time last_decay = clock::zero(); // time of last decay
DecayRate rate;