/* SPDX-FileCopyrightText: 2015 Ivan Cukic SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef UTILS_LAZY_VAL_H #define UTILS_LAZY_VAL_H namespace kamd { namespace utils { template class lazy_val { public: lazy_val(F f) : _f(std::forward(f)) , valueRetrieved(false) { } private: F _f; mutable decltype(_f()) value; mutable bool valueRetrieved; public: operator decltype(_f())() const { if (!valueRetrieved) { valueRetrieved = true; value = _f(); } return value; } }; template inline lazy_val make_lazy_val(F &&f) { return lazy_val(std::forward(f)); } } // namespace utils } // namespace kamd #endif // UTILS_LAZY_VAL_H