mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Got rid of the switch/case in JsonValue
This commit is contained in:
		| @@ -6,27 +6,25 @@ | ||||
| #include "JsonValue.h" | ||||
| #include "JsonObjectBase.h" | ||||
|  | ||||
| void JsonValue::writeTo(StringBuilder& sb) | ||||
| void JsonValue::writeBooleanTo(StringBuilder& sb) | ||||
| { | ||||
|     switch (type) | ||||
|     { | ||||
|     case JSON_STRING: | ||||
|         sb.appendEscaped(content.string); | ||||
|         break; | ||||
|  | ||||
|     case JSON_NUMBER: | ||||
|         sb.append(content.number); | ||||
|         break; | ||||
|  | ||||
|     case JSON_BOOLEAN: | ||||
|         sb.append(content.boolean ? "true" : "false"); | ||||
|         break; | ||||
|  | ||||
|     case JSON_OBJECT: | ||||
|         if (content.object) | ||||
|             ((JsonObjectBase*)content.object)->writeTo(sb); | ||||
|         else | ||||
|             sb.append("null"); | ||||
|         break; | ||||
|     } | ||||
|     sb.append(content.boolean ? "true" : "false"); | ||||
| } | ||||
|  | ||||
| void JsonValue::writeNumberTo(StringBuilder& sb) | ||||
| { | ||||
|     sb.append(content.number); | ||||
| } | ||||
|  | ||||
| void JsonValue::writeObjectTo(StringBuilder& sb) | ||||
| { | ||||
|     if (content.object) | ||||
|         ((JsonObjectBase*) content.object)->writeTo(sb); | ||||
|     else | ||||
|         sb.append("null"); | ||||
| } | ||||
|  | ||||
| void JsonValue::writeStringTo(StringBuilder& sb) | ||||
| { | ||||
|     sb.appendEscaped(content.string); | ||||
| } | ||||
| @@ -18,50 +18,51 @@ public: | ||||
|     } | ||||
|  | ||||
|     JsonValue(const char* value) | ||||
|         : type(JSON_STRING) | ||||
|         : implementation(&JsonValue::writeStringTo) | ||||
|     { | ||||
|         content.string = value; | ||||
|     } | ||||
|  | ||||
|     JsonValue(double value) | ||||
|         : type(JSON_NUMBER) | ||||
|         : implementation(&JsonValue::writeNumberTo) | ||||
|     { | ||||
|         content.number = value; | ||||
|     } | ||||
|  | ||||
|     JsonValue(bool value) | ||||
|         : type(JSON_BOOLEAN) | ||||
|         : implementation(&JsonValue::writeBooleanTo) | ||||
|     { | ||||
|         content.boolean = value; | ||||
|     } | ||||
|  | ||||
|     JsonValue(JsonObjectBase& value) | ||||
|         : type(JSON_OBJECT) | ||||
|         : implementation(&JsonValue::writeObjectTo) | ||||
|     { | ||||
|         content.object = &value; | ||||
|     } | ||||
|  | ||||
|     void writeTo(StringBuilder& sb); | ||||
|     void writeTo(StringBuilder& sb) | ||||
|     { | ||||
|         // handmade polymorphism | ||||
|        (this->*implementation)(sb); | ||||
|     } | ||||
|      | ||||
| private: | ||||
|      | ||||
|     enum Type | ||||
|     { | ||||
|         JSON_STRING, | ||||
|         JSON_NUMBER, | ||||
|         JSON_BOOLEAN, | ||||
|         JSON_OBJECT, | ||||
|     }; | ||||
|  | ||||
|     union Content | ||||
|     { | ||||
|         const char*     string; | ||||
|         double          number; | ||||
|         bool            boolean; | ||||
|         double          number; | ||||
|         JsonObjectBase* object; | ||||
|         const char*     string; | ||||
|     }; | ||||
|  | ||||
|     Type    type; | ||||
|     Content content; | ||||
| }; | ||||
|  | ||||
|     void (JsonValue::*implementation)(StringBuilder& sb); | ||||
|  | ||||
|     void writeBooleanTo(StringBuilder& sb); | ||||
|     void writeNumberTo(StringBuilder& sb); | ||||
|     void writeObjectTo(StringBuilder& sb); | ||||
|     void writeStringTo(StringBuilder& sb); | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user