barretenberg
Loading...
Searching...
No Matches
func_traits.hpp
1#pragma once
2#include "../msgpack.hpp"
3#include <tuple>
4
5// Define a template struct to deduce function traits for different function types
6template <typename Func> struct func_traits;
7
8// Specialization for function pointers
9template <typename R, typename... Vs> struct func_traits<R (*)(Vs...)> {
10 typedef std::tuple<typename std::decay<Vs>::type...> Args; // Define a tuple type that holds all argument types
11 Args args; // Args instance
12 R ret; // Holds return type
13 MSGPACK_FIELDS(args, ret); // Macro from msgpack library to serialize/deserialize fields
14};
15
16// Specialization for function references
17template <typename R, typename... Vs> struct func_traits<R (&)(Vs...)> {
18 typedef std::tuple<typename std::decay<Vs>::type...> Args;
19 Args args;
20 R ret;
21 MSGPACK_FIELDS(args, ret);
22};
23
24// Specialization for member function pointers. This also includes lambda types,
25// as they are functors (objects with operator()) and hence have a member function pointer
26template <typename R, typename T, typename... Vs> struct func_traits<R (T::*)(Vs...) const> {
27 typedef std::tuple<typename std::decay<Vs>::type...> Args;
28 Args args;
29 R ret;
30 MSGPACK_FIELDS(args, ret);
31};
32
33// Define a concept that checks if the type is a lambda (or functor) type
34// This is done by checking if T::operator() exists
35template <typename T>
36concept LambdaType =
37 requires() { typename std::enable_if_t<std::is_member_function_pointer_v<decltype(&T::operator())>, void>; };
38
39// Overload for lambda (or functor) types
40template <LambdaType T> constexpr auto get_func_traits()
41{
42 // If T is a lambda type (i.e. it has operator()), deduce its traits using func_traits
44}
45
46// Overload for non-lambda types
47template <typename T> constexpr auto get_func_traits()
48{
49 // If T is not a lambda, just deduce its traits using func_traits
50 return func_traits<T>();
51}
Definition: func_traits.hpp:36
Definition: func_traits.hpp:6