private static void WriteClass(string tab, rStruct str, StringBuilder sb, List <rStruct> Structs) { sb.AppendLine(tab + "[Serializable]"); sb.AppendFormat(tab + "public class {0}\n", str.Name); sb.AppendLine(tab + "{"); foreach (var child in str.Childs) { if (child != null) { WriteClass(tab + t1, child, sb, Structs); } } foreach (var field in str.Fields) { sb.Append(buildStructFieldHeader(tab + t1, field)); } sb.AppendLine(); sb.AppendLine(tab + t1 + "public static readonly Dictionary<string, uint> sFields = new Dictionary<string, uint> {"); buildStructDictionary(tab, sb, Structs, str.Name, null); sb.AppendLine(tab + t1 + "}"); sb.AppendLine(tab + "}"); }
private static string buildSubobjectSerialization(string tab, rStruct str, string parentJson, string self, rStructField parent, List <rStruct> Structs, int nestLevel, bool nest = true, EArrayType array = EArrayType.SCALAR) { StringBuilder sb = new StringBuilder(); if (!nest) { sb.AppendFormat(tab + "json {0};\n", parentJson); foreach (var f in str.Fields) { sb.Append(buildStructFieldJsonSerialization(tab, f, parentJson, self, Structs, nestLevel + 1)); } } else { if (array == EArrayType.SCALAR) { string jsonName = string.Format("_{0}_{1}", parentJson, parent.Name); string newSelf = string.Format("{0}{1}.", self, parent.Name); sb.AppendLine(tab + "{"); sb.AppendFormat(tab + t1 + "json {0};\n", jsonName); foreach (var f in str.Fields) { sb.Append(buildStructFieldJsonSerialization(tab + t1, f, jsonName, newSelf, Structs, nestLevel + 1)); } sb.AppendFormat(tab + t1 + "{0}[\"{1}\"] = {2};\n", parentJson, parent.Name, jsonName); sb.AppendLine(tab + "}"); } else if (array == EArrayType.DYNAMIC || array == EArrayType.FIXED || array == EArrayType.LIST) { string jsonName = string.Format("_{0}_{1}", parentJson, parent.Name); string itrName = string.Format("{0}_tmp", jsonName); string itr = string.Format("i{0}", nestLevel); string len = string.Format("len{0}", nestLevel); string lenValue = array == EArrayType.FIXED ? parent.Count.ToString() : string.Format("{0}{1}.size()", self, parent.Name); sb.AppendLine(tab + "{"); sb.AppendFormat(tab + t1 + "json {0};\n", jsonName); sb.AppendFormat(tab + t1 + "for (size_t {0} = 0; {0} < {1}; ++{0})\n", itr, lenValue); sb.AppendLine(tab + t1 + "{"); sb.AppendFormat(tab + t2 + "json {0};\n", itrName); string itrSelf = string.Format("{0}{1}[{2}].", self, parent.Name, itr); foreach (var f in str.Fields) { sb.Append(buildStructFieldJsonSerialization(tab + t2, f, itrName, itrSelf, Structs, nestLevel + 1)); } sb.AppendFormat(tab + t2 + "{0}.push_back({1});\n", jsonName, itrName); sb.AppendLine(tab + t1 + "}"); sb.AppendFormat(tab + t1 + "{0}[\"{1}\"] = {2};\n", parentJson, parent.Name, jsonName); sb.AppendLine(tab + "}"); } } return(sb.ToString()); }
public static void WriteStructJsonSerialization(string tab, rStruct str, StringBuilder sb, List <rStruct> Structs) { sb.AppendFormat(tab + "std::string {1}::to_json(const {0} * self)\n", str.Name, str.Name); sb.AppendLine(tab + "{"); sb.AppendLine(tab + t1 + "assert(self != nullptr);"); sb.AppendLine(buildSubobjectSerialization(tab + t1, str, "root", "self->", null, Structs, 0, false)); sb.AppendLine(tab + t1 + "return root.dump();"); sb.AppendLine(tab + "}"); }
public static void WriteStructJsonDeserialization(string tab, rStruct str, StringBuilder sb, List <rStruct> Structs) { sb.AppendFormat(tab + "bool {0}::from_json(const std::string & json, {0} * self)\n", str.Name); sb.AppendLine(tab + "{"); sb.AppendLine(tab + t1 + "assert(self != nullptr);"); sb.AppendLine(tab + t1 + "auto j = json::parse(json);"); sb.AppendLine(tab + t1 + "if (j.empty())"); sb.AppendLine(tab + t2 + "return false;"); sb.AppendLine(tab + t1 + "auto it = j.end();"); sb.AppendLine(Subobject(tab + t1, str, "j", "self->", null, Structs, 0, false)); sb.AppendLine(tab + t1 + "return true;"); sb.AppendLine(tab + "}"); }
public override void VisitStructDeclaration(StructDeclarationSyntax node) { var strDef = new rStruct(); strDef.Name = node.Identifier.Text; List <string> namespaceChain = new List <string>(); BuildFullNamespaceChain(node.Parent, namespaceChain); strDef.Namespace = namespaceChain; foreach (var m in node.Members) { ProcessStructOrClass(strDef, m); } Structs.Add(strDef); base.VisitStructDeclaration(node); }
private void ProcessStructOrClass(rStruct strDef, MemberDeclarationSyntax member) { if (member is FieldDeclarationSyntax) { var field = new rStructField(); Struct.ParseStructField((FieldDeclarationSyntax)member, ref field, Selects, Structs); strDef.Fields.Add(field); } else if (member is ClassDeclarationSyntax) { var node = member as ClassDeclarationSyntax; var newstrDef = new rStruct(); newstrDef.Name = node.Identifier.Text; List <string> namespaceChain = new List <string>(); BuildFullNamespaceChain(node.Parent, namespaceChain); newstrDef.Namespace = namespaceChain; foreach (var m in node.Members) { ProcessStructOrClass(newstrDef, m); } Structs.Add(newstrDef); strDef.Childs.Add(newstrDef); } else if (member is StructDeclarationSyntax) { var node = member as StructDeclarationSyntax; var newstrDef = new rStruct(); newstrDef.Name = node.Identifier.Text; List <string> namespaceChain = new List <string>(); BuildFullNamespaceChain(node.Parent, namespaceChain); newstrDef.Namespace = namespaceChain; foreach (var m in node.Members) { ProcessStructOrClass(newstrDef, m); } Structs.Add(newstrDef); strDef.Childs.Add(newstrDef); } }
private static void WriteClass(string tab, rStruct str, StringBuilder sb) { sb.AppendFormat(tab + "struct {0}\n", str.Name); sb.AppendLine(tab + "{"); foreach (var child in str.Childs) { if (child != null) { WriteClass(tab + t1, child, sb); } } foreach (var field in str.Fields) { sb.Append(buildStructFieldHeader(tab + t1, field)); } sb.AppendLine(); sb.AppendFormat(tab + t1 + "static std::string to_json(const {0} * self);\n", str.Name); sb.AppendFormat(tab + t1 + "static bool from_json(const std::string & json, {0} * self);\n", str.Name); sb.AppendLine(tab + "};"); }
private static string Subobject(string tab, rStruct str, string parentJson, string self, rStructField parent, List <rStruct> Structs, int nestLevel, bool nest = true, EArrayType array = EArrayType.SCALAR) { StringBuilder sb = new StringBuilder(); if (!nest) { foreach (var f in str.Fields) { sb.Append(Field(tab, f, parentJson, self, Structs, nestLevel + 1)); } } else { if (array == EArrayType.SCALAR) { string newSelf = string.Format("{0}{1}.", self, parent.Name); string jsi = string.Format("j{0}_it", nestLevel); string jsv = string.Format("j{0}_v", nestLevel); sb.AppendLine(tab + "{"); sb.AppendFormat(tab + t1 + "auto {0} = {1}.find(\"{2}\");\n", jsi, parentJson, parent.Name); sb.AppendFormat(tab + t1 + "if ({0} == {1}.end())\n", jsi, parentJson); sb.AppendFormat(tab + t1 + t1 + "return false;\n"); sb.AppendFormat(tab + t1 + "auto {0} = {1}.value();\n", jsv, jsi); sb.AppendLine(tab + t1 + "{"); foreach (var f in str.Fields) { sb.Append(Field(tab + t2, f, jsv, newSelf, Structs, nestLevel + 1)); } sb.AppendLine(tab + t1 + "}"); sb.AppendLine(tab + "}"); } else if (array == EArrayType.DYNAMIC || array == EArrayType.FIXED || array == EArrayType.LIST) { string itr = string.Format("i{0}", nestLevel); string len = string.Format("len{0}", nestLevel); string jsi = string.Format("j{0}", nestLevel); string jsv = string.Format("j{0}v", nestLevel); string jsval = string.Format("j{0}_val", nestLevel); sb.AppendLine(tab + "{"); sb.AppendFormat(tab + t1 + "auto {0} = {2}.find(\"{1}\");\n", jsi, parent.Name, parentJson); sb.AppendFormat(tab + t1 + "if ({0} == {1}.end())\n", jsi, parentJson); sb.AppendLine(tab + t1 + t1 + "return false;"); sb.AppendFormat(tab + t1 + "auto {0} = {1}.value();\n", jsv, jsi); sb.AppendFormat(tab + t1 + "const size_t {0} = {1}.size();\n", len, jsv); sb.AppendFormat(tab + t1 + "{0}{1}.resize({2});\n", self, parent.Name, len); sb.AppendFormat(tab + t1 + "for (size_t {0} = 0; {0} < {1}; ++{0})\n", itr, len); sb.AppendLine(tab + t1 + "{"); sb.AppendFormat(tab + t2 + "auto {0} = {1}[{2}];\n", jsval, jsv, itr); string itrSelf = string.Format("{0}{1}[{2}].", self, parent.Name, itr); foreach (var f in str.Fields) { sb.Append(Field(tab + t2, f, jsval, itrSelf, Structs, nestLevel + 1)); } sb.AppendLine(tab + t1 + "}"); sb.AppendLine(tab + "}"); } } return(sb.ToString()); }