json_ref.hpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #pragma once
  2. #include <initializer_list>
  3. #include <utility>
  4. namespace nlohmann
  5. {
  6. namespace detail
  7. {
  8. template<typename BasicJsonType>
  9. class json_ref
  10. {
  11. public:
  12. using value_type = BasicJsonType;
  13. json_ref(value_type&& value)
  14. : owned_value(std::move(value)), value_ref(&owned_value), is_rvalue(true)
  15. {}
  16. json_ref(const value_type& value)
  17. : value_ref(const_cast<value_type*>(&value)), is_rvalue(false)
  18. {}
  19. json_ref(std::initializer_list<json_ref> init)
  20. : owned_value(init), value_ref(&owned_value), is_rvalue(true)
  21. {}
  22. template<class... Args>
  23. json_ref(Args&& ... args)
  24. : owned_value(std::forward<Args>(args)...), value_ref(&owned_value), is_rvalue(true)
  25. {}
  26. // class should be movable only
  27. json_ref(json_ref&&) = default;
  28. json_ref(const json_ref&) = delete;
  29. json_ref& operator=(const json_ref&) = delete;
  30. value_type moved_or_copied() const
  31. {
  32. if (is_rvalue)
  33. {
  34. return std::move(*value_ref);
  35. }
  36. return *value_ref;
  37. }
  38. value_type const& operator*() const
  39. {
  40. return *static_cast<value_type const*>(value_ref);
  41. }
  42. value_type const* operator->() const
  43. {
  44. return static_cast<value_type const*>(value_ref);
  45. }
  46. private:
  47. mutable value_type owned_value = nullptr;
  48. value_type* value_ref = nullptr;
  49. const bool is_rvalue;
  50. };
  51. }
  52. }