diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/generic/lazy_value.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/generic/lazy_value.h')
-rw-r--r-- | util/generic/lazy_value.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/util/generic/lazy_value.h b/util/generic/lazy_value.h new file mode 100644 index 0000000000..3c720f76b5 --- /dev/null +++ b/util/generic/lazy_value.h @@ -0,0 +1,66 @@ +#pragma once + +#include "maybe.h" +#include "function.h" + +template <class T> +class TLazyValueBase { +public: + using TInitializer = std::function<T()>; + + TLazyValueBase() = default; + + TLazyValueBase(TInitializer initializer) + : Initializer(std::move(initializer)) + { + } + + explicit operator bool() const noexcept { + return Defined(); + } + + bool Defined() const noexcept { + return ValueHolder.Defined(); + } + + const T& GetRef() const { + if (!Defined()) { + InitDefault(); + } + return *ValueHolder; + } + + const T& operator*() const { + return GetRef(); + } + + const T* operator->() const { + return &GetRef(); + } + + void InitDefault() const { + Y_ASSERT(Initializer); + ValueHolder = Initializer(); + } + +private: + mutable TMaybe<T> ValueHolder; + TInitializer Initializer; +}; + +// we need this to get implicit construction TLazyValue from lambda +// and save default copy constructor and operator= for type TLazyValue +template <class T> +class TLazyValue: public TLazyValueBase<T> { +public: + template <typename... TArgs> + TLazyValue(TArgs&&... args) + : TLazyValueBase<T>(std::forward<TArgs>(args)...) + { + } +}; + +template <typename F> +TLazyValue<TFunctionResult<F>> MakeLazy(F&& f) { + return {std::forward<F>(f)}; +} |