Some improvements to Lazy<T> class.

This commit is contained in:
LoRd_MuldeR 2018-04-15 02:20:09 +02:00
parent 562911dbff
commit 5673c6f14a

View File

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