| #pragma once |
| |
| #include "callback.hpp" |
| #include "data_types.hpp" |
| |
| namespace phosphor |
| { |
| namespace dbus |
| { |
| namespace monitoring |
| { |
| |
| /** @class CountCondition |
| * @brief Count properties that satisfy a condition. |
| * |
| * When invoked, a count class instance performs its condition |
| * test in two passes. |
| * |
| * In pass one, apply a C++ relational operator to the value of |
| * each property in the index and a value provided by the |
| * configuration file. |
| * |
| * Count the number of properties that pass the test in pass |
| * 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. |
| */ |
| template <typename T> |
| class CountCondition : public IndexedConditional |
| { |
| public: |
| CountCondition() = delete; |
| CountCondition(const CountCondition&) = default; |
| CountCondition(CountCondition&&) = default; |
| CountCondition& operator=(const CountCondition&) = default; |
| CountCondition& operator=(CountCondition&&) = default; |
| ~CountCondition() = default; |
| |
| CountCondition( |
| const PropertyIndex& conditionIndex, |
| const std::function<bool(size_t)>& _countOp, |
| const std::function<bool(T)>& _propertyOp) : |
| IndexedConditional(conditionIndex), |
| countOp(_countOp), |
| propertyOp(_propertyOp) {} |
| |
| bool operator()() override |
| { |
| // Count the number of properties in the index that |
| // pass the condition specified in the config file. |
| auto count = std::count_if( |
| index.cbegin(), |
| index.cend(), |
| [this](const auto & item) |
| // *INDENT-OFF* |
| { |
| const auto& storage = std::get<2>( |
| item.second); |
| // Don't count properties that don't exist. |
| if (storage.get().empty()) |
| { |
| return false; |
| } |
| const auto& value = any_ns::any_cast<T>( |
| storage); |
| return propertyOp(value); |
| }); |
| // *INDENT-ON* |
| |
| // Now apply the count condition to the count. |
| return countOp(count); |
| } |
| |
| private: |
| /** @brief The comparison to perform on the count. */ |
| std::function<bool(size_t)> countOp; |
| /** @brief The comparison to perform on each property. */ |
| std::function<bool(T)> propertyOp; |
| }; |
| } // namespace monitoring |
| } // namespace dbus |
| } // namespace phosphor |