blob: 3e19721482ee82530b61e81b202d4eca30d5b28a [file] [log] [blame]
#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();
};