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

网格计算

开发平台:

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. #include "utils.hh"
  19. #include "recordTypeInfo.hh"
  20. using namespace hadoop;
  21. void Utils::skip(IArchive& a, const char* tag, const TypeID& typeID)
  22. {
  23.   bool b;
  24.   size_t len=0;
  25.   ::std::string str;
  26.   int8_t bt;
  27.   double d;
  28.   float f;
  29.   int32_t i;
  30.   int64_t l;
  31.   switch(typeID.getTypeVal()) {
  32.   case RIOTYPE_BOOL: 
  33.     a.deserialize(b, tag);
  34.     break;
  35.   case RIOTYPE_BUFFER: 
  36.     a.deserialize(str, len, tag);
  37.     break;
  38.   case RIOTYPE_BYTE: 
  39.     a.deserialize(bt, tag);
  40.     break;
  41.   case RIOTYPE_DOUBLE: 
  42.     a.deserialize(d, tag);
  43.     break;
  44.   case RIOTYPE_FLOAT: 
  45.     a.deserialize(f, tag);
  46.     break;
  47.   case RIOTYPE_INT: 
  48.     a.deserialize(i, tag);
  49.     break;
  50.   case RIOTYPE_LONG: 
  51.     a.deserialize(l, tag);
  52.     break;
  53.   case RIOTYPE_MAP:
  54.     {
  55.       // since we don't know the key, value types, 
  56.       // we need to deserialize in a generic manner
  57.       Index* idx = a.startMap(tag);
  58.       MapTypeID& mtID = (MapTypeID&) typeID;
  59.       while (!idx->done()) {
  60. skip(a, tag, *(mtID.getKeyTypeID()));
  61. skip(a, tag, *(mtID.getValueTypeID()));
  62. idx->incr();
  63.       }
  64.       a.endMap(idx, tag);
  65.     }
  66.     break;
  67.   case RIOTYPE_STRING: 
  68.     a.deserialize(str, tag);
  69.     break;
  70.   case RIOTYPE_STRUCT: 
  71.     {
  72.       // since we don't know the key, value types, 
  73.       // we need to deserialize in a generic manner
  74.       // we need to pass a record in, though it's never used
  75.       RecordTypeInfo rec;
  76.       a.startRecord(rec, tag);
  77.       StructTypeID& stID = (StructTypeID&) typeID;
  78.       std::vector<FieldTypeInfo*>& typeInfos = stID.getFieldTypeInfos();
  79.       for (unsigned int i=0; i<typeInfos.size(); i++) {
  80. skip(a, tag, *(typeInfos[i]->getTypeID()));
  81.       }
  82.       a.endRecord(rec, tag);
  83.     }
  84.     break;
  85.   case RIOTYPE_VECTOR:
  86.     {
  87.       // since we don't know the key, value types, 
  88.       // we need to deserialize in a generic manner
  89.       Index* idx = a.startVector(tag);
  90.       VectorTypeID& vtID = (VectorTypeID&) typeID;
  91.       while (!idx->done()) {
  92. skip(a, tag, *(vtID.getElementTypeID()));
  93. idx->incr();
  94.       }
  95.       a.endVector(idx, tag);
  96.     }
  97.     break;
  98.   default: 
  99.     // shouldn't be here
  100.     throw new IOException("Unknown typeID when skipping bytes");
  101.     break;
  102.   };
  103. }