typeIDs.cc
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:7k
- /**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include "typeIDs.hh"
- using namespace hadoop;
- void TypeID::serialize(::hadoop::OArchive& a_, const char* tag) const
- {
- a_.serialize(typeVal, tag);
- }
- bool TypeID::operator==(const TypeID& peer_) const
- {
- return (this->typeVal == peer_.typeVal);
- }
- void TypeID::print(int space) const
- {
- for (int i=0; i<space; i++) {
- printf(" ");
- }
- printf("typeID(%lx) = %dn", (long)this, typeVal);
- }
- /*StructTypeID::StructTypeID(const char *p): TypeID(RIOTYPE_STRUCT)
- {
- pName = new std::string(p);
- }
- StructTypeID::StructTypeID(std::string* p): TypeID(RIOTYPE_STRUCT)
- {
- this->pName = p;
- }*/
- StructTypeID::StructTypeID(const std::vector<FieldTypeInfo*>& vec) :
- TypeID(RIOTYPE_STRUCT)
- {
- // we need to copy object clones into our own vector
- for (unsigned int i=0; i<vec.size(); i++) {
- typeInfos.push_back(vec[i]->clone());
- }
- }
- /*StructTypeID::StructTypeID(const StructTypeID& ti) :
- TypeID(RIOTYPE_STRUCT)
- {
- // we need to copy object clones into our own vector
- for (unsigned int i=0; i<ti.typeInfos.size(); i++) {
- typeInfos.push_back(ti.typeInfos[i]->clone());
- }
- } */
- StructTypeID::~StructTypeID()
- {
- for (unsigned int i=0; i<typeInfos.size(); i++) {
- delete typeInfos[i];
- }
- }
- void StructTypeID::add(FieldTypeInfo *pti)
- {
- typeInfos.push_back(pti);
- }
- // return the StructTypeiD, if any, of the given field
- StructTypeID* StructTypeID::findStruct(const char *pStructName)
- {
- // walk through the list, searching. Not the most efficient way, but this
- // in intended to be used rarely, so we keep it simple.
- // As an optimization, we can keep a hashmap of record name to its RTI, for later.
- for (unsigned int i=0; i<typeInfos.size(); i++) {
- if ((0 == typeInfos[i]->getFieldID()->compare(pStructName)) &&
- (typeInfos[i]->getTypeID()->getTypeVal()==RIOTYPE_STRUCT)) {
- return (StructTypeID*)(typeInfos[i]->getTypeID()->clone());
- }
- }
- return NULL;
- }
- void StructTypeID::serialize(::hadoop::OArchive& a_, const char* tag) const
- {
- a_.serialize(typeVal, tag);
- serializeRest(a_, tag);
- }
- /*
- * Writes rest of the struct (excluding type value).
- * As an optimization, this method is directly called by RTI
- * for the top level record so that we don't write out the byte
- * indicating that this is a struct (since top level records are
- * always structs).
- */
- void StructTypeID::serializeRest(::hadoop::OArchive& a_, const char* tag) const
- {
- a_.serialize((int32_t)typeInfos.size(), tag);
- for (unsigned int i=0; i<typeInfos.size(); i++) {
- typeInfos[i]->serialize(a_, tag);
- }
- }
- /*
- * deserialize ourselves. Called by RTI.
- */
- void StructTypeID::deserialize(::hadoop::IArchive& a_, const char* tag)
- {
- // number of elements
- int numElems;
- a_.deserialize(numElems, tag);
- for (int i=0; i<numElems; i++) {
- typeInfos.push_back(genericReadTypeInfo(a_, tag));
- }
- }
- // generic reader: reads the next TypeInfo object from stream and returns it
- FieldTypeInfo* StructTypeID::genericReadTypeInfo(::hadoop::IArchive& a_, const char* tag)
- {
- // read name of field
- std::string* pName = new std::string();
- a_.deserialize(*pName, tag);
- TypeID* pti = genericReadTypeID(a_, tag);
- return new FieldTypeInfo(pName, pti);
- }
- // generic reader: reads the next TypeID object from stream and returns it
- TypeID* StructTypeID::genericReadTypeID(::hadoop::IArchive& a_, const char* tag)
- {
- int8_t typeVal;
- a_.deserialize(typeVal, tag);
- switch(typeVal) {
- case RIOTYPE_BOOL:
- case RIOTYPE_BUFFER:
- case RIOTYPE_BYTE:
- case RIOTYPE_DOUBLE:
- case RIOTYPE_FLOAT:
- case RIOTYPE_INT:
- case RIOTYPE_LONG:
- case RIOTYPE_STRING:
- return new TypeID(typeVal);
- case RIOTYPE_STRUCT:
- {
- StructTypeID* pstID = new StructTypeID();
- int numElems;
- a_.deserialize(numElems, tag);
- for (int i=0; i<numElems; i++) {
- pstID->add(genericReadTypeInfo(a_, tag));
- }
- return pstID;
- }
- case RIOTYPE_VECTOR:
- {
- TypeID* pti = genericReadTypeID(a_, tag);
- return new VectorTypeID(pti);
- }
- case RIOTYPE_MAP:
- {
- TypeID* ptiKey = genericReadTypeID(a_, tag);
- TypeID* ptiValue = genericReadTypeID(a_, tag);
- return new MapTypeID(ptiKey, ptiValue);
- }
- default:
- // shouldn't be here
- return NULL;
- }
- }
- void StructTypeID::print(int space) const
- {
- TypeID::print(space);
- for (int i=0; i<space; i++) {
- printf(" ");
- }
- printf("StructTypeInfo(%lx): n", (long)&typeInfos);
- for (unsigned int i=0; i<typeInfos.size(); i++) {
- typeInfos[i]->print(space+2);
- }
- }
- VectorTypeID::~VectorTypeID()
- {
- delete ptiElement;
- }
- VectorTypeID::VectorTypeID(const VectorTypeID& ti): TypeID(RIOTYPE_VECTOR)
- {
- ptiElement = ti.ptiElement->clone();
- }
- void VectorTypeID::serialize(::hadoop::OArchive& a_, const char* tag) const
- {
- a_.serialize(typeVal, tag);
- ptiElement->serialize(a_, tag);
- }
- bool VectorTypeID::operator==(const TypeID& peer_) const
- {
- if (typeVal != peer_.getTypeVal()) {
- return false;
- }
- // this must be a vector type id
- return (*ptiElement) == (*((VectorTypeID&)peer_).ptiElement);
- }
- void VectorTypeID::print(int space) const
- {
- TypeID::print(space);
- for (int i=0; i<space; i++) {
- printf(" ");
- }
- printf("VectorTypeInfo(%lx): n", (long)this);
- ptiElement->print(space+2);
- }
- MapTypeID::~MapTypeID()
- {
- delete ptiKey;
- delete ptiValue;
- }
- MapTypeID::MapTypeID(const MapTypeID& ti): TypeID(RIOTYPE_MAP)
- {
- ptiKey = ti.ptiKey->clone();
- ptiValue = ti.ptiValue->clone();
- }
- void MapTypeID::serialize(::hadoop::OArchive& a_, const char* tag) const
- {
- a_.serialize(typeVal, tag);
- ptiKey->serialize(a_, tag);
- ptiValue->serialize(a_, tag);
- }
- bool MapTypeID::operator==(const TypeID& peer_) const
- {
- if (typeVal != peer_.getTypeVal()) {
- return false;
- }
- // this must be a map type id
- MapTypeID& mti = (MapTypeID&) peer_;
- if (!(*ptiKey == *(mti.ptiKey))) {
- return false;
- }
- return ((*ptiValue == *(mti.ptiValue)));
- }
- void MapTypeID::print(int space) const
- {
- TypeID::print(space);
- for (int i=0; i<space; i++) {
- printf(" ");
- }
- printf("MapTypeInfo(%lx): n", (long)this);
- ptiKey->print(space+2);
- ptiValue->print(space+2);
- }