9namespace opcua::services::detail {
11template <
typename CompletionHandler,
typename Transform>
12auto asyncTransform(CompletionHandler&& handler, Transform&& transform) {
13 return [innerHandler = std::forward<CompletionHandler>(handler),
14 innerTransform = std::forward<Transform>(transform)](
auto&& result)
mutable {
15 auto transformed = std::invoke(innerTransform, std::forward<
decltype(result)>(result));
16 std::invoke(innerHandler, transformed);
24template <
typename TransformFunction,
typename CompletionToken>
25struct TransformToken {
26 TransformToken(TransformFunction&& transformFunction, CompletionToken&& completionToken)
27 : transform(std::move(transformFunction)),
28 token(std::move(completionToken)) {}
30 std::decay_t<TransformFunction> transform;
31 std::decay_t<CompletionToken> token;
34template <
typename TransformFunction,
typename CompletionToken>
35TransformToken(TransformFunction&&, CompletionToken&&)
36 -> TransformToken<TransformFunction, CompletionToken>;
42template <
typename TransformFunction,
typename CompletionToken,
typename T>
43struct AsyncResult<services::detail::TransformToken<TransformFunction, CompletionToken>, T> {
44 using Token = services::detail::TransformToken<TransformFunction, CompletionToken>;
46 template <
typename Initiation,
typename... Args>
48 Initiation&& initiation,
52 using TransformResult = std::invoke_result_t<TransformFunction, T&>;
54 [innerInitiation = std::forward<Initiation>(initiation),
55 innerTransform = std::forward<Token>(token).transform](
56 auto&& handler,
auto&&... innerArgs
60 services::detail::asyncTransform(
61 std::forward<
decltype(handler)>(handler), std::move(innerTransform)
63 std::forward<
decltype(innerArgs)>(innerArgs)...
66 std::forward<Token>(token).token,
67 std::forward<Args>(args)...
auto asyncInitiate(Initiation &&initiation, CompletionToken &&token, Args &&... args)
static void initiate(Initiation &&initiation, CompletionHandler &&handler, Args &&... args)