scheme_holder.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #pragma once
  2. #include <library/cpp/scheme/scheme.h>
  3. // Scheme adapter that holds referenced value
  4. template <typename TScheme>
  5. class TSchemeHolder {
  6. public:
  7. TSchemeHolder()
  8. : Value_(NSc::Null())
  9. , Scheme_(&Value_)
  10. {
  11. }
  12. explicit TSchemeHolder(NSc::TValue&& value)
  13. : Value_(std::move(value))
  14. , Scheme_(&Value_)
  15. {
  16. }
  17. explicit TSchemeHolder(const NSc::TValue& value)
  18. : Value_(value)
  19. , Scheme_(&Value_)
  20. {
  21. }
  22. TSchemeHolder(TSchemeHolder<TScheme>&& rhs)
  23. : Value_(std::move(rhs.Value_))
  24. , Scheme_(&Value_)
  25. {
  26. }
  27. TSchemeHolder(const TSchemeHolder<TScheme>& rhs)
  28. : Value_(rhs.Value_)
  29. , Scheme_(&Value_)
  30. {
  31. }
  32. TSchemeHolder<TScheme>& operator=(TSchemeHolder<TScheme>&& rhs) {
  33. Value_ = std::move(rhs.Value_);
  34. return *this;
  35. }
  36. TSchemeHolder<TScheme>& operator=(const TSchemeHolder<TScheme>& rhs) {
  37. Value_ = rhs.Value_;
  38. return *this;
  39. }
  40. TScheme& Scheme() {
  41. return Scheme_;
  42. }
  43. const TScheme& Scheme() const {
  44. return Scheme_;
  45. }
  46. TScheme& operator->() {
  47. return Scheme_;
  48. }
  49. const TScheme& operator->() const {
  50. return Scheme_;
  51. }
  52. NSc::TValue& Value() {
  53. return Value_;
  54. }
  55. const NSc::TValue& Value() const {
  56. return Value_;
  57. }
  58. bool IsNull() const {
  59. return Value_.IsNull();
  60. }
  61. private:
  62. NSc::TValue Value_;
  63. TScheme Scheme_;
  64. };