diff --git a/code/espurna/filters/BaseFilter.h b/code/espurna/filters/BaseFilter.h index 9e5cd672..45d9609d 100644 --- a/code/espurna/filters/BaseFilter.h +++ b/code/espurna/filters/BaseFilter.h @@ -11,16 +11,16 @@ class BaseFilter { public: virtual ~BaseFilter() = default; - // Reset internal value to default and also erases internal storage + // Reset internal state to default virtual void reset() { } - // Defaults to 0 aka no backing storage - virtual size_t capacity() const { - return 0; + // Defaults to false aka filter is not initialized + virtual bool status() const { + return false; } - // Resize the backing storage (when it is available) + // Resize the backing storage (when it is available) and reset internal state virtual void resize(size_t) { } diff --git a/code/espurna/filters/LastFilter.h b/code/espurna/filters/LastFilter.h index 703a09b9..196bbde4 100644 --- a/code/espurna/filters/LastFilter.h +++ b/code/espurna/filters/LastFilter.h @@ -13,8 +13,8 @@ public: _value = value; } - size_t capacity() const override { - return 1; + bool status() const override { + return true; } void reset() override { diff --git a/code/espurna/filters/MaxFilter.h b/code/espurna/filters/MaxFilter.h index 87779f86..c7da6cd4 100644 --- a/code/espurna/filters/MaxFilter.h +++ b/code/espurna/filters/MaxFilter.h @@ -15,8 +15,8 @@ public: _value = std::max(value, _value); } - size_t capacity() const override { - return 1; + bool status() const override { + return true; } void resize(size_t) override { diff --git a/code/espurna/filters/MedianFilter.h b/code/espurna/filters/MedianFilter.h index 57a0b0a6..7f2e4c13 100644 --- a/code/espurna/filters/MedianFilter.h +++ b/code/espurna/filters/MedianFilter.h @@ -61,8 +61,8 @@ public: return out; } - size_t capacity() const override { - return _capacity; + bool status() const override { + return _values.capacity() > 0; } void resize(size_t capacity) override { @@ -72,14 +72,12 @@ public: private: void _reset() { - auto previous = _values.size() - ? _values.back() - : 0.0; - _values.clear(); - _values.push_back(previous); - + if (_values.size()) { + _values.erase(_values.begin(), _values.end() - 1); + } else { + _values.clear(); + } } std::vector _values; - size_t _capacity = 0; }; diff --git a/code/espurna/filters/MovingAverageFilter.h b/code/espurna/filters/MovingAverageFilter.h index 01460dd8..0e6a00b3 100644 --- a/code/espurna/filters/MovingAverageFilter.h +++ b/code/espurna/filters/MovingAverageFilter.h @@ -17,8 +17,8 @@ public: } } - size_t capacity() const override { - return _values.capacity(); + bool status() const override { + return _values.capacity() > 0; } double value() const override { diff --git a/code/espurna/filters/SumFilter.h b/code/espurna/filters/SumFilter.h index e5cb4ea6..b332d45e 100644 --- a/code/espurna/filters/SumFilter.h +++ b/code/espurna/filters/SumFilter.h @@ -13,8 +13,8 @@ public: _value += value; } - size_t capacity() const override { - return 1; + bool status() const override { + return true; } void resize(size_t) override { diff --git a/code/test/unit/src/filters/filters.cpp b/code/test/unit/src/filters/filters.cpp index 2ac6fded..4804daed 100644 --- a/code/test/unit/src/filters/filters.cpp +++ b/code/test/unit/src/filters/filters.cpp @@ -19,12 +19,12 @@ namespace { void test_last() { auto filter = LastFilter(); - TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); filter.resize(123); - TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); filter.update(123.4); @@ -43,12 +43,12 @@ void test_last() { void test_max() { auto filter = MaxFilter(); - TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); filter.resize(567); - TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); filter.update(5.0); @@ -78,12 +78,12 @@ void test_max() { void test_median() { auto filter = MedianFilter(); - TEST_ASSERT_EQUAL(0, filter.capacity()); + TEST_ASSERT(!filter.status()); const double one[] {4., 3., 5., 6., 2., 2., 3., 4., 7., 9.}; filter.resize(std::size(one)); - TEST_ASSERT_EQUAL(std::size(samples), filter.capacity()); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); for (const auto& sample : one) { @@ -95,6 +95,7 @@ void test_median() { const double two[] {6., 6.1, 6.2, 6.3, 6.4, 6.5, 2.5, 4.5, 2.6, 2.5, 2.4}; filter.resize(std::size(two)); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(9, filter.value()); for (const auto& sample : two) { @@ -106,6 +107,7 @@ void test_median() { const double three[] {2.4, 2.4}; filter.resize(std::size(three)); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(2.4, filter.value()); for (const auto& sample : three) { @@ -118,13 +120,13 @@ void test_median() { void test_moving_average() { auto filter = MovingAverageFilter(); - TEST_ASSERT_EQUAL(0, filter.capacity()); + TEST_ASSERT(!filter.status()); TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); const double samples[] {22., 22.3, 22.1, 22.1, 22.1, 22.0, 22.5, 22.1}; filter.resize(std::size(samples)); - TEST_ASSERT_EQUAL(std::size(samples), filter.capacity()); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); for (const auto& sample : samples) { @@ -137,13 +139,13 @@ void test_moving_average() { void test_sum() { auto filter = SumFilter(); - TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); const double samples[] {20., 20.1, 13., 10., 5., 14., 29., 32.}; filter.resize(std::size(samples)); - TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT(filter.status()); TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); for (const auto& sample : samples) {