/** * Copyright © 2022 IBM Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "config_base.hpp" #include #include namespace phosphor::fan::control::json { using json = nlohmann::json; /** * @class Modifier * * This class provides a doOp() function to modify a PropertyVariantType value * based on a JSON config passed into its constructor. * * For example, with the JSON: * { * "operator": "minus", * "value": 3 * } * * When doOp() is called, it will subtract 3 from the value passed * into doOp() and return the result. * * The valid operators are: * - "minus" * - "less_than" * * To add a new operator, derive a new class from BaseOperator and * then create it accordingly in setOperator. */ class Modifier { public: /** * @brief Base class for operators */ struct BaseOperator { virtual ~BaseOperator() = default; virtual PropertyVariantType operator()(double val) = 0; virtual PropertyVariantType operator()(int32_t val) = 0; virtual PropertyVariantType operator()(int64_t val) = 0; virtual PropertyVariantType operator()(const std::string& val) = 0; virtual PropertyVariantType operator()(bool val) = 0; }; Modifier() = delete; ~Modifier() = default; Modifier(const Modifier&) = delete; Modifier& operator=(const Modifier&) = delete; Modifier(Modifier&&) = delete; Modifier& operator=(Modifier&&) = delete; /** * @brief Constructor * * @param[in] jsonObj - The JSON config object */ explicit Modifier(const json& jsonObj); /** * @brief Performs the operation * * @param[in] value - The variant to do the operation on * * @return PropertyVariantType - The result */ PropertyVariantType doOp(const PropertyVariantType& value); private: /** * @brief Parse and set the value * * @param[in] jsonObj - The JSON config object */ void setValue(const json& jsonObj); /** * @brief Parse and set the operator * * @param[in] jsonObj - The JSON config object */ void setOperator(const json& jsonObj); /** @brief The value used by the operator */ PropertyVariantType _value; /** @brief The operator that will be used */ std::unique_ptr _operator; }; } // namespace phosphor::fan::control::json