275 memory_consumption() const;
281 mutable
std::optional<T>
object;
288 mutable
std::atomic<
bool> object_is_initialized;
307 std::is_move_assignable_v<T>))
309 : object_is_initialized(false)
315 std::is_move_assignable_v<T>))
317 :
object(other.
object)
319 object_is_initialized.store(other.object_is_initialized.load());
325 std::is_move_assignable_v<T>))
327 :
object(
std::move(other.
object))
329 object_is_initialized.store(other.object_is_initialized.load());
337 other.object.reset();
343 std::is_move_assignable_v<T>))
347 object_is_initialized.store(other.object_is_initialized.load());
354 std::is_move_assignable_v<T>))
357 object = std::move(other.object);
358 object_is_initialized.store(other.object_is_initialized.load());
365 other.object_is_initialized.store(
false);
366 other.object.reset();
374 std::is_move_assignable_v<T>))
375inline
void Lazy<T>::reset() noexcept
377 object_is_initialized.store(
false);
384 std::is_move_assignable_v<T>))
385template <
typename Callable>
408 if (!object_is_initialized.load(std::memory_order_acquire))
409#ifdef DEAL_II_HAVE_CXX20
413 std::lock_guard<std::mutex> lock(initialization_mutex);
423 if (!object_is_initialized.load(std::memory_order_relaxed))
426 object.emplace(std::move(creator()));
435 object_is_initialized.store(
true, std::memory_order_release);
442 "The internal std::optional<T> object does not contain a valid object "
443 "even though we have just initialized it."));
449 std::is_move_assignable_v<T>))
458 return (object_is_initialized &&
object.has_value());
464 std::is_move_assignable_v<T>))
468 object_is_initialized &&
object.has_value(),
470 "value() has been called but the contained object has not been "
471 "initialized. Did you forget to call 'ensure_initialized()' first?"));
473 return object.value();
479 std::is_move_assignable_v<T>))
483 object_is_initialized &&
object.has_value(),
485 "value() has been called but the contained object has not been "
486 "initialized. Did you forget to call 'ensure_initialized()' first?"));
488 return object.value();
494 std::is_move_assignable_v<T>))
495template <
typename Callable>
497 const Callable &creator)
const
500 ensure_initialized(creator);
501 return object.value();
507 std::is_move_assignable_v<T>))
508template <
typename Callable>
510 const Callable &creator)
513 ensure_initialized(creator);
514 return object.value();
520 std::is_move_assignable_v<T>))
521std::
size_t Lazy<T>::memory_consumption()
const
524 sizeof(*this) -
sizeof(object);