| #pragma once |
| |
| #include "interfaces/sensor.hpp" |
| |
| #include <boost/container/flat_map.hpp> |
| #include <boost/system/error_code.hpp> |
| |
| #include <iostream> |
| #include <memory> |
| #include <string_view> |
| |
| class SensorCache |
| { |
| public: |
| template <class SensorType, class... Args> |
| std::shared_ptr<SensorType> makeSensor(std::string_view service, |
| std::string_view path, |
| Args&&... args) |
| { |
| cleanupExpiredSensors(); |
| |
| auto id = SensorType::makeId(service, path); |
| auto it = sensors.find(id); |
| |
| if (it == sensors.end()) |
| { |
| auto sensor = std::make_shared<SensorType>( |
| std::move(id), std::forward<Args>(args)...); |
| |
| sensors[sensor->id()] = sensor; |
| |
| return sensor; |
| } |
| |
| return std::static_pointer_cast<SensorType>(it->second.lock()); |
| } |
| |
| private: |
| using SensorsContainer = |
| boost::container::flat_map<interfaces::Sensor::Id, |
| std::weak_ptr<interfaces::Sensor>>; |
| |
| SensorsContainer sensors; |
| |
| SensorsContainer::iterator findExpiredSensor(SensorsContainer::iterator); |
| void cleanupExpiredSensors(); |
| }; |