#include #include #include #include #include #include #include #include #include #include #include #include #include namespace kapi::devices { device::device(kstd::string const & name) : m_name(name) {} auto device::facet(kapi::capabilities::facet_id facet) noexcept -> void * { return query_facet(facet); } auto device::facet(kapi::capabilities::facet_id facet) const noexcept -> void const * { return const_cast(this)->query_facet(facet); } auto device::has_facet(kapi::capabilities::facet_id facet) const noexcept -> bool { return const_cast(this)->query_facet(facet) != nullptr; } auto device::name() const -> kstd::string const & { return m_name; } auto device::parent() const -> kstd::shared_ptr { auto guard = kstd::lock_guard{m_lock}; return m_parent.lock(); } auto device::state() const noexcept -> enum state { auto guard = kstd::lock_guard{m_lock}; return m_state; } auto device::set_state(enum state state) -> void { auto guard = kstd::lock_guard{m_lock}; m_state = state; } auto device::bound_driver() const noexcept -> driver * { auto guard = kstd::lock_guard{m_lock}; return m_driver.lock().get(); } auto device::bind_driver(kstd::weak_ptr driver) -> void { auto guard = kstd::lock_guard{m_lock}; m_driver = driver; } auto device::driver_data() const -> kstd::shared_ptr { auto guard = kstd::lock_guard{m_lock}; return m_driver_data; } auto device::set_driver_data(kstd::shared_ptr data) -> void { auto guard = kstd::lock_guard{m_lock}; m_driver_data = data; } auto device::resources() const -> kstd::vector { auto guard = kstd::lock_guard{m_lock}; return m_resources; } auto device::request_resource(resource_type type, std::size_t index) const -> kstd::result { auto guard = kstd::lock_guard{m_lock}; auto numbered_resources = std::views::enumerate(m_resources); auto found = std::ranges::find_if(numbered_resources, [&](auto entry) { auto const & [number, resource] = entry; return resource.type == type && static_cast(number) == index; }); if (found != numbered_resources.end()) { return kstd::success(*found.base()); } return kstd::failure(make_error_code(kstd::errc::invalid_argument)); } auto device::set_resources(kstd::vector resources) -> void { auto guard = kstd::lock_guard{m_lock}; m_resources = resources; } auto device::query_facet(kapi::capabilities::facet_id) -> void * { return nullptr; } auto device::set_parent(kstd::weak_ptr parent) -> void { auto guard = kstd::lock_guard{m_lock}; m_parent = parent; } } // namespace kapi::devices