blob: 7261f9a59350d382d42237e6f0432b42d4207d9e [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.
// mcpack2pb - Make protobuf be front-end of mcpack/compack
// Date: Mon Oct 19 17:17:36 CST 2015
#ifndef MCPACK2PB_MCPACK_FIELD_TYPE_H
#define MCPACK2PB_MCPACK_FIELD_TYPE_H
#include <stddef.h>
#include <stdint.h>
namespace mcpack2pb {
enum FieldType {
// NOTE: All names end with 0 and all name_size count 0.
// Group of fields.
// | FieldLongHead | Name | ItemsHead | Item1 | Item2 | ...
FIELD_OBJECT = 0x10,
FIELD_ARRAY = 0x20,
// Isomorphic array of primitive type. Notice that the items are values
// without any header. E.g. If type is int32_t, an items occupies 4 bytes.
// | FieldLongHead | Name | IsoItemsHead | Item1 | Item2 | ...
FIELD_ISOARRAY = 0x30,
// Layout of repeated objects.
// [{a=1,b=2},{a=3,b=4}] => {a=[1,3],b=[2,4]}
FIELD_OBJECTISOARRAY = 0x40,
// C-style strings (ending with 0)
// strlen <= 254 : | FieldShortHead | Name | String |
// otherwise : | FieldLongHead | Name | String |
// ^ ending with 0
FIELD_STRING = 0x50,
// Binary data
// length <= 255: | FieldShortHead | Name | Data |
// otherwise: | FieldLongHead | Name | Data |
FIELD_BINARY = 0x60,
// Primitive types.
// | FieldFixedHead | Name | Value |
FIELD_INT8 = 0x11,
FIELD_INT16 = 0x12,
FIELD_INT32 = 0x14,
FIELD_INT64 = 0x18,
FIELD_UINT8 = 0x21,
FIELD_UINT16 = 0x22,
FIELD_UINT32 = 0x24,
FIELD_UINT64 = 0x28,
FIELD_BOOL = 0x31,
FIELD_FLOAT = 0x44,
FIELD_DOUBLE = 0x48,
// TODO(gejun): Don't know what this is. Seems to be timestamp, but grep nothing
// from public/idlcompiler and public/mcpack
FIELD_DATE = 0x58,
// Represent absent field in OBJECTISOARRAY
// | FieldFixedHead | Name | char(0) |
FIELD_NULL = 0x61
};
// Get description of the type.
const char* type2str(FieldType type);
inline const char* type2str(uint8_t type) {
return type2str((FieldType)type);
}
// Masks of types.
// String <= 254 or BinaryData <= 255 may have this bit set to save 3 bytes.
static const uint8_t FIELD_SHORT_MASK = 0x80;
// primitive-types & FIELD_FIXED_MASK = non-zero.
// non-primitive-types & FIELD_FIXED_MASK = 0.
static const uint8_t FIELD_FIXED_MASK = 0xf;
// Valid field & FIELD_NON_DELETED_MASK = non-zero.
// Deleted fields should be skipped.
static const uint8_t FIELD_NON_DELETED_MASK = 0x70;
// Represent fields unknown/unset/invalid.
static const FieldType FIELD_UNKNOWN = (FieldType)0;
// Maximum of level of array/object
// Parsing/Serialization would fail if the level exceeds this value.
static const int MAX_DEPTH = 128;
enum PrimitiveFieldType {
PRIMITIVE_FIELD_INT8 = FIELD_INT8,
PRIMITIVE_FIELD_INT16 = FIELD_INT16,
PRIMITIVE_FIELD_INT32 = FIELD_INT32,
PRIMITIVE_FIELD_INT64 = FIELD_INT64,
PRIMITIVE_FIELD_UINT8 = FIELD_UINT8,
PRIMITIVE_FIELD_UINT16 = FIELD_UINT16,
PRIMITIVE_FIELD_UINT32 = FIELD_UINT32,
PRIMITIVE_FIELD_UINT64 = FIELD_UINT64,
PRIMITIVE_FIELD_BOOL = FIELD_BOOL,
PRIMITIVE_FIELD_FLOAT = FIELD_FLOAT,
PRIMITIVE_FIELD_DOUBLE = FIELD_DOUBLE
};
static const PrimitiveFieldType PRIMITIVE_FIELD_UNKNOWN =
(PrimitiveFieldType)FIELD_UNKNOWN;
inline const char* type2str(PrimitiveFieldType type) {
return type2str((FieldType)type);
}
inline bool is_primitive(FieldType type) {
return type & 0xF;
}
inline bool is_integral(PrimitiveFieldType type) {
return (type & 0xF0) < 0x40;
}
inline bool is_floating_point(PrimitiveFieldType type) {
return (type & 0xF0) == 0x40;
}
inline size_t get_primitive_type_size(PrimitiveFieldType type) {
return (type & 0xF);
}
inline size_t get_primitive_type_size(FieldType type) {
return (type & 0xF);
}
} // namespace mcpack2pb
#endif // MCPACK2PB_MCPACK_FIELD_TYPE_H