typo fixed
[libcds.git] / cds / intrusive / details / raw_ptr_disposer.h
1 //$$CDS-header$$
2
3 #ifndef CDSLIB_INTRUSIVE_DETAILS_RAW_PTR_DISPOSER_H
4 #define CDSLIB_INTRUSIVE_DETAILS_RAW_PTR_DISPOSER_H
5
6 #include <cds/details/defs.h>
7
8 //@cond
9 namespace cds { namespace intrusive { namespace details {
10
11     template <typename RCU, typename NodeType, typename Disposer>
12     struct raw_ptr_disposer
13     {
14         typedef RCU gc;
15         typedef NodeType node_type;
16         typedef Disposer disposer;
17
18         node_type *     pReclaimedChain;
19
20         raw_ptr_disposer()
21             : pReclaimedChain( nullptr )
22         {}
23
24         template <typename Position>
25         explicit raw_ptr_disposer( Position& pos )
26             : pReclaimedChain( pos.pDelChain )
27         {
28             pos.pDelChain = nullptr;
29         }
30
31         raw_ptr_disposer( raw_ptr_disposer&& d )
32             : pReclaimedChain( d.pReclaimedChain )
33         {
34             d.pReclaimedChain = nullptr;
35         }
36
37         raw_ptr_disposer( raw_ptr_disposer const& ) = delete;
38
39         ~raw_ptr_disposer()
40         {
41             apply();
42         }
43
44         raw_ptr_disposer& operator=(raw_ptr_disposer&& d)
45         {
46             assert( pReclaimedChain == nullptr );
47             pReclaimedChain = d.pReclaimedChain;
48             d.pReclaimedChain = nullptr;
49             return *this;
50         }
51
52         raw_ptr_disposer& operator=(raw_ptr_disposer const& d) = delete;
53
54         void apply()
55         {
56             if ( pReclaimedChain ) {
57                 assert( !gc::is_locked());
58                 disposer()( pReclaimedChain );
59                 pReclaimedChain = nullptr;
60             }
61         }
62     };
63
64 }}} // namespace cds::intrusive::details
65 //@endcond
66
67 #endif // #ifndef CDSLIB_INTRUSIVE_DETAILS_RAW_PTR_DISPOSER_H