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