Merge branch 'develop' into fix/1237
This commit is contained in:
		
						commit
						1fae82b7a7
					
				
					 16 changed files with 317 additions and 97 deletions
				
			
		| 
						 | 
				
			
			@ -10,7 +10,7 @@
 | 
			
		|||
            #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
 | 
			
		||||
        #endif
 | 
			
		||||
    #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
 | 
			
		||||
        #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900
 | 
			
		||||
        #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
 | 
			
		||||
            #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
 | 
			
		||||
        #endif
 | 
			
		||||
    #endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -442,7 +442,7 @@ class serializer
 | 
			
		|||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const bool is_negative = (x <= 0) and (x != 0);  // see issue #755
 | 
			
		||||
        const bool is_negative = not (x >= 0);  // see issue #755
 | 
			
		||||
        std::size_t i = 0;
 | 
			
		||||
 | 
			
		||||
        while (x != 0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2623,6 +2623,52 @@ class basic_json
 | 
			
		|||
        return JSONSerializer<ValueTypeCV>::from_json(*this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
    @brief get a value (explicit)
 | 
			
		||||
 | 
			
		||||
    Explicit type conversion between the JSON value and a compatible value.
 | 
			
		||||
    The value is filled into the input parameter by calling the @ref json_serializer<ValueType>
 | 
			
		||||
    `from_json()` method.
 | 
			
		||||
 | 
			
		||||
    The function is equivalent to executing
 | 
			
		||||
    @code {.cpp}
 | 
			
		||||
    ValueType v;
 | 
			
		||||
    JSONSerializer<ValueType>::from_json(*this, v);
 | 
			
		||||
    @endcode
 | 
			
		||||
 | 
			
		||||
    This overloads is chosen if:
 | 
			
		||||
    - @a ValueType is not @ref basic_json,
 | 
			
		||||
    - @ref json_serializer<ValueType> has a `from_json()` method of the form
 | 
			
		||||
      `void from_json(const basic_json&, ValueType&)`, and
 | 
			
		||||
 | 
			
		||||
    @tparam ValueType the input parameter type.
 | 
			
		||||
 | 
			
		||||
    @return the input parameter, allowing chaining calls.
 | 
			
		||||
 | 
			
		||||
    @throw what @ref json_serializer<ValueType> `from_json()` method throws
 | 
			
		||||
 | 
			
		||||
    @liveexample{The example below shows several conversions from JSON values
 | 
			
		||||
    to other types. There a few things to note: (1) Floating-point numbers can
 | 
			
		||||
    be converted to integers\, (2) A JSON array can be converted to a standard
 | 
			
		||||
    `std::vector<short>`\, (3) A JSON object can be converted to C++
 | 
			
		||||
    associative containers such as `std::unordered_map<std::string\,
 | 
			
		||||
    json>`.,get_to}
 | 
			
		||||
 | 
			
		||||
    @since version 3.3.0
 | 
			
		||||
    */
 | 
			
		||||
    template<typename ValueType,
 | 
			
		||||
             detail::enable_if_t <
 | 
			
		||||
                 not detail::is_basic_json<ValueType>::value and
 | 
			
		||||
                 detail::has_from_json<basic_json_t, ValueType>::value,
 | 
			
		||||
                 int> = 0>
 | 
			
		||||
    ValueType & get_to(ValueType& v) const noexcept(noexcept(
 | 
			
		||||
                JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), v)))
 | 
			
		||||
    {
 | 
			
		||||
        JSONSerializer<ValueType>::from_json(*this, v);
 | 
			
		||||
        return v;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
    @brief get a pointer value (implicit)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -4915,6 +4961,26 @@ class basic_json
 | 
			
		|||
        return {it, res.second};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Helper for insertion of an iterator
 | 
			
		||||
    /// @note: This uses std::distance to support GCC 4.8,
 | 
			
		||||
    ///        see https://github.com/nlohmann/json/pull/1257
 | 
			
		||||
    template<typename... Args>
 | 
			
		||||
    iterator insert_iterator(const_iterator pos, Args&& ... args)
 | 
			
		||||
    {
 | 
			
		||||
        iterator result(this);
 | 
			
		||||
        assert(m_value.array != nullptr);
 | 
			
		||||
 | 
			
		||||
        auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator);
 | 
			
		||||
        m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);
 | 
			
		||||
        result.m_it.array_iterator = m_value.array->begin() + insert_pos;
 | 
			
		||||
 | 
			
		||||
        // This could have been written as:
 | 
			
		||||
        // result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val);
 | 
			
		||||
        // but the return value of insert is missing in GCC 4.8, so it is written this way instead.
 | 
			
		||||
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
    @brief inserts element
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -4949,9 +5015,7 @@ class basic_json
 | 
			
		|||
            }
 | 
			
		||||
 | 
			
		||||
            // insert to array and return iterator
 | 
			
		||||
            iterator result(this);
 | 
			
		||||
            result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, val);
 | 
			
		||||
            return result;
 | 
			
		||||
            return insert_iterator(pos, val);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
 | 
			
		||||
