From 1fbb82de895f5eda973150de8452c57c0b7e09ad Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 17 Jun 2017 20:47:53 +0200 Subject: [PATCH] :hammer: using std::array to buffer input --- src/json.hpp | 45 +++++++++++++++++++----------------- test/src/unit-regression.cpp | 2 -- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 6bd09cd1e..7a1fbc23c 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8761,15 +8761,15 @@ class basic_json // native support /// input adapter for input stream - static std::shared_ptr create(std::istream& i, const size_t buffer_size = 16384) + static std::shared_ptr create(std::istream& i) { - return std::shared_ptr(new cached_input_stream_adapter(i, buffer_size)); + return std::shared_ptr(new cached_input_stream_adapter<16384>(i)); } /// input adapter for input stream - static std::shared_ptr create(std::istream&& i, const size_t buffer_size = 16384) + static std::shared_ptr create(std::istream&& i) { - return std::shared_ptr(new cached_input_stream_adapter(i, buffer_size)); + return std::shared_ptr(new cached_input_stream_adapter<16384>(i)); } /// input adapter for buffer @@ -8841,11 +8841,12 @@ class basic_json using input_adapter_t = std::shared_ptr; /// input adapter for cached stream input + template class cached_input_stream_adapter : public input_adapter { public: - cached_input_stream_adapter(std::istream& i, const size_t buffer_size) - : is(i), start_position(is.tellg()), buffer(buffer_size, '\0') + cached_input_stream_adapter(std::istream& i) + : is(i), start_position(is.tellg()) { // immediately abort if stream is erroneous if (JSON_UNLIKELY(i.fail())) @@ -8853,10 +8854,7 @@ class basic_json JSON_THROW(parse_error::create(111, 0, "bad input stream")); } - // initial fill - is.read(buffer.data(), static_cast(buffer.size())); - // store number of bytes in the buffer - fill_size = static_cast(is.gcount()); + fill_buffer(); // skip byte order mark if (fill_size >= 3 and buffer[0] == '\xEF' and buffer[1] == '\xBB' and buffer[2] == '\xBF') @@ -8884,20 +8882,17 @@ class basic_json // check if refilling is necessary and possible if (buffer_pos == fill_size and not eof) { - // refill - is.read(buffer.data(), static_cast(buffer.size())); - // store number of bytes in the buffer - fill_size = static_cast(is.gcount()); + fill_buffer(); - // the buffer is ready - buffer_pos = 0; - - // remember that filling did not yield new input + // check and remember that filling did not yield new input if (fill_size == 0) { eof = true; return std::char_traits::eof(); } + + // the buffer is ready + buffer_pos = 0; } ++processed_chars; @@ -8910,9 +8905,9 @@ class basic_json std::string result(length, '\0'); // save stream position - auto current_pos = is.tellg(); + const auto current_pos = is.tellg(); // save stream flags - auto flags = is.rdstate(); + const auto flags = is.rdstate(); // clear stream flags is.clear(); @@ -8930,6 +8925,14 @@ class basic_json } private: + void fill_buffer() + { + // fill + is.read(buffer.data(), static_cast(buffer.size())); + // store number of bytes in the buffer + fill_size = static_cast(is.gcount()); + } + /// the associated input stream std::istream& is; @@ -8947,7 +8950,7 @@ class basic_json const std::streampos start_position; /// internal buffer - std::vector buffer; + std::array buffer; }; /// input adapter for buffer input diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index 0489e630c..4d1231c22 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -1175,7 +1175,6 @@ TEST_CASE("regression tests") // create and print a JSON from the map json j = m1; - std::cout << j << std::endl; // get the map out of JSON std::map m2 = j; @@ -1191,7 +1190,6 @@ TEST_CASE("regression tests") // create and print a JSON from the map json j = m1; - std::cout << j << std::endl; // get the map out of JSON std::map m2 = j;