Branch data Line data Source code
1 : : #pragma once 2 : : 3 : : #include <initializer_list> 4 : : #include <utility> 5 : : 6 : : #include <nlohmann/detail/meta/type_traits.hpp> 7 : : 8 : : namespace nlohmann 9 : : { 10 : : namespace detail 11 : : { 12 : : template<typename BasicJsonType> 13 : : class json_ref 14 : : { 15 : : public: 16 : : using value_type = BasicJsonType; 17 : : 18 : 23 : json_ref(value_type&& value) 19 : 23 : : owned_value(std::move(value)), value_ref(&owned_value), is_rvalue(true) 20 : 23 : {} 21 : : 22 : : json_ref(const value_type& value) 23 : : : value_ref(const_cast<value_type*>(&value)), is_rvalue(false) 24 : : {} 25 : : 26 : 106 : json_ref(std::initializer_list<json_ref> init) 27 : 106 : : owned_value(init), value_ref(&owned_value), is_rvalue(true) 28 : 106 : {} 29 : : 30 : : template < 31 : : class... Args, 32 : : enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 > 33 : 5693 : json_ref(Args && ... args) 34 : 5693 : : owned_value(std::forward<Args>(args)...), value_ref(&owned_value), 35 : 5693 : is_rvalue(true) {} 36 : : 37 : : // class should be movable only 38 : : json_ref(json_ref&&) = default; 39 : : json_ref(const json_ref&) = delete; 40 : : json_ref& operator=(const json_ref&) = delete; 41 : : json_ref& operator=(json_ref&&) = delete; 42 : 5822 : ~json_ref() = default; 43 : : 44 : 5822 : value_type moved_or_copied() const 45 : : { 46 : 5822 : if (is_rvalue) 47 : : { 48 : 5822 : return std::move(*value_ref); 49 : : } 50 : 0 : return *value_ref; 51 : 5822 : } 52 : : 53 : 106 : value_type const& operator*() const 54 : : { 55 : 106 : return *static_cast<value_type const*>(value_ref); 56 : : } 57 : : 58 : 2566 : value_type const* operator->() const 59 : : { 60 : 2566 : return static_cast<value_type const*>(value_ref); 61 : : } 62 : : 63 : : private: 64 : : mutable value_type owned_value = nullptr; 65 : : value_type* value_ref = nullptr; 66 : : const bool is_rvalue; 67 : : }; 68 : : } // namespace detail 69 : : } // namespace nlohmann