1 /******************************************************************************
3 * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) *
5 * This program is free software; you can redistribute it and/or *
6 * modify it under the terms of the GNU General Public License *
7 * as published by the Free Software Foundation; either version 2 *
8 * of the License, or (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the Free Software Foundation *
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
18 ******************************************************************************/
32 * Lazy object initialization abstraction inspired from
33 * <https://docs.microsoft.com/en-us/dotnet/api/system.lazy-1?view=netframework-4.7.2>.
42 LazyInit(std::function<T()> initializer = []() { return T(); }) : m_Initializer(std::move(initializer))
44 m_Underlying.store(nullptr, std::memory_order_release);
47 LazyInit(const LazyInit&) = delete;
48 LazyInit(LazyInit&&) = delete;
49 LazyInit& operator=(const LazyInit&) = delete;
50 LazyInit& operator=(LazyInit&&) = delete;
55 auto ptr (m_Underlying.load(std::memory_order_acquire));
65 auto ptr (m_Underlying.load(std::memory_order_acquire));
68 std::unique_lock<std::mutex> lock (m_Mutex);
70 ptr = m_Underlying.load(std::memory_order_acquire);
73 ptr = new T(m_Initializer());
74 m_Underlying.store(ptr, std::memory_order_release);
82 std::function<T()> m_Initializer;
84 std::atomic<T*> m_Underlying;
89 #endif /* LAZY_INIT */