• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 **)30 int 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