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 10 // UNSUPPORTED: c++03, c++11, c++14, c++17 11 12 #include <__stop_token/intrusive_shared_ptr.h> 13 #include <atomic> 14 #include <cassert> 15 #include <utility> 16 17 #include "test_macros.h" 18 19 struct Object { 20 std::atomic<int> counter = 0; 21 }; 22 23 template <> 24 struct std::__intrusive_shared_ptr_traits<Object> { __get_atomic_ref_countstd::__intrusive_shared_ptr_traits25 static std::atomic<int>& __get_atomic_ref_count(Object& obj) { return obj.counter; } 26 }; 27 28 using Ptr = std::__intrusive_shared_ptr<Object>; 29 main(int,char **)30int main(int, char**) { 31 // default 32 { 33 Ptr ptr; 34 assert(!ptr); 35 } 36 37 // raw ptr 38 { 39 auto object = new Object; 40 Ptr ptr(object); 41 assert(ptr->counter == 1); 42 } 43 44 // copy 45 { 46 auto object = new Object; 47 Ptr ptr(object); 48 auto ptr2 = ptr; 49 assert(ptr->counter == 2); 50 assert(ptr2->counter == 2); 51 } 52 53 // move 54 { 55 auto object = new Object; 56 Ptr ptr(object); 57 auto ptr2 = std::move(ptr); 58 assert(!ptr); 59 assert(ptr2->counter == 1); 60 } 61 62 // copy assign 63 { 64 auto object1 = new Object; 65 auto object2 = new Object; 66 Ptr ptr1(object1); 67 Ptr ptr2(object2); 68 69 ptr1 = ptr2; 70 assert(ptr1->counter == 2); 71 assert(ptr2->counter == 2); 72 } 73 74 // move assign 75 { 76 auto object1 = new Object; 77 auto object2 = new Object; 78 Ptr ptr1(object1); 79 Ptr ptr2(object2); 80 81 ptr1 = std::move(ptr2); 82 assert(ptr1->counter == 1); 83 assert(!ptr2); 84 } 85 86 return 0; 87 } 88