| #pragma once |
| |
| #include <initializer_list> |
| #include <utility> |
| |
| #include <nlohmann/detail/meta/type_traits.hpp> |
| |
| namespace nlohmann |
| { |
| namespace detail |
| { |
| template<typename BasicJsonType> |
| class json_ref |
| { |
| public: |
| using value_type = BasicJsonType; |
| |
| json_ref(value_type&& value) |
| : owned_value(std::move(value)) |
| , value_ref(&owned_value) |
| , is_rvalue(true) |
| {} |
| |
| json_ref(const value_type& value) |
| : value_ref(const_cast<value_type*>(&value)) |
| , is_rvalue(false) |
| {} |
| |
| json_ref(std::initializer_list<json_ref> init) |
| : owned_value(init) |
| , value_ref(&owned_value) |
| , is_rvalue(true) |
| {} |
| |
| 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)...) |
| , value_ref(&owned_value) |
| , is_rvalue(true) |
| {} |
| |
| // class should be movable only |
| json_ref(json_ref&&) = 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 (is_rvalue) |
| { |
| return std::move(*value_ref); |
| } |
| return *value_ref; |
| } |
| |
| value_type const& operator*() const |
| { |
| return *static_cast<value_type const*>(value_ref); |
| } |
| |
| value_type const* operator->() const |
| { |
| return static_cast<value_type const*>(value_ref); |
| } |
| |
| private: |
| mutable value_type owned_value = nullptr; |
| value_type* value_ref = nullptr; |
| const bool is_rvalue = true; |
| }; |
| } // namespace detail |
| } // namespace nlohmann |