aboutsummaryrefslogtreecommitdiff
path: root/kapi
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-09-10 14:33:19 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-09-10 14:33:19 +0200
commit14ec8e92b45a2eae5bdb3d459cee9633ea129359 (patch)
treee25ec59134144bbdd00c451136b8425a75d89050 /kapi
parentfcc2527351589b6e3a85e88d01f1d310165aa8af (diff)
downloadkernel-14ec8e92b45a2eae5bdb3d459cee9633ea129359.tar.xz
kernel-14ec8e92b45a2eae5bdb3d459cee9633ea129359.zip
kstd/memory: introduce observer_ptr casts
Diffstat (limited to 'kapi')
-rw-r--r--kapi/kapi/acpi.hpp2
-rw-r--r--kapi/kapi/devices/device.hpp4
-rw-r--r--kapi/kapi/devices/driver.hpp12
-rw-r--r--kapi/kapi/devices/facet_registry.hpp8
4 files changed, 16 insertions, 10 deletions
diff --git a/kapi/kapi/acpi.hpp b/kapi/kapi/acpi.hpp
index eb82c781..49806433 100644
--- a/kapi/kapi/acpi.hpp
+++ b/kapi/kapi/acpi.hpp
@@ -32,7 +32,7 @@ namespace kapi::acpi
template<char const * Signature>
auto get_table() -> kstd::observer_ptr<::acpi::table_type_t<Signature> const>
{
- return kstd::make_observer(static_cast<::acpi::table_type_t<Signature> const *>(get_table(Signature).get()));
+ return static_pointer_cast<::acpi::table_type_t<Signature> const>(get_table(Signature));
}
} // namespace kapi::acpi
diff --git a/kapi/kapi/devices/device.hpp b/kapi/kapi/devices/device.hpp
index c3a33daf..6b2288e5 100644
--- a/kapi/kapi/devices/device.hpp
+++ b/kapi/kapi/devices/device.hpp
@@ -71,7 +71,7 @@ namespace kapi::devices
template<typename FacetType>
[[nodiscard]] auto facet() -> kstd::observer_ptr<FacetType>
{
- return kstd::observer_ptr{static_cast<FacetType *>(facet(FacetType::id).get())};
+ return static_pointer_cast<FacetType>(facet(FacetType::id));
}
//! Get a specific facet of this device, if it supports it.
@@ -81,7 +81,7 @@ namespace kapi::devices
template<typename FacetType>
[[nodiscard]] auto facet() const noexcept -> kstd::observer_ptr<FacetType const>
{
- return kstd::observer_ptr{static_cast<FacetType const *>(facet(FacetType::id).get())};
+ return static_pointer_cast<FacetType const>(facet(FacetType::id));
}
//! Check if this device has a specific facet.
diff --git a/kapi/kapi/devices/driver.hpp b/kapi/kapi/devices/driver.hpp
index 8c4d5e97..e789b19a 100644
--- a/kapi/kapi/devices/driver.hpp
+++ b/kapi/kapi/devices/driver.hpp
@@ -69,7 +69,7 @@ namespace kapi::devices
template<typename FacetType>
[[nodiscard]] auto facet() -> kstd::observer_ptr<FacetType>
{
- return kstd::observer_ptr{static_cast<FacetType *>(query_facet(FacetType::id))};
+ return static_pointer_cast<FacetType>(query_facet(FacetType::id));
}
//! Retrieve this drivers implementation of a given capability facet.
@@ -79,8 +79,7 @@ namespace kapi::devices
template<typename FacetType>
[[nodiscard]] auto facet() const -> kstd::observer_ptr<FacetType const>
{
- return kstd::observer_ptr{
- static_cast<FacetType const *>(const_cast<driver *>(this)->query_facet(FacetType::id).get())};
+ return static_pointer_cast<FacetType const>(query_facet(FacetType::id));
}
//! Check if this driver implements a given capability facet.
@@ -110,6 +109,13 @@ namespace kapi::devices
protected:
//! Return a pointer to the implementation of the given facet if this driver supports it.
virtual auto query_facet(kapi::capabilities::facet_id facet) -> kstd::observer_ptr<void>;
+
+ private:
+ //! Return a pointer to the implementation of the given facet if this driver supports it.
+ [[nodiscard]] auto query_facet(kapi::capabilities::facet_id facet) const -> kstd::observer_ptr<void const>
+ {
+ return const_cast<driver *>(this)->query_facet(facet);
+ }
};
//! @}
diff --git a/kapi/kapi/devices/facet_registry.hpp b/kapi/kapi/devices/facet_registry.hpp
index 5e0367c1..4fa6186a 100644
--- a/kapi/kapi/devices/facet_registry.hpp
+++ b/kapi/kapi/devices/facet_registry.hpp
@@ -99,7 +99,7 @@ namespace kapi::devices
{
if (m_id == FacetType::id)
{
- return kstd::observer_ptr{static_cast<FacetType *>(untyped_facet().get())};
+ return static_pointer_cast<FacetType>(untyped_facet());
}
return nullptr;
}
@@ -112,7 +112,7 @@ namespace kapi::devices
{
if (m_id == FacetType::id)
{
- return kstd::observer_ptr{static_cast<FacetType const *>(untyped_facet().get())};
+ return static_pointer_cast<FacetType const>(untyped_facet());
}
return nullptr;
}
@@ -213,7 +213,7 @@ namespace kapi::devices
template<typename FacetType>
[[nodiscard]] auto resolve(std::string_view name) -> kstd::observer_ptr<FacetType>
{
- return kstd::observer_ptr{static_cast<FacetType *>(resolve(FacetType::id, name).get())};
+ return static_pointer_cast<FacetType>(resolve(FacetType::id, name));
}
//! Attempt to resolve a facet for a device.
@@ -223,7 +223,7 @@ namespace kapi::devices
template<typename FacetType>
[[nodiscard]] auto resolve(device & device) -> kstd::observer_ptr<FacetType>
{
- return kstd::observer_ptr{static_cast<FacetType *>(resolve(FacetType::id, device).get())};
+ return static_pointer_cast<FacetType>(resolve(FacetType::id, device));
}
//! Subscribe to facet publish/withdraw notifications.