#ifndef LIBASYNC_BASIC_HPP #define LIBASYNC_BASIC_HPP namespace async { template struct callback; template struct callback { private: using storage = std::aligned_storage_t; template static R invoke(storage object, Args... args) { return (*reinterpret_cast(&object))(std::move(args)...); } public: callback() : _function(nullptr) { } template::value && std::is_trivially_destructible::value>> callback(F functor) : _function(&invoke) { new (&_object) F{std::move(functor)}; } explicit operator bool () { return static_cast(_function); } R operator() (Args... args) { return _function(_object, std::move(args)...); } private: R (*_function)(storage, Args...); std::aligned_storage_t _object; }; template struct awaitable { virtual void then(callback awaiter) = 0; virtual void detach() = 0; }; template<> struct awaitable { virtual void then(callback cb) = 0; virtual void detach() = 0; }; template struct cancelable_awaitable : awaitable { virtual void cancel() = 0; }; } // namespace async #endif // LIBASYNC_BASIC_HPP