aboutsummaryrefslogtreecommitdiffstats
path: root/util/ysaveload.h
diff options
context:
space:
mode:
authorionagamed <ionagamed@yandex-team.com>2023-06-10 13:55:54 +0300
committerionagamed <ionagamed@yandex-team.com>2023-06-10 13:55:54 +0300
commit824bccde520021cc23441f3f0d01bdd791ff6790 (patch)
treeb1b84d730f4359a45ffb16623bc625706e57ceea /util/ysaveload.h
parentd570836295decdb827b4f95d75ebf2d8d9232b9b (diff)
downloadydb-824bccde520021cc23441f3f0d01bdd791ff6790.tar.gz
util/saveload: implement default saveload for std::optional
Diffstat (limited to 'util/ysaveload.h')
-rw-r--r--util/ysaveload.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/util/ysaveload.h b/util/ysaveload.h
index f3451e2ad5..8771f1e4a1 100644
--- a/util/ysaveload.h
+++ b/util/ysaveload.h
@@ -12,6 +12,7 @@
#ifndef __NVCC__
// cuda is compiled in C++14 mode at the time
+ #include <optional>
#include <variant>
#endif
@@ -642,6 +643,27 @@ public:
#ifndef __NVCC__
+template <typename T>
+struct TSerializer<std::optional<T>> {
+ static inline void Save(IOutputStream* os, const std::optional<T>& v) {
+ ::Save(os, v.has_value());
+ if (v.has_value()) {
+ ::Save(os, *v);
+ }
+ }
+
+ static inline void Load(IInputStream* is, std::optional<T>& v) {
+ v.reset();
+
+ bool hasValue;
+ ::Load(is, hasValue);
+
+ if (hasValue) {
+ ::Load(is, v.emplace());
+ }
+ }
+};
+
namespace NPrivate {
template <class Variant, class T, size_t I>
void LoadVariantAlternative(IInputStream* is, Variant& v) {