📝 cleanup after the last PRs

parent be4fba7b
...@@ -875,7 +875,12 @@ I deeply appreciate the help of the following people. ...@@ -875,7 +875,12 @@ I deeply appreciate the help of the following people.
- [WebProdPP](https://github.com/WebProdPP) fixed a subtle error in a precondition check. - [WebProdPP](https://github.com/WebProdPP) fixed a subtle error in a precondition check.
- [Alex](https://github.com/leha-bot) noted an error in a code sample. - [Alex](https://github.com/leha-bot) noted an error in a code sample.
- [Tom de Geus](https://github.com/tdegeus) reported some warnings with ICC and helped fixing them. - [Tom de Geus](https://github.com/tdegeus) reported some warnings with ICC and helped fixing them.
- [Perry Kundert](https://github.com/pjkundert) simplified reading from input streams.
- [Sonu Lohani](https://github.com/sonulohani) fixed a small compilation error.
- [Jamie Seward](https://github.com/jseward) fixed all MSVC warnings.
- [Nate Vargas](https://github.com/eld00d) added a Doxygen tag file.
- [pvleuven](https://github.com/pvleuven) helped fixing a warning in ICC.
- [Pavel](https://github.com/crea7or) helped fixing some warnings in MSVC.
Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone. Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone.
......
...@@ -1404,63 +1404,66 @@ consist of all valid char values as positive values (typically unsigned char), ...@@ -1404,63 +1404,66 @@ consist of all valid char values as positive values (typically unsigned char),
plus an EOF value outside that range, specified by the value of the function plus an EOF value outside that range, specified by the value of the function
std::char_traits<char>::eof(). This value is typically -1, but could be any std::char_traits<char>::eof(). This value is typically -1, but could be any
arbitrary value which is not a valid char value. arbitrary value which is not a valid char value.
@return Typically [0,255] plus std::char_traits<char>::eof().
*/ */
struct input_adapter_protocol struct input_adapter_protocol
{ {
/// get a character [0,255] or std::char_traits<char>::eof().
virtual std::char_traits<char>::int_type get_character() = 0; virtual std::char_traits<char>::int_type get_character() = 0;
virtual void unget_character() = 0; // restore the last non-eof() character to input /// restore the last non-eof() character to input
virtual void unget_character() = 0;
virtual ~input_adapter_protocol() = default; virtual ~input_adapter_protocol() = default;
}; };
/// a type to simplify interfaces /// a type to simplify interfaces
using input_adapter_t = std::shared_ptr<input_adapter_protocol>; using input_adapter_t = std::shared_ptr<input_adapter_protocol>;
/// input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at /*!
/// beginning of input. Does not support changing the underlying std::streambuf Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at
/// in mid-input. Maintains underlying std::istream and std::streambuf to beginning of input. Does not support changing the underlying std::streambuf
/// support subsequent use of standard std::istream operations to process any in mid-input. Maintains underlying std::istream and std::streambuf to support
/// input characters following those used in parsing the JSON input. Clears the subsequent use of standard std::istream operations to process any input
/// std::istream flags; any input errors (eg. EOF) will be detected by the first characters following those used in parsing the JSON input. Clears the
/// subsequent call for input from the std::istream. std::istream flags; any input errors (e.g., EOF) will be detected by the first
subsequent call for input from the std::istream.
*/
class input_stream_adapter : public input_adapter_protocol class input_stream_adapter : public input_adapter_protocol
{ {
public: public:
~input_stream_adapter() override ~input_stream_adapter() override
{ {
// clear stream flags; we use underlying streambuf I/O, do not maintain ifstream flags // clear stream flags; we use underlying streambuf I/O, do not
// maintain ifstream flags
is.clear(); is.clear();
} }
explicit input_stream_adapter(std::istream& i) explicit input_stream_adapter(std::istream& i)
: is(i) : is(i), sb(*i.rdbuf())
, sb(*i.rdbuf())
{ {
// Ignore Byte Order Mark at start of input // ignore Byte Order Mark at start of input
std::char_traits<char>::int_type c; std::char_traits<char>::int_type c;
if (( c = get_character() ) == 0xEF ) if ((c = get_character()) == 0xEF)
{ {
if (( c = get_character() ) == 0xBB ) if ((c = get_character()) == 0xBB)
{ {
if (( c = get_character() ) == 0xBF ) if ((c = get_character()) == 0xBF)
{ {
return; // Ignore BOM return; // Ignore BOM
} }
else if ( c != std::char_traits<char>::eof() ) else if (c != std::char_traits<char>::eof())
{ {
is.unget(); is.unget();
} }
is.putback( '\xBB' ); is.putback('\xBB');
} }
else if ( c != std::char_traits<char>::eof() ) else if (c != std::char_traits<char>::eof())
{ {
is.unget(); is.unget();
} }
is.putback( '\xEF' ); is.putback('\xEF');
} }
else if ( c != std::char_traits<char>::eof() ) else if (c != std::char_traits<char>::eof())
{ {
is.unget(); // Not BOM. Process as usual. is.unget(); // Not BOM. Process as usual.
} }
} }
...@@ -1478,13 +1481,13 @@ class input_stream_adapter : public input_adapter_protocol ...@@ -1478,13 +1481,13 @@ class input_stream_adapter : public input_adapter_protocol
void unget_character() override void unget_character() override
{ {
sb.sungetc(); // Avoided for performance: is.unget(); sb.sungetc(); // is.unget() avoided for performance
} }
private:
private:
/// the associated input stream /// the associated input stream
std::istream& is; std::istream& is;
std::streambuf &sb; std::streambuf& sb;
}; };
/// input adapter for buffer input /// input adapter for buffer input
...@@ -2691,7 +2694,7 @@ scan_number_done: ...@@ -2691,7 +2694,7 @@ scan_number_done:
{ {
++chars_read; ++chars_read;
current = ia->get_character(); current = ia->get_character();
if (JSON_LIKELY( current != std::char_traits<char>::eof())) if (JSON_LIKELY(current != std::char_traits<char>::eof()))
{ {
token_string.push_back(std::char_traits<char>::to_char_type(current)); token_string.push_back(std::char_traits<char>::to_char_type(current));
} }
...@@ -2709,7 +2712,7 @@ scan_number_done: ...@@ -2709,7 +2712,7 @@ scan_number_done:
token_string.pop_back(); token_string.pop_back();
} }
} }
/// add a character to yytext /// add a character to yytext
void add(int c) void add(int c)
{ {
...@@ -2742,7 +2745,7 @@ scan_number_done: ...@@ -2742,7 +2745,7 @@ scan_number_done:
/// return current string value (implicitly resets the token; useful only once) /// return current string value (implicitly resets the token; useful only once)
std::string move_string() std::string move_string()
{ {
return std::move( yytext ); return std::move(yytext);
} }
///////////////////// /////////////////////
......
...@@ -274,7 +274,7 @@ TEST_CASE("modifiers") ...@@ -274,7 +274,7 @@ TEST_CASE("modifiers")
// invalid values (no string/val pair) // invalid values (no string/val pair)
CHECK_THROWS_AS(j.push_back({1}), json::type_error&); CHECK_THROWS_AS(j.push_back({1}), json::type_error&);
CHECK_THROWS_WITH(j.push_back({1}), "[json.exception.type_error.308] cannot use push_back() with object"); CHECK_THROWS_WITH(j.push_back({1}), "[json.exception.type_error.308] cannot use push_back() with object");
CHECK_THROWS_AS(j.push_back({1,2}), json::type_error&); CHECK_THROWS_AS(j.push_back({1, 2}), json::type_error&);
CHECK_THROWS_WITH(j.push_back({1, 2}), "[json.exception.type_error.308] cannot use push_back() with object"); CHECK_THROWS_WITH(j.push_back({1, 2}), "[json.exception.type_error.308] cannot use push_back() with object");
CHECK_THROWS_AS(j.push_back({1, 2, 3, 4}), json::type_error&); CHECK_THROWS_AS(j.push_back({1, 2, 3, 4}), json::type_error&);
CHECK_THROWS_WITH(j.push_back({1, 2, 3, 4}), "[json.exception.type_error.308] cannot use push_back() with object"); CHECK_THROWS_WITH(j.push_back({1, 2, 3, 4}), "[json.exception.type_error.308] cannot use push_back() with object");
......
...@@ -39,8 +39,8 @@ using nlohmann::json; ...@@ -39,8 +39,8 @@ using nlohmann::json;
#include <iostream> #include <iostream>
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning (push) #pragma warning (push)
#pragma warning (disable : 4189) // local variable is initialized but not referenced #pragma warning (disable : 4189) // local variable is initialized but not referenced
#endif #endif
TEST_CASE("README", "[hide]") TEST_CASE("README", "[hide]")
...@@ -305,5 +305,5 @@ TEST_CASE("README", "[hide]") ...@@ -305,5 +305,5 @@ TEST_CASE("README", "[hide]")
} }
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning (pop) #pragma warning (pop)
#endif #endif
...@@ -1236,21 +1236,21 @@ TEST_CASE("regression tests") ...@@ -1236,21 +1236,21 @@ TEST_CASE("regression tests")
SECTION("issue #367 - Behavior of operator>> should more closely resemble that of built-in overloads.") SECTION("issue #367 - Behavior of operator>> should more closely resemble that of built-in overloads.")
{ {
SECTION("example 1") SECTION("example 1")
{ {
std::istringstream i1_2_3( "{\"first\": \"one\" }{\"second\": \"two\"}3" ); std::istringstream i1_2_3( "{\"first\": \"one\" }{\"second\": \"two\"}3" );
json j1, j2, j3; json j1, j2, j3;
i1_2_3 >> j1; i1_2_3 >> j1;
i1_2_3 >> j2; i1_2_3 >> j2;
i1_2_3 >> j3; i1_2_3 >> j3;
std::map<std::string,std::string> m1 = j1; std::map<std::string, std::string> m1 = j1;
std::map<std::string,std::string> m2 = j2; std::map<std::string, std::string> m2 = j2;
int i3 = j3; int i3 = j3;
CHECK( m1 == ( std::map<std::string,std::string> {{ "first", "one" }} )); CHECK( m1 == ( std::map<std::string, std::string> {{ "first", "one" }} ));
CHECK( m2 == ( std::map<std::string,std::string> {{ "second", "two" }} )); CHECK( m2 == ( std::map<std::string, std::string> {{ "second", "two" }} ));
CHECK( i3 == 3 ); CHECK( i3 == 3 );
} }
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment