emlabcpp
modern opinionated embedded C++ library
function_view.h
Go to the documentation of this file.
1 
24 #pragma once
25 
26 #include <concepts>
27 
28 namespace emlabcpp
29 {
30 
31 template < typename MemberFunctionPtr >
33 
34 template < typename ReturnType, typename Object, typename... ArgTypes >
35 struct _member_function_traits< ReturnType ( Object::* )( ArgTypes... ) >
36 {
37  using signature = ReturnType( ArgTypes... );
38  using object = Object;
39 };
40 
41 template < typename Signature >
43 
44 template < auto MemberFunctionPtr >
46 {
47  using traits = _member_function_traits< decltype( MemberFunctionPtr ) >;
48  using signature = typename traits::signature;
49  using object = typename traits::object;
50 
51  member_function( object& object )
52  : obj( object )
53  {
54  }
55 
56  object& obj;
57 };
58 
59 template < typename ReturnType, typename... ArgTypes >
60 class function_view< ReturnType( ArgTypes... ) >
61 {
62 public:
63  using signature = ReturnType( ArgTypes... );
64 
66  function_view( function_view const& ) = default;
67  function_view( function_view&& ) noexcept = default;
68  function_view& operator=( function_view const& ) = default;
69  function_view& operator=( function_view&& ) noexcept = default;
70 
72  : obj_( reinterpret_cast< void* >( fun ) )
73  , handler_( &function_handler )
74  {
75  }
76 
77  template < std::invocable< ArgTypes... > Callable >
78  function_view( Callable& cb )
79  : obj_( &cb )
80  , handler_( &callable_handler< Callable > )
81  {
82  }
83 
84  template < auto MemberFunctionPtr >
86  : obj_( &handle.obj )
87  , handler_( &member_function_handler<
88  MemberFunctionPtr,
89  typename member_function< MemberFunctionPtr >::object > )
90  {
91  }
92 
93  ReturnType operator()( ArgTypes... args ) const
94  {
95  return handler_( obj_, (ArgTypes&&) ( args )... );
96  }
97 
98 private:
99  template < typename Callable >
100  static ReturnType callable_handler( void* const ptr, ArgTypes... args )
101  {
102  auto* cb_ptr = reinterpret_cast< Callable* >( ptr );
103  return ( *cb_ptr )( (ArgTypes&&) ( args )... );
104  }
105 
106  static ReturnType function_handler( void* const ptr, ArgTypes... args )
107  {
108  auto f_ptr = reinterpret_cast< signature* >( ptr );
109  return f_ptr( args... );
110  }
111 
112  template < auto MemberFunction, typename Object >
113  static ReturnType member_function_handler( void* const ptr, ArgTypes... args )
114  {
115  auto* obj_ptr = reinterpret_cast< Object* >( ptr );
116  return ( obj_ptr->*MemberFunction )( (ArgTypes&&) ( args )... );
117  }
118 
119  using handler = ReturnType( void*, ArgTypes... );
120 
121  void* obj_;
122  handler* handler_;
123 };
124 
125 template < auto MemberFunctionPtr >
128 
129 } // namespace emlabcpp
function_view(function_view const &)=default
function_view(member_function< MemberFunctionPtr > handle)
Definition: function_view.h:85
ReturnType(ArgTypes...) signature
Definition: function_view.h:63
ReturnType operator()(ArgTypes... args) const
Definition: function_view.h:93
function_view(Callable &cb)
Definition: function_view.h:78
function_view(function_view &&) noexcept=default
MIT License.
Definition: impl.h:31
ReturnType(ArgTypes...) signature
Definition: function_view.h:37
Args const & args
Definition: min_max.h:83
function_view(member_function< MemberFunctionPtr > handle) -> function_view< typename member_function< MemberFunctionPtr >::signature >
Definition: function_view.h:42
Definition: function_view.h:32
Definition: function_view.h:46
typename traits::signature signature
Definition: function_view.h:48
member_function(object &object)
Definition: function_view.h:51
typename traits::object object
Definition: function_view.h:49
object & obj
Definition: function_view.h:56