blob: 15a99a077fe15f44f2576e8cfae516f5bd998e33 [file] [log] [blame]
/*
* 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 "ext/compact.h"
namespace apache {
namespace thrift {
namespace py {
const uint8_t CompactProtocol::TTypeToCType[] = {
CT_STOP, // T_STOP
0, // unused
CT_BOOLEAN_TRUE, // T_BOOL
CT_BYTE, // T_BYTE
CT_DOUBLE, // T_DOUBLE
0, // unused
CT_I16, // T_I16
0, // unused
CT_I32, // T_I32
0, // unused
CT_I64, // T_I64
CT_BINARY, // T_STRING
CT_STRUCT, // T_STRUCT
CT_MAP, // T_MAP
CT_SET, // T_SET
CT_LIST, // T_LIST
};
bool CompactProtocol::readFieldBegin(TType& type, int16_t& tag) {
uint8_t b;
if (!readByte(b)) {
return false;
}
uint8_t ctype = b & 0xf;
type = getTType(ctype);
if (type == -1) {
return false;
} else if (type == T_STOP) {
tag = 0;
return true;
}
uint8_t diff = (b & 0xf0) >> 4;
if (diff) {
tag = readTags_.top() + diff;
} else if (!readI16(tag)) {
readTags_.top() = -1;
return false;
}
if (ctype == CT_BOOLEAN_FALSE || ctype == CT_BOOLEAN_TRUE) {
readBool_.exists = true;
readBool_.value = ctype == CT_BOOLEAN_TRUE;
}
readTags_.top() = tag;
return true;
}
TType CompactProtocol::getTType(uint8_t type) {
switch (type) {
case T_STOP:
return T_STOP;
case CT_BOOLEAN_FALSE:
case CT_BOOLEAN_TRUE:
return T_BOOL;
case CT_BYTE:
return T_BYTE;
case CT_I16:
return T_I16;
case CT_I32:
return T_I32;
case CT_I64:
return T_I64;
case CT_DOUBLE:
return T_DOUBLE;
case CT_BINARY:
return T_STRING;
case CT_LIST:
return T_LIST;
case CT_SET:
return T_SET;
case CT_MAP:
return T_MAP;
case CT_STRUCT:
return T_STRUCT;
default:
PyErr_Format(PyExc_TypeError, "don't know what type: %d", type);
return static_cast<TType>(-1);
}
}
}
}
}