diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-05-05T14·40+0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-05-05T15·08+0200 |
commit | 465cb6824401541d82489e11b5223dbfd50bb132 (patch) | |
tree | 98b112563cbf08c29e94c4ddc0755de95524186f /src/libutil/lazy.hh | |
parent | eba840c8a13b465ace90172ff76a0db2899ab11b (diff) |
Figure out the user's home directory if $HOME is not set
Diffstat (limited to 'src/libutil/lazy.hh')
-rw-r--r-- | src/libutil/lazy.hh | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/libutil/lazy.hh b/src/libutil/lazy.hh new file mode 100644 index 000000000000..d073e486c2eb --- /dev/null +++ b/src/libutil/lazy.hh @@ -0,0 +1,48 @@ +#include <exception> +#include <functional> +#include <mutex> + +namespace nix { + +/* A helper class for lazily-initialized variables. + + Lazy<T> var([]() { return value; }); + + declares a variable of type T that is initialized to 'value' (in a + thread-safe way) on first use, that is, when var() is first + called. If the initialiser code throws an exception, then all + subsequent calls to var() will rethrow that exception. */ +template<typename T> +class Lazy +{ + + typedef std::function<T()> Init; + + Init init; + + std::once_flag done; + + T value; + + std::exception_ptr ex; + +public: + + Lazy(Init init) : init(init) + { } + + const T & operator () () + { + std::call_once(done, [&]() { + try { + value = init(); + } catch (...) { + ex = std::current_exception(); + } + }); + if (ex) std::rethrow_exception(ex); + return value; + } +}; + +} |