C/C++ API Reference
Loading...
Searching...
No Matches
func_task.h
1// Copyright 2023 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#pragma once
15
16#include <optional>
17
18#include "pw_async2/dispatcher.h"
19#include "pw_function/function.h"
20
21namespace pw::async2 {
22
24
31template <typename Func = Function<Poll<>(Context&)>>
32class FuncTask final : public Task {
33 public:
35 explicit constexpr FuncTask(Func&& func) : func_(std::forward<Func>(func)) {}
36
37 FuncTask(const FuncTask&) = delete;
38 FuncTask& operator=(const FuncTask&) = delete;
39
40 FuncTask(FuncTask&&) = delete;
41 FuncTask& operator=(FuncTask&&) = delete;
42
43 ~FuncTask() override { Deregister(); }
44
45 private:
46 Poll<> DoPend(Context& cx) override { return func_(cx); }
47
48 Func func_;
49};
50
51template <typename Func>
52FuncTask(Func&&) -> FuncTask<Func>;
53
55enum class ReturnValuePolicy : bool { kKeep, kDiscard };
56
72template <typename Func = Function<Poll<>()>,
73 ReturnValuePolicy = std::is_void_v<std::invoke_result_t<Func>>
74 ? ReturnValuePolicy::kDiscard
75 : ReturnValuePolicy::kKeep>
76class RunOnceTask final : public Task {
77 public:
79 using value_type =
80 std::conditional_t<std::is_void_v<std::invoke_result_t<Func>>,
82 std::invoke_result_t<Func>>;
83
85 explicit constexpr RunOnceTask(Func&& func)
86 : func_(std::forward<Func>(func)) {}
87
88 RunOnceTask(const RunOnceTask&) = delete;
89 RunOnceTask& operator=(const RunOnceTask&) = delete;
90
91 RunOnceTask(RunOnceTask&&) = delete;
92 RunOnceTask& operator=(RunOnceTask&&) = delete;
93
94 ~RunOnceTask() override { Deregister(); }
95
98 bool has_value() const { return return_value_.has_value(); }
99
103 value_type& value() { return return_value_.value(); }
104
106 const value_type& value() const { return return_value_.value(); }
107
110 Task::Join();
111 return *return_value_;
112 }
113
114 private:
115 Poll<> DoPend(Context&) override {
116 if constexpr (std::is_void_v<std::invoke_result_t<Func>>) {
117 func_();
118 return_value_.emplace();
119 } else {
120 return_value_ = func_();
121 }
122 return Ready();
123 }
124
125 Func func_;
126 std::optional<value_type> return_value_;
127};
128
134template <typename Func>
135class RunOnceTask<Func, ReturnValuePolicy::kDiscard> final : public Task {
136 public:
137 explicit constexpr RunOnceTask(Func&& func)
138 : func_(std::forward<Func>(func)) {}
139
140 RunOnceTask(const RunOnceTask&) = delete;
141 RunOnceTask& operator=(const RunOnceTask&) = delete;
142
143 RunOnceTask(RunOnceTask&&) = delete;
144 RunOnceTask& operator=(RunOnceTask&&) = delete;
145
146 ~RunOnceTask() override { Deregister(); }
147
148 private:
149 Poll<> DoPend(Context&) override {
150 (void)func_();
151 return Ready();
152 }
153
154 Func func_;
155};
156
157template <typename Func>
158RunOnceTask(Func&&) -> RunOnceTask<Func>;
159
161
162} // namespace pw::async2
Definition: context.h:46
Definition: func_task.h:32
Poll DoPend(Context &cx) override
Definition: func_task.h:46
constexpr FuncTask(Func &&func)
Creates a new Task that delegates Pend to func.
Definition: func_task.h:35
Definition: poll.h:138
Poll DoPend(Context &) override
Definition: func_task.h:149
Definition: func_task.h:76
constexpr RunOnceTask(Func &&func)
Creates a new Task that runs the provided function once.
Definition: func_task.h:85
Poll DoPend(Context &) override
Definition: func_task.h:115
std::conditional_t< std::is_void_v< std::invoke_result_t< Func > >, ReadyType, std::invoke_result_t< Func > > value_type
The return value of the function.
Definition: func_task.h:82
value_type & value()
Definition: func_task.h:103
const value_type & value() const
Definition: func_task.h:106
bool has_value() const
Definition: func_task.h:98
value_type & Wait()
Blocks until the task completes and returns a reference its return value.
Definition: func_task.h:109
Definition: task.h:67
constexpr Poll Ready()
Returns a value indicating completion.
Definition: poll.h:337
ReturnValuePolicy
Whether to store or discard the function's return value in RunOnceTask.
Definition: func_task.h:55
Definition: poll.h:40