diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index a733f097..474cb750 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -2416,6 +2416,19 @@ class basic_json return is_number_float() ? &m_value.number_float : nullptr; } + /// helper function to implement get_ref without code duplication + /// for const and non-const overloads + /// ThisType will be deduced as 'basic_jason' or 'const basic_json' + template + static ReferenceType get_ref_impl(ThisType& obj) + { + using PointerType = std::add_pointer::type; + // delegate the call to get_ptr<>() + auto ptr = obj.get_ptr(); + if (ptr) return *ptr; + throw std::domain_error("incompatible ReferenceType for get_ref, actual type is " + obj.type_name()); + } + public: /// @name value access @@ -2563,6 +2576,52 @@ class basic_json return get_impl_ptr(static_cast(nullptr)); } + /*! + @brief get a reference value (implicit) + + Implict reference access to the internally stored JSON value. No copies are + made. + + @warning Writing data to the referee of the result yields an undefined + state. + + @tparam ReferenceType reference type; must be a reference to @ref array_t, @ref + object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or @ref + number_float_t. + + @return reference to the internally stored JSON value if the requested reference + type @a ReferenceType fits to the JSON value; throws std::domain_error otherwise + + @throw std::domain_error in case passed type @a ReferenceType is incompatible + with the stored JSON value + + @complexity Constant. + */ + template::value + , int>::type = 0> + ReferenceType get_ref() + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + + /*! + @brief get a reference value (implicit) + @copydoc get_ref() + */ + template::value + and std::is_const< typename std::remove_reference::type >::value + , int>::type = 0> + ReferenceType get_ref() const + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + /*! @brief get a value (implicit)