1 #pragma once 2 3 #include "interfaces/sensor.hpp" 4 5 #include <boost/asio/io_context.hpp> 6 7 struct ThresholdOperations 8 { 9 template <typename ThresholdType> 10 static void initialize(ThresholdType* thresholdPtr) 11 { 12 for ([[maybe_unused]] auto& [sensor, detail] : 13 thresholdPtr->sensorDetails) 14 { 15 sensor->registerForUpdates(thresholdPtr->weak_from_this()); 16 } 17 thresholdPtr->initialized = true; 18 } 19 20 template <typename ThresholdType> 21 static typename ThresholdType::ThresholdDetail& 22 getDetails(ThresholdType* thresholdPtr, 23 const interfaces::Sensor& sensor) 24 { 25 auto it = std::find_if( 26 thresholdPtr->sensorDetails.begin(), 27 thresholdPtr->sensorDetails.end(), 28 [&sensor](const auto& x) { return &sensor == x.first.get(); }); 29 return *it->second; 30 } 31 32 template <typename ThresholdType> 33 static void updateSensors(ThresholdType* thresholdPtr, Sensors newSensors) 34 { 35 typename ThresholdType::SensorDetails newSensorDetails; 36 typename ThresholdType::SensorDetails oldSensorDetails = 37 thresholdPtr->sensorDetails; 38 39 for (const auto& sensor : newSensors) 40 { 41 auto it = std::find_if( 42 oldSensorDetails.begin(), oldSensorDetails.end(), 43 [&sensor](const auto& sd) { return sensor == sd.first; }); 44 if (it != oldSensorDetails.end()) 45 { 46 newSensorDetails.emplace(*it); 47 oldSensorDetails.erase(it); 48 continue; 49 } 50 51 newSensorDetails.emplace( 52 sensor, thresholdPtr->makeDetails(sensor->getName())); 53 if (thresholdPtr->initialized) 54 { 55 sensor->registerForUpdates(thresholdPtr->weak_from_this()); 56 } 57 } 58 59 if (thresholdPtr->initialized) 60 { 61 for ([[maybe_unused]] auto& [sensor, detail] : oldSensorDetails) 62 { 63 sensor->unregisterFromUpdates(thresholdPtr->weak_from_this()); 64 } 65 } 66 67 thresholdPtr->sensorDetails = std::move(newSensorDetails); 68 } 69 }; 70