17f06f613SKrzysztof Grobelny #pragma once 27f06f613SKrzysztof Grobelny 37f06f613SKrzysztof Grobelny #include "interfaces/sensor.hpp" 47f06f613SKrzysztof Grobelny 57f06f613SKrzysztof Grobelny #include <boost/container/flat_map.hpp> 67f06f613SKrzysztof Grobelny #include <boost/system/error_code.hpp> 77f06f613SKrzysztof Grobelny 87f06f613SKrzysztof Grobelny #include <memory> 97f06f613SKrzysztof Grobelny #include <string_view> 107f06f613SKrzysztof Grobelny 117f06f613SKrzysztof Grobelny class SensorCache 127f06f613SKrzysztof Grobelny { 137f06f613SKrzysztof Grobelny public: 147f06f613SKrzysztof Grobelny template <class SensorType, class... Args> makeSensor(std::string_view service,std::string_view path,Args &&...args)15*583ba441SPatrick Williams std::shared_ptr<SensorType> makeSensor( 16*583ba441SPatrick Williams std::string_view service, std::string_view path, Args&&... args) 177f06f613SKrzysztof Grobelny { 187f06f613SKrzysztof Grobelny cleanupExpiredSensors(); 197f06f613SKrzysztof Grobelny 207f06f613SKrzysztof Grobelny auto id = SensorType::makeId(service, path); 217f06f613SKrzysztof Grobelny auto it = sensors.find(id); 227f06f613SKrzysztof Grobelny 237f06f613SKrzysztof Grobelny if (it == sensors.end()) 247f06f613SKrzysztof Grobelny { 257f06f613SKrzysztof Grobelny auto sensor = std::make_shared<SensorType>( 267f06f613SKrzysztof Grobelny std::move(id), std::forward<Args>(args)...); 277f06f613SKrzysztof Grobelny 287f06f613SKrzysztof Grobelny sensors[sensor->id()] = sensor; 297f06f613SKrzysztof Grobelny 307f06f613SKrzysztof Grobelny return sensor; 317f06f613SKrzysztof Grobelny } 327f06f613SKrzysztof Grobelny 337f06f613SKrzysztof Grobelny return std::static_pointer_cast<SensorType>(it->second.lock()); 347f06f613SKrzysztof Grobelny } 357f06f613SKrzysztof Grobelny 367f06f613SKrzysztof Grobelny private: 377f06f613SKrzysztof Grobelny using SensorsContainer = 387f06f613SKrzysztof Grobelny boost::container::flat_map<interfaces::Sensor::Id, 397f06f613SKrzysztof Grobelny std::weak_ptr<interfaces::Sensor>>; 407f06f613SKrzysztof Grobelny 417f06f613SKrzysztof Grobelny SensorsContainer sensors; 427f06f613SKrzysztof Grobelny 437f06f613SKrzysztof Grobelny SensorsContainer::iterator findExpiredSensor(SensorsContainer::iterator); 447f06f613SKrzysztof Grobelny void cleanupExpiredSensors(); 457f06f613SKrzysztof Grobelny }; 46