Remove CDS_RVALUE_SUPPORT, CDS_MOVE_SEMANTICS_SUPPORT macros and emulating code
[libcds.git] / cds / details / functor_wrapper.h
1 //$$CDS-header$$
2
3 #ifndef __CDS_DETAILS_FUNCTOR_WRAPPER_H
4 #define __CDS_DETAILS_FUNCTOR_WRAPPER_H
5
6 #include <cds/ref.h>
7
8 //@cond
9 namespace cds { namespace details {
10
11     template <typename Functor>
12     struct functor_wrapper
13     {
14     public:
15         functor_wrapper()
16         {}
17
18         functor_wrapper( Functor /*f*/)
19         {}
20
21         Functor get()
22         {
23             return Functor();
24         }
25     };
26
27     template <typename Functor>
28     struct functor_wrapper<Functor&>
29     {
30         Functor&    m_func;
31     public:
32         functor_wrapper( Functor& f)
33         : m_func(f)
34         {}
35
36         Functor& get()
37         {
38             return m_func;
39         }
40     };
41
42     template <typename Functor>
43     struct functor_wrapper< boost::reference_wrapper<Functor> >
44     {
45         boost::reference_wrapper<Functor>    m_func;
46     public:
47         functor_wrapper( boost::reference_wrapper<Functor> f)
48         : m_func(f)
49         {}
50
51         Functor& get()
52         {
53             return m_func.get();
54         }
55     };
56
57     template <typename Result, typename... Args>
58     struct functor_wrapper<Result (*)(Args...)>
59     {
60         typedef Result (* func_ptr)(Args...);
61         typedef Result (& func_ref)(Args...);
62         func_ptr m_func;
63     public:
64         functor_wrapper( func_ptr f )
65             : m_func(f)
66         {}
67
68         func_ref get()
69         {
70             assert( m_func );
71             return *m_func;
72         }
73     };
74 }}  // namespace cds::details
75 //@endcond
76
77 #endif // #ifndef __CDS_DETAILS_FUNCTOR_WRAPPER_H