functor2c
Single header templates for wrapping C++ functors as opaque userdata plus function pointers for C interop
 
Loading...
Searching...
No Matches
functor2c Namespace Reference

Namespaces

namespace  detail
 

Functions

template<typename RetType, typename... Args, typename Fn>
std::tuple< void *, RetType(*)(void *, Args...), void(*)(void *)> prefix_invoker_deleter (Fn &&fn)
 
template<typename RetType, typename... Args, typename Fn>
std::tuple< void *, RetType(*)(void *, Args...)> prefix_invoker_oneshot (Fn &&fn)
 
template<typename RetType, typename... Args, typename Fn>
std::tuple< std::unique_ptr< void, typename detail::destroyable_function< false, RetType, Args... >::deleter >, RetType(*)(void *, Args...)> prefix_invoker_unique (Fn &&fn)
 
template<typename RetType, typename... Args, typename Fn>
std::tuple< std::shared_ptr< void >, RetType(*)(void *, Args...)> prefix_invoker_shared (Fn &&fn)
 
template<typename RetType, typename... Args, typename Fn>
std::tuple< void *, RetType(*)(Args..., void *), void(*)(void *)> suffix_invoker_deleter (Fn &&fn)
 
template<typename RetType, typename... Args, typename Fn>
std::tuple< void *, RetType(*)(Args..., void *)> suffix_invoker_oneshot (Fn &&fn)
 
template<typename RetType, typename... Args, typename Fn>
std::tuple< std::unique_ptr< void, typename detail::destroyable_function< false, RetType, Args... >::deleter >, RetType(*)(Args..., void *)> suffix_invoker_unique (Fn &&fn)
 
template<typename RetType, typename... Args, typename Fn>
std::tuple< std::shared_ptr< void >, RetType(*)(Args..., void *)> suffix_invoker_shared (Fn &&fn)
 
