#pragma once #include #include namespace NYT { //////////////////////////////////////////////////////////////////////////////// template struct TOptionalTraits { using TOptional = std::optional; using TValue = T; static constexpr bool HasValue(const TOptional& opt) { return opt.has_value(); } static constexpr TOptional Empty() { return std::nullopt; } }; template struct TOptionalTraits> { using TOptional = std::optional; using TValue = T; static constexpr bool HasValue(const TOptional& opt) { return opt.has_value(); } static constexpr TOptional Empty() { return std::nullopt; } }; template struct TOptionalTraits { using TOptional = T*; using TValue = T*; static constexpr bool HasValue(const TOptional& opt) { return opt != nullptr; } static constexpr TOptional Empty() { return nullptr; } }; template struct TOptionalTraits> { using TOptional = TIntrusivePtr; using TValue = TIntrusivePtr; static bool HasValue(const TOptional& opt) { return opt.Get() != nullptr; } static constexpr TOptional Empty() { return TIntrusivePtr{}; } }; //////////////////////////////////////////////////////////////////////////////// template struct TStdOptionalTraits { static constexpr bool IsStdOptional = false; using TValueType = T; }; template struct TStdOptionalTraits> { static constexpr bool IsStdOptional = true; using TValueType = T; }; //////////////////////////////////////////////////////////////////////////////// } // namespace NYT template TString ToString(const std::optional& nullable) { return nullable ? ToString(*nullable) : ""; } template struct THash> { size_t operator()(const std::optional& nullable) const { return nullable ? THash()(*nullable) : 0; } };