optional.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #pragma once
  2. #include <util/string/cast.h>
  3. #include <optional>
  4. namespace NYT {
  5. ////////////////////////////////////////////////////////////////////////////////
  6. template <class T>
  7. struct TOptionalTraits
  8. {
  9. using TOptional = std::optional<T>;
  10. using TValue = T;
  11. };
  12. template <class T>
  13. struct TOptionalTraits<std::optional<T>>
  14. {
  15. using TOptional = std::optional<T>;
  16. using TValue = T;
  17. };
  18. template <class T>
  19. struct TOptionalTraits<T*>
  20. {
  21. using TOptional = T*;
  22. using TValue = T*;
  23. };
  24. template <class T>
  25. struct TOptionalTraits<TIntrusivePtr<T>>
  26. {
  27. using TOptional = TIntrusivePtr<T>;
  28. using TValue = TIntrusivePtr<T>;
  29. };
  30. ////////////////////////////////////////////////////////////////////////////////
  31. template <class T>
  32. struct TStdOptionalTraits
  33. {
  34. static constexpr bool IsStdOptional = false;
  35. using TValueType = T;
  36. };
  37. template <class T>
  38. struct TStdOptionalTraits<std::optional<T>>
  39. {
  40. static constexpr bool IsStdOptional = true;
  41. using TValueType = T;
  42. };
  43. ////////////////////////////////////////////////////////////////////////////////
  44. } // namespace NYT
  45. template <class T>
  46. TString ToString(const std::optional<T>& nullable)
  47. {
  48. return nullable ? ToString(*nullable) : "<Null>";
  49. }
  50. template <class T>
  51. struct THash<std::optional<T>>
  52. {
  53. size_t operator()(const std::optional<T>& nullable) const
  54. {
  55. return nullable ? THash<T>()(*nullable) : 0;
  56. }
  57. };