13#ifndef dealii_task_result_h
14#define dealii_task_result_h
122 std::is_move_constructible_v<T> &&std::is_move_assignable_v<T>);
198 std::is_move_constructible_v<T> &&std::is_move_assignable_v<T>);
317 template <
typename Callable>
334 std::is_copy_assignable_v<T>));
348 std::is_copy_assignable_v<T>));
406 mutable std::optional<Task<T>>
task;
424 template <
typename T>
427 std::is_move_constructible_v<T> &&std::is_move_assignable_v<T>)
432 std::scoped_lock lock(other.mutex);
434 result_is_available = other.result_is_available.load();
435 other.result_is_available =
false;
437 task = std::move(other.task);
440 task_result = std::move(other.task_result);
441 other.task_result.reset();
446 template <
typename T>
457 template <
typename T>
469 std::scoped_lock lock(mutex);
475 template <
typename T>
476 inline TaskResult<T> &
479 std::is_move_constructible_v<T> &&std::is_move_assignable_v<T>)
488 std::scoped_lock lock(other.mutex);
490 result_is_available = other.result_is_available.load();
491 other.result_is_available =
false;
493 task = std::move(other.task);
496 task_result = std::move(other.task_result);
497 other.task_result.reset();
504 template <
typename T>
505 template <
typename Callable>
511 if (result_is_available)
518 std::scoped_lock lock(mutex);
519 if (result_is_available)
524 if (task.has_value())
534 template <
typename T>
538 std::is_copy_assignable_v<T>))
542 result_is_available =
true;
546 template <
typename T>
550 std::is_copy_assignable_v<T>))
553 task_result = std::move(t);
554 result_is_available =
true;
558 template <
typename T>
562 std::scoped_lock lock(mutex);
564 if (result_is_available)
568 result_is_available =
false;
572 Assert(task.has_value() ==
false,
573 ExcMessage(
"You cannot destroy a TaskResult object "
574 "while it is still waiting for its associated task "
575 "to finish. See the documentation of this class' "
576 "destructor for more information."));
581 template <
typename T>
586 ExcMessage(
"You can't join a TaskResult object that has not "
587 "been associated with a task."));
590 if (result_is_available)
599 std::scoped_lock lock(mutex);
600 if (result_is_available)
609 task_result = std::move(task.value().return_value());
612 result_is_available =
true;
619 template <
typename T>
624 if (result_is_available)
629 else if (task.has_value())
640 std::scoped_lock lock(mutex);
641 if (result_is_available)
655 template <
typename T>
661 "You can't ask for the result of a TaskResult object that "
662 "has not been associated with a task."));
664 if (!result_is_available)
666 return task_result.value();
TaskResult & operator=(TaskResult &&other) noexcept
void emplace_object(const T &t)
void operator=(const Task< T > &t)
TaskResult(const TaskResult< T > &)=delete
TaskResult(TaskResult< T > &&other) noexcept
TaskResult & operator=(const TaskResult &)=delete
std::optional< Task< T > > task
std::optional< T > task_result
void emplace_object(T &&t)
TaskResult(const Task< T > &task)
void try_emplace_task(const Callable &creator) const
std::atomic< bool > result_is_available
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_CXX20_REQUIRES(condition)
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
Task< RT > new_task(const std::function< RT()> &function)