| 
						 | 
				
			
			@ -5002,9 +5066,7 @@ class basic_json
 | 
			
		|||
            }
 | 
			
		||||
 | 
			
		||||
            // insert to array and return iterator
 | 
			
		||||
            iterator result(this);
 | 
			
		||||
            result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val);
 | 
			
		||||
            return result;
 | 
			
		||||
            return insert_iterator(pos, cnt, val);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
 | 
			
		||||
| 
						 | 
				
			
			@ -5066,12 +5128,7 @@ class basic_json
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        // insert to array and return iterator
 | 
			
		||||
        iterator result(this);
 | 
			
		||||
        result.m_it.array_iterator = m_value.array->insert(
 | 
			
		||||
                                         pos.m_it.array_iterator,
 | 
			
		||||
                                         first.m_it.array_iterator,
 | 
			
		||||
                                         last.m_it.array_iterator);
 | 
			
		||||
        return result;
 | 
			
		||||
        return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
| 
						 | 
				
			
			@ -5113,9 +5170,7 @@ class basic_json
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        // insert to array and return iterator
 | 
			
		||||
        iterator result(this);
 | 
			
		||||
        result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, ilist.begin(), ilist.end());
 | 
			
		||||
        return result;
 | 
			
		||||
        return insert_iterator(pos, ilist.begin(), ilist.end());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
| 
						 | 
				
			
			@ -7663,19 +7718,6 @@ class basic_json
 | 
			
		|||
// specialization of std::swap, and std::hash
 | 
			
		||||
namespace std
 | 
			
		||||
{
 | 
			
		||||
/*!
 | 
			
		||||
@brief exchanges the values of two JSON objects
 | 
			
		||||
 | 
			
		||||
@since version 1.0.0
 | 
			
		||||
*/
 | 
			
		||||
template<>
 | 
			
		||||
inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcept(
 | 
			
		||||
    is_nothrow_move_constructible<nlohmann::json>::value and
 | 
			
		||||
    is_nothrow_move_assignable<nlohmann::json>::value
 | 
			
		||||
)
 | 
			
		||||
{
 | 
			
		||||
    j1.swap(j2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// hash value for JSON objects
 | 
			
		||||
template<>
 | 
			
		||||
| 
						 | 
				
			
			@ -7711,6 +7753,20 @@ struct less< ::nlohmann::detail::value_t>
 | 
			
		|||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
@brief exchanges the values of two JSON objects
 | 
			
		||||
 | 
			
		||||
@since version 1.0.0
 | 
			
		||||
*/
 | 
			
		||||
template<>
 | 
			
		||||
inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcept(
 | 
			
		||||
    is_nothrow_move_constructible<nlohmann::json>::value and
 | 
			
		||||
    is_nothrow_move_assignable<nlohmann::json>::value
 | 
			
		||||
)
 | 
			
		||||
{
 | 
			
		||||
    j1.swap(j2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace std
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue