json_ref.hpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // __ _____ _____ _____
  2. // __| | __| | | | JSON for Modern C++
  3. // | | |__ | | | | | | version 3.11.3
  4. // |_____|_____|_____|_|___| https://github.com/nlohmann/json
  5. //
  6. // SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
  7. // SPDX-License-Identifier: MIT
  8. #pragma once
  9. #include <initializer_list>
  10. #include <utility>
  11. #include <nlohmann/detail/abi_macros.hpp>
  12. #include <nlohmann/detail/meta/type_traits.hpp>
  13. NLOHMANN_JSON_NAMESPACE_BEGIN
  14. namespace detail
  15. {
  16. template<typename BasicJsonType>
  17. class json_ref
  18. {
  19. public:
  20. using value_type = BasicJsonType;
  21. json_ref(value_type&& value)
  22. : owned_value(std::move(value))
  23. {}
  24. json_ref(const value_type& value)
  25. : value_ref(&value)
  26. {}
  27. json_ref(std::initializer_list<json_ref> init)
  28. : owned_value(init)
  29. {}
  30. template <
  31. class... Args,
  32. enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >
  33. json_ref(Args && ... args)
  34. : owned_value(std::forward<Args>(args)...)
  35. {}
  36. // class should be movable only
  37. json_ref(json_ref&&) noexcept = default;
  38. json_ref(const json_ref&) = delete;
  39. json_ref& operator=(const json_ref&) = delete;
  40. json_ref& operator=(json_ref&&) = delete;
  41. ~json_ref() = default;
  42. value_type moved_or_copied() const
  43. {
  44. if (value_ref == nullptr)
  45. {
  46. return std::move(owned_value);
  47. }
  48. return *value_ref;
  49. }
  50. value_type const& operator*() const
  51. {
  52. return value_ref ? *value_ref : owned_value;
  53. }
  54. value_type const* operator->() const
  55. {
  56. return &** this;
  57. }
  58. private:
  59. mutable value_type owned_value = nullptr;
  60. value_type const* value_ref = nullptr;
  61. };
  62. } // namespace detail
  63. NLOHMANN_JSON_NAMESPACE_END