]> https://gitweb.dealii.org/ - dealii.git/commitdiff
base: add Lazy<T>::has_value() method
authorMatthias Maier <tamiko@43-1.org>
Fri, 27 Oct 2023 04:29:55 +0000 (23:29 -0500)
committerMatthias Maier <tamiko@43-1.org>
Fri, 27 Oct 2023 07:01:39 +0000 (02:01 -0500)
include/deal.II/base/lazy.h
tests/base/lazy_01.cc
tests/base/lazy_01.output

index e2c5f22b06ef759a37b23550ef9d151073fe6498..307fbc9708cc0029ffda1f143ed745a577a52463 100644 (file)
@@ -138,6 +138,14 @@ public:
   ensure_initialized(const Callable &creator) const;
 
 
+  /**
+   * Returns true if the contained object has been initialized, otherwise
+   * false.
+   */
+  bool
+  has_value() const;
+
+
   /**
    * Return a const reference to the contained object.
    *
@@ -326,12 +334,26 @@ Lazy<T>::ensure_initialized(const Callable &creator) const
 }
 
 
+template <typename T>
+inline DEAL_II_ALWAYS_INLINE bool
+Lazy<T>::has_value() const
+{
+  //
+  // In principle it would be sufficient to solely check the atomic<bool>
+  // object_is_initialized because the load() is performed with "acquire"
+  // semantics. But just in case let's check the object.has_value() boolean
+  // as well:
+  //
+  return object_is_initialized && object.has_value();
+}
+
+
 template <typename T>
 inline DEAL_II_ALWAYS_INLINE const T &
 Lazy<T>::value() const
 {
   Assert(
-    object.has_value(),
+    object_is_initialized && object.has_value(),
     dealii::ExcMessage(
       "value() has been called but the contained object has not been "
       "initialized. Did you forget to call 'ensure_initialized()' first?"));
@@ -345,7 +367,7 @@ inline DEAL_II_ALWAYS_INLINE T &
 Lazy<T>::value()
 {
   Assert(
-    object.has_value(),
+    object_is_initialized && object.has_value(),
     dealii::ExcMessage(
       "value() has been called but the contained object has not been "
       "initialized. Did you forget to call 'ensure_initialized()' first?"));
index 879f3c339cf751cdc1fbe0a14b23bfcb61719e9a..b33277d5a65fcbd5a1ffa8619778c6b35170f075 100644 (file)
@@ -33,11 +33,15 @@ main()
 
   {
     Lazy<int> lazy_integer;
+    deallog << "lazy_integer.has_value() = " << lazy_integer.has_value()
+            << std::endl;
 
     lazy_integer.ensure_initialized([&]() {
       deallog << "[initializing object]" << std::endl;
       return 42;
     });
+    deallog << "lazy_integer.has_value() = " << lazy_integer.has_value()
+            << std::endl;
     deallog << "lazy_integer.value() = " << lazy_integer.value() << std::endl;
 
     lazy_integer.ensure_initialized([&]() {
index 7d33dd9badeea0d2453ea537ac671adb115c486b..728e7260e7004fac16fb8f86edcc9fca3c93801e 100644 (file)
@@ -1,5 +1,7 @@
 
+DEAL::lazy_integer.has_value() = 0
 DEAL::[initializing object]
+DEAL::lazy_integer.has_value() = 1
 DEAL::lazy_integer.value() = 42
 DEAL::lazy_integer.value() = 42
 DEAL::lazy_integer.value() = ... [initializing object] ... 42

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.