diff --git a/fluent++/CallbackContainer.h b/fluent++/CallbackContainer.h index 4588b9a..38b64a0 100644 --- a/fluent++/CallbackContainer.h +++ b/fluent++/CallbackContainer.h @@ -24,15 +24,63 @@ class CallbackContainer { - size_t current_handle; + std::shared_ptr self_reference; - std::unordered_map container; + size_t handle; + + struct InternalReference + { + }; + + std::unordered_map container; + + template + struct ProxyFactory; + + template + struct ProxyFactory<_CTy, std::tuple> + { + // 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...)); + }; + } + }; public: - template - _CTy operator()(_CTy&& callback) + CallbackContainer() + : 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 + 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); } }; diff --git a/test.cpp b/test.cpp index 9407c20..1662363 100644 --- a/test.cpp +++ b/test.cpp @@ -42,19 +42,16 @@ int main(int argc, char** argv) cbd2 _cbd2; cbd3 _cbd3; - auto cb = make_shared_callback([](bool) + auto _test_make_shared_callback = make_shared_callback([](bool) { }); - auto cbt = std::make_shared>([]() - { - }); - CallbackContainer callback; - auto mycb = callback([] + auto mycb = callback([](bool success) { + }); return 0;