79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| //     __ _____ _____ _____
 | |
| //  __|  |   __|     |   | |  JSON for Modern C++
 | |
| // |  |  |__   |  |  | | | |  version 3.11.3
 | |
| // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 | |
| //
 | |
| // SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <initializer_list>
 | |
| #include <utility>
 | |
| 
 | |
| #include <nlohmann/detail/abi_macros.hpp>
 | |
| #include <nlohmann/detail/meta/type_traits.hpp>
 | |
| 
 | |
| NLOHMANN_JSON_NAMESPACE_BEGIN
 | |
| namespace detail
 | |
| {
 | |
| 
 | |
| template<typename BasicJsonType>
 | |
| class json_ref
 | |
| {
 | |
|   public:
 | |
|     using value_type = BasicJsonType;
 | |
| 
 | |
|     json_ref(value_type&& value)
 | |
|         : owned_value(std::move(value))
 | |
|     {}
 | |
| 
 | |
|     json_ref(const value_type& value)
 | |
|         : value_ref(&value)
 | |
|     {}
 | |
| 
 | |
|     json_ref(std::initializer_list<json_ref> init)
 | |
|         : owned_value(init)
 | |
|     {}
 | |
| 
 | |
|     template <
 | |
|         class... Args,
 | |
|         enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >
 | |
|     json_ref(Args && ... args)
 | |
|         : owned_value(std::forward<Args>(args)...)
 | |
|     {}
 | |
| 
 | |
|     // class should be movable only
 | |
|     json_ref(json_ref&&) noexcept = default;
 | |
|     json_ref(const json_ref&) = delete;
 | |
|     json_ref& operator=(const json_ref&) = delete;
 | |
|     json_ref& operator=(json_ref&&) = delete;
 | |
|     ~json_ref() = default;
 | |
| 
 | |
|     value_type moved_or_copied() const
 | |
|     {
 | |
|         if (value_ref == nullptr)
 | |
|         {
 | |
|             return std::move(owned_value);
 | |
|         }
 | |
|         return *value_ref;
 | |
|     }
 | |
| 
 | |
|     value_type const& operator*() const
 | |
|     {
 | |
|         return value_ref ? *value_ref : owned_value;
 | |
|     }
 | |
| 
 | |
|     value_type const* operator->() const
 | |
|     {
 | |
|         return &** this;
 | |
|     }
 | |
| 
 | |
|   private:
 | |
|     mutable value_type owned_value = nullptr;
 | |
|     value_type const* value_ref = nullptr;
 | |
| };
 | |
| 
 | |
| }  // namespace detail
 | |
| NLOHMANN_JSON_NAMESPACE_END
 |