#ifndef RETURN_VALUES_H #define RETURN_VALUES_H #include #include #include #include #include namespace sscl::co { template > struct ReturnValueStorage; template struct ReturnValueStorage { T myReturnValue{}; }; template struct ReturnValueStorage { }; template struct ReturnValues : public ReturnValueStorage { ReturnValues() noexcept : myExceptionPtr(myMemberExceptionPtr) {} explicit ReturnValues(std::exception_ptr &callerExceptionPtr) noexcept : myExceptionPtr(callerExceptionPtr) {} ~ReturnValues() noexcept { #ifdef CONFIG_LIBSSCL_DEBUG_CO std::cout << __func__ << ": " << std::this_thread::get_id() << " Destructing.\n"; #endif } /** EXPLANATION: * The exception_ptr ref here can either point to the exception_ptr * a non-viral coroutine supplied to us as its storage space for * where we should store any exception that is thrown; * * Or it could point to the member exception_ptr in this very class, * which is used for viral coroutines that can bubble their exception * up and automatically via the language runtime. */ std::exception_ptr &myExceptionPtr; std::exception_ptr myMemberExceptionPtr = nullptr; }; } // namespace sscl::co #endif // RETURN_VALUES_H