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)
{
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;
}