more cleanup
This commit is contained in:
parent
b2b68a0fa1
commit
b145e0c404
3 changed files with 77 additions and 57 deletions
|
@ -24,7 +24,7 @@ Other aspects were not so important to us:
|
|||
|
||||
- **Memory efficiency**. Each JSON object has an overhead of one pointer (the maximal size of a union) and one enumeration element (1 byte). The default generalization uses the following C++ data types: `std::string` for strings, `int64_t`, `uint64_t` or `double` for numbers, `std::map` for objects, `std::vector` for arrays, and `bool` for Booleans. However, you can template the generalized class `basic_json` to your needs.
|
||||
|
||||
- **Speed**. We currently implement the parser as naive [recursive descent parser](http://en.wikipedia.org/wiki/Recursive_descent_parser) with hand coded string handling. It is fast enough, but a [LALR-parser](http://en.wikipedia.org/wiki/LALR_parser) with a decent regular expression processor should be even faster (but would consist of more files which makes the integration harder).
|
||||
- **Speed**. We currently implement the parser as naive [recursive descent parser](http://en.wikipedia.org/wiki/Recursive_descent_parser) with hand coded string handling. It is fast enough, but a [LALR-parser](http://en.wikipedia.org/wiki/LALR_parser) may be even faster (but would consist of more files which makes the integration harder).
|
||||
|
||||
See the [contribution guidelines](https://github.com/nlohmann/json/blob/master/.github/CONTRIBUTING.md#please-dont) for more information.
|
||||
|
||||
|
|
66
src/json.hpp
66
src/json.hpp
|
@ -927,12 +927,13 @@ class basic_json
|
|||
@brief per-element parser callback type
|
||||
|
||||
With a parser callback function, the result of parsing a JSON text can be
|
||||
influenced. When passed to @ref parse(std::istream&, parser_callback_t) or
|
||||
@ref parse(const string_t&, parser_callback_t), it is called on certain
|
||||
events (passed as @ref parse_event_t via parameter @a event) with a set
|
||||
recursion depth @a depth and context JSON value @a parsed. The return
|
||||
value of the callback function is a boolean indicating whether the element
|
||||
that emitted the callback shall be kept or not.
|
||||
influenced. When passed to @ref parse(std::istream&, const
|
||||
parser_callback_t) or @ref parse(const string_t&, const parser_callback_t),
|
||||
it is called on certain events (passed as @ref parse_event_t via parameter
|
||||
@a event) with a set recursion depth @a depth and context JSON value
|
||||
@a parsed. The return value of the callback function is a boolean
|
||||
indicating whether the element that emitted the callback shall be kept or
|
||||
not.
|
||||
|
||||
We distinguish six scenarios (determined by the event type) in which the
|
||||
callback function can be called. The following table describes the values
|
||||
|
@ -1913,7 +1914,7 @@ class basic_json
|
|||
|
||||
@since version 2.0.0
|
||||
*/
|
||||
explicit basic_json(std::istream& i, parser_callback_t cb = nullptr)
|
||||
explicit basic_json(std::istream& i, const parser_callback_t cb = nullptr)
|
||||
{
|
||||
*this = parser(i, cb).parse();
|
||||
}
|
||||
|
@ -5907,12 +5908,13 @@ class basic_json
|
|||
@liveexample{The example below demonstrates the `parse()` function with
|
||||
and without callback function.,parse__string__parser_callback_t}
|
||||
|
||||
@sa @ref parse(std::istream&, parser_callback_t) for a version that reads
|
||||
from an input stream
|
||||
@sa @ref parse(std::istream&, const parser_callback_t) for a version that
|
||||
reads from an input stream
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
static basic_json parse(const string_t& s, parser_callback_t cb = nullptr)
|
||||
static basic_json parse(const string_t& s,
|
||||
const parser_callback_t cb = nullptr)
|
||||
{
|
||||
return parser(s, cb).parse();
|
||||
}
|
||||
|
@ -5936,20 +5938,22 @@ class basic_json
|
|||
@liveexample{The example below demonstrates the `parse()` function with
|
||||
and without callback function.,parse__istream__parser_callback_t}
|
||||
|
||||
@sa @ref parse(const string_t&, parser_callback_t) for a version that
|
||||
reads from a string
|
||||
@sa @ref parse(const string_t&, const parser_callback_t) for a version
|
||||
that reads from a string
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
static basic_json parse(std::istream& i, parser_callback_t cb = nullptr)
|
||||
static basic_json parse(std::istream& i,
|
||||
const parser_callback_t cb = nullptr)
|
||||
{
|
||||
return parser(i, cb).parse();
|
||||
}
|
||||
|
||||
/*!
|
||||
@copydoc parse(std::istream&, parser_callback_t)
|
||||
@copydoc parse(std::istream&, const parser_callback_t)
|
||||
*/
|
||||
static basic_json parse(std::istream&& i, parser_callback_t cb = nullptr)
|
||||
static basic_json parse(std::istream&& i,
|
||||
const parser_callback_t cb = nullptr)
|
||||
{
|
||||
return parser(i, cb).parse();
|
||||
}
|
||||
|
@ -5972,8 +5976,8 @@ class basic_json
|
|||
@liveexample{The example below shows how a JSON value is constructed by
|
||||
reading a serialization from a stream.,operator_deserialize}
|
||||
|
||||
@sa parse(std::istream&, parser_callback_t) for a variant with a parser
|
||||
callback function to filter values while parsing
|
||||
@sa parse(std::istream&, const parser_callback_t) for a variant with a
|
||||
parser callback function to filter values while parsing
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
|
@ -6001,7 +6005,18 @@ class basic_json
|
|||
// convenience functions //
|
||||
///////////////////////////
|
||||
|
||||
/// return the type as string
|
||||
/*!
|
||||
@brief return the type as string
|
||||
|
||||
Returns the type name as string to be used in error messages - usually to
|
||||
indicate that a function was called on a wrong JSON type.
|
||||
|
||||
@return basically a string representation of a the @ref m_type member
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
std::string type_name() const
|
||||
{
|
||||
switch (m_type)
|
||||
|
@ -7487,7 +7502,7 @@ class basic_json
|
|||
}
|
||||
|
||||
/// return name of values of type token_type (only used for errors)
|
||||
static std::string token_type_name(token_type t)
|
||||
static std::string token_type_name(const token_type t)
|
||||
{
|
||||
switch (t)
|
||||
{
|
||||
|
@ -8540,11 +8555,6 @@ basic_json_parser_63:
|
|||
the number
|
||||
|
||||
@return the floating point number
|
||||
|
||||
@bug This function uses `std::strtof`, `std::strtod`, or `std::strtold`
|
||||
which use the current C locale to determine which character is used as
|
||||
decimal point character. This may yield to parse errors if the locale
|
||||
does not used `.`.
|
||||
*/
|
||||
long double str_to_float_t(long double* /* type */, char** endptr) const
|
||||
{
|
||||
|
@ -8725,7 +8735,7 @@ basic_json_parser_63:
|
|||
{
|
||||
public:
|
||||
/// constructor for strings
|
||||
parser(const string_t& s, parser_callback_t cb = nullptr) noexcept
|
||||
parser(const string_t& s, const parser_callback_t cb = nullptr) noexcept
|
||||
: callback(cb), m_lexer(s)
|
||||
{
|
||||
// read first token
|
||||
|
@ -8733,7 +8743,7 @@ basic_json_parser_63:
|
|||
}
|
||||
|
||||
/// a parser reading from an input stream
|
||||
parser(std::istream& _is, parser_callback_t cb = nullptr) noexcept
|
||||
parser(std::istream& _is, const parser_callback_t cb = nullptr) noexcept
|
||||
: callback(cb), m_lexer(&_is)
|
||||
{
|
||||
// read first token
|
||||
|
@ -8981,7 +8991,7 @@ basic_json_parser_63:
|
|||
/// current level of recursion
|
||||
int depth = 0;
|
||||
/// callback function
|
||||
parser_callback_t callback;
|
||||
const parser_callback_t callback;
|
||||
/// the type of the last read token
|
||||
typename lexer::token_type last_token = lexer::token_type::uninitialized;
|
||||
/// the lexer
|
||||
|
@ -9420,7 +9430,7 @@ basic_json_parser_63:
|
|||
|
||||
@param[in,out] s the string to manipulate
|
||||
@param[in] f the substring to replace with @a t
|
||||
@param[out] t the string to replace @a f
|
||||
@param[in] t the string to replace @a f
|
||||
|
||||
@return The string @a s where all occurrences of @a f are replaced
|
||||
with @a t.
|
||||
|
|
|
@ -927,12 +927,13 @@ class basic_json
|
|||
@brief per-element parser callback type
|
||||
|
||||
With a parser callback function, the result of parsing a JSON text can be
|
||||
influenced. When passed to @ref parse(std::istream&, parser_callback_t) or
|
||||
@ref parse(const string_t&, parser_callback_t), it is called on certain
|
||||
events (passed as @ref parse_event_t via parameter @a event) with a set
|
||||
recursion depth @a depth and context JSON value @a parsed. The return
|
||||
value of the callback function is a boolean indicating whether the element
|
||||
that emitted the callback shall be kept or not.
|
||||
influenced. When passed to @ref parse(std::istream&, const
|
||||
parser_callback_t) or @ref parse(const string_t&, const parser_callback_t),
|
||||
it is called on certain events (passed as @ref parse_event_t via parameter
|
||||
@a event) with a set recursion depth @a depth and context JSON value
|
||||
@a parsed. The return value of the callback function is a boolean
|
||||
indicating whether the element that emitted the callback shall be kept or
|
||||
not.
|
||||
|
||||
We distinguish six scenarios (determined by the event type) in which the
|
||||
callback function can be called. The following table describes the values
|
||||
|
@ -1913,7 +1914,7 @@ class basic_json
|
|||
|
||||
@since version 2.0.0
|
||||
*/
|
||||
explicit basic_json(std::istream& i, parser_callback_t cb = nullptr)
|
||||
explicit basic_json(std::istream& i, const parser_callback_t cb = nullptr)
|
||||
{
|
||||
*this = parser(i, cb).parse();
|
||||
}
|
||||
|
@ -5907,12 +5908,13 @@ class basic_json
|
|||
@liveexample{The example below demonstrates the `parse()` function with
|
||||
and without callback function.,parse__string__parser_callback_t}
|
||||
|
||||
@sa @ref parse(std::istream&, parser_callback_t) for a version that reads
|
||||
from an input stream
|
||||
@sa @ref parse(std::istream&, const parser_callback_t) for a version that
|
||||
reads from an input stream
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
static basic_json parse(const string_t& s, parser_callback_t cb = nullptr)
|
||||
static basic_json parse(const string_t& s,
|
||||
const parser_callback_t cb = nullptr)
|
||||
{
|
||||
return parser(s, cb).parse();
|
||||
}
|
||||
|
@ -5936,20 +5938,22 @@ class basic_json
|
|||
@liveexample{The example below demonstrates the `parse()` function with
|
||||
and without callback function.,parse__istream__parser_callback_t}
|
||||
|
||||
@sa @ref parse(const string_t&, parser_callback_t) for a version that
|
||||
reads from a string
|
||||
@sa @ref parse(const string_t&, const parser_callback_t) for a version
|
||||
that reads from a string
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
static basic_json parse(std::istream& i, parser_callback_t cb = nullptr)
|
||||
static basic_json parse(std::istream& i,
|
||||
const parser_callback_t cb = nullptr)
|
||||
{
|
||||
return parser(i, cb).parse();
|
||||
}
|
||||
|
||||
/*!
|
||||
@copydoc parse(std::istream&, parser_callback_t)
|
||||
@copydoc parse(std::istream&, const parser_callback_t)
|
||||
*/
|
||||
static basic_json parse(std::istream&& i, parser_callback_t cb = nullptr)
|
||||
static basic_json parse(std::istream&& i,
|
||||
const parser_callback_t cb = nullptr)
|
||||
{
|
||||
return parser(i, cb).parse();
|
||||
}
|
||||
|
@ -5972,8 +5976,8 @@ class basic_json
|
|||
@liveexample{The example below shows how a JSON value is constructed by
|
||||
reading a serialization from a stream.,operator_deserialize}
|
||||
|
||||
@sa parse(std::istream&, parser_callback_t) for a variant with a parser
|
||||
callback function to filter values while parsing
|
||||
@sa parse(std::istream&, const parser_callback_t) for a variant with a
|
||||
parser callback function to filter values while parsing
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
|
@ -6001,7 +6005,18 @@ class basic_json
|
|||
// convenience functions //
|
||||
///////////////////////////
|
||||
|
||||
/// return the type as string
|
||||
/*!
|
||||
@brief return the type as string
|
||||
|
||||
Returns the type name as string to be used in error messages - usually to
|
||||
indicate that a function was called on a wrong JSON type.
|
||||
|
||||
@return basically a string representation of a the @ref m_type member
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@since version 1.0.0
|
||||
*/
|
||||
std::string type_name() const
|
||||
{
|
||||
switch (m_type)
|
||||
|
@ -7487,7 +7502,7 @@ class basic_json
|
|||
}
|
||||
|
||||
/// return name of values of type token_type (only used for errors)
|
||||
static std::string token_type_name(token_type t)
|
||||
static std::string token_type_name(const token_type t)
|
||||
{
|
||||
switch (t)
|
||||
{
|
||||
|
@ -7837,11 +7852,6 @@ class basic_json
|
|||
the number
|
||||
|
||||
@return the floating point number
|
||||
|
||||
@bug This function uses `std::strtof`, `std::strtod`, or `std::strtold`
|
||||
which use the current C locale to determine which character is used as
|
||||
decimal point character. This may yield to parse errors if the locale
|
||||
does not used `.`.
|
||||
*/
|
||||
long double str_to_float_t(long double* /* type */, char** endptr) const
|
||||
{
|
||||
|
@ -8022,7 +8032,7 @@ class basic_json
|
|||
{
|
||||
public:
|
||||
/// constructor for strings
|
||||
parser(const string_t& s, parser_callback_t cb = nullptr) noexcept
|
||||
parser(const string_t& s, const parser_callback_t cb = nullptr) noexcept
|
||||
: callback(cb), m_lexer(s)
|
||||
{
|
||||
// read first token
|
||||
|
@ -8030,7 +8040,7 @@ class basic_json
|
|||
}
|
||||
|
||||
/// a parser reading from an input stream
|
||||
parser(std::istream& _is, parser_callback_t cb = nullptr) noexcept
|
||||
parser(std::istream& _is, const parser_callback_t cb = nullptr) noexcept
|
||||
: callback(cb), m_lexer(&_is)
|
||||
{
|
||||
// read first token
|
||||
|
@ -8278,7 +8288,7 @@ class basic_json
|
|||
/// current level of recursion
|
||||
int depth = 0;
|
||||
/// callback function
|
||||
parser_callback_t callback;
|
||||
const parser_callback_t callback;
|
||||
/// the type of the last read token
|
||||
typename lexer::token_type last_token = lexer::token_type::uninitialized;
|
||||
/// the lexer
|
||||
|
@ -8717,7 +8727,7 @@ class basic_json
|
|||
|
||||
@param[in,out] s the string to manipulate
|
||||
@param[in] f the substring to replace with @a t
|
||||
@param[out] t the string to replace @a f
|
||||
@param[in] t the string to replace @a f
|
||||
|
||||
@return The string @a s where all occurrences of @a f are replaced
|
||||
with @a t.
|
||||
|
|
Loading…
Reference in a new issue