diff options
Diffstat (limited to 'src/include/rba/RBAArbitrator.hpp')
-rw-r--r-- | src/include/rba/RBAArbitrator.hpp | 615 |
1 files changed, 0 insertions, 615 deletions
diff --git a/src/include/rba/RBAArbitrator.hpp b/src/include/rba/RBAArbitrator.hpp deleted file mode 100644 index 017db1a..0000000 --- a/src/include/rba/RBAArbitrator.hpp +++ /dev/null @@ -1,615 +0,0 @@ -/** - * Copyright (c) 2019 DENSO 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. - */ - -/** - * Arbitrator Logic class - */ - -#ifndef RBAARBITORATOR_HPP -#define RBAARBITORATOR_HPP - -#ifdef _MSC_VER -#ifdef _WINDLL -#define DLL_EXPORT __declspec(dllexport) -#else -#define DLL_EXPORT __declspec(dllimport) -#endif -#else -#define DLL_EXPORT -#endif - -#include <string> -#include <list> -#include <memory> -#include <mutex> -#include <deque> -#include "RBAModel.hpp" -#include "RBAResult.hpp" -#include "RBARequestQueMember.hpp" -#include "RBAResultSet.hpp" -#include "RBAResultImpl.hpp" - -/** - * @namespace rba - * @brief The namespace defined by Rule Based Arbitration Framework. - */ -namespace rba -{ - -// internal { -#ifdef RBA_USE_LOG -class RBALogManager; -#endif - -class RBARuleObject; -class RBAExpression; -class RBAModelImpl; -class RBAAffectInfo; -class RBARollbacker; -class RBAWindowRouter; -class RBAConstraintImpl; -// } - -/** - * @class RBAArbitrator - * An object that performs arbitration processing based on rules - * generated from a model.<br> - * Set the model generated using rba::RBAJsonParser in the constructor. - */ -class DLL_EXPORT RBAArbitrator -{ -public: - /** - * @brief Arbitrator logic constractor. - * @param newModel Processing model. - * The model is generated by rba::RBAJsonParser. - */ - RBAArbitrator()=default; - RBAArbitrator(RBAModel* newModel); - - /** - * @brief Arbitrator logic destractor. - */ - RBAArbitrator(const RBAArbitrator&)=delete; - RBAArbitrator(const RBAArbitrator&&)=delete; - RBAArbitrator& operator=(const RBAArbitrator&)=delete; - RBAArbitrator& operator=(const RBAArbitrator&&)=delete; - virtual ~RBAArbitrator() noexcept; - -public: - - /** - * @brief Sets the model for arbitration - * The model is generated by rba::RBAJsonParser. - * @param newModel The model for arbitration - * @details Replace the model with newModel. An arbitrator has only one model at all times. - * Model can be generated by using rba::RBAJsonParser. - * nullptr can not be set. - */ - void setModel(RBAModel* newModel); - - /** - * @brief Returns the model for arbitration - * @return model The model for arbitration - * @details Because the arbitrator always has a model, this API never returns nullptr. - */ - const RBAModel* getModel() const; - - /** - * @brief Set initial requirements of contents and scenes - * @param contexts Context list of contents and scenes requests. - * - * Following is the structure of context name.\n - * *<CONTENT_NAME>* / *<STATE_NAME>* \n\n - * Example of context name: \n - * TEL/Calling\n - * TPMS/NORMAL\n - * AutoDriveScene\n\n - * You can omit "/ <STATE_NAME>" if content has only one state. - * @details After arbitrator creation or calling clearArbitration(), - * you can set initial state of contents and scenes for first arbitration. - * This API does not execute arbitration. - * The information of arbitration result will be empty. - * Don't call this API after starting arbitration until calling clearArbitration(). - * @details - * **Example** - * - * ``` - * RBAJsonParser parser; - * rba::RBAModel* model = parser.parse(JSONFILE_PATH); - * rba::RBAArbitrator* arb = new rba::RBAArbitrator(model); - * - * std::list<std::string> defaultContents = { - * "CONTENT_A/NORMAL", - * "CONTENT_B/NORMAL", - * "CONTENT_C/NORMAL", - * "CONTENT_D/NORMAL", - * }; - * arb->initialize(defaultContents); - * std::unique_ptr<RBAResult> result = arb->execute(); - * ``` - */ - void initialize(std::list<std::string>& contexts); - - /** - * @brief Executes arbitration with one requirement\n - * @param contextName - * Context string of arbitration request.\n - * Display request or sound request : "<CONTENT_NAME>/<STATE_NAME>"\n - * If the content has only one state, the <STATE> can be omitted.\n - * \n - * Scene request : "<SCENE_NAME>" - * @param require - * true : request displaying / outputting content or scene on (default)\n - * false : withdraw a request or scene off. - * - * @return The result of arbitration. - * @details - * Execute Arbitration with one requirement of a content or scene without properties. \n - * The arbitration result as the return value will be generated at every arbitration and - * will not be changed by another arbitration. - * \n - * Context indicates a content state or a scene. - * If the content or scene is not defined in the model, the arbitration will not executed - * and the state of the arbitration result will be UNKNWON_CONTENT_STATE. - * In this case, other property values are undefined.\n - * If the context is empty, this API just execute arbitration. - * \n - * **Exapmle** - * - * ``` - * RBAJsonParser parser; - * rba::RBAModel* model = parser.parse(JSONFILE_PATH); - * rba::RBAArbitrator* arb = new rba::RBAArbitrator(model); - * std::unique_ptr<RBAResult> result = arb->execute("CONTENT_A/NORMAL", true); - * - * if(result->getStatusType() != rba::RBAResultStatusType::SUCCESS) { - * std::cout << "ERROR: Unknown context" << std::endl; - * } - * ``` - * - */ - std::unique_ptr<RBAResult> execute(const std::string& contextName="", - bool require=true); - - /** - * @brief Executes arbitration with multiple requirements\n - * @param contexts List of contexts. - * @param require - * true : request displaying / outputting content or scene on (default)\n - * false : withdraw a request or scene off. - * @return The result of arbitration. - * @details - * \n - * Execute Arbitration with multiple requirements of contents or scenes. \n - * Contents and Scenes can be mixed in the list. - * Display / Outputting request and withdraw request, scene on and scene off request can not be mixed. - * The arbitration result as the return value will be generated at every arbitration and - * will not be changed by another arbitration. - * \n - * Context indicates a content state or a scene. - * If the content or scene is not defined in the model, the arbitration will not executed - * and the state of the arbitration result will be UNKNWON_CONTENT_STATE.\n - * In this case, other property values are undefined.\n - * If the context is empty, this API just execute arbitration. - * \n - * Request order is the with the list. Beginning of the list will be treated as the first coming request. - * \n - * **Exapmle** - * - * ``` - * RBAJsonParser parser; - * rba::RBAModel* model = parser.parse(JSONFILE_PATH); - * rba::RBAArbitrator* arb = new rba::RBAArbitrator(model); - * std::list<std::string> contents = { - * "CONTENT_A/NORMAL", - * "CONTENT_B/NORMAL", - * "CONTENT_C/NORMAL", - * "CONTENT_D/NORMAL", - * }; - * std::unique_ptr<RBAResult> result = arb->execute(contents, true); - * - * if(result->getStatusType() != rba::RBAResultStatusType::SUCCESS) { - * std::cout << "ERROR: Unknown context" << std::endl; - * } - * ``` - * - */ - std::unique_ptr<RBAResult> execute(std::list<std::string>& contexts, - bool require=true); - - /** - * @brief Executes arbitration with a requirement of scene and scene properties. - * @param sceneName The Scene name of arbitration reauest.\n - * @param properties The list of pairs of property name and value. - * @return The result of arbitration. - * @details - * \n - * Sets the scene indicated by sceneName to the property specified - * by properties, and execute arbitration processing.\n - * If sceneName is empty, this API just execute arbitration. - * If the required scene is not defined in the model, the arbitration will not executed - * and the state of the arbitration result will be UNKNWON_CONTENT_STATE.\n - * Even If there is a property not defined in the model, the arbitration will be executed. - * \n - * @note - * You cannot set scene off and property at the same time, by this API.\n - * Use setScene() to set scene off and properties, - * and then call execute(const std::string&,bool) without specifying arguments.\n - * Or Use setScene() to set properties, - * and then call execute(scene name,false).\n - * \n - * @details - * **Example** - * - * ``` - * RBAJsonParser parser; - * rba::RBAModel* model = parser.parse(JSONFILE_PATH); - * rba::RBAArbitrator* arb = new rba::RBAArbitrator(model); - * std::list<std::pair<std::string, std::int32_t>> properties; - * properties.push_back(std::make_pair("Prop1", 10)); - * properties.push_back(std::make_pair("Prop2", 20)); - * std::unique_ptr<RBAResult> result = arb->execute("Scene1", properties); - * - * if(result->getStatusType() != rba::RBAResultStatusType::SUCCESS) { - * std::cout << "ERROR: Unknown context" << std::endl; - * } - * ``` - */ - std::unique_ptr<RBAResult> execute(const std::string& sceneName, - std::list<std::pair<std::string,std::int32_t>>& properties); - - /** - * @brief Replaces the result of arbitration - * @param allocatableName area or zone name - * @param contextName Context string of arbitration request. - * @return The result of arbitration. - * @details - * \n - * Replace allocated a content state to area or zone of the last arbitration result.\n - * If the allocatableName or contextName is undefined, return the errror - * code from the method getStatusType() of result.\n - * If the contextName is non-active, activate the content request. - * This API execute the "Request handling on lost" process and the - * "Execution expression" process, and doesn't execute the check of - * constraint expression process. - * Therefore, this API can lead the result that does not satisfy the constraints\n - * If the specified area or zone by allocatableName is hidden, mute or - * attenuated, these statuses will be kept. - * @deprecated Because there is a possibility that the result does not satisfy - * the constraints, please use execute() - * instead of this API.\n - * \n - * @details - * **Example** - * - * ``` - * RBAJsonParser parser; - * rba::RBAModel* model = parser.parse(JSONFILE_PATH); - * rba::RBAArbitrator* arb = new rba::RBAArbitrator(model); - * std::unique_ptr<RBAResult> result = arb->execute("CONTENT_A/NORMAL", true); - * std::unique_ptr<RBAResult> result_replaced = arb->setResultContentState("AREA_A", "CONTENT_B/NORMAL"); - * - * if(result_replaced->getStatusType() != rba::RBAResultStatusType::SUCCESS) { - * std::cout << "ERROR" << std::endl; - * } - * ``` - */ - std::unique_ptr<RBAResult> - setResultContentState(const std::string& allocatableName, - const std::string& contextName); - - /** - * @brief Cancel last arbitration - * @return The result of arbitration. - * @details - * \n - * Cancel last arbitration and restore internal state immediately.\n - * This API returns the restored result but the ViewActions will be empty.\n - * Do not execute this function more than once continuously. In that case, - * an error occurs.\n - * Even when executed without performing arbitration processing, - * an error occurs.\n - * In case of error, the status of the arbitration result is set to - * CANCEL_ERROR.\n - * \n - * @details - * **Example** - * - * ``` - * RBAJsonParser parser; - * rba::RBAModel* model = parser.parse(JSONFILE_PATH); - * rba::RBAArbitrator* arb = new rba::RBAArbitrator(model); - * std::unique_ptr<RBAResult> result = arb->execute("CONTENT_A/NORMAL", true); - * std::unique_ptr<RBAResult> result_back = arb->cancelArbitration() - * - * if(result_replaced->getStatusType() != rba::RBAResultStatusType::SUCCESS) { - * std::cout << "ERROR" << std::endl; - * } - * ``` - */ - std::unique_ptr<RBAResult> cancelArbitration(); - - /** - * @brief Clear internal states of arbitration. - * @details - * \n - * Initialize internal states of arbitration (ex. Previous arbitration - * result, request of content states, etc...) and set to the initial state.\n - * \n - * @note - * This API is intended for setting up initial state of unit tests.\n - * \n - * @details - * **Example** - * - * ``` - * std::unique_ptr<RBAResult> result1 = arb->execute("CONTENT_A/NORMAL", true); - * std::unique_ptr<RBAResult> result2 = arb->execute("CONTENT_B/NORMAL", true); - * // reset display requests - * arb->clearArbitration(); - * std::unique_ptr<RBAResult> result2 = arb->execute("CONTENT_C/NORMAL", true); - * std::unique_ptr<RBAResult> result3 = arb->execute("CONTENT_D/NORMAL", true); - - * - * ``` - */ - void clearArbitration(); - - /** - * @brief Sets scene ON/OFF requests and properties. - * @param sceneName The Scene name of arbitration reauest.\n - * @param require true : Valid request.\n - * false : Invalid request. - * @param properties The pair of property name and value.\n - * @return true: Success\n - * @return false: Unknown scene\n - * @details - * \n - * Sets the scene indicated by sceneName to the property specified - * by properties, and without execute arbitration processing.\n - * Returns true if the scene set succeeded. If an unknown scene name is - * specified, false is returned.\n - * \n - * @note - * This API is intended for setting up initial state of unit tests\n - * or setting global scene and scene properties.\n - * \n - * @details - * **Example** - * - * ``` - * std::list<std::pair<std::string, std::int32_t>> props; - * props.push_back(std::make_pair("PropertyA", 10); - * props.push_back(std::make_pair("PropertyB", -3); - * res = arb->setScene("SCENE_A", true, props); - * if(res == false) { - * // Unknwon scene - * } - * ``` - */ - bool setScene(const std::string& sceneName, bool require, - std::list<std::pair<std::string, std::int32_t>>& properties); - - /** - * @brief Sets content requests or scene ON/OFF request. - * @param contextName Context string of arbitration request.\n - * @param require - * true : request displaying / outputting content or scene on (default)\n - * false : withdraw a request or scene off. - * @return true: Success\n - * @return false: Unknown context\n - * @details - * \n - * Sets a display request for the context without arbitration.\n - * Returns true if the request setting is succeeded. If an unknown context - * name is specified, false is returned.\n - * \n - * @note - * This API is intended for setting up initial state of unit tests.\n - * While initialize() has only the function to turn on the request, - * this API can turn off the request. It is used for switch of each - * requests when initialization setting of unit test.\n - * \n - * @details - * **Example** - * - * ``` - * res = arb->setContentState("ContentA/NORMAL", true); - * if(res == false) { - * // Unknwon context - * } - * ``` - */ - bool setContentState(const std::string& contextName, bool require); - - /** - * @brief Allocates content state to area or zone. - * @param allocatableName Name of area or zone - * @param contextName Context string of content state.\n - * contextName : "<CONTENT_NAME>/<STATE_NAME>"\n - * If the content has only one state, the <STATE> can be omitted.\n - * \n - * @return true: Success\n - * @return false: Unknown area, zone or context\n - * @details - * \n - * Allocates the content state to the area or zone. Arbitration and - * post arbitration will not be executed.\n - * The display / outputting request of the specified content state will be active. - * The statuses of hidden, mute and attenuated will not be changed.\n - * Returns true if the request setting is succeeded. If an unknown context - * name is specified, false is returned.\n - * - * @note - * This API is intended for setting up initial state of unit tests.\n - * In setResultContentState(), in addition to content state assignment, - * evaluation of the action determination process at the time of arbitration - * losing and control execution expression is performed, whereas in this - * API only content state assignment is performed.\n - * \n - * @deprecated - * Since there is a possibility of contradiction with the - * constraint, it is recommended not to use it except unit test. - * \n - * @details - * **Example** - * - * ``` - * res = arb->setAllocatableResult("AreaA", "ContentA/NORMAL"); - * if(res == false) { - * // Unknwon area, zone or context - * } - * ``` - */ - bool setAllocatableResult(const std::string& allocatableName, - const std::string& contextName); - // internal { -#ifdef RBA_USE_LOG - RBAArbitrator(RBAModel* newModel, RBALogManager* logManager); -#endif - bool evaluate(RBAExpression* expression); - const RBARuleObject* evaluateObject(RBAExpression* expression); - int32_t evaluateValue(RBAExpression* expression); - - // } - -private: -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4251) -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -private: - bool isValidContext(const std::string& context); - bool isValidContext(std::list<std::string>& contexts); - bool setRequestData( - const std::string& context, bool require, - std::list<std::pair<std::string, std::int32_t>>* const properties = nullptr, - std::uint32_t syncIndex = 0xFFFFU); - void setRequestData(const RBAContentState* state, bool require); - void setRequestData(const RBAContent* const content, bool require); - void setActive(const RBASceneImpl* const scene, const bool require); - void setSceneProperty(const RBAAbstractProperty* const prop, const std::int32_t value); - void setRequestData(std::list<std::string>& contexts, const bool require); - -#ifdef RBA_USE_LOG - void checkAllConstraints(); -#endif - void updateResult(); - void checkCancelContent() const; - void createResultData(); - -public: - bool satisfiesConstraints() const; - -private: - std::unique_ptr<RBAResult> arbitrateMain(); - void arbitrate(std::list<RBAAllocatable*>& allocatables); - void arbitrateAllocatable(RBAAllocatable* allocatable, - std::set<const RBAAllocatable*>& revisited, - const std::int32_t nest, RBAAffectInfo* const affectInfo, - RBARollbacker* const parentRollbacker); - - bool sortContentStates(const RBAAllocatable* const allocatable, - std::list<const RBAContentState*>& states) const; - void postArbitrate(); - void changeContentStateCancelWithPolicy(const RBAContentState* const state); - void collectRevisitAllocatable( - std::list<const RBAAllocatable*>* const totalRevisitAllocatables, - RBAAllocatable*& allocatable, - std::list<RBAConstraintImpl*>& falseConstraints, - std::set<const RBAAllocatable*>& revisited); - - static std::int32_t getViewActionPriority(const RBAViewActionType viewActionType); - static bool compareViewAction(const std::unique_ptr<RBAViewAction>& lhs, - const std::unique_ptr<RBAViewAction>& rhs); - -public: - RBAResultImpl* getResult() const; /// Used by rba_tool - bool isCancel(const RBAContentState* const state) const; - -private: - void differenceArbitrate(); - bool checkConstraints(std::list<RBAConstraintImpl*>& constraints, - std::list<RBAConstraintImpl*>& falseConstraints, - const RBAAllocatable* const allocatable); - bool checkConstraintAndReArbitrate(RBAAllocatable* allocatable, - std::set<const RBAAllocatable*>& revisited, - const std::int32_t nest, - RBAAffectInfo* const affectInfo, - RBARollbacker* const parentRollbacker, - std::list<RBAConstraintImpl*>& constraints, - bool * const isSkipped, const bool isFinal); - void setCancel(const RBAContentState* const state, const bool checked); - void getSortedContentStates( - const RBAAllocatable* const allocatable, - std::list<const RBAContentState*>& contentStates) const; - -#ifdef RBA_USE_LOG - void logRequestArbitration(); - void logPreResultArbitration(); - void logRequestForCoverage(); - void logResultArbitration(); - void logResultForCoverage(); - void setLogToResult(); -#endif - -public: - std::set<const RBAContentState*>& getCancelChecked(); - std::unique_ptr<RBAResultImpl>& getResultRef() const; - void setResult(std::unique_ptr<RBAResultImpl> result); - std::unique_ptr<RBAResultSet>& getNextResultSet(); - void setNextResultSet(std::unique_ptr<RBAResultSet> nextResultSet); - std::unique_ptr<RBAResultSet>& getBackupResultSet(); - void setBackupResultSet(std::unique_ptr<RBAResultSet> backupResultSet); - std::unique_ptr<RBAResultSet>& getReservedResultSet(); - void setReservedResultSet(std::unique_ptr<RBAResultSet> reservedResultSet); - std::recursive_mutex& getMutex() const; -#ifdef RBA_USE_LOG - void setSimulationMode(bool simulationMode); -#endif - std::deque<std::unique_ptr<RBARequestQueMember>>& getRequestQue(); - -private: - RBAModelImpl* model_ {nullptr}; - std::set<const RBAContentState*> cancelChecked_; - - mutable std::unique_ptr<RBAResultImpl> result_; - // ResultSet to use as CurrentResultSet in next arbitration - std::unique_ptr<RBAResultSet> nextResultSet_; - // ResultSet to use as PreviousResultSet in next arbitration - std::unique_ptr<RBAResultSet> backupResultSet_; - // ResultSet to be used as CurrentResultSet in cancelArbitration() - std::unique_ptr<RBAResultSet> reservedResultSet_; - // ResultSet to use as CurrentResultSet in satisfiesConstraints() - std::unique_ptr<RBAResultSet> resultSetForSatisfiesConstraints_; - mutable std::recursive_mutex mutex_; -#ifdef RBA_USE_LOG - bool simulationMode_ = false; -#endif - std::deque<std::unique_ptr<RBARequestQueMember>> requestQue_; - -public: - void setModel(RBAModelImpl* const newModel); -}; - -} - -#endif |