1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <memory> 10 11 // shared_ptr 12 13 // template<class T, class U> 14 // shared_ptr<T> reinterpret_pointer_cast(const shared_ptr<U>& r) noexcept; 15 16 #include "test_macros.h" 17 18 #include <memory> 19 #include <type_traits> 20 #include <cassert> 21 22 struct A { 23 int x; 24 }; 25 26 struct Base { }; 27 struct Derived : public Base { }; 28 main(int,char **)29int main(int, char**) { 30 { 31 const std::shared_ptr<A> pA(new A); 32 std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA); 33 std::shared_ptr<A> pA2 = std::reinterpret_pointer_cast<A>(pi); 34 assert(pA2.get() == pA.get()); 35 assert(!pi.owner_before(pA) && !pA.owner_before(pi)); 36 } 37 { 38 const std::shared_ptr<A> pA; 39 std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA); 40 std::shared_ptr<A> pA2 = std::reinterpret_pointer_cast<A>(pi); 41 assert(pA2.get() == pA.get()); 42 assert(!pi.owner_before(pA) && !pA.owner_before(pi)); 43 } 44 { 45 const std::shared_ptr<A> pA(new A); 46 std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA); 47 pA->x = 42; 48 assert(*pi == 42); 49 } 50 { 51 const std::shared_ptr<Derived> pDerived(new Derived); 52 std::shared_ptr<Base> pBase = std::reinterpret_pointer_cast<Base>(pDerived); 53 std::shared_ptr<Derived> pDerived2 = std::reinterpret_pointer_cast<Derived>(pBase); 54 assert(pDerived2.get() == pDerived2.get()); 55 assert(!pBase.owner_before(pDerived) && !pDerived.owner_before(pBase)); 56 } 57 { 58 const std::shared_ptr<Base> pBase(new Base); 59 std::shared_ptr<Derived> pDerived = std::reinterpret_pointer_cast<Derived>(pBase); 60 std::shared_ptr<Base> pBase2 = std::reinterpret_pointer_cast<Base>(pDerived); 61 assert(pBase2.get() == pBase.get()); 62 assert(!pDerived.owner_before(pBase) && !pBase.owner_before(pDerived)); 63 } 64 #if TEST_STD_VER > 14 65 { 66 const std::shared_ptr<A[8]> pA; 67 std::shared_ptr<int[8]> pi = std::reinterpret_pointer_cast<int[8]>(pA); 68 std::shared_ptr<A[8]> pA2 = std::reinterpret_pointer_cast<A[8]>(pi); 69 assert(pA2.get() == pA.get()); 70 assert(!pi.owner_before(pA) && !pA.owner_before(pi)); 71 } 72 #endif // TEST_STD_VER > 14 73 74 return 0; 75 } 76