From cb0af6b863ab7c450015d3f4a5ebcbe479ed7dca Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Fri, 30 Sep 2022 15:04:24 +0200 Subject: [PATCH] Add string --- include/util/json_renderer.hpp | 18 ++++++++++++++++-- src/benchmarks/json_render.cpp | 20 ++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/include/util/json_renderer.hpp b/include/util/json_renderer.hpp index b7bfde255..8d221e428 100644 --- a/include/util/json_renderer.hpp +++ b/include/util/json_renderer.hpp @@ -122,21 +122,35 @@ template <> void Renderer>::write(const char *str) { out.insert(out.end(), str, str + strlen(str)); } +template <> void Renderer>::write(char ch) { out.push_back(ch); } + template <> void Renderer::write(const std::string &str) { out << str; } template <> void Renderer::write(const char *str) { out << str; } -template <> void Renderer>::write(char ch) { out.push_back(ch); } - template <> void Renderer::write(char ch) { out << ch; } + +template <> void Renderer::write(const std::string &str) { out += str; } + +template <> void Renderer::write(const char *str) { out += str; } + +template <> void Renderer::write(char ch) { out += ch; } + + inline void render(std::ostream &out, const Object &object) { Value value = object; mapbox::util::apply_visitor(Renderer(out), value); } +inline void render(std::string &out, const Object &object) +{ + Value value = object; + mapbox::util::apply_visitor(Renderer(out), value); +} + inline void render(std::vector &out, const Object &object) { Value value = object; diff --git a/src/benchmarks/json_render.cpp b/src/benchmarks/json_render.cpp index fdddee6c9..d76d9e54b 100644 --- a/src/benchmarks/json_render.cpp +++ b/src/benchmarks/json_render.cpp @@ -6,6 +6,7 @@ #include #include #include +#include // #ifdef _WIN32 // #pragma optimize("", off) @@ -130,17 +131,28 @@ int main(int, char **) } json::Object obj{{{"arr", arr}}}; + TIMER_START(string); + std::string out_str; + json::render(out_str, obj); + TIMER_STOP(string); + std::cout << "String: " << TIMER_MSEC(string) << "ms" << std::endl; + TIMER_START(stringstream); std::stringstream ss; json::render(ss, obj); - std::string s{ss.str()}; + std::string out_ss_str{ss.str()}; TIMER_STOP(stringstream); - std::cout << "String: " << TIMER_MSEC(stringstream) << "ms" << std::endl; + + std::cout << "Stringstream: " << TIMER_MSEC(stringstream) << "ms" << std::endl; TIMER_START(vector); - std::vector vec; - json::render(vec, obj); + std::vector out_vec; + json::render(out_vec, obj); TIMER_STOP(vector); std::cout << "Vector: " << TIMER_MSEC(vector) << "ms" << std::endl; + + if (std::string{out_vec.begin(), out_vec.end()} != out_str || out_str != out_ss_str) { + throw std::logic_error("Vector and string are not equal"); + } // (void)s; // std::cerr << ss << "\n"; return EXIT_SUCCESS;