template<typename RetType, typename... Args>
auto prefix_invoker_deleter (std::function< RetType(Args...)> &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename Fn>
auto prefix_invoker_deleter (Fn &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename RetType, typename... Args>
auto prefix_invoker_oneshot (std::function< RetType(Args...)> &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename Fn>
auto prefix_invoker_oneshot (Fn &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename RetType, typename... Args>
auto prefix_invoker_unique (std::function< RetType(Args...)> &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename Fn>
auto prefix_invoker_unique (Fn &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename RetType, typename... Args>
auto prefix_invoker_shared (std::function< RetType(Args...)> &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename Fn>
auto prefix_invoker_shared (Fn &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename RetType, typename... Args>
auto suffix_invoker_deleter (std::function< RetType(Args...)> &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename Fn>
auto suffix_invoker_deleter (Fn &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename RetType, typename... Args>
auto suffix_invoker_oneshot (std::function< RetType(Args...)> &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename Fn>
auto suffix_invoker_oneshot (Fn &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename RetType, typename... Args>
auto suffix_invoker_unique (std::function< RetType(Args...)> &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename Fn>
auto suffix_invoker_unique (Fn &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename RetType, typename... Args>
auto suffix_invoker_shared (std::function< RetType(Args...)> &&fn)
 Overload used for automatic type deduction in C++17.
 
template<typename Fn>
auto suffix_invoker_shared (Fn &&fn)
 Overload used for automatic type deduction in C++17.
 

Function Documentation

◆ prefix_invoker_deleter() [1/3]

template<typename RetType, typename... Args, typename Fn>
std::tuple< void *, RetType(*)(void *, Args...), void(*)(void *)> functor2c::prefix_invoker_deleter ( Fn && fn)

Transform fn into a [userdata, invoker, deleter] tuple.

The invoker accepts the same parameters as fn, with the addition of the userdata prefix argument.

Note
You are responsible for calling the deleter with the userdata as parameter to reclaim allocated memory.
auto [userdata, invoker, deleter] = prefix_invoker_deleter([](int value) {});
// Invoke wrapped function as many times as you need.
invoker(userdata, 1);
invoker(userdata, 2);
invoker(userdata, 3);
// Delete wrapped function afterwards to avoid memory leak.
deleter(userdata);
std::tuple< void *, RetType(*)(void *, Args...), void(*)(void *)> prefix_invoker_deleter(Fn &&fn)
Definition functor2c.hpp:108
Returns
Tuple containing an opaque userdata, plus its invoker and deleter functions.

◆ prefix_invoker_deleter() [2/3]

template<typename Fn>
auto functor2c::prefix_invoker_deleter ( Fn && fn)

Overload used for automatic type deduction in C++17.

◆ prefix_invoker_deleter() [3/3]

template<typename RetType, typename... Args>
auto functor2c::prefix_invoker_deleter ( std::function< RetType(Args...)> && fn)

Overload used for automatic type deduction in C++17.

◆ prefix_invoker_oneshot() [1/3]

template<typename RetType, typename... Args, typename Fn>
std::tuple< void *, RetType(*)(void *, Args...)> functor2c::prefix_invoker_oneshot ( Fn && fn)

Transform fn into a [userdata, oneshot_invoker] tuple.

The invoker accepts the same parameters as fn, with the addition of the userdata prefix argument. The allocated memory will be freed in the first invocation, so you must invoke it exactly once.

Warning
If you don't invoke the function, memory will leak.
If you try to invoke the function twice, your app will try to access freed memory and likely SEGFAULT.
auto [userdata, oneshot_invoker] = prefix_invoker_oneshot([](int value) {});
// Invoke wrapped function exactly once
oneshot_invoker(userdata, 42);
std::tuple< void *, RetType(*)(void *, Args...)> prefix_invoker_oneshot(Fn &&fn)
Definition functor2c.hpp:130
Returns
Tuple containing an opaque userdata, plus its oneshot invoker function.

◆ prefix_invoker_oneshot() [2/3]

template<typename Fn>
auto functor2c::prefix_invoker_oneshot ( Fn && fn)

Overload used for automatic type deduction in C++17.

◆ prefix_invoker_oneshot() [3/3]

template<typename RetType, typename... Args>
auto functor2c::prefix_invoker_oneshot ( std::function< RetType(Args...)> && fn)

Overload used for automatic type deduction in C++17.

◆ prefix_invoker_shared() [1/3]

template<typename RetType, typename... Args, typename Fn>
std::tuple< std::shared_ptr< void >, RetType(*)(void *, Args...)> functor2c::prefix_invoker_shared ( Fn && fn)

Transform fn into a [userdata, invoker] tuple.

The invoker accepts the same parameters as fn, with the addition of the userdata prefix argument.

Note
The userdata is retained by a std::shared_ptr, so there's no need to manually delete it.
auto [userdata, invoker] = prefix_invoker_shared([](int value) {});
// Invoke wrapped function as many times as you need.
invoker(userdata.get(), 1);
invoker(userdata.get(), 2);
invoker(userdata.get(), 3);
// Userdata is a shared_ptr, memory will be freed automatically.
std::tuple< std::shared_ptr< void >, RetType(*)(void *, Args...)> prefix_invoker_shared(Fn &&fn)
Definition functor2c.hpp:176
Returns
Tuple containing an opaque userdata, plus its invoker and deleter functions.

◆ prefix_invoker_shared() [2/3]

template<typename Fn>
auto functor2c::prefix_invoker_shared ( Fn && fn)

Overload used for automatic type deduction in C++17.

◆ prefix_invoker_shared() [3/3]

template<typename RetType, typename... Args>
auto functor2c::prefix_invoker_shared ( std::function< RetType(Args...)> && fn)

Overload used for automatic type deduction in C++17.

◆ prefix_invoker_unique() [1/3]

template<typename RetType, typename... Args, typename Fn>
std::tuple< std::unique_ptr< void, typename detail::destroyable_function< false, RetType, Args... >::deleter >, RetType(*)(void *, Args...)> functor2c::prefix_invoker_unique ( Fn && fn)

Transform fn into a [userdata, invoker] tuple.

The invoker accepts the same parameters as fn, with the addition of the userdata prefix argument.

Note
The userdata is owned by a std::unique_ptr, so there's no need to manually delete it.
auto [userdata, invoker] = prefix_invoker_unique([](int value) {});
// Invoke wrapped function as many times as you need.
invoker(userdata.get(), 1);
invoker(userdata.get(), 2);
invoker(userdata.get(), 3);
// Userdata is a unique_ptr, memory will be freed automatically.
std::tuple< std::unique_ptr< void, typename detail::destroyable_function< false, RetType, Args... >::deleter >, RetType(*)(void *, Args...)> prefix_invoker_unique(Fn &&fn)
Definition functor2c.hpp:153
Returns
Tuple containing an opaque userdata, plus its invoker and deleter functions.

◆ prefix_invoker_unique() [2/3]

template<typename Fn>
auto functor2c::prefix_invoker_unique ( Fn && fn)

Overload used for automatic type deduction in C++17.

◆ prefix_invoker_unique() [3/3]

template<typename RetType, typename... Args>
auto functor2c::prefix_invoker_unique ( std::function< RetType(Args...)> && fn)

Overload used for automatic type deduction in C++17.

◆ suffix_invoker_deleter() [1/3]

template<typename RetType, typename... Args, typename Fn>
std::tuple< void *, RetType(*)(Args..., void *), void(*)(void *)> functor2c::suffix_invoker_deleter ( Fn && fn)

Same as prefix_invoker_deleter where the invoker accepts userdata parameter suffix instead of prefix.

auto [userdata, invoker, deleter] = suffix_invoker_deleter([](int value) {});
// Invoke wrapped function as many times as you need.
invoker(1, userdata);
invoker(2, userdata);
invoker(3, userdata);
// Delete wrapped function afterwards to avoid memory leak.
deleter(userdata);
std::tuple< void *, RetType(*)(Args..., void *), void(*)(void *)> suffix_invoker_deleter(Fn &&fn)
Definition functor2c.hpp:195

◆ suffix_invoker_deleter() [2/3]

template<typename Fn>
auto functor2c::suffix_invoker_deleter ( Fn && fn)

Overload used for automatic type deduction in C++17.

◆ suffix_invoker_deleter() [3/3]

template<typename RetType, typename... Args>
auto functor2c::suffix_invoker_deleter ( std::function< RetType(Args...)> && fn)

Overload used for automatic type deduction in C++17.

◆ suffix_invoker_oneshot() [1/3]

template<typename RetType, typename... Args, typename Fn>
std::tuple< void *, RetType(*)(Args..., void *)> functor2c::suffix_invoker_oneshot ( Fn && fn)

Same as prefix_invoker_oneshot where the invoker accepts userdata parameter suffix instead of prefix.

auto [userdata, oneshot_invoker] = suffix_invoker_oneshot([](int value) {});
// Invoke wrapped function exactly once
oneshot_invoker(42, userdata);
std::tuple< void *, RetType(*)(Args..., void *)> suffix_invoker_oneshot(Fn &&fn)
Definition functor2c.hpp:209

◆ suffix_invoker_oneshot() [2/3]

template<typename Fn>
auto functor2c::suffix_invoker_oneshot ( Fn && fn)

Overload used for automatic type deduction in C++17.

◆ suffix_invoker_oneshot() [3/3]

template<typename RetType, typename... Args>
auto functor2c::suffix_invoker_oneshot ( std::function< RetType(Args...)> && fn)

Overload used for automatic type deduction in C++17.

◆ suffix_invoker_shared() [1/3]

template<typename RetType, typename... Args, typename Fn>
std::tuple< std::shared_ptr< void >, RetType(*)(Args..., void *)> functor2c::suffix_invoker_shared ( Fn && fn)

Same as prefix_invoker_shared where the invoker accepts userdata parameter suffix instead of prefix.

auto [userdata, invoker] = suffix_invoker_shared([](int value) {});
// Invoke wrapped function as many times as you need.
invoker(1, userdata.get());
invoker(2, userdata.get());
invoker(3, userdata.get());
// Userdata is a shared_ptr, memory will be freed automatically.
std::tuple< std::shared_ptr< void >, RetType(*)(Args..., void *)> suffix_invoker_shared(Fn &&fn)
Definition functor2c.hpp:243

◆ suffix_invoker_shared() [2/3]

template<typename Fn>
auto functor2c::suffix_invoker_shared ( Fn && fn)

Overload used for automatic type deduction in C++17.

◆ suffix_invoker_shared() [3/3]

template<typename RetType, typename... Args>
auto functor2c::suffix_invoker_shared ( std::function< RetType(Args...)> && fn)

Overload used for automatic type deduction in C++17.

◆ suffix_invoker_unique() [1/3]

template<typename RetType, typename... Args, typename Fn>
std::tuple< std::unique_ptr< void, typename detail::destroyable_function< false, RetType, Args... >::deleter >, RetType(*)(Args..., void *)> functor2c::suffix_invoker_unique ( Fn && fn)

Same as prefix_invoker_unique where the invoker accepts userdata parameter suffix instead of prefix.

auto [userdata, invoker] = suffix_invoker_unique([](int value) {});
// Invoke wrapped function as many times as you need.
invoker(1, userdata.get());
invoker(2, userdata.get());
invoker(3, userdata.get());
// Userdata is a unique_ptr, memory will be freed automatically.
std::tuple< std::unique_ptr< void, typename detail::destroyable_function< false, RetType, Args... >::deleter >, RetType(*)(Args..., void *)> suffix_invoker_unique(Fn &&fn)
Definition functor2c.hpp:226

◆ suffix_invoker_unique() [2/3]

template<typename Fn>
auto functor2c::suffix_invoker_unique ( Fn && fn)

Overload used for automatic type deduction in C++17.

◆ suffix_invoker_unique() [3/3]

template<typename RetType, typename... Args>
auto functor2c::suffix_invoker_unique ( std::function< RetType(Args...)> && fn)

Overload used for automatic type deduction in C++17.