Пример #1
0
        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 + "}");
        }
Пример #2
0
        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());
        }
Пример #3
0
 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 + "}");
 }
Пример #4
0
 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 + "}");
 }
Пример #5
0
        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);
        }
Пример #6
0
        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);
            }
        }
Пример #7
0
        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 + "};");
        }
Пример #8
0
        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());
        }