From 26693e9774804e8f5afc53953fee9920d33688ae Mon Sep 17 00:00:00 2001 From: Sayan Date: Sat, 4 Oct 2025 23:14:11 -0400 Subject: [PATCH 1/2] improvements and image --- fastcast.hpp | 28 ++++++++++------------------ ptroffset.png | Bin 0 -> 3278 bytes 2 files changed, 10 insertions(+), 18 deletions(-) create mode 100644 ptroffset.png diff --git a/fastcast.hpp b/fastcast.hpp index c5c27df..9be6c8e 100644 --- a/fastcast.hpp +++ b/fastcast.hpp @@ -18,7 +18,6 @@ #define CONSTEXPR #endif - namespace fastcast { // Core implementation for pointer types @@ -59,12 +58,10 @@ template CONSTEXPR inline To cast_impl(From *ptr) { // slow path auto result = dynamic_cast(ptr); cached_vtable = this_vtable; - if (result) { - offset = reinterpret_cast(result) - - reinterpret_cast(ptr); - } else { - offset = FAILED_OFFSET; - } + offset = static_cast(result) + ? reinterpret_cast(result) - + reinterpret_cast(ptr) + : FAILED_OFFSET; return result; } } @@ -84,25 +81,20 @@ template requires std::is_reference_v constexpr inline To fast_cast(From &ref) { using ToPtr = std::add_pointer_t>; - auto casted_ptr = fast_cast(&ref); - if (!casted_ptr) - throw std::bad_cast{}; - return *casted_ptr; + if (auto casted = fast_cast(&ref)) + return *casted; + throw std::bad_cast{}; } // shared_ptr overload template constexpr inline std::shared_ptr fast_dynamic_pointer_cast(const std::shared_ptr &ptr) { - return std::shared_ptr(ptr, fast_cast(ptr.get())); + if (auto raw = fast_cast(ptr.get())) + return std::shared_ptr(ptr, std::move(raw)); + return nullptr; } -// Identity cast (same type) -template - requires std::is_same_v, std::remove_cv_t> -constexpr inline To fast_cast(To ptr) { - return ptr; -} } // namespace fastcast using fastcast::fast_cast; diff --git a/ptroffset.png b/ptroffset.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc45e5e3c32a819de593f60d61db4de31ea45f6 GIT binary patch literal 3278 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 M&Sg0d%yRxg6HyCdBme*a literal 0 HcmV?d00001 From 8858c969eaca90f123d1dc8499e05459d7254f5a Mon Sep 17 00:00:00 2001 From: Sayan Date: Sat, 4 Oct 2025 23:15:18 -0400 Subject: [PATCH 2/2] update reamde --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a0a1940..5d51dc2 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,9 @@ correctness. The code is heavily inspired by [FastDynamicCast](https://github.com/tobspr/FastDynamicCast). This is effectively a -modern C++ implementation of FastDynamicCast. +modern C++ implementation of FastDynamicCast. This is the basic idea in a single image + +![offset](ptroffset.png) # Improvements from FastDynamicCast