summaryrefslogtreecommitdiffstats
path: root/src/count.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/count.hpp')
-rw-r--r--src/count.hpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/count.hpp b/src/count.hpp
index f7b809f..51a76eb 100644
--- a/src/count.hpp
+++ b/src/count.hpp
@@ -26,6 +26,9 @@ namespace monitoring
* one. In pass two, apply a second C++ relational operator
* to the number of properties that pass the test from pass one
* to a count provided by the configuration file.
+ *
+ * If the oneshot parameter is true, then this condition won't pass
+ * again until it fails at least once.
*/
template <typename T>
class CountCondition : public IndexedConditional
@@ -41,10 +44,12 @@ class CountCondition : public IndexedConditional
CountCondition(
const PropertyIndex& conditionIndex,
const std::function<bool(size_t)>& _countOp,
- const std::function<bool(T)>& _propertyOp) :
+ const std::function<bool(T)>& _propertyOp,
+ bool oneshot = false) :
IndexedConditional(conditionIndex),
countOp(_countOp),
- propertyOp(_propertyOp) {}
+ propertyOp(_propertyOp),
+ oneshot(oneshot) {}
bool operator()() override
{
@@ -70,7 +75,18 @@ class CountCondition : public IndexedConditional
// *INDENT-ON*
// Now apply the count condition to the count.
- return countOp(count);
+ auto result = countOp(count);
+
+ // If this was a oneshot and the the condition has already
+ // passed, then don't let it pass again until the condition
+ // has gone back to false.
+ if (oneshot && result && lastResult)
+ {
+ return false;
+ }
+
+ lastResult = result;
+ return result;
}
private:
@@ -78,6 +94,11 @@ class CountCondition : public IndexedConditional
std::function<bool(size_t)> countOp;
/** @brief The comparison to perform on each property. */
std::function<bool(T)> propertyOp;
+ /** @brief If the condition can be allowed to pass again
+ on subsequent checks that are also true. */
+ const bool oneshot;
+ /** @brief The result of the previous check. */
+ bool lastResult = false;
};
} // namespace monitoring
} // namespace dbus
OpenPOWER on IntegriCloud