Some work on weak callbacks

This commit is contained in:
Naios 2015-06-10 00:41:20 +02:00
parent 60f1e04ea9
commit 57e7a61c55
2 changed files with 56 additions and 11 deletions

View File

@ -24,15 +24,63 @@
class CallbackContainer class CallbackContainer
{ {
size_t current_handle; std::shared_ptr<CallbackContainer> self_reference;
std::unordered_map<decltype(current_handle), void*> container; size_t handle;
struct InternalReference
{
};
std::unordered_map<decltype(handle), InternalReference> container;
template<typename _CTy, typename... Args>
struct ProxyFactory;
template<typename _CTy, typename... Args>
struct ProxyFactory<_CTy, std::tuple<Args...>>
{
// Creates a weak callback proxy which prevents invoking to an invalid context.
static callback_of_t<_CTy> CreateProxy(_CTy&& callback)
{
return [callback](Args&&... args)
{
// Invoke the original callback
callback(std::forward<Args...>(args...));
};
}
};
public: public:
template<typename _CTy> CallbackContainer()
_CTy operator()(_CTy&& callback) : self_reference(this, [](decltype(this) me) { }), handle(0L) { }
~CallbackContainer() = default;
CallbackContainer(CallbackContainer const&) = delete;
CallbackContainer(CallbackContainer&&) = delete;
CallbackContainer& operator= (CallbackContainer const&) = delete;
CallbackContainer& operator= (CallbackContainer&&) = delete;
CallbackContainer& Clear()
{ {
return callback; container.clear();
handle = 0L;
return *this;
}
template<typename _CTy>
auto operator()(_CTy&& callback)
-> callback_of_t<_CTy>
{
// Create a weak proxy callback which removes the callback on execute
callback_of_t<_CTy> proxy =
ProxyFactory<_CTy, ::fu::argument_type_of_t<_CTy>>::
CreateProxy(std::forward<_CTy>(callback));
return std::move(proxy);
} }
}; };

View File

@ -42,19 +42,16 @@ int main(int argc, char** argv)
cbd2 _cbd2; cbd2 _cbd2;
cbd3 _cbd3; cbd3 _cbd3;
auto cb = make_shared_callback([](bool) auto _test_make_shared_callback = make_shared_callback([](bool)
{ {
}); });
auto cbt = std::make_shared<std::function<void()>>([]()
{
});
CallbackContainer callback; CallbackContainer callback;
auto mycb = callback([] auto mycb = callback([](bool success)
{ {
}); });
return 0; return 0;