| 393 | */ |
| 394 | template<typename T, typename std::enable_if<std::is_convertible<T*, SharedPtrRefCountable*>::value, int>::type = 0> |
| 395 | T* unsafeSharedMove(std::shared_ptr<T>&& ptr) { |
| 396 | auto* innerPtr = ptr.get(); |
| 397 | |
| 398 | typename std::aligned_storage<sizeof(std::shared_ptr<T>), alignof(std::shared_ptr<T>)>::type storage; |
| 399 | static_assert(sizeof(storage) == sizeof(std::shared_ptr<T>)); |
| 400 | new (&storage) std::shared_ptr<T>(std::move(ptr)); |
| 401 | |
| 402 | return innerPtr; |
| 403 | } |
| 404 | |
| 405 | template<typename T, typename From> |
| 406 | Ref<T> unsafeCast(const Ref<From>& ptr) { |