OSDN Git Service

Some improvements to Lazy<T> class.
authorLoRd_MuldeR <mulder2@gmx.de>
Sun, 15 Apr 2018 00:20:09 +0000 (02:20 +0200)
committerLoRd_MuldeR <mulder2@gmx.de>
Sun, 15 Apr 2018 00:20:09 +0000 (02:20 +0200)
include/MUtils/Lazy.h

index e5fb12d..904c1ec 100644 (file)
@@ -52,20 +52,26 @@ namespace MUtils
 
                T& operator*(void)
                {
-                       while (!m_value)
+                       T *value;
+                       do
                        {
-                               if (T *const value = m_initializer())
+                               if (!(value = m_value.fetchAndAddOrdered(0)))
                                {
-                                       if (!m_value.testAndSetOrdered(NULL, value))
+                                       if (value = m_initializer())
                                        {
-                                               delete value; /*too late*/
+                                               if (!m_value.testAndSetOrdered(NULL, value))
+                                               {
+                                                       delete value;
+                                                       value = NULL;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               MUTILS_THROW("Initializer returned NULL pointer!");
                                        }
-                               }
-                               else
-                               {
-                                       MUTILS_THROW("Initializer returned NULL!");
                                }
                        }
+                       while (!value);
                        return *m_value;
                }