| #pragma once |
| |
| #include "data_types.hpp" |
| |
| #include <algorithm> |
| #include <functional> |
| |
| namespace phosphor |
| { |
| namespace dbus |
| { |
| namespace monitoring |
| { |
| |
| /** @class Filters |
| * @brief Filter interface |
| * |
| * Filters of any type can be applied to property value changes. |
| */ |
| class Filters |
| { |
| public: |
| Filters() = default; |
| Filters(const Filters&) = delete; |
| Filters(Filters&&) = default; |
| Filters& operator=(const Filters&) = delete; |
| Filters& operator=(Filters&&) = default; |
| virtual ~Filters() = default; |
| |
| /** @brief Apply filter operations to a property value. */ |
| virtual bool operator()(const std::any& value) = 0; |
| }; |
| |
| /** @class OperandFilters |
| * @brief Filter property values utilzing operand based functions. |
| * |
| * When configured, an operand filter is applied to a property value each |
| * time it changes to determine if that property value should be filtered |
| * from being stored or used within a given callback function. |
| */ |
| template <typename T> |
| class OperandFilters : public Filters |
| { |
| public: |
| OperandFilters() = delete; |
| OperandFilters(const OperandFilters&) = delete; |
| OperandFilters(OperandFilters&&) = default; |
| OperandFilters& operator=(const OperandFilters&) = delete; |
| OperandFilters& operator=(OperandFilters&&) = default; |
| virtual ~OperandFilters() = default; |
| explicit OperandFilters(const std::vector<std::function<bool(T)>>& _ops) : |
| Filters(), ops(std::move(_ops)) |
| {} |
| |
| bool operator()(const std::any& value) override |
| { |
| for (const auto& filterOps : ops) |
| { |
| try |
| { |
| // Apply filter operand to property value |
| if (!filterOps(std::any_cast<T>(value))) |
| { |
| // Property value should be filtered |
| return true; |
| } |
| } |
| catch (const std::bad_any_cast& bac) |
| { |
| // Unable to cast property value to filter value type |
| // to check filter, continue to next filter op |
| continue; |
| } |
| } |
| |
| // Property value should not be filtered |
| return false; |
| } |
| |
| private: |
| /** @brief List of operand based filter functions. */ |
| const std::vector<std::function<bool(T)>> ops; |
| }; |
| |
| } // namespace monitoring |
| } // namespace dbus |
| } // namespace phosphor |