cleanup after #184

This commit is contained in:
Niels 2016-01-20 21:14:58 +01:00
parent 663ad13fc3
commit a04bd4f851
7 changed files with 103 additions and 58 deletions

View file

@ -382,7 +382,7 @@ I deeply appreciate the help of the following people.
- [Colin Hirsch](https://github.com/ColinH) took care of a small namespace issue. - [Colin Hirsch](https://github.com/ColinH) took care of a small namespace issue.
- [Huu Nguyen](https://github.com/whoshuu) correct a variable name in the documentation. - [Huu Nguyen](https://github.com/whoshuu) correct a variable name in the documentation.
- [Silverweed](https://github.com/silverweed) overloaded `parse()` to accept an rvalue reference. - [Silverweed](https://github.com/silverweed) overloaded `parse()` to accept an rvalue reference.
- [dariomt](https://github.com/dariomt) fixed a subtlety in MSVC type support. - [dariomt](https://github.com/dariomt) fixed a subtlety in MSVC type support and implemented the `get_ref()` function to get a reference to stored values.
- [ZahlGraf](https://github.com/ZahlGraf) added a workaround that allows compilation using Android NDK. - [ZahlGraf](https://github.com/ZahlGraf) added a workaround that allows compilation using Android NDK.
- [whackashoe](https://github.com/whackashoe) replaced a function that was marked as unsafe by Visual Studio. - [whackashoe](https://github.com/whackashoe) replaced a function that was marked as unsafe by Visual Studio.
- [406345](https://github.com/406345) fixed two small warnings. - [406345](https://github.com/406345) fixed two small warnings.

View file

@ -0,0 +1 @@
<a target="_blank" href="http://melpon.org/wandbox/permlink/nBNBANVonG9HCQqQ"><b>online</b></a>

View file

@ -0,0 +1,2 @@
17 17
incompatible ReferenceType for get_ref, actual type is number

View file

@ -2416,17 +2416,33 @@ class basic_json
return is_number_float() ? &m_value.number_float : nullptr; return is_number_float() ? &m_value.number_float : nullptr;
} }
/// helper function to implement get_ref without code duplication /*!
/// for const and non-const overloads @brief helper function to implement get_ref()
/// ThisType will be deduced as 'basic_jason' or 'const basic_json'
This funcion helps to implement get_ref() without code duplication for
const and non-const overloads
@tparam ThisType will be deduced as `basic_json` or `const basic_json`
@throw std::domain_error if ReferenceType does not match underlying value
type of the current JSON
*/
template<typename ReferenceType, typename ThisType> template<typename ReferenceType, typename ThisType>
static ReferenceType get_ref_impl(ThisType& obj) static ReferenceType get_ref_impl(ThisType& obj)
{ {
using PointerType = typename std::add_pointer<ReferenceType>::type;
// delegate the call to get_ptr<>() // delegate the call to get_ptr<>()
using PointerType = typename std::add_pointer<ReferenceType>::type;
auto ptr = obj.template get_ptr<PointerType>(); auto ptr = obj.template get_ptr<PointerType>();
if (ptr) return *ptr;
throw std::domain_error("incompatible ReferenceType for get_ref, actual type is " + obj.type_name()); if (ptr != nullptr)
{
return *ptr;
}
else
{
throw std::domain_error("incompatible ReferenceType for get_ref, actual type is " +
obj.type_name());
}
} }
public: public:
@ -2585,17 +2601,22 @@ class basic_json
@warning Writing data to the referee of the result yields an undefined @warning Writing data to the referee of the result yields an undefined
state. state.
@tparam ReferenceType reference type; must be a reference to @ref array_t, @ref @tparam ReferenceType reference type; must be a reference to @ref array_t,
object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or @ref @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or
number_float_t. @ref number_float_t.
@return reference to the internally stored JSON value if the requested reference @return reference to the internally stored JSON value if the requested
type @a ReferenceType fits to the JSON value; throws std::domain_error otherwise 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 @throw std::domain_error in case passed type @a ReferenceType is
with the stored JSON value incompatible with the stored JSON value
@complexity Constant. @complexity Constant.
@liveexample{The example shows several calls to `get_ref()`.,get_ref}
@since version 1.0.1
*/ */
template<typename ReferenceType, typename template<typename ReferenceType, typename
std::enable_if< std::enable_if<

View file

@ -2416,17 +2416,33 @@ class basic_json
return is_number_float() ? &m_value.number_float : nullptr; return is_number_float() ? &m_value.number_float : nullptr;
} }
/// helper function to implement get_ref without code duplication /*!
/// for const and non-const overloads @brief helper function to implement get_ref()
/// ThisType will be deduced as 'basic_jason' or 'const basic_json'
This funcion helps to implement get_ref() without code duplication for
const and non-const overloads
@tparam ThisType will be deduced as `basic_json` or `const basic_json`
@throw std::domain_error if ReferenceType does not match underlying value
type of the current JSON
*/
template<typename ReferenceType, typename ThisType> template<typename ReferenceType, typename ThisType>
static ReferenceType get_ref_impl(ThisType& obj) static ReferenceType get_ref_impl(ThisType& obj)
{ {
using PointerType = typename std::add_pointer<ReferenceType>::type;
// delegate the call to get_ptr<>() // delegate the call to get_ptr<>()
using PointerType = typename std::add_pointer<ReferenceType>::type;
auto ptr = obj.template get_ptr<PointerType>(); auto ptr = obj.template get_ptr<PointerType>();
if (ptr) return *ptr;
throw std::domain_error("incompatible ReferenceType for get_ref, actual type is " + obj.type_name()); if (ptr != nullptr)
{
return *ptr;
}
else
{
throw std::domain_error("incompatible ReferenceType for get_ref, actual type is " +
obj.type_name());
}
} }
public: public:
@ -2585,17 +2601,22 @@ class basic_json
@warning Writing data to the referee of the result yields an undefined @warning Writing data to the referee of the result yields an undefined
state. state.
@tparam ReferenceType reference type; must be a reference to @ref array_t, @ref @tparam ReferenceType reference type; must be a reference to @ref array_t,
object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or @ref @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or
number_float_t. @ref number_float_t.
@return reference to the internally stored JSON value if the requested reference @return reference to the internally stored JSON value if the requested
type @a ReferenceType fits to the JSON value; throws std::domain_error otherwise 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 @throw std::domain_error in case passed type @a ReferenceType is
with the stored JSON value incompatible with the stored JSON value
@complexity Constant. @complexity Constant.
@liveexample{The example shows several calls to `get_ref()`.,get_ref}
@since version 1.0.1
*/ */
template<typename ReferenceType, typename template<typename ReferenceType, typename
std::enable_if< std::enable_if<