diff options
| -rw-r--r-- | kapi/kapi/acpi.hpp | 2 | ||||
| -rw-r--r-- | kapi/kapi/devices/device.hpp | 4 | ||||
| -rw-r--r-- | kapi/kapi/devices/driver.hpp | 12 | ||||
| -rw-r--r-- | kapi/kapi/devices/facet_registry.hpp | 8 | ||||
| -rw-r--r-- | libs/kstd/kstd/bits/observer_ptr.hpp | 42 |
5 files changed, 58 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. diff --git a/libs/kstd/kstd/bits/observer_ptr.hpp b/libs/kstd/kstd/bits/observer_ptr.hpp index d53ab5a0..d0c40549 100644 --- a/libs/kstd/kstd/bits/observer_ptr.hpp +++ b/libs/kstd/kstd/bits/observer_ptr.hpp @@ -160,6 +160,48 @@ namespace kstd return observer_ptr<ElementType>{pointer}; } + template<typename T, typename U> + [[nodiscard]] constexpr auto static_pointer_cast(observer_ptr<U> const & other) noexcept -> observer_ptr<T> + { + return observer_ptr{static_cast<observer_ptr<T>::element_type *>(other.get())}; + } + + template<typename T, typename U> + [[nodiscard]] constexpr auto static_pointer_cast(observer_ptr<U> && other) noexcept -> observer_ptr<T> + { + return observer_ptr{static_cast<observer_ptr<T>::element_type *>(std::move(other).get())}; + } + + template<typename T, typename U> + [[nodiscard]] constexpr auto dynamic_pointer_cast(observer_ptr<U> const & other) noexcept -> observer_ptr<T> = delete; + + template<typename T, typename U> + [[nodiscard]] constexpr auto dynamic_pointer_cast(observer_ptr<U> && other) noexcept -> observer_ptr<T> = delete; + + template<typename T, typename U> + [[nodiscard]] constexpr auto const_pointer_cast(observer_ptr<U> const & other) noexcept -> observer_ptr<T> + { + return observer_ptr{const_cast<observer_ptr<T>::element_type *>(other.get())}; + } + + template<typename T, typename U> + [[nodiscard]] constexpr auto const_pointer_cast(observer_ptr<U> && other) noexcept -> observer_ptr<T> + { + return observer_ptr{const_cast<observer_ptr<T>::element_type *>(other.get())}; + } + + template<typename T, typename U> + [[nodiscard]] constexpr auto reinterpret_pointer_cast(observer_ptr<U> const & other) noexcept -> observer_ptr<T> + { + return observer_ptr{reinterpret_cast<observer_ptr<T>::element_type *>(other.get())}; + } + + template<typename T, typename U> + [[nodiscard]] constexpr auto reinterpret_pointer_cast(observer_ptr<U> && other) noexcept -> observer_ptr<T> + { + return observer_ptr{reinterpret_cast<observer_ptr<T>::element_type *>(other.get())}; + } + } // namespace kstd #endif
\ No newline at end of file |
