#pragma once | #pragma once | ||||
#include <yvals.h> | |||||
//#include <yvals.h> | |||||
#include <atomic> | #include <atomic> | ||||
#include <memory> | #include <memory> | ||||
#include <chrono> | #include <chrono> |
#include <array> | #include <array> | ||||
#include <vector> | #include <vector> | ||||
#include <yvals.h> | |||||
//#include <yvals.h> | |||||
#include "rf_task.h" | #include "rf_task.h" | ||||
#include "utils.h" | #include "utils.h" |
#endif | #endif | ||||
protected: | protected: | ||||
coroutine_handle<> _coro; | coroutine_handle<> _coro; | ||||
std::atomic<intptr_t> _count = 0; // tracks reference count of state object | |||||
std::atomic<intptr_t> _count{0}; // tracks reference count of state object | |||||
std::exception_ptr _exception; | std::exception_ptr _exception; | ||||
std::atomic<bool> _ready = false; | std::atomic<bool> _ready = false; |
}; | }; | ||||
template<class _Tup, size_t _Idx> | template<class _Tup, size_t _Idx> | ||||
inline void when_all_one__(scheduler & s, const detail::when_impl_ptr & e, _Tup & t) | |||||
inline void when_all_one__(scheduler & s, const when_impl_ptr & e, _Tup & t) | |||||
{ | { | ||||
} | } | ||||
template<class _Tup, size_t _Idx, class _Fty, class... _Rest> | template<class _Tup, size_t _Idx, class _Fty, class... _Rest> | ||||
inline void when_all_one__(scheduler & s, const detail::when_impl_ptr & e, _Tup & t, _Fty f, _Rest&&... rest) | |||||
inline void when_all_one__(scheduler & s, const when_impl_ptr & e, _Tup & t, _Fty f, _Rest&&... rest) | |||||
{ | { | ||||
s + when_all_functor<_Fty, std::tuple_element_t<_Idx, _Tup> >{e, std::move(f), std::get<_Idx>(t)}; | s + when_all_functor<_Fty, std::tuple_element_t<_Idx, _Tup> >{e, std::move(f), std::get<_Idx>(t)}; | ||||
} | } | ||||
template<class _Val, class _Iter, typename _Fty = decltype(*std::declval<_Iter>())> | template<class _Val, class _Iter, typename _Fty = decltype(*std::declval<_Iter>())> | ||||
inline void when_all_range__(scheduler & s, const detail::when_impl_ptr & e, std::vector<_Val> & t, _Iter begin, _Iter end) | |||||
inline void when_all_range__(scheduler & s, const when_impl_ptr & e, std::vector<_Val> & t, _Iter begin, _Iter end) | |||||
{ | { | ||||
using future_type = std::remove_reference_t<_Fty>; | using future_type = std::remove_reference_t<_Fty>; | ||||
mutable when_any_result_ptr _val; | mutable when_any_result_ptr _val; | ||||
intptr_t _Idx; | intptr_t _Idx; | ||||
when_any_functor(const detail::when_impl_ptr & e, future_type f, const when_any_result_ptr & v, intptr_t idx) | |||||
when_any_functor(const when_impl_ptr & e, future_type f, const when_any_result_ptr & v, intptr_t idx) | |||||
: _e(e) | : _e(e) | ||||
, _f(std::move(f)) | , _f(std::move(f)) | ||||
, _val(v) | , _val(v) | ||||
}; | }; | ||||
template<intptr_t _Idx> | template<intptr_t _Idx> | ||||
inline void when_any_one__(scheduler & s, const detail::when_impl_ptr & e, const when_any_result_ptr & t) | |||||
inline void when_any_one__(scheduler & s, const when_impl_ptr & e, const when_any_result_ptr & t) | |||||
{ | { | ||||
} | } | ||||
template<intptr_t _Idx, class _Fty, class... _Rest> | template<intptr_t _Idx, class _Fty, class... _Rest> | ||||
inline void when_any_one__(scheduler & s, const detail::when_impl_ptr & e, const when_any_result_ptr & t, _Fty f, _Rest&&... rest) | |||||
inline void when_any_one__(scheduler & s, const when_impl_ptr & e, const when_any_result_ptr & t, _Fty f, _Rest&&... rest) | |||||
{ | { | ||||
s + when_any_functor<_Fty>{e, std::move(f), t, _Idx}; | s + when_any_functor<_Fty>{e, std::move(f), t, _Idx}; | ||||
template<class _Iter, typename _Fty = decltype(*std::declval<_Iter>())> | template<class _Iter, typename _Fty = decltype(*std::declval<_Iter>())> | ||||
inline void when_any_range__(scheduler & s, const detail::when_impl_ptr & e, const when_any_result_ptr & t, _Iter begin, _Iter end) | |||||
inline void when_any_range__(scheduler & s, const when_impl_ptr & e, const when_any_result_ptr & t, _Iter begin, _Iter end) | |||||
{ | { | ||||
using future_type = std::remove_reference_t<_Fty>; | using future_type = std::remove_reference_t<_Fty>; | ||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
<SDLCheck>true</SDLCheck> | <SDLCheck>true</SDLCheck> | ||||
<AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | <AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
<AdditionalOptions>/await /std:c++latest </AdditionalOptions> | |||||
<AdditionalOptions>/await /permissive- </AdditionalOptions> | |||||
<MultiProcessorCompilation>true</MultiProcessorCompilation> | <MultiProcessorCompilation>true</MultiProcessorCompilation> | ||||
<LanguageStandard>stdcpplatest</LanguageStandard> | <LanguageStandard>stdcpplatest</LanguageStandard> | ||||
</ClCompile> | </ClCompile> | ||||
<MultiProcessorCompilation>true</MultiProcessorCompilation> | <MultiProcessorCompilation>true</MultiProcessorCompilation> | ||||
<LanguageStandard>stdcpp17</LanguageStandard> | <LanguageStandard>stdcpp17</LanguageStandard> | ||||
<MinimalRebuild /> | <MinimalRebuild /> | ||||
<CLanguageStandard>c11</CLanguageStandard> | |||||
<CppLanguageStandard>c++1y</CppLanguageStandard> | |||||
</ClCompile> | </ClCompile> | ||||
<Link> | <Link> | ||||
<SubSystem>Console</SubSystem> | <SubSystem>Console</SubSystem> | ||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
<SDLCheck>true</SDLCheck> | <SDLCheck>true</SDLCheck> | ||||
<AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | <AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
<AdditionalOptions>/await /std:c++latest </AdditionalOptions> | |||||
<AdditionalOptions>/await /permissive- </AdditionalOptions> | |||||
<MultiProcessorCompilation>true</MultiProcessorCompilation> | <MultiProcessorCompilation>true</MultiProcessorCompilation> | ||||
<LanguageStandard>stdcpplatest</LanguageStandard> | <LanguageStandard>stdcpplatest</LanguageStandard> | ||||
</ClCompile> | </ClCompile> | ||||
<IntrinsicFunctions>true</IntrinsicFunctions> | <IntrinsicFunctions>true</IntrinsicFunctions> | ||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
<AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | <AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
<AdditionalOptions>/await </AdditionalOptions> | |||||
<AdditionalOptions>/await /permissive- </AdditionalOptions> | |||||
<ExceptionHandling>Sync</ExceptionHandling> | <ExceptionHandling>Sync</ExceptionHandling> | ||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> | <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> | ||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> | <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> |