blob: 475acbec121f1c5b4c86a9f7410ea30ea655c632 [file] [log] [blame]
Andrew Jeffery275f7c32024-01-31 12:41:14 +10301#pragma once
2
3#include "MCTPEndpoint.hpp"
4
5class MCTPDeviceRepository
6{
7 private:
8 // FIXME: Ugh, hack. Figure out a better data structure?
9 std::map<std::string, std::shared_ptr<MCTPDevice>> devices;
10
11 auto lookup(const std::shared_ptr<MCTPDevice>& device)
12 {
13 auto pred = [&device](const auto& it) { return it.second == device; };
14 return std::ranges::find_if(devices, pred);
15 }
16
17 public:
18 MCTPDeviceRepository() = default;
19 MCTPDeviceRepository(const MCTPDeviceRepository&) = delete;
20 MCTPDeviceRepository(MCTPDeviceRepository&&) = delete;
21 ~MCTPDeviceRepository() = default;
22
23 MCTPDeviceRepository& operator=(const MCTPDeviceRepository&) = delete;
24 MCTPDeviceRepository& operator=(MCTPDeviceRepository&&) = delete;
25
26 void add(const std::string& inventory,
27 const std::shared_ptr<MCTPDevice>& device)
28 {
29 auto [entry, fresh] = devices.emplace(inventory, device);
30 if (!fresh && entry->second.get() != device.get())
31 {
32 throw std::system_error(
33 std::make_error_code(std::errc::device_or_resource_busy),
34 std::format("Tried to add entry for existing device: {}",
35 device->describe()));
36 }
37 }
38
39 void remove(const std::shared_ptr<MCTPDevice>& device)
40 {
41 auto entry = lookup(device);
42 if (entry == devices.end())
43 {
44 throw std::system_error(
45 std::make_error_code(std::errc::no_such_device),
46 std::format("Trying to remove unknown device: {}",
47 entry->second->describe()));
48 }
49 devices.erase(entry);
50 }
51
52 bool contains(const std::shared_ptr<MCTPDevice>& device)
53 {
54 return lookup(device) != devices.end();
55 }
56
57 std::optional<std::string>
58 inventoryFor(const std::shared_ptr<MCTPDevice>& device)
59 {
60 auto entry = lookup(device);
61 if (entry == devices.end())
62 {
63 return {};
64 }
65 return entry->first;
66 }
67
68 std::shared_ptr<MCTPDevice> deviceFor(const std::string& inventory)
69 {
70 auto entry = devices.find(inventory);
71 if (entry == devices.end())
72 {
73 return {};
74 }
75 return entry->second;
76 }
77};