blob: b6136798d2cba12789ec1258669805a686167d25 [file] [log] [blame]
#pragma once
#include <algorithm>
#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 <typename T>
auto countAtOrAbove(Group& items, const char* path, size_t count, T&& value)
{
return [&items,
path,
count,
value = std::forward<T>(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