move JSON rendering code out of container header file. prerequesite to #1261
This commit is contained in:
		
							parent
							
								
									007eced326
								
							
						
					
					
						commit
						10d7a2396c
					
				| @ -90,146 +90,6 @@ struct Array | |||||||
|     std::vector<Value> values; |     std::vector<Value> 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<Value>::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<char> &_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<Value>::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<char> &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<char> &out, const Object &object) |  | ||||||
| { |  | ||||||
|     Value value = object; |  | ||||||
|     mapbox::util::apply_visitor(ArrayRenderer(out), value); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| } // namespace JSON
 | } // namespace JSON
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| #include "../DataStructures/QueryEdge.h" | #include "../DataStructures/QueryEdge.h" | ||||||
| #include "../DataStructures/SearchEngine.h" | #include "../DataStructures/SearchEngine.h" | ||||||
| #include "../Descriptors/BaseDescriptor.h" | #include "../Descriptors/BaseDescriptor.h" | ||||||
|  | #include "../Util/json_renderer.hpp" | ||||||
| #include "../Util/make_unique.hpp" | #include "../Util/make_unique.hpp" | ||||||
| #include "../Util/StringUtil.h" | #include "../Util/StringUtil.h" | ||||||
| #include "../Util/TimingUtil.h" | #include "../Util/TimingUtil.h" | ||||||
|  | |||||||
| @ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| #include "BasePlugin.h" | #include "BasePlugin.h" | ||||||
| #include "../DataStructures/JSONContainer.h" | #include "../DataStructures/JSONContainer.h" | ||||||
| #include "../Util/cast.hpp" | #include "../Util/cast.hpp" | ||||||
|  | #include "../Util/json_renderer.hpp" | ||||||
| 
 | 
 | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| 
 | 
 | ||||||
| #include "BasePlugin.h" | #include "BasePlugin.h" | ||||||
| #include "../DataStructures/JSONContainer.h" | #include "../DataStructures/JSONContainer.h" | ||||||
|  | #include "../Util/json_renderer.hpp" | ||||||
| #include "../Util/StringUtil.h" | #include "../Util/StringUtil.h" | ||||||
| 
 | 
 | ||||||
| #include <string> | #include <string> | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| #include "../DataStructures/JSONContainer.h" | #include "../DataStructures/JSONContainer.h" | ||||||
| #include "../DataStructures/phantom_node.hpp" | #include "../DataStructures/phantom_node.hpp" | ||||||
| #include "../DataStructures/Range.h" | #include "../DataStructures/Range.h" | ||||||
|  | #include "../Util/json_renderer.hpp" | ||||||
| 
 | 
 | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -28,8 +28,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| #ifndef TIMESTAMP_PLUGIN_H | #ifndef TIMESTAMP_PLUGIN_H | ||||||
| #define TIMESTAMP_PLUGIN_H | #define TIMESTAMP_PLUGIN_H | ||||||
| 
 | 
 | ||||||
| #include "../DataStructures/JSONContainer.h" |  | ||||||
| #include "BasePlugin.h" | #include "BasePlugin.h" | ||||||
|  | #include "../DataStructures/JSONContainer.h" | ||||||
|  | #include "../Util/json_renderer.hpp" | ||||||
| 
 | 
 | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -36,6 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| #include "../Descriptors/BaseDescriptor.h" | #include "../Descriptors/BaseDescriptor.h" | ||||||
| #include "../Descriptors/GPXDescriptor.h" | #include "../Descriptors/GPXDescriptor.h" | ||||||
| #include "../Descriptors/JSONDescriptor.h" | #include "../Descriptors/JSONDescriptor.h" | ||||||
|  | #include "../Util/json_renderer.hpp" | ||||||
| #include "../Util/make_unique.hpp" | #include "../Util/make_unique.hpp" | ||||||
| #include "../Util/simple_logger.hpp" | #include "../Util/simple_logger.hpp" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| 
 | 
 | ||||||
| #include "../DataStructures/JSONContainer.h" | #include "../DataStructures/JSONContainer.h" | ||||||
| #include "../Library/OSRM.h" | #include "../Library/OSRM.h" | ||||||
|  | #include "../Util/json_renderer.hpp" | ||||||
| #include "../Util/simple_logger.hpp" | #include "../Util/simple_logger.hpp" | ||||||
| #include "../Util/StringUtil.h" | #include "../Util/StringUtil.h" | ||||||
| #include "../typedefs.h" | #include "../typedefs.h" | ||||||
|  | |||||||
							
								
								
									
										182
									
								
								Util/json_renderer.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								Util/json_renderer.hpp
									
									
									
									
									
										Normal file
									
								
							| @ -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<Value>::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<char> &_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<Value>::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<char> &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<char> &out, const Object &object) | ||||||
|  | { | ||||||
|  |     Value value = object; | ||||||
|  |     mapbox::util::apply_visitor(ArrayRenderer(out), value); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace JSON
 | ||||||
|  | 
 | ||||||
|  | #endif // JSON_RENDERER_HPP
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user