16#ifndef dealii_task_result_h
17#define dealii_task_result_h
286 mutable std::optional<Task<T>>
task;
311 template <
typename T>
317 std::lock_guard<std::mutex> lock(other.mutex);
319 result_is_available = other.result_is_available.load();
320 other.result_is_available =
false;
322 task = std::move(other.task);
325 task_result = std::move(other.task_result);
326 other.task_result.reset();
331 template <
typename T>
342 template <
typename T>
354 std::lock_guard<std::mutex> lock(mutex);
361 template <
typename T>
366 if (result_is_available)
375 std::lock_guard<std::mutex> lock(mutex);
377 if (result_is_available)
380 Assert(task.has_value() ==
false,
381 ExcMessage(
"You cannot destroy a TaskResult object "
382 "while it is still waiting for its associated task "
383 "to finish. See the documentation of this class' "
384 "destructor for more information."));
386 std::lock_guard<std::mutex> lock(mutex);
388 result_is_available =
false;
397 template <
typename T>
402 if (result_is_available)
410 std::lock_guard<std::mutex> lock(mutex);
411 if (result_is_available)
417 if (task.has_value())
424 template <
typename T>
428 if (!result_is_available)
429 wait_and_move_result();
430 return task_result.value();
435 template <
typename T>
440 if (result_is_available)
449 std::lock_guard<std::mutex> lock(mutex);
451 if (result_is_available)
456 ExcMessage(
"You cannot wait for the result of a TaskResult "
457 "object that has no task associated with it."));
459 task_result = std::move(task.value().return_value());
462 result_is_available =
true;
void operator=(const Task< T > &t)
TaskResult(const TaskResult< T > &)=delete
void wait_and_move_result() const
std::optional< Task< T > > task
std::optional< T > task_result
TaskResult(const Task< T > &task)
std::atomic< bool > result_is_available
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
static ::ExceptionBase & ExcMessage(std::string arg1)