JVector.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:7k
源码类别:

网格计算

开发平台:

Java

  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. package org.apache.hadoop.record.compiler;
  19. import java.util.Map;
  20. /**
  21.  */
  22. public class JVector extends JCompType {
  23.   
  24.   static private int level = 0;
  25.   
  26.   static private String getId(String id) { return id+getLevel(); }
  27.   
  28.   static private String getLevel() { return Integer.toString(level); }
  29.   
  30.   static private void incrLevel() { level++; }
  31.   
  32.   static private void decrLevel() { level--; }
  33.   
  34.   private JType type;
  35.   
  36.   class JavaVector extends JavaCompType {
  37.     
  38.     private JType.JavaType element;
  39.     
  40.     JavaVector(JType.JavaType t) {
  41.       super("java.util.ArrayList<"+t.getWrapperType()+">",
  42.             "Vector", "java.util.ArrayList<"+t.getWrapperType()+">",
  43.             "TypeID.RIOType.VECTOR");
  44.       element = t;
  45.     }
  46.     
  47.     String getTypeIDObjectString() {
  48.       return "new org.apache.hadoop.record.meta.VectorTypeID(" + 
  49.       element.getTypeIDObjectString() + ")";
  50.     }
  51.     void genSetRTIFilter(CodeBuffer cb, Map<String, Integer> nestedStructMap) {
  52.       element.genSetRTIFilter(cb, nestedStructMap);
  53.     }
  54.     void genCompareTo(CodeBuffer cb, String fname, String other) {
  55.       cb.append("{n");
  56.       incrLevel();
  57.       cb.append("int "+getId(Consts.RIO_PREFIX + "len1")+" = "+fname+
  58.           ".size();n");
  59.       cb.append("int "+getId(Consts.RIO_PREFIX + "len2")+" = "+other+
  60.           ".size();n");
  61.       cb.append("for(int "+getId(Consts.RIO_PREFIX + "vidx")+" = 0; "+
  62.           getId(Consts.RIO_PREFIX + "vidx")+"<"+getId(Consts.RIO_PREFIX + "len1")+
  63.           " && "+getId(Consts.RIO_PREFIX + "vidx")+"<"+
  64.           getId(Consts.RIO_PREFIX + "len2")+"; "+
  65.           getId(Consts.RIO_PREFIX + "vidx")+"++) {n");
  66.       cb.append(element.getType()+" "+getId(Consts.RIO_PREFIX + "e1")+
  67.                 " = "+fname+
  68.                 ".get("+getId(Consts.RIO_PREFIX + "vidx")+");n");
  69.       cb.append(element.getType()+" "+getId(Consts.RIO_PREFIX + "e2")+
  70.                 " = "+other+
  71.                 ".get("+getId(Consts.RIO_PREFIX + "vidx")+");n");
  72.       element.genCompareTo(cb, getId(Consts.RIO_PREFIX + "e1"), 
  73.           getId(Consts.RIO_PREFIX + "e2"));
  74.       cb.append("if (" + Consts.RIO_PREFIX + "ret != 0) { return " +
  75.           Consts.RIO_PREFIX + "ret; }n");
  76.       cb.append("}n");
  77.       cb.append(Consts.RIO_PREFIX + "ret = ("+getId(Consts.RIO_PREFIX + "len1")+
  78.           " - "+getId(Consts.RIO_PREFIX + "len2")+");n");
  79.       decrLevel();
  80.       cb.append("}n");
  81.     }
  82.     
  83.     void genReadMethod(CodeBuffer cb, String fname, String tag, boolean decl) {
  84.       if (decl) {
  85.         cb.append(getType()+" "+fname+";n");
  86.       }
  87.       cb.append("{n");
  88.       incrLevel();
  89.       cb.append("org.apache.hadoop.record.Index "+
  90.           getId(Consts.RIO_PREFIX + "vidx")+" = " + 
  91.           Consts.RECORD_INPUT + ".startVector(""+tag+"");n");
  92.       cb.append(fname+"=new "+getType()+"();n");
  93.       cb.append("for (; !"+getId(Consts.RIO_PREFIX + "vidx")+".done(); " + 
  94.           getId(Consts.RIO_PREFIX + "vidx")+".incr()) {n");
  95.       element.genReadMethod(cb, getId(Consts.RIO_PREFIX + "e"), 
  96.           getId(Consts.RIO_PREFIX + "e"), true);
  97.       cb.append(fname+".add("+getId(Consts.RIO_PREFIX + "e")+");n");
  98.       cb.append("}n");
  99.       cb.append(Consts.RECORD_INPUT + ".endVector(""+tag+"");n");
  100.       decrLevel();
  101.       cb.append("}n");
  102.     }
  103.     
  104.     void genWriteMethod(CodeBuffer cb, String fname, String tag) {
  105.       cb.append("{n");
  106.       incrLevel();
  107.       cb.append(Consts.RECORD_OUTPUT + ".startVector("+fname+",""+tag+"");n");
  108.       cb.append("int "+getId(Consts.RIO_PREFIX + "len")+" = "+fname+".size();n");
  109.       cb.append("for(int "+getId(Consts.RIO_PREFIX + "vidx")+" = 0; " + 
  110.           getId(Consts.RIO_PREFIX + "vidx")+"<"+getId(Consts.RIO_PREFIX + "len")+
  111.           "; "+getId(Consts.RIO_PREFIX + "vidx")+"++) {n");
  112.       cb.append(element.getType()+" "+getId(Consts.RIO_PREFIX + "e")+" = "+
  113.           fname+".get("+getId(Consts.RIO_PREFIX + "vidx")+");n");
  114.       element.genWriteMethod(cb, getId(Consts.RIO_PREFIX + "e"), 
  115.           getId(Consts.RIO_PREFIX + "e"));
  116.       cb.append("}n");
  117.       cb.append(Consts.RECORD_OUTPUT + ".endVector("+fname+",""+tag+"");n");
  118.       cb.append("}n");
  119.       decrLevel();
  120.     }
  121.     
  122.     void genSlurpBytes(CodeBuffer cb, String b, String s, String l) {
  123.       cb.append("{n");
  124.       incrLevel();
  125.       cb.append("int "+getId("vi")+
  126.                 " = org.apache.hadoop.record.Utils.readVInt("+b+", "+s+");n");
  127.       cb.append("int "+getId("vz")+
  128.                 " = org.apache.hadoop.record.Utils.getVIntSize("+getId("vi")+");n");
  129.       cb.append(s+"+="+getId("vz")+"; "+l+"-="+getId("vz")+";n");
  130.       cb.append("for (int "+getId("vidx")+" = 0; "+getId("vidx")+
  131.                 " < "+getId("vi")+"; "+getId("vidx")+"++)");
  132.       element.genSlurpBytes(cb, b, s, l);
  133.       decrLevel();
  134.       cb.append("}n");
  135.     }
  136.     
  137.     void genCompareBytes(CodeBuffer cb) {
  138.       cb.append("{n");
  139.       incrLevel();
  140.       cb.append("int "+getId("vi1")+
  141.                 " = org.apache.hadoop.record.Utils.readVInt(b1, s1);n");
  142.       cb.append("int "+getId("vi2")+
  143.                 " = org.apache.hadoop.record.Utils.readVInt(b2, s2);n");
  144.       cb.append("int "+getId("vz1")+
  145.                 " = org.apache.hadoop.record.Utils.getVIntSize("+getId("vi1")+");n");
  146.       cb.append("int "+getId("vz2")+
  147.                 " = org.apache.hadoop.record.Utils.getVIntSize("+getId("vi2")+");n");
  148.       cb.append("s1+="+getId("vz1")+"; s2+="+getId("vz2")+
  149.                 "; l1-="+getId("vz1")+"; l2-="+getId("vz2")+";n");
  150.       cb.append("for (int "+getId("vidx")+" = 0; "+getId("vidx")+
  151.                 " < "+getId("vi1")+" && "+getId("vidx")+" < "+getId("vi2")+
  152.                 "; "+getId("vidx")+"++)");
  153.       element.genCompareBytes(cb);
  154.       cb.append("if ("+getId("vi1")+" != "+getId("vi2")+
  155.                 ") { return ("+getId("vi1")+"<"+getId("vi2")+")?-1:0; }n");
  156.       decrLevel();
  157.       cb.append("}n");
  158.     }
  159.   }
  160.   
  161.   class CppVector extends CppCompType {
  162.     
  163.     private JType.CppType element;
  164.     
  165.     CppVector(JType.CppType t) {
  166.       super("::std::vector< "+t.getType()+" >");
  167.       element = t;
  168.     }
  169.     
  170.     String getTypeIDObjectString() {
  171.       return "new ::hadoop::VectorTypeID(" +    
  172.       element.getTypeIDObjectString() + ")";
  173.     }
  174.     void genSetRTIFilter(CodeBuffer cb) {
  175.       element.genSetRTIFilter(cb);
  176.     }
  177.   }
  178.   
  179.   /** Creates a new instance of JVector */
  180.   public JVector(JType t) {
  181.     type = t;
  182.     setJavaType(new JavaVector(t.getJavaType()));
  183.     setCppType(new CppVector(t.getCppType()));
  184.     setCType(new CCompType());
  185.   }
  186.   
  187.   String getSignature() {
  188.     return "[" + type.getSignature() + "]";
  189.   }
  190. }