| // 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 |