3 #ifndef CDSLIB_INTRUSIVE_DETAILS_RAW_PTR_DISPOSER_H
4 #define CDSLIB_INTRUSIVE_DETAILS_RAW_PTR_DISPOSER_H
6 #include <cds/details/defs.h>
9 namespace cds { namespace intrusive { namespace details {
11 template <typename RCU, typename NodeType, typename Disposer>
12 struct raw_ptr_disposer
15 typedef NodeType node_type;
16 typedef Disposer disposer;
18 node_type * pReclaimedChain;
21 : pReclaimedChain( nullptr )
24 template <typename Position>
25 explicit raw_ptr_disposer( Position& pos )
26 : pReclaimedChain( pos.pDelChain )
28 pos.pDelChain = nullptr;
31 raw_ptr_disposer( raw_ptr_disposer&& d )
32 : pReclaimedChain( d.pReclaimedChain )
34 d.pReclaimedChain = nullptr;
37 raw_ptr_disposer( raw_ptr_disposer const& ) = delete;
44 raw_ptr_disposer& operator=(raw_ptr_disposer&& d)
46 assert( pReclaimedChain == nullptr );
47 pReclaimedChain = d.pReclaimedChain;
48 d.pReclaimedChain = nullptr;
52 raw_ptr_disposer& operator=(raw_ptr_disposer const& d) = delete;
56 if ( pReclaimedChain ) {
57 assert( !gc::is_locked());
58 disposer()( pReclaimedChain );
59 pReclaimedChain = nullptr;
64 }}} // namespace cds::intrusive::details
67 #endif // #ifndef CDSLIB_INTRUSIVE_DETAILS_RAW_PTR_DISPOSER_H