#pragma once #include #include namespace NYT { //////////////////////////////////////////////////////////////////////////////// template struct TOptionalTraits { using TOptional = std::optional; using TValue = T; }; template struct TOptionalTraits> { using TOptional = std::optional; using TValue = T; }; template struct TOptionalTraits { using TOptional = T*; using TValue = T*; }; template struct TOptionalTraits> { using TOptional = TIntrusivePtr; using TValue = 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; } };