/* * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_UTILS_FUNCTION_TRAITS_H #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_UTILS_FUNCTION_TRAITS_H #include template struct function_traits; template struct function_traits { static constexpr const size_t argc = sizeof...(Args); typedef ReturnType returnType; using ArgumentPack = std::tuple; template struct argv { typedef typename std::tuple_element::type type; }; }; namespace FunctionUtils { template auto CallMemberFunction(C* instance, F func, T&& tuple, std::index_sequence) { return (instance->*func)(std::get(std::forward(tuple))...); } template auto CallMemberFunction(C* instance, R (C::*func)(Types...), Tuple&& tup) { return CallMemberFunction(instance, func, std::forward(tup), std::make_index_sequence {}); } template auto CallStaticMemberFunction(F func, T&& tuple, std::index_sequence) { return func(std::get(std::forward(tuple))...); } template auto CallStaticMemberFunction(R (*func)(Types...), Tuple&& tup) { return CallStaticMemberFunction(func, std::forward(tup), std::make_index_sequence {}); } template T* ConstructFromTuple(Tuple&& tuple, std::index_sequence) { return new T { std::get(std::forward(tuple))... }; } template T* ConstructFromTuple(Tuple&& tuple) { return ConstructFromTuple( std::forward(tuple), std::make_index_sequence>::value> {}); } }; // namespace FunctionUtils #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_UTILS_FUNCTION_TRAITS_H