1 // Copyright 2023 The Pigweed Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4 // use this file except in compliance with the License. You may obtain a copy of 5 // the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 // License for the specific language governing permissions and limitations under 13 // the License. 14 #pragma once 15 16 // This code is in its own header since Doxygen / Breathe can't parse it. 17 18 namespace pw::function::internal { 19 20 template <typename FunctionType, typename CallOperatorType> 21 struct StaticInvoker; 22 23 template <typename FunctionType, typename Return, typename... Args> 24 struct StaticInvoker<FunctionType, Return (FunctionType::*)(Args...)> { 25 // Invoker function with the context argument last to match libc. Could add a 26 // version with the context first if needed. 27 static Return InvokeWithContextLast(Args... args, void* context) { 28 return static_cast<FunctionType*>(context)->operator()( 29 std::forward<Args>(args)...); 30 } 31 32 static Return InvokeWithContextFirst(void* context, Args... args) { 33 return static_cast<FunctionType*>(context)->operator()( 34 std::forward<Args>(args)...); 35 } 36 }; 37 38 // Make the const version identical to the non-const version. 39 template <typename FunctionType, typename Return, typename... Args> 40 struct StaticInvoker<FunctionType, Return (FunctionType::*)(Args...) const> 41 : StaticInvoker<FunctionType, Return (FunctionType::*)(Args...)> {}; 42 43 } // namespace pw::function::internal 44