3 #ifndef __CDS_DETAILS_FUNCTOR_WRAPPER_H
4 #define __CDS_DETAILS_FUNCTOR_WRAPPER_H
9 namespace cds { namespace details {
11 template <typename Functor>
12 struct functor_wrapper
18 functor_wrapper( Functor /*f*/)
27 template <typename Functor>
28 struct functor_wrapper<Functor&>
32 functor_wrapper( Functor& f)
42 template <typename Functor>
43 struct functor_wrapper< boost::reference_wrapper<Functor> >
45 boost::reference_wrapper<Functor> m_func;
47 functor_wrapper( boost::reference_wrapper<Functor> f)
57 #ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
58 template <typename Result, typename... Args>
59 struct functor_wrapper<Result (*)(Args...)>
61 typedef Result (* func_ptr)(Args...);
62 typedef Result (& func_ref)(Args...);
65 functor_wrapper( func_ptr f )
71 assert( m_func != NULL );
76 template <typename Result>
77 struct functor_wrapper<Result (*)()>
79 typedef Result (* func_ptr)();
80 typedef Result (& func_ref)();
83 functor_wrapper( func_ptr f )
89 assert( m_func != NULL );
94 template <typename Result, typename Arg1>
95 struct functor_wrapper<Result (*)(Arg1)>
97 typedef Result (* func_ptr)(Arg1);
98 typedef Result (& func_ref)(Arg1);
101 functor_wrapper( func_ptr f )
107 assert( m_func != NULL );
112 template <typename Result, typename Arg1, typename Arg2>
113 struct functor_wrapper<Result (*)(Arg1, Arg2)>
115 typedef Result (* func_ptr)(Arg1, Arg2);
116 typedef Result (& func_ref)(Arg1, Arg2);
119 functor_wrapper( func_ptr f )
125 assert( m_func != NULL );
130 template <typename Result, typename Arg1, typename Arg2, typename Arg3>
131 struct functor_wrapper<Result (*)(Arg1, Arg2, Arg3)>
133 typedef Result (* func_ptr)(Arg1, Arg2, Arg3);
134 typedef Result (& func_ref)(Arg1, Arg2, Arg3);
137 functor_wrapper( func_ptr f )
143 assert( m_func != NULL );
149 }} // namespace cds::details
152 #endif // #ifndef __CDS_DETAILS_FUNCTOR_WRAPPER_H