#pragma once #include #include "data_types.hpp" namespace phosphor { namespace dbus { namespace monitoring { namespace condition { /** * @brief A condition used to trigger an action when a number of items are at * or above a given value * @details A given group of items is updated with their last known item * value, which then the entire group is checked if there are a given number of * them at or above a value which would cause the condition to be true * * @param[in] items - Group of items * @param[in] path - Path of a item within the group * @param[in] count - Number of items needed at or above value * @param[in] value - Value of items to be at or above * * @return Lambda function * A lambda function to determine if the number of items within the group * are at or above the given value */ template auto countAtOrAbove(Group& items, const char* path, size_t count, T&& value) { return [&items, path, count, value = std::forward(value)](T&& arg) { Group::iterator it = std::find_if(items.begin(), items.end(), [&path](auto const& item) { return std::get<0>(item) == path; }); if (it != std::end(items)) { std::get<1>(*it) = arg; } size_t condCount = std::count_if(items.begin(), items.end(), [&value](auto const& item) { return std::get<1>(item) >= value; }); return condCount >= count; }; } } // namespace condition } // namespace monitoring } // namespace dbus } // namespace phosphor