1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 package org.apache.jute.compiler;
20 
21 /**
22  *
23  */
24 public class JVector extends JCompType {
25 
26     private static int level = 0;
27 
getId(String id)28     private static String getId(String id) {
29         return id + getLevel();
30     }
31 
getLevel()32     private static String getLevel() {
33         return Integer.toString(level);
34     }
35 
incrLevel()36     private static void incrLevel() {
37         level++;
38     }
39 
decrLevel()40     private static void decrLevel() {
41         level--;
42     }
43 
44     private JType mElement;
45 
46     /**
47      * Creates a new instance of JVector.
48      */
JVector(JType t)49     public JVector(JType t) {
50         super("struct " + extractVectorName(t), " ::std::vector<" + t.getCppType() + ">", "System.Collections.Generic.List<" + t.getCsharpType() + ">", "java.util.List<" + t.getJavaType() + ">", "Vector",
51                 "System.Collections.Generic.List<" + t.getCsharpType() + ">", "java.util.ArrayList<" + t.getJavaType() + ">");
52         mElement = t;
53     }
54 
getSignature()55     public String getSignature() {
56         return "[" + mElement.getSignature() + "]";
57     }
58 
genJavaCompareTo(String fname)59     public String genJavaCompareTo(String fname) {
60         return "    throw new UnsupportedOperationException(\"comparing "
61                 + fname + " is unimplemented\");\n";
62     }
63 
genJavaReadWrapper(String fname, String tag, boolean decl)64     public String genJavaReadWrapper(String fname, String tag, boolean decl) {
65         StringBuilder ret = new StringBuilder("");
66         if (decl) {
67             ret.append("      java.util.List " + fname + ";\n");
68         }
69         ret.append("    {\n");
70         incrLevel();
71         ret.append("      Index " + getId("vidx") + " = a_.startVector(\"" + tag + "\");\n");
72         ret.append("      if (" + getId("vidx") + "!= null) {");
73         ret.append("          " + fname + "=new java.util.ArrayList<" + mElement.getJavaType() + ">();\n");
74         ret.append("          for (; !" + getId("vidx") + ".done(); " + getId("vidx") + ".incr()) {\n");
75         ret.append(mElement.genJavaReadWrapper(getId("e"), getId("e"), true));
76         ret.append("            " + fname + ".add(" + getId("e") + ");\n");
77         ret.append("          }\n");
78         ret.append("      }\n");
79         ret.append("    a_.endVector(\"" + tag + "\");\n");
80         decrLevel();
81         ret.append("    }\n");
82         return ret.toString();
83     }
84 
genJavaReadMethod(String fname, String tag)85     public String genJavaReadMethod(String fname, String tag) {
86         return genJavaReadWrapper(fname, tag, false);
87     }
88 
genJavaWriteWrapper(String fname, String tag)89     public String genJavaWriteWrapper(String fname, String tag) {
90         StringBuilder ret = new StringBuilder("    {\n");
91         incrLevel();
92         ret.append("      a_.startVector(" + fname + ",\"" + tag + "\");\n");
93         ret.append("      if (" + fname + "!= null) {");
94         ret.append("          int " + getId("len") + " = " + fname + ".size();\n");
95         ret.append("          for(int " + getId("vidx") + " = 0; " + getId("vidx") + "<" + getId("len") + "; " + getId("vidx") + "++) {\n");
96         ret.append("            " + mElement.getJavaWrapperType() + " " + getId("e") + " = (" + mElement.getJavaWrapperType() + ") " + fname + ".get(" + getId("vidx") + ");\n");
97         ret.append(mElement.genJavaWriteWrapper(getId("e"), getId("e")));
98         ret.append("          }\n");
99         ret.append("      }\n");
100         ret.append("      a_.endVector(" + fname + ",\"" + tag + "\");\n");
101         ret.append("    }\n");
102         decrLevel();
103         return ret.toString();
104     }
105 
genJavaWriteMethod(String fname, String tag)106     public String genJavaWriteMethod(String fname, String tag) {
107         return genJavaWriteWrapper(fname, tag);
108     }
109 
getElementType()110     public JType getElementType() {
111         return mElement;
112     }
113 
genCsharpWriteWrapper(String fname, String tag)114     public String genCsharpWriteWrapper(String fname, String tag) {
115         StringBuilder ret = new StringBuilder("    {\n");
116         incrLevel();
117         ret.append("      a_.StartVector(" + capitalize(fname) + ",\"" + tag + "\");\n");
118         ret.append("      if (" + capitalize(fname) + "!= null) {");
119         ret.append("          int " + getId("len") + " = " + capitalize(fname) + ".Count;\n");
120         ret.append("          for(int " + getId("vidx") + " = 0; " + getId("vidx") + "<" + getId("len") + "; " + getId("vidx") + "++) {\n");
121         ret.append("            " + mElement.getCsharpWrapperType() + " " + getId("e") + " = (" + mElement.getCsharpWrapperType() + ") " + capitalize(fname) + "[" + getId("vidx") + "];\n");
122         ret.append(mElement.genCsharpWriteWrapper(getId("e"), getId("e")));
123         ret.append("          }\n");
124         ret.append("      }\n");
125         ret.append("      a_.EndVector(" + capitalize(fname) + ",\"" + tag + "\");\n");
126         ret.append("    }\n");
127         decrLevel();
128         return ret.toString();
129     }
130 
genCsharpWriteMethod(String fname, String tag)131     String genCsharpWriteMethod(String fname, String tag) {
132         return genCsharpWriteWrapper(fname, tag);
133     }
134 
genCsharpReadWrapper(String fname, String tag, boolean decl)135     public String genCsharpReadWrapper(String fname, String tag, boolean decl) {
136         StringBuilder ret = new StringBuilder();
137         if (decl) {
138             ret.append("      System.Collections.Generic.List<" + mElement.getCsharpType() + "> " + capitalize(fname) + ";\n");
139         }
140         ret.append("    {\n");
141         incrLevel();
142         ret.append("      IIndex " + getId("vidx") + " = a_.StartVector(\"" + tag + "\");\n");
143         ret.append("      if (" + getId("vidx") + "!= null) {");
144         ret.append("          " + capitalize(fname) + "=new System.Collections.Generic.List<" + mElement.getCsharpType() + ">();\n");
145         ret.append("          for (; !" + getId("vidx") + ".Done(); " + getId("vidx") + ".Incr()) {\n");
146         ret.append(mElement.genCsharpReadWrapper(getId("e"), getId("e"), true));
147         ret.append("            " + capitalize(fname) + ".Add(" + getId("e") + ");\n");
148         ret.append("          }\n");
149         ret.append("      }\n");
150         ret.append("    a_.EndVector(\"" + tag + "\");\n");
151         decrLevel();
152         ret.append("    }\n");
153         return ret.toString();
154     }
155 
genCsharpReadMethod(String fname, String tag)156     String genCsharpReadMethod(String fname, String tag) {
157         return genCsharpReadWrapper(fname, tag, false);
158     }
159 
extractVectorName(JType jvType)160     static String extractVectorName(JType jvType) {
161         return JRecord.extractMethodSuffix(jvType) + "_vector";
162     }
163 }
164