diff --git a/DataStructures/JSONContainer.h b/DataStructures/JSONContainer.h index 3d1538af6..55f7d5fc6 100644 --- a/DataStructures/JSONContainer.h +++ b/DataStructures/JSONContainer.h @@ -90,146 +90,6 @@ struct Array std::vector values; }; -struct Renderer : mapbox::util::static_visitor<> -{ - explicit Renderer(std::ostream &_out) : out(_out) {} - - void operator()(const String &string) const { out << "\"" << string.value << "\""; } - - void operator()(const Number &number) const - { - out.precision(10); - out << number.value; - } - - void operator()(const Object &object) const - { - out << "{"; - auto iterator = object.values.begin(); - while (iterator != object.values.end()) - { - out << "\"" << (*iterator).first << "\":"; - mapbox::util::apply_visitor(Renderer(out), (*iterator).second); - if (++iterator != object.values.end()) - { - out << ","; - } - } - out << "}"; - } - - void operator()(const Array &array) const - { - out << "["; - std::vector::const_iterator iterator; - iterator = array.values.begin(); - while (iterator != array.values.end()) - { - mapbox::util::apply_visitor(Renderer(out), *iterator); - if (++iterator != array.values.end()) - { - out << ","; - } - } - out << "]"; - } - - void operator()(const True &) const { out << "true"; } - - void operator()(const False &) const { out << "false"; } - - void operator()(const Null &) const { out << "null"; } - - private: - std::ostream &out; -}; - -struct ArrayRenderer : mapbox::util::static_visitor<> -{ - explicit ArrayRenderer(std::vector &_out) : out(_out) {} - - void operator()(const String &string) const - { - out.push_back('\"'); - out.insert(out.end(), string.value.begin(), string.value.end()); - out.push_back('\"'); - } - - void operator()(const Number &number) const - { - const std::string number_string = cast::double_fixed_to_string(number.value); - out.insert(out.end(), number_string.begin(), number_string.end()); - } - - void operator()(const Object &object) const - { - out.push_back('{'); - auto iterator = object.values.begin(); - while (iterator != object.values.end()) - { - out.push_back('\"'); - out.insert(out.end(), (*iterator).first.begin(), (*iterator).first.end()); - out.push_back('\"'); - out.push_back(':'); - - mapbox::util::apply_visitor(ArrayRenderer(out), (*iterator).second); - if (++iterator != object.values.end()) - { - out.push_back(','); - } - } - out.push_back('}'); - } - - void operator()(const Array &array) const - { - out.push_back('['); - std::vector::const_iterator iterator; - iterator = array.values.begin(); - while (iterator != array.values.end()) - { - mapbox::util::apply_visitor(ArrayRenderer(out), *iterator); - if (++iterator != array.values.end()) - { - out.push_back(','); - } - } - out.push_back(']'); - } - - void operator()(const True &) const - { - const std::string temp("true"); - out.insert(out.end(), temp.begin(), temp.end()); - } - - void operator()(const False &) const - { - const std::string temp("false"); - out.insert(out.end(), temp.begin(), temp.end()); - } - - void operator()(const Null &) const - { - const std::string temp("null"); - out.insert(out.end(), temp.begin(), temp.end()); - } - - private: - std::vector &out; -}; - -inline void render(std::ostream &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; - mapbox::util::apply_visitor(ArrayRenderer(out), value); -} } // namespace JSON diff --git a/Plugins/DistanceTablePlugin.h b/Plugins/DistanceTablePlugin.h index c8d7a3ad2..a5cd8c807 100644 --- a/Plugins/DistanceTablePlugin.h +++ b/Plugins/DistanceTablePlugin.h @@ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../DataStructures/QueryEdge.h" #include "../DataStructures/SearchEngine.h" #include "../Descriptors/BaseDescriptor.h" +#include "../Util/json_renderer.hpp" #include "../Util/make_unique.hpp" #include "../Util/StringUtil.h" #include "../Util/TimingUtil.h" diff --git a/Plugins/HelloWorldPlugin.h b/Plugins/HelloWorldPlugin.h index 662758d1f..1a610fd68 100644 --- a/Plugins/HelloWorldPlugin.h +++ b/Plugins/HelloWorldPlugin.h @@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "BasePlugin.h" #include "../DataStructures/JSONContainer.h" #include "../Util/cast.hpp" +#include "../Util/json_renderer.hpp" #include diff --git a/Plugins/LocatePlugin.h b/Plugins/LocatePlugin.h index b6abcefb5..a4e030251 100644 --- a/Plugins/LocatePlugin.h +++ b/Plugins/LocatePlugin.h @@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "BasePlugin.h" #include "../DataStructures/JSONContainer.h" +#include "../Util/json_renderer.hpp" #include "../Util/StringUtil.h" #include diff --git a/Plugins/NearestPlugin.h b/Plugins/NearestPlugin.h index 7b05d7405..954bf2e61 100644 --- a/Plugins/NearestPlugin.h +++ b/Plugins/NearestPlugin.h @@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../DataStructures/JSONContainer.h" #include "../DataStructures/phantom_node.hpp" #include "../DataStructures/Range.h" +#include "../Util/json_renderer.hpp" #include diff --git a/Plugins/TimestampPlugin.h b/Plugins/TimestampPlugin.h index 0047db199..07cffca5e 100644 --- a/Plugins/TimestampPlugin.h +++ b/Plugins/TimestampPlugin.h @@ -28,8 +28,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef TIMESTAMP_PLUGIN_H #define TIMESTAMP_PLUGIN_H -#include "../DataStructures/JSONContainer.h" #include "BasePlugin.h" +#include "../DataStructures/JSONContainer.h" +#include "../Util/json_renderer.hpp" #include diff --git a/Plugins/ViaRoutePlugin.h b/Plugins/ViaRoutePlugin.h index ec74b4a1f..428b2abe2 100644 --- a/Plugins/ViaRoutePlugin.h +++ b/Plugins/ViaRoutePlugin.h @@ -36,6 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../Descriptors/BaseDescriptor.h" #include "../Descriptors/GPXDescriptor.h" #include "../Descriptors/JSONDescriptor.h" +#include "../Util/json_renderer.hpp" #include "../Util/make_unique.hpp" #include "../Util/simple_logger.hpp" diff --git a/Server/RequestHandler.cpp b/Server/RequestHandler.cpp index b358d8d2d..bb2c5d8e1 100644 --- a/Server/RequestHandler.cpp +++ b/Server/RequestHandler.cpp @@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../DataStructures/JSONContainer.h" #include "../Library/OSRM.h" +#include "../Util/json_renderer.hpp" #include "../Util/simple_logger.hpp" #include "../Util/StringUtil.h" #include "../typedefs.h" diff --git a/Util/json_renderer.hpp b/Util/json_renderer.hpp new file mode 100644 index 000000000..fa35bbf95 --- /dev/null +++ b/Util/json_renderer.hpp @@ -0,0 +1,182 @@ +/* + +Copyright (c) 2013, Project OSRM, Dennis Luxen, others +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +// based on +// https://svn.apache.org/repos/asf/mesos/tags/release-0.9.0-incubating-RC0/src/common/json.hpp + +#ifndef JSON_RENDERER_HPP +#define JSON_RENDERER_HPP + +#include "../DataStructures/JSONContainer.h" +#include "cast.hpp" + +namespace JSON { + +struct Renderer : mapbox::util::static_visitor<> +{ + explicit Renderer(std::ostream &_out) : out(_out) {} + + void operator()(const String &string) const { out << "\"" << string.value << "\""; } + + void operator()(const Number &number) const + { + out.precision(10); + out << number.value; + } + + void operator()(const Object &object) const + { + out << "{"; + auto iterator = object.values.begin(); + while (iterator != object.values.end()) + { + out << "\"" << (*iterator).first << "\":"; + mapbox::util::apply_visitor(Renderer(out), (*iterator).second); + if (++iterator != object.values.end()) + { + out << ","; + } + } + out << "}"; + } + + void operator()(const Array &array) const + { + out << "["; + std::vector::const_iterator iterator; + iterator = array.values.begin(); + while (iterator != array.values.end()) + { + mapbox::util::apply_visitor(Renderer(out), *iterator); + if (++iterator != array.values.end()) + { + out << ","; + } + } + out << "]"; + } + + void operator()(const True &) const { out << "true"; } + + void operator()(const False &) const { out << "false"; } + + void operator()(const Null &) const { out << "null"; } + + private: + std::ostream &out; +}; + +struct ArrayRenderer : mapbox::util::static_visitor<> +{ + explicit ArrayRenderer(std::vector &_out) : out(_out) {} + + void operator()(const String &string) const + { + out.push_back('\"'); + out.insert(out.end(), string.value.begin(), string.value.end()); + out.push_back('\"'); + } + + void operator()(const Number &number) const + { + const std::string number_string = cast::double_fixed_to_string(number.value); + out.insert(out.end(), number_string.begin(), number_string.end()); + } + + void operator()(const Object &object) const + { + out.push_back('{'); + auto iterator = object.values.begin(); + while (iterator != object.values.end()) + { + out.push_back('\"'); + out.insert(out.end(), (*iterator).first.begin(), (*iterator).first.end()); + out.push_back('\"'); + out.push_back(':'); + + mapbox::util::apply_visitor(ArrayRenderer(out), (*iterator).second); + if (++iterator != object.values.end()) + { + out.push_back(','); + } + } + out.push_back('}'); + } + + void operator()(const Array &array) const + { + out.push_back('['); + std::vector::const_iterator iterator; + iterator = array.values.begin(); + while (iterator != array.values.end()) + { + mapbox::util::apply_visitor(ArrayRenderer(out), *iterator); + if (++iterator != array.values.end()) + { + out.push_back(','); + } + } + out.push_back(']'); + } + + void operator()(const True &) const + { + const std::string temp("true"); + out.insert(out.end(), temp.begin(), temp.end()); + } + + void operator()(const False &) const + { + const std::string temp("false"); + out.insert(out.end(), temp.begin(), temp.end()); + } + + void operator()(const Null &) const + { + const std::string temp("null"); + out.insert(out.end(), temp.begin(), temp.end()); + } + + private: + std::vector &out; +}; + +inline void render(std::ostream &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; + mapbox::util::apply_visitor(ArrayRenderer(out), value); +} + +} // namespace JSON + +#endif // JSON_RENDERER_HPP