cmake_minimum_required(VERSION 3.14) | |||||
PROJECT(librf) | |||||
cmake_minimum_required(VERSION 3.10) | |||||
project(librf) | |||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | ||||
set(CMAKE_CXX_FLAGS "-std=c++2a -fcoroutines-ts -stdlib=libc++") | set(CMAKE_CXX_FLAGS "-std=c++2a -fcoroutines-ts -stdlib=libc++") | ||||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | ||||
set(CMAKE_CXX_FLAGS "/std:c++latest /await /EHsc") | set(CMAKE_CXX_FLAGS "/std:c++latest /await /EHsc") | ||||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | ||||
set(CMAKE_CXX_FLAGS "-std=c++2a -fcoroutines-ts") | |||||
set(CMAKE_CXX_FLAGS "-std=c++2a -fcoroutines") | |||||
endif() | endif() | ||||
message(STATUS "C++ flags: ${CMAKE_CXX_FLAGS}") | message(STATUS "C++ flags: ${CMAKE_CXX_FLAGS}") | ||||
) | ) | ||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) | ||||
add_executable(test ${TSRC}) | |||||
target_link_libraries(test ${LIB_NAME}) | |||||
add_executable(rf_tutorial ${TSRC}) | |||||
target_link_libraries(rf_tutorial ${LIB_NAME}) |
#pragma once | |||||
#ifndef RESUMEF_INLINE_STATE | |||||
#if defined(__clang__) || defined(_MSC_VER) | |||||
#define RESUMEF_INLINE_STATE 1 | |||||
#else | |||||
#define RESUMEF_INLINE_STATE 1 | |||||
#endif //defined(__clang__) || defined(_MSC_VER) | |||||
#endif //RESUMEF_INLINE_STATE | |||||
#ifndef RESUMEF_DEBUG_COUNTER | |||||
/* #undef RESUMEF_DEBUG_COUNTER */ | |||||
#endif //RESUMEF_DEBUG_COUNTER | |||||
#ifndef RESUMEF_ENABLE_CONCEPT | |||||
#ifdef __cpp_lib_concepts | |||||
#define RESUMEF_ENABLE_CONCEPT 0 | |||||
#else | |||||
#define RESUMEF_ENABLE_CONCEPT 0 | |||||
#endif //#ifdef __cpp_lib_concepts | |||||
#endif //#ifndef RESUMEF_ENABLE_CONCEPT | |||||
#ifndef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE | |||||
/* #undef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE */ | |||||
#endif //_WITH_LOCK_FREE_Q_KEEP_REAL_SIZE | |||||
/* #undef RESUMEF_USE_CUSTOM_SPINLOCK */ | |||||
#pragma once | |||||
#ifndef RESUMEF_INLINE_STATE | |||||
#if defined(__clang__) || defined(_MSC_VER) | |||||
/* #undef RESUMEF_INLINE_STATE */ | |||||
#else | |||||
/* #undef RESUMEF_INLINE_STATE */ | |||||
#endif //defined(__clang__) || defined(_MSC_VER) | |||||
#endif //RESUMEF_INLINE_STATE | |||||
#ifndef RESUMEF_DEBUG_COUNTER | |||||
/* #undef RESUMEF_DEBUG_COUNTER */ | |||||
#endif //RESUMEF_DEBUG_COUNTER | |||||
#ifndef RESUMEF_ENABLE_CONCEPT | |||||
#ifdef __cpp_lib_concepts | |||||
#define RESUMEF_ENABLE_CONCEPT 1 | |||||
#else | |||||
#define RESUMEF_ENABLE_CONCEPT 1 | |||||
#endif //#ifdef __cpp_lib_concepts | |||||
#endif //#ifndef RESUMEF_ENABLE_CONCEPT | |||||
#ifndef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE | |||||
/* #undef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE */ | |||||
#endif //_WITH_LOCK_FREE_Q_KEEP_REAL_SIZE | |||||
/* #undef RESUMEF_USE_CUSTOM_SPINLOCK */ |
callback(std::to_string(value)); | callback(std::to_string(value)); | ||||
}).detach(); | }).detach(); | ||||
MODERN_CALLBACK_RETURN(); | |||||
MODERN_CALLBACK_RETURN(); | |||||
} | } | ||||
//演示异步库有多个异步回调函数,只要按照Modern Callback范式去做回调,就不再需要写额外的代码,就可以适配到future+librf,以及更多的其他库 | //演示异步库有多个异步回调函数,只要按照Modern Callback范式去做回调,就不再需要写额外的代码,就可以适配到future+librf,以及更多的其他库 | ||||
callback(val1 + val2); | callback(val1 + val2); | ||||
}).detach(); | }).detach(); | ||||
MODERN_CALLBACK_RETURN(); | |||||
MODERN_CALLBACK_RETURN(); | |||||
} | } | ||||
//演示异步库有多个异步回调函数,只要按照Modern Callback范式去做回调,就不再需要写额外的代码,就可以适配到future+librf,以及更多的其他库 | //演示异步库有多个异步回调函数,只要按照Modern Callback范式去做回调,就不再需要写额外的代码,就可以适配到future+librf,以及更多的其他库 | ||||
callback(nullptr, v1, val1 / val2); | callback(nullptr, v1, val1 / val2); | ||||
}).detach(); | }).detach(); | ||||
MODERN_CALLBACK_RETURN(); | |||||
MODERN_CALLBACK_RETURN(); | |||||
} | } | ||||
#include "use_future.h" | #include "use_future.h" | ||||
//muldiv_async函数可能会抛异常,取决于val是否是0 | //muldiv_async函数可能会抛异常,取决于val是否是0 | ||||
//异常将会带回到本协程里的代码,所以需要try-catch | //异常将会带回到本协程里的代码,所以需要try-catch | ||||
auto ab = co_await muldiv_async(9, val, use_librf); | |||||
//C++17: | |||||
//auto [a, b] = co_await muldiv_async(9, val, use_librf); | |||||
auto [a, b] = co_await muldiv_async(9, val, use_librf); | |||||
std::string result = co_await tostring_async(std::get<0>(ab) + std::get<1>(ab), use_librf); | |||||
std::string result = co_await tostring_async(a + b, use_librf); | |||||
std::cout << result << std::endl; | std::cout << result << std::endl; | ||||
} | } |