Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-06-02 08:51:49

0001 #ifndef SERVICE_OBJECT_TYPED_H
0002 #define SERVICE_OBJECT_TYPED_H
0003 
0004 /**
0005  * @file ServiceObjectTyped.h
0006  * @author Bryan BERTHOU (SPhN / CEA Saclay)
0007  * @date February 26, 2016
0008  * @version 1.0
0009  */
0010 
0011 #include <ElementaryUtils/string_utils/StringUtils.h>
0012 #include <stddef.h>
0013 #include <SFML/System/Lock.hpp>
0014 #include <SFML/System/Mutex.hpp>
0015 #include <string>
0016 
0017 #include "beans/automation/Scenario.h"
0018 #include "beans/automation/Task.h"
0019 #include "beans/List.h"
0020 #include "beans/system/ResultInfo.h"
0021 #include "ResourceManager.h"
0022 #include "ServiceObject.h"
0023 
0024 //TODO How to handle random computation from thread ? How to index results for later compare ?
0025 
0026 namespace PARTONS {
0027 
0028 /** @class ServiceObjectTyped
0029  *
0030  * @brief Abstract class for a service.
0031  */
0032 template<typename KinematicType, typename ResultType>
0033 class ServiceObjectTyped: public ServiceObject {
0034 
0035 public:
0036 
0037     static const std::string SERVICE_OBJECT_PRINT_RESULTS; ///< Name of the XML task used to print results via Logger.
0038 
0039     /**
0040      * Destructor.
0041      */
0042     virtual ~ServiceObjectTyped() {
0043     }
0044 
0045     virtual void resolveObjectDependencies() {
0046         ServiceObject::resolveObjectDependencies();
0047     }
0048 
0049     /**
0050      * Add single result to result list.
0051      */
0052     void add(const ResultType &result) {
0053 
0054         sf::Lock lock(m_mutexResultListBuffer); // mutex.lock()
0055         m_resultListBuffer.add(result);
0056     } // mutex.unlock()
0057 
0058     /**
0059      * Add many results to result list.
0060      */
0061     void add(const List<ResultType> &resultList) {
0062 
0063         sf::Lock lock(m_mutexResultListBuffer); // mutex.lock()
0064 
0065         for (size_t i = 0; i != resultList.size(); i++) {
0066             m_resultListBuffer.add(resultList[i]);
0067         }
0068     } // mutex.unlock()
0069 
0070     /**
0071      * Sort result list.
0072      */
0073     void sortResultList() {
0074 
0075         sf::Lock lock(m_mutexResultListBuffer); // mutex.lock()
0076         m_resultListBuffer.sort();
0077     } // mutex.unlock()
0078 
0079     /**
0080      * Get result list.
0081      */
0082     List<ResultType>& getResultList() {
0083 
0084         sf::Lock lock(m_mutexResultListBuffer); // mutex.lock()
0085         return m_resultListBuffer;
0086     } // mutex.unlock()
0087 
0088     /**
0089      * Clear result list.
0090      */
0091     void clearResultListBuffer() {
0092 
0093         sf::Lock lock(m_mutexResultListBuffer); // mutex.lock()
0094         m_resultListBuffer.clear();
0095     } // mutex.unlock()
0096 
0097     /**
0098      * Clear kinematic list.
0099      */
0100     void clearKinematicListBuffer() {
0101 
0102         sf::Lock lock(m_mutexKinematicList); // mutex.lock()
0103         m_kinematicListBuffer.clear();
0104     } // mutex.unlock()
0105 
0106     /**
0107      * Compute scenario.
0108      */
0109     List<ResultType> computeScenario(Scenario& scenario) {
0110 
0111         List<ResultType> resultList;
0112 
0113         for (size_t i = 0; i != scenario.size(); i++) {
0114             computeTask(scenario.getTask(i));
0115         }
0116 
0117         resultList = getResultList();
0118         clearResultListBuffer();
0119 
0120         return resultList;
0121     }
0122 
0123     /**
0124      * Flush result list.
0125      */
0126     List<ResultType> flushResultList() {
0127 
0128         sf::Lock lock(m_mutexResultListBuffer); // mutex.lock()
0129 
0130         List<ResultType> resultList = m_resultListBuffer;
0131         m_resultListBuffer.clear();
0132 
0133         return resultList;
0134     } // mutex.unlock()
0135 
0136     /**
0137      * Compute task.
0138      */
0139     virtual void computeTask(Task &task) {
0140 
0141         m_resultInfo = ResultInfo();
0142 
0143         m_resultInfo.setScenarioTaskIndexNumber(
0144                 task.getScenarioTaskIndexNumber());
0145 
0146         Scenario * tempSenario =
0147                 ResourceManager::getInstance()->registerScenario(
0148                         task.getScenario());
0149 
0150         if (tempSenario) {
0151             m_resultInfo.setScenarioHashSum(tempSenario->getHashSum());
0152         }
0153     }
0154 
0155 protected:
0156 
0157     /**
0158      * Default constructor.
0159      */
0160     ServiceObjectTyped(const std::string &className) :
0161             ServiceObject(className), m_batchSize(1000) {
0162     }
0163 
0164     unsigned int m_batchSize; ///< Batch size.
0165 
0166     sf::Mutex m_mutexKinematicList; ///< Mutex for kinematic list.
0167     sf::Mutex m_mutexResultListBuffer; ///< Mutex for result list.
0168 
0169     List<KinematicType> m_kinematicListBuffer; ///< Kinematic list.
0170     List<ResultType> m_resultListBuffer; ///< Result list.
0171 
0172     ResultInfo m_resultInfo; ///< Result info.
0173 
0174     /**
0175      * General tasks.
0176      */
0177     bool computeGeneralTask(Task &task) {
0178 
0179         bool isEvaluated = false;
0180 
0181         if (ElemUtils::StringUtils::equals(task.getFunctionName(),
0182                 SERVICE_OBJECT_PRINT_RESULTS)) {
0183 
0184             printResultListBuffer();
0185             isEvaluated = true;
0186         }
0187 
0188         return isEvaluated;
0189     }
0190 
0191     /**
0192      * Print results to buffer.
0193      */
0194     void printResultListBuffer() {
0195         for (unsigned int i = 0; i != m_resultListBuffer.size(); i++) {
0196             info(__func__, m_resultListBuffer[i].toString());
0197         }
0198     }
0199 
0200     /**
0201      * Update result info.
0202      */
0203     void updateResultInfo(ResultType &result, const ResultInfo &resultInfo) {
0204         result.setResultInfo(resultInfo);
0205     }
0206 
0207     /**
0208      * Update result info.
0209      */
0210     void updateResultInfo(List<ResultType> &resultList,
0211             const ResultInfo &resultInfo) {
0212         for (size_t i = 0; i != resultList.size(); i++) {
0213             updateResultInfo(resultList[i], resultInfo);
0214         }
0215     }
0216 };
0217 
0218 template<typename KinematicType, typename ResultType>
0219 const std::string ServiceObjectTyped<KinematicType, ResultType>::SERVICE_OBJECT_PRINT_RESULTS =
0220         "printResults";
0221 
0222 } /* namespace PARTONS */
0223 
0224 #endif /* SERVICE_OBJECT_TYPED_H */