diff options
Diffstat (limited to 'kernel/kapi/devices/interface_registry.cpp')
| -rw-r--r-- | kernel/kapi/devices/interface_registry.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/kernel/kapi/devices/interface_registry.cpp b/kernel/kapi/devices/interface_registry.cpp index d959c857..2ff42aa3 100644 --- a/kernel/kapi/devices/interface_registry.cpp +++ b/kernel/kapi/devices/interface_registry.cpp @@ -85,30 +85,41 @@ namespace kapi::devices return filtered; } - auto interface_registry::find(interface interface, std::string_view name) const -> kstd::result<entry> + auto interface_registry::resolve(interface interface, std::string_view name) -> void * { auto found = std::ranges::find_if( m_entries, [&](auto e) { return e.interface() == interface && e.name() == name && e.device(); }); + if (found == m_entries.cend()) { - return kstd::failure(make_error_code(kstd::errc::no_such_device)); + return nullptr; + } + else if (auto device = found->device()) + { + return resolve(interface, *device); } - return *found; + return nullptr; } - auto interface_registry::find(interface interface, device const & device) const -> kstd::result<entry> + auto interface_registry::resolve(interface interface, device & device) -> void * { + if (auto by_device = device.as(interface)) + { + return by_device; + } + auto found = std::ranges::find_if(m_entries, [&](auto e) { auto locked_device = e.device(); return e.interface() == interface && locked_device && locked_device.get() == &device; }); + if (found == m_entries.cend()) { - return kstd::failure(make_error_code(kstd::errc::no_such_device)); + return nullptr; } - return *found; + return found->implementation(); } } // namespace kapi::devices |
