summaryrefslogtreecommitdiff
path: root/include/google/protobuf/generated_message_tctable_decl.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/google/protobuf/generated_message_tctable_decl.h')
-rw-r--r--include/google/protobuf/generated_message_tctable_decl.h312
1 files changed, 0 insertions, 312 deletions
diff --git a/include/google/protobuf/generated_message_tctable_decl.h b/include/google/protobuf/generated_message_tctable_decl.h
deleted file mode 100644
index b1bb1def70..0000000000
--- a/include/google/protobuf/generated_message_tctable_decl.h
+++ /dev/null
@@ -1,312 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// This file contains declarations needed in generated headers for messages
-// that use tail-call table parsing. Everything in this file is for internal
-// use only.
-
-#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_DECL_H__
-#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_DECL_H__
-
-#include <array>
-#include <cstddef>
-#include <cstdint>
-#include <type_traits>
-
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/parse_context.h>
-
-// Must come last:
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-// Additional information about this field:
-struct TcFieldData {
- constexpr TcFieldData() : data(0) {}
-
- // Fast table entry constructor:
- constexpr TcFieldData(uint16_t coded_tag, uint8_t hasbit_idx, uint8_t aux_idx,
- uint16_t offset)
- : data(uint64_t{offset} << 48 | //
- uint64_t{aux_idx} << 24 | //
- uint64_t{hasbit_idx} << 16 | //
- uint64_t{coded_tag}) {}
-
- // Fields used in fast table parsing:
- //
- // Bit:
- // +-----------+-------------------+
- // |63 .. 32|31 .. 0|
- // +---------------+---------------+
- // : . : . : . 16|=======| [16] coded_tag()
- // : . : . : 24|===| . : [ 8] hasbit_idx()
- // : . : . 32|===| : . : [ 8] aux_idx()
- // : . 48:---.---: . : . : [16] (unused)
- // |=======| . : . : . : [16] offset()
- // +-----------+-------------------+
- // |63 .. 32|31 .. 0|
- // +---------------+---------------+
-
- template <typename TagType = uint16_t>
- TagType coded_tag() const {
- return static_cast<TagType>(data);
- }
- uint8_t hasbit_idx() const { return static_cast<uint8_t>(data >> 16); }
- uint8_t aux_idx() const { return static_cast<uint8_t>(data >> 24); }
- uint16_t offset() const { return static_cast<uint16_t>(data >> 48); }
-
- // Fields used in mini table parsing:
- //
- // Bit:
- // +-----------+-------------------+
- // |63 .. 32|31 .. 0|
- // +---------------+---------------+
- // : . : . |===============| [32] tag() (decoded)
- // |===============| . : . : [32] entry_offset()
- // +-----------+-------------------+
- // |63 .. 32|31 .. 0|
- // +---------------+---------------+
-
- uint32_t tag() const { return static_cast<uint32_t>(data); }
- uint32_t entry_offset() const { return static_cast<uint32_t>(data >> 32); }
-
- uint64_t data;
-};
-
-struct TcParseTableBase;
-
-// TailCallParseFunc is the function pointer type used in the tailcall table.
-typedef const char* (*TailCallParseFunc)(PROTOBUF_TC_PARAM_DECL);
-
-namespace field_layout {
-struct Offset {
- uint32_t off;
-};
-} // namespace field_layout
-
-#if defined(_MSC_VER) && !defined(_WIN64)
-#pragma warning(push)
-// TcParseTableBase is intentionally overaligned on 32 bit targets.
-#pragma warning(disable : 4324)
-#endif
-
-// Base class for message-level table with info for the tail-call parser.
-struct alignas(uint64_t) TcParseTableBase {
- // Common attributes for message layout:
- uint16_t has_bits_offset;
- uint16_t extension_offset;
- uint32_t extension_range_low;
- uint32_t extension_range_high;
- uint32_t max_field_number;
- uint8_t fast_idx_mask;
- uint16_t lookup_table_offset;
- uint32_t skipmap32;
- uint32_t field_entries_offset;
- uint16_t num_field_entries;
-
- uint16_t num_aux_entries;
- uint32_t aux_offset;
-
- const MessageLite* default_instance;
-
- // Handler for fields which are not handled by table dispatch.
- TailCallParseFunc fallback;
-
- // This constructor exactly follows the field layout, so it's technically
- // not necessary. However, it makes it much much easier to add or re-arrange
- // fields, because it can be overloaded with an additional constructor,
- // temporarily allowing both old and new protocol buffer headers to be
- // compiled.
- constexpr TcParseTableBase(
- uint16_t has_bits_offset, uint16_t extension_offset,
- uint32_t extension_range_low, uint32_t extension_range_high,
- uint32_t max_field_number, uint8_t fast_idx_mask,
- uint16_t lookup_table_offset, uint32_t skipmap32,
- uint32_t field_entries_offset, uint16_t num_field_entries,
- uint16_t num_aux_entries, uint32_t aux_offset,
- const MessageLite* default_instance, TailCallParseFunc fallback)
- : has_bits_offset(has_bits_offset),
- extension_offset(extension_offset),
- extension_range_low(extension_range_low),
- extension_range_high(extension_range_high),
- max_field_number(max_field_number),
- fast_idx_mask(fast_idx_mask),
- lookup_table_offset(lookup_table_offset),
- skipmap32(skipmap32),
- field_entries_offset(field_entries_offset),
- num_field_entries(num_field_entries),
- num_aux_entries(num_aux_entries),
- aux_offset(aux_offset),
- default_instance(default_instance),
- fallback(fallback) {}
-
- // Table entry for fast-path tailcall dispatch handling.
- struct FastFieldEntry {
- // Target function for dispatch:
- TailCallParseFunc target;
- // Field data used during parse:
- TcFieldData bits;
- };
- // There is always at least one table entry.
- const FastFieldEntry* fast_entry(size_t idx) const {
- return reinterpret_cast<const FastFieldEntry*>(this + 1) + idx;
- }
-
- // Returns a begin iterator (pointer) to the start of the field lookup table.
- const uint16_t* field_lookup_begin() const {
- return reinterpret_cast<const uint16_t*>(reinterpret_cast<uintptr_t>(this) +
- lookup_table_offset);
- }
-
- // Field entry for all fields.
- struct FieldEntry {
- uint32_t offset; // offset in the message object
- int32_t has_idx; // has-bit index
- uint16_t aux_idx; // index for `field_aux`.
- uint16_t type_card; // `FieldType` and `Cardinality` (see _impl.h)
- };
-
- // Returns a begin iterator (pointer) to the start of the field entries array.
- const FieldEntry* field_entries_begin() const {
- return reinterpret_cast<const FieldEntry*>(
- reinterpret_cast<uintptr_t>(this) + field_entries_offset);
- }
-
- // Auxiliary entries for field types that need extra information.
- union FieldAux {
- constexpr FieldAux() : message_default(nullptr) {}
- constexpr FieldAux(bool (*enum_validator)(int))
- : enum_validator(enum_validator) {}
- constexpr FieldAux(field_layout::Offset off) : offset(off.off) {}
- constexpr FieldAux(int16_t range_start, uint16_t range_length)
- : enum_range{range_start, range_length} {}
- constexpr FieldAux(const MessageLite* msg) : message_default(msg) {}
- bool (*enum_validator)(int);
- struct {
- int16_t start; // minimum enum number (if it fits)
- uint16_t length; // length of range (i.e., max = start + length - 1)
- } enum_range;
- uint32_t offset;
- const MessageLite* message_default;
- };
- const FieldAux* field_aux(uint32_t idx) const {
- return reinterpret_cast<const FieldAux*>(reinterpret_cast<uintptr_t>(this) +
- aux_offset) +
- idx;
- }
- const FieldAux* field_aux(const FieldEntry* entry) const {
- return field_aux(entry->aux_idx);
- }
-
- // Field name data
- const char* name_data() const {
- return reinterpret_cast<const char*>(reinterpret_cast<uintptr_t>(this) +
- aux_offset +
- num_aux_entries * sizeof(FieldAux));
- }
-};
-
-#if defined(_MSC_VER) && !defined(_WIN64)
-#pragma warning(pop)
-#endif
-
-static_assert(sizeof(TcParseTableBase::FastFieldEntry) <= 16,
- "Fast field entry is too big.");
-static_assert(sizeof(TcParseTableBase::FieldEntry) <= 16,
- "Field entry is too big.");
-
-template <size_t kFastTableSizeLog2, size_t kNumFieldEntries = 0,
- size_t kNumFieldAux = 0, size_t kNameTableSize = 0,
- size_t kFieldLookupSize = 2>
-struct TcParseTable {
- TcParseTableBase header;
-
- // Entries for each field.
- //
- // Fields are indexed by the lowest bits of their field number. The field
- // number is masked to fit inside the table. Note that the parsing logic
- // generally calls `TailCallParseTableBase::fast_entry()` instead of accessing
- // this field directly.
- std::array<TcParseTableBase::FastFieldEntry, (1 << kFastTableSizeLog2)>
- fast_entries;
-
- // Just big enough to find all the field entries.
- std::array<uint16_t, kFieldLookupSize> field_lookup_table;
- // Entries for all fields:
- std::array<TcParseTableBase::FieldEntry, kNumFieldEntries> field_entries;
- std::array<TcParseTableBase::FieldAux, kNumFieldAux> aux_entries;
- std::array<char, kNameTableSize> field_names;
-};
-
-// Partial specialization: if there are no aux entries, there will be no array.
-// In C++, arrays cannot have length 0, but (C++11) std::array<T, 0> is valid.
-// However, different implementations have different sizeof(std::array<T, 0>).
-// Skipping the member makes offset computations portable.
-template <size_t kFastTableSizeLog2, size_t kNumFieldEntries,
- size_t kNameTableSize, size_t kFieldLookupSize>
-struct TcParseTable<kFastTableSizeLog2, kNumFieldEntries, 0, kNameTableSize,
- kFieldLookupSize> {
- TcParseTableBase header;
- std::array<TcParseTableBase::FastFieldEntry, (1 << kFastTableSizeLog2)>
- fast_entries;
- std::array<uint16_t, kFieldLookupSize> field_lookup_table;
- std::array<TcParseTableBase::FieldEntry, kNumFieldEntries> field_entries;
- std::array<char, kNameTableSize> field_names;
-};
-
-// Partial specialization: if there are no fields at all, then we can save space
-// by skipping the field numbers and entries.
-template <size_t kNameTableSize, size_t kFieldLookupSize>
-struct TcParseTable<0, 0, 0, kNameTableSize, kFieldLookupSize> {
- TcParseTableBase header;
- // N.B.: the fast entries are sized by log2, so 2**0 fields = 1 entry.
- // The fast parsing loop will always use this entry, so it must be present.
- std::array<TcParseTableBase::FastFieldEntry, 1> fast_entries;
- std::array<uint16_t, kFieldLookupSize> field_lookup_table;
- std::array<char, kNameTableSize> field_names;
-};
-
-static_assert(std::is_standard_layout<TcParseTable<1>>::value,
- "TcParseTable must be standard layout.");
-
-static_assert(offsetof(TcParseTable<1>, fast_entries) ==
- sizeof(TcParseTableBase),
- "Table entries must be laid out after TcParseTableBase.");
-
-} // namespace internal
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_DECL_H__