Experiments with Node bindings optimisation
This commit is contained in:
		
							parent
							
								
									df62a871f6
								
							
						
					
					
						commit
						e7d75f9824
					
				| @ -11,87 +11,85 @@ namespace node_osrm | |||||||
| 
 | 
 | ||||||
| struct V8Renderer | struct V8Renderer | ||||||
| { | { | ||||||
|     explicit V8Renderer(const Napi::Env &env, Napi::Value &out) : env(env), out(out) {} |     explicit V8Renderer(const Napi::Env &env) : env(env) {} | ||||||
| 
 | 
 | ||||||
|     void operator()(const osrm::json::String &string) const |     Napi::Value operator()(const osrm::json::String &string) const | ||||||
|     { |     { | ||||||
|         out = Napi::String::New(env, string.value); |         return Napi::String::New(env, string.value); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     void operator()(const osrm::json::Number &number) const |     Napi::Value operator()(const osrm::json::Number &number) const | ||||||
|     { |     { | ||||||
|         out = Napi::Number::New(env, number.value); |         return Napi::Number::New(env, number.value); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     void operator()(const osrm::json::Object &object) const |     Napi::Value operator()(const osrm::json::Object &object) const | ||||||
|     { |     { | ||||||
|         Napi::Object obj = Napi::Object::New(env); |         Napi::Object obj = Napi::Object::New(env); | ||||||
|         for (const auto &keyValue : object.values) |         for (const auto &keyValue : object.values) | ||||||
|         { |         { | ||||||
|             Napi::Value child; |             obj.Set(keyValue.first, visit(V8Renderer(env), keyValue.second)); | ||||||
| 
 |  | ||||||
|             visit(V8Renderer(env, child), keyValue.second); |  | ||||||
|             obj.Set(keyValue.first, child); |  | ||||||
|         } |         } | ||||||
|         out = obj; |         return obj; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     void operator()(const osrm::json::Array &array) const |     Napi::Value operator()(const osrm::json::Array &array) const | ||||||
|     { |     { | ||||||
|         Napi::Array a = Napi::Array::New(env, array.values.size()); |         Napi::Array a = Napi::Array::New(env, array.values.size()); | ||||||
|         for (auto i = 0u; i < array.values.size(); ++i) |         for (auto i = 0u; i < array.values.size(); ++i) | ||||||
|         { |         { | ||||||
|             Napi::Value child; |             a.Set(i, visit(V8Renderer(env), array.values[i])); | ||||||
|             visit(V8Renderer(env, child), array.values[i]); |  | ||||||
|             a.Set(i, child); |  | ||||||
|         } |         } | ||||||
|         out = a; |         return a; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     void operator()(const osrm::json::True &) const { out = Napi::Boolean::New(env, true); } |     Napi::Value operator()(const osrm::json::True &) const { return Napi::Boolean::New(env, true); } | ||||||
| 
 | 
 | ||||||
|     void operator()(const osrm::json::False &) const { out = Napi::Boolean::New(env, false); } |     Napi::Value operator()(const osrm::json::False &) const | ||||||
|  |     { | ||||||
|  |         return Napi::Boolean::New(env, false); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     void operator()(const osrm::json::Null &) const { out = env.Null(); } |     Napi::Value operator()(const osrm::json::Null &) const { return env.Null(); } | ||||||
| 
 | 
 | ||||||
|   private: |   private: | ||||||
|     void visit(const V8Renderer &renderer, const osrm::json::Value &value) const |     Napi::Value visit(const V8Renderer &renderer, const osrm::json::Value &value) const | ||||||
|     { |     { | ||||||
|         switch (value.index()) |         switch (value.index()) | ||||||
|         { |         { | ||||||
|         case 0: |         case 0: | ||||||
|             renderer(std::get<osrm::json::String>(value)); |             return renderer(std::get<osrm::json::String>(value)); | ||||||
|             break; |             break; | ||||||
|         case 1: |         case 1: | ||||||
|             renderer(std::get<osrm::json::Number>(value)); |             return renderer(std::get<osrm::json::Number>(value)); | ||||||
|             break; |             break; | ||||||
|         case 2: |         case 2: | ||||||
|             renderer(std::get<osrm::json::Object>(value)); |             return renderer(std::get<osrm::json::Object>(value)); | ||||||
|             break; |             break; | ||||||
|         case 3: |         case 3: | ||||||
|             renderer(std::get<osrm::json::Array>(value)); |             return renderer(std::get<osrm::json::Array>(value)); | ||||||
|             break; |             break; | ||||||
|         case 4: |         case 4: | ||||||
|             renderer(std::get<osrm::json::True>(value)); |             return renderer(std::get<osrm::json::True>(value)); | ||||||
|             break; |             break; | ||||||
|         case 5: |         case 5: | ||||||
|             renderer(std::get<osrm::json::False>(value)); |             return renderer(std::get<osrm::json::False>(value)); | ||||||
|             break; |             break; | ||||||
|         case 6: |         case 6: | ||||||
|             renderer(std::get<osrm::json::Null>(value)); |             return renderer(std::get<osrm::json::Null>(value)); | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |         return env.Null(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   private: |   private: | ||||||
|     const Napi::Env &env; |     const Napi::Env &env; | ||||||
|     Napi::Value &out; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| inline void renderToV8(const Napi::Env &env, Napi::Value &out, const osrm::json::Object &object) | inline void renderToV8(const Napi::Env &env, Napi::Value &out, const osrm::json::Object &object) | ||||||
| { | { | ||||||
|     V8Renderer renderer(env, out); |     V8Renderer renderer(env); | ||||||
|     renderer(object); |     out = renderer(object); | ||||||
| } | } | ||||||
| } // namespace node_osrm
 | } // namespace node_osrm
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user