diff --git a/doc/examples/count.cpp b/doc/examples/count.cpp
index a805eeb6..b97f71da 100644
--- a/doc/examples/count.cpp
+++ b/doc/examples/count.cpp
@@ -12,7 +12,6 @@ int main()
auto count_three = j_object.count("three");
// print values
- std::cout << std::boolalpha;
std::cout << "number of elements with key \"two\": " << count_two << '\n';
std::cout << "number of elements with key \"three\": " << count_three << '\n';
}
diff --git a/doc/examples/count.link b/doc/examples/count.link
index 62833ff4..0893d922 100644
--- a/doc/examples/count.link
+++ b/doc/examples/count.link
@@ -1 +1 @@
-online
\ No newline at end of file
+online
\ No newline at end of file
diff --git a/src/json.hpp b/src/json.hpp
index d08ad58e..ba7d8212 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -90,7 +90,13 @@ namespace
{
/*!
@brief Helper to determine whether there's a key_type for T.
+
+Thus helper is used to tell associative containers apart from other containers
+such as sequence containers. For instance, `std::map` passes the test as it
+contains a `mapped_type`, whereas `std::vector` fails the test.
+
@sa http://stackoverflow.com/a/7728728/266378
+@since version 1.0.0
*/
template
struct has_mapped_type
@@ -104,11 +110,18 @@ struct has_mapped_type
/*!
@brief helper class to create locales with decimal point
+
+This struct is used a default locale during the JSON serialization. JSON
+requires the decimal point to be `.`, so this function overloads the
+`do_decimal_point()` function to return `.`. This function is called by
+float-to-string conversions to retrieve the decimal separator between integer
+and fractional parts.
+
@sa https://github.com/nlohmann/json/issues/51#issuecomment-86869315
+@since version 2.0.0
*/
-class DecimalSeparator : public std::numpunct
+struct DecimalSeparator : std::numpunct
{
- protected:
char do_decimal_point() const
{
return '.';
@@ -202,13 +215,8 @@ class basic_json
{
private:
/// workaround type for MSVC
- using basic_json_t = basic_json;
public:
@@ -221,6 +229,8 @@ class basic_json
/////////////////////
/// @name container types
+ /// The canonic container types to use @ref basic_json like any other STL
+ /// container.
/// @{
/// the type of elements in a basic_json container
@@ -270,6 +280,8 @@ class basic_json
///////////////////////////
/// @name JSON value data types
+ /// The data types to store a JSON value. These types are derived from
+ /// the template arguments passed to class @ref basic_json.
/// @{
/*!
@@ -937,6 +949,8 @@ class basic_json
//////////////////
/// @name constructors and destructors
+ /// Constructors of class @ref basic_json, copy/move constructor, copy
+ /// assignment, static functions creating objects, and the destructor.
/// @{
/*!
@@ -2074,19 +2088,20 @@ class basic_json
///////////////////////
/// @name object inspection
+ /// Functions to inspect the type of a JSON value.
/// @{
/*!
@brief serialization
Serialization function for JSON values. The function tries to mimic
- Python's @p json.dumps() function, and currently supports its @p indent
+ Python's `json.dumps()` function, and currently supports its @a indent
parameter.
- @param[in] indent if indent is nonnegative, then array elements and object
+ @param[in] indent If indent is nonnegative, then array elements and object
members will be pretty-printed with that indent level. An indent level of
- 0 will only insert newlines. -1 (the default) selects the most compact
- representation
+ `0` will only insert newlines. `-1` (the default) selects the most compact
+ representation.
@return string containing the serialization of the JSON value
@@ -2772,6 +2787,7 @@ class basic_json
public:
/// @name value access
+ /// Direct access to the stored value of a JSON value.
/// @{
/*!
@@ -2822,7 +2838,8 @@ class basic_json
Explicit pointer access to the internally stored JSON value. No copies are
made.
- @warning The pointer becomes invalid if the underlying JSON object changes.
+ @warning The pointer becomes invalid if the underlying JSON object
+ changes.
@tparam PointerType pointer type; must be a pointer to @ref array_t, @ref
object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,
@@ -2877,7 +2894,8 @@ class basic_json
@tparam PointerType pointer type; must be a pointer to @ref array_t, @ref
object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,
- @ref number_unsigned_t, or @ref number_float_t.
+ @ref number_unsigned_t, or @ref number_float_t. Enforced by a static
+ assertion.
@return pointer to the internally stored JSON value if the requested
pointer type @a PointerType fits to the JSON value; `nullptr` otherwise
@@ -2897,6 +2915,21 @@ class basic_json
, int>::type = 0>
PointerType get_ptr() noexcept
{
+ // get the type of the PointerType (remove pointer and const)
+ using pointee_t = typename std::remove_const::type>::type>::type;
+ // make sure the type matches the allowed types
+ static_assert(
+ std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ , "incompatible pointer type");
+
// delegate the call to get_impl_ptr<>()
return get_impl_ptr(static_cast(nullptr));
}
@@ -2912,6 +2945,21 @@ class basic_json
, int>::type = 0>
constexpr const PointerType get_ptr() const noexcept
{
+ // get the type of the PointerType (remove pointer and const)
+ using pointee_t = typename std::remove_const::type>::type>::type;
+ // make sure the type matches the allowed types
+ static_assert(
+ std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ , "incompatible pointer type");
+
// delegate the call to get_impl_ptr<>() const
return get_impl_ptr(static_cast(nullptr));
}
@@ -2927,7 +2975,7 @@ class basic_json
@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.
+ @ref number_float_t. Enforced by static assertion.
@return reference to the internally stored JSON value if the requested
reference type @a ReferenceType fits to the JSON value; throws
@@ -3017,6 +3065,7 @@ class basic_json
////////////////////
/// @name element access
+ /// Access to the JSON value.
/// @{
/*!
@@ -8132,7 +8181,7 @@ basic_json_parser_63:
}
/// return string representation of last read token
- string_t get_token() const
+ string_t get_token_string() const
{
assert(m_start != nullptr);
return string_t(reinterpret_cast(m_start),
@@ -8400,7 +8449,7 @@ basic_json_parser_63:
if (type != value_t::number_float)
{
// multiply last value by ten and add the new digit
- auto temp = value * 10 + *curptr - 0x30;
+ auto temp = value * 10 + *curptr - '0';
// test for overflow
if (temp < value || temp > max)
@@ -8693,7 +8742,8 @@ basic_json_parser_63:
if (t != last_token)
{
std::string error_msg = "parse error - unexpected ";
- error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token() + "'") :
+ error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() +
+ "'") :
lexer::token_type_name(last_token));
error_msg += "; expected " + lexer::token_type_name(t);
throw std::invalid_argument(error_msg);
@@ -8705,7 +8755,8 @@ basic_json_parser_63:
if (t == last_token)
{
std::string error_msg = "parse error - unexpected ";
- error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token() + "'") :
+ error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() +
+ "'") :
lexer::token_type_name(last_token));
throw std::invalid_argument(error_msg);
}
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index 0aadde9c..5ee270f9 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -90,7 +90,13 @@ namespace
{
/*!
@brief Helper to determine whether there's a key_type for T.
+
+Thus helper is used to tell associative containers apart from other containers
+such as sequence containers. For instance, `std::map` passes the test as it
+contains a `mapped_type`, whereas `std::vector` fails the test.
+
@sa http://stackoverflow.com/a/7728728/266378
+@since version 1.0.0
*/
template
struct has_mapped_type
@@ -104,11 +110,18 @@ struct has_mapped_type
/*!
@brief helper class to create locales with decimal point
+
+This struct is used a default locale during the JSON serialization. JSON
+requires the decimal point to be `.`, so this function overloads the
+`do_decimal_point()` function to return `.`. This function is called by
+float-to-string conversions to retrieve the decimal separator between integer
+and fractional parts.
+
@sa https://github.com/nlohmann/json/issues/51#issuecomment-86869315
+@since version 2.0.0
*/
-class DecimalSeparator : public std::numpunct
+struct DecimalSeparator : std::numpunct
{
- protected:
char do_decimal_point() const
{
return '.';
@@ -202,13 +215,8 @@ class basic_json
{
private:
/// workaround type for MSVC
- using basic_json_t = basic_json;
public:
@@ -221,6 +229,8 @@ class basic_json
/////////////////////
/// @name container types
+ /// The canonic container types to use @ref basic_json like any other STL
+ /// container.
/// @{
/// the type of elements in a basic_json container
@@ -270,6 +280,8 @@ class basic_json
///////////////////////////
/// @name JSON value data types
+ /// The data types to store a JSON value. These types are derived from
+ /// the template arguments passed to class @ref basic_json.
/// @{
/*!
@@ -937,6 +949,8 @@ class basic_json
//////////////////
/// @name constructors and destructors
+ /// Constructors of class @ref basic_json, copy/move constructor, copy
+ /// assignment, static functions creating objects, and the destructor.
/// @{
/*!
@@ -2074,19 +2088,20 @@ class basic_json
///////////////////////
/// @name object inspection
+ /// Functions to inspect the type of a JSON value.
/// @{
/*!
@brief serialization
Serialization function for JSON values. The function tries to mimic
- Python's @p json.dumps() function, and currently supports its @p indent
+ Python's `json.dumps()` function, and currently supports its @a indent
parameter.
- @param[in] indent if indent is nonnegative, then array elements and object
+ @param[in] indent If indent is nonnegative, then array elements and object
members will be pretty-printed with that indent level. An indent level of
- 0 will only insert newlines. -1 (the default) selects the most compact
- representation
+ `0` will only insert newlines. `-1` (the default) selects the most compact
+ representation.
@return string containing the serialization of the JSON value
@@ -2772,6 +2787,7 @@ class basic_json
public:
/// @name value access
+ /// Direct access to the stored value of a JSON value.
/// @{
/*!
@@ -2822,7 +2838,8 @@ class basic_json
Explicit pointer access to the internally stored JSON value. No copies are
made.
- @warning The pointer becomes invalid if the underlying JSON object changes.
+ @warning The pointer becomes invalid if the underlying JSON object
+ changes.
@tparam PointerType pointer type; must be a pointer to @ref array_t, @ref
object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,
@@ -2877,7 +2894,8 @@ class basic_json
@tparam PointerType pointer type; must be a pointer to @ref array_t, @ref
object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,
- @ref number_unsigned_t, or @ref number_float_t.
+ @ref number_unsigned_t, or @ref number_float_t. Enforced by a static
+ assertion.
@return pointer to the internally stored JSON value if the requested
pointer type @a PointerType fits to the JSON value; `nullptr` otherwise
@@ -2897,6 +2915,21 @@ class basic_json
, int>::type = 0>
PointerType get_ptr() noexcept
{
+ // get the type of the PointerType (remove pointer and const)
+ using pointee_t = typename std::remove_const::type>::type>::type;
+ // make sure the type matches the allowed types
+ static_assert(
+ std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ , "incompatible pointer type");
+
// delegate the call to get_impl_ptr<>()
return get_impl_ptr(static_cast(nullptr));
}
@@ -2912,6 +2945,21 @@ class basic_json
, int>::type = 0>
constexpr const PointerType get_ptr() const noexcept
{
+ // get the type of the PointerType (remove pointer and const)
+ using pointee_t = typename std::remove_const::type>::type>::type;
+ // make sure the type matches the allowed types
+ static_assert(
+ std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ or std::is_same::value
+ , "incompatible pointer type");
+
// delegate the call to get_impl_ptr<>() const
return get_impl_ptr(static_cast(nullptr));
}
@@ -2927,7 +2975,7 @@ class basic_json
@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.
+ @ref number_float_t. Enforced by static assertion.
@return reference to the internally stored JSON value if the requested
reference type @a ReferenceType fits to the JSON value; throws
@@ -3017,6 +3065,7 @@ class basic_json
////////////////////
/// @name element access
+ /// Access to the JSON value.
/// @{
/*!
@@ -7412,7 +7461,7 @@ class basic_json
// anything else is an error
. { return token_type::parse_error; }
- */
+ */
}
/// append data from the stream to the internal buffer
@@ -7442,7 +7491,7 @@ class basic_json
}
/// return string representation of last read token
- string_t get_token() const
+ string_t get_token_string() const
{
assert(m_start != nullptr);
return string_t(reinterpret_cast(m_start),
@@ -7710,7 +7759,7 @@ class basic_json
if (type != value_t::number_float)
{
// multiply last value by ten and add the new digit
- auto temp = value * 10 + *curptr - 0x30;
+ auto temp = value * 10 + *curptr - '0';
// test for overflow
if (temp < value || temp > max)
@@ -8003,7 +8052,8 @@ class basic_json
if (t != last_token)
{
std::string error_msg = "parse error - unexpected ";
- error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token() + "'") :
+ error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() +
+ "'") :
lexer::token_type_name(last_token));
error_msg += "; expected " + lexer::token_type_name(t);
throw std::invalid_argument(error_msg);
@@ -8015,7 +8065,8 @@ class basic_json
if (t == last_token)
{
std::string error_msg = "parse error - unexpected ";
- error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token() + "'") :
+ error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() +
+ "'") :
lexer::token_type_name(last_token));
throw std::invalid_argument(error_msg);
}