]> git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/thrift/lib/py/src/ext/compact.cpp
buildsys: switch source download to quincy
[ceph.git] / ceph / src / jaegertracing / thrift / lib / py / src / ext / compact.cpp
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,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20 #include "ext/compact.h"
21
22 namespace apache {
23 namespace thrift {
24 namespace py {
25
26 const uint8_t CompactProtocol::TTypeToCType[] = {
27 CT_STOP, // T_STOP
28 0, // unused
29 CT_BOOLEAN_TRUE, // T_BOOL
30 CT_BYTE, // T_BYTE
31 CT_DOUBLE, // T_DOUBLE
32 0, // unused
33 CT_I16, // T_I16
34 0, // unused
35 CT_I32, // T_I32
36 0, // unused
37 CT_I64, // T_I64
38 CT_BINARY, // T_STRING
39 CT_STRUCT, // T_STRUCT
40 CT_MAP, // T_MAP
41 CT_SET, // T_SET
42 CT_LIST, // T_LIST
43 };
44
45 bool CompactProtocol::readFieldBegin(TType& type, int16_t& tag) {
46 uint8_t b;
47 if (!readByte(b)) {
48 return false;
49 }
50 uint8_t ctype = b & 0xf;
51 type = getTType(ctype);
52 if (type == -1) {
53 return false;
54 } else if (type == T_STOP) {
55 tag = 0;
56 return true;
57 }
58 uint8_t diff = (b & 0xf0) >> 4;
59 if (diff) {
60 tag = readTags_.top() + diff;
61 } else if (!readI16(tag)) {
62 readTags_.top() = -1;
63 return false;
64 }
65 if (ctype == CT_BOOLEAN_FALSE || ctype == CT_BOOLEAN_TRUE) {
66 readBool_.exists = true;
67 readBool_.value = ctype == CT_BOOLEAN_TRUE;
68 }
69 readTags_.top() = tag;
70 return true;
71 }
72
73 TType CompactProtocol::getTType(uint8_t type) {
74 switch (type) {
75 case T_STOP:
76 return T_STOP;
77 case CT_BOOLEAN_FALSE:
78 case CT_BOOLEAN_TRUE:
79 return T_BOOL;
80 case CT_BYTE:
81 return T_BYTE;
82 case CT_I16:
83 return T_I16;
84 case CT_I32:
85 return T_I32;
86 case CT_I64:
87 return T_I64;
88 case CT_DOUBLE:
89 return T_DOUBLE;
90 case CT_BINARY:
91 return T_STRING;
92 case CT_LIST:
93 return T_LIST;
94 case CT_SET:
95 return T_SET;
96 case CT_MAP:
97 return T_MAP;
98 case CT_STRUCT:
99 return T_STRUCT;
100 default:
101 PyErr_Format(PyExc_TypeError, "don't know what type: %d", type);
102 return static_cast<TType>(-1);
103 }
104 }
105 }
106 }
107 }