5d4120a0740485e28171b1217183c9034a832eda
[libcds.git] / cds / intrusive / details / dummy_node_holder.h
1 //$$CDS-header$$
2
3 #ifndef __CDS_INTRUSIVE_DETAILS_DUMMY_NODE_HOLDER_H
4 #define __CDS_INTRUSIVE_DETAILS_DUMMY_NODE_HOLDER_H
5
6 #include <cds/gc/gc_fwd.h>
7 #include <cds/details/allocator.h>
8
9 //@cond
10 namespace cds { namespace intrusive { namespace details {
11
12     template <typename GC, typename Node, typename Alloc = CDS_DEFAULT_ALLOCATOR>
13     class dummy_node: public Node
14     {
15         typedef Node    node_type;
16
17         node_type       m_Dummy;
18     public:
19         node_type *     get()
20         {
21             return &m_Dummy;
22         }
23
24         void retire()
25         {}
26     };
27
28     template <typename Node, typename Alloc>
29     class dummy_node< cds::gc::HRC, Node, Alloc >
30     {
31         typedef Node    node_type;
32         typedef cds::gc::HRC    gc;
33         typedef cds::details::Allocator< node_type, Alloc> allocator_type;
34
35         node_type *     m_pDummy;
36
37         struct dummy_node_disposer {
38             void operator()( node_type * p )
39             {
40                 assert( p != null_ptr<node_type *>());
41
42                 p->m_pNext.store( null_ptr<node_type *>(), CDS_ATOMIC::memory_order_release );
43                 allocator_type().Delete( p );
44             }
45         };
46
47     public:
48         dummy_node()
49             : m_pDummy( allocator_type().New() )
50         {}
51
52         node_type *     get()
53         {
54             return m_pDummy;
55         }
56
57         void retire()
58         {
59             gc::template retire<dummy_node_disposer>( m_pDummy );
60         }
61     };
62
63 }}} // namepace cds::intrusive::details
64
65 //@endcond
66
67 #endif // #ifndef __CDS_INTRUSIVE_DETAILS_DUMMY_NODE_HOLDER_H