Warning, file /include/google/protobuf/message_lite.h was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #ifndef GOOGLE_PROTOBUF_MESSAGE_LITE_H__
0023 #define GOOGLE_PROTOBUF_MESSAGE_LITE_H__
0024
0025 #include <climits>
0026 #include <cstddef>
0027 #include <cstdint>
0028 #include <cstring>
0029 #include <iosfwd>
0030 #include <memory>
0031 #include <string>
0032 #include <type_traits>
0033 #include <utility>
0034
0035 #include "absl/base/attributes.h"
0036 #include "absl/log/absl_check.h"
0037 #include "absl/numeric/bits.h"
0038 #include "absl/strings/cord.h"
0039 #include "absl/strings/string_view.h"
0040 #include "google/protobuf/arena.h"
0041 #include "google/protobuf/internal_visibility.h"
0042 #include "google/protobuf/io/coded_stream.h"
0043 #include "google/protobuf/metadata_lite.h"
0044 #include "google/protobuf/port.h"
0045
0046
0047
0048 #include "google/protobuf/port_def.inc"
0049
0050
0051 #ifdef SWIG
0052 #error "You cannot SWIG proto headers"
0053 #endif
0054
0055 namespace google {
0056 namespace protobuf {
0057
0058 template <typename T>
0059 class RepeatedPtrField;
0060
0061 class FastReflectionMessageMutator;
0062 class FastReflectionStringSetter;
0063 class Reflection;
0064 class Descriptor;
0065 class AssignDescriptorsHelper;
0066 class MessageLite;
0067
0068 namespace io {
0069
0070 class CodedInputStream;
0071 class CodedOutputStream;
0072 class ZeroCopyInputStream;
0073 class ZeroCopyOutputStream;
0074
0075 }
0076
0077 namespace compiler {
0078 namespace cpp {
0079 class MessageTableTester;
0080 }
0081 }
0082
0083 namespace internal {
0084
0085 namespace v2 {
0086 class TableDriven;
0087 class TableDrivenMessage;
0088 class TableDrivenParse;
0089 }
0090
0091 class MessageCreator {
0092 public:
0093 using Func = void* (*)(const void*, void*, Arena*);
0094
0095
0096 enum Tag : int8_t {
0097 kFunc = -1,
0098 kZeroInit = 0,
0099 kMemcpy = 1,
0100 };
0101
0102 constexpr MessageCreator()
0103 : allocation_size_(), tag_(), alignment_(), arena_bits_(uintptr_t{}) {}
0104
0105 static constexpr MessageCreator ZeroInit(uint32_t allocation_size,
0106 uint8_t alignment,
0107 uintptr_t arena_bits = 0) {
0108 MessageCreator out;
0109 out.allocation_size_ = allocation_size;
0110 out.tag_ = kZeroInit;
0111 out.alignment_ = alignment;
0112 out.arena_bits_ = arena_bits;
0113 return out;
0114 }
0115 static constexpr MessageCreator CopyInit(uint32_t allocation_size,
0116 uint8_t alignment,
0117 uintptr_t arena_bits = 0) {
0118 MessageCreator out;
0119 out.allocation_size_ = allocation_size;
0120 out.tag_ = kMemcpy;
0121 out.alignment_ = alignment;
0122 out.arena_bits_ = arena_bits;
0123 return out;
0124 }
0125 constexpr MessageCreator(Func func, uint32_t allocation_size,
0126 uint8_t alignment)
0127 : allocation_size_(allocation_size),
0128 tag_(kFunc),
0129 alignment_(alignment),
0130 func_(func) {}
0131
0132
0133 template <typename MessageLite>
0134 MessageLite* New(const MessageLite* prototype_for_func,
0135 const MessageLite* prototype_for_copy, Arena* arena) const;
0136
0137 template <typename MessageLite>
0138 MessageLite* PlacementNew(const MessageLite* prototype_for_func,
0139 const MessageLite* prototype_for_copy, void* mem,
0140 Arena* arena) const;
0141
0142 Tag tag() const { return tag_; }
0143
0144 uint32_t allocation_size() const { return allocation_size_; }
0145
0146 uint8_t alignment() const { return alignment_; }
0147
0148 uintptr_t arena_bits() const {
0149 ABSL_DCHECK_NE(+tag(), +kFunc);
0150 return arena_bits_;
0151 }
0152
0153 private:
0154 uint32_t allocation_size_;
0155 Tag tag_;
0156 uint8_t alignment_;
0157 union {
0158 Func func_;
0159 uintptr_t arena_bits_;
0160 };
0161 };
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177 class PROTOBUF_EXPORT CachedSize {
0178 private:
0179 using Scalar = int;
0180
0181 public:
0182 constexpr CachedSize() noexcept : atom_(Scalar{}) {}
0183
0184 constexpr CachedSize(Scalar desired) noexcept : atom_(desired) {}
0185
0186 #ifdef PROTOBUF_BUILTIN_ATOMIC
0187 constexpr CachedSize(const CachedSize& other) = default;
0188
0189 Scalar Get() const noexcept {
0190 return __atomic_load_n(&atom_, __ATOMIC_RELAXED);
0191 }
0192
0193 void Set(Scalar desired) const noexcept {
0194
0195
0196 if (ABSL_PREDICT_FALSE(desired == 0)) {
0197 if (Get() == 0) return;
0198 }
0199 __atomic_store_n(&atom_, desired, __ATOMIC_RELAXED);
0200 }
0201
0202 void SetNonZero(Scalar desired) const noexcept {
0203 ABSL_DCHECK_NE(desired, 0);
0204 __atomic_store_n(&atom_, desired, __ATOMIC_RELAXED);
0205 }
0206
0207 void SetNoDefaultInstance(Scalar desired) const noexcept {
0208 __atomic_store_n(&atom_, desired, __ATOMIC_RELAXED);
0209 }
0210 #else
0211 CachedSize(const CachedSize& other) noexcept : atom_(other.Get()) {}
0212 CachedSize& operator=(const CachedSize& other) noexcept {
0213 Set(other.Get());
0214 return *this;
0215 }
0216
0217 Scalar Get() const noexcept {
0218 return atom_.load(std::memory_order_relaxed);
0219 }
0220
0221 void Set(Scalar desired) const noexcept {
0222
0223
0224 if (ABSL_PREDICT_FALSE(desired == 0)) {
0225 if (Get() == 0) return;
0226 }
0227 atom_.store(desired, std::memory_order_relaxed);
0228 }
0229
0230 void SetNonZero(Scalar desired) const noexcept {
0231 ABSL_DCHECK_NE(desired, 0);
0232 atom_.store(desired, std::memory_order_relaxed);
0233 }
0234
0235 void SetNoDefaultInstance(Scalar desired) const noexcept {
0236 atom_.store(desired, std::memory_order_relaxed);
0237 }
0238 #endif
0239
0240 private:
0241 #ifdef PROTOBUF_BUILTIN_ATOMIC
0242 mutable Scalar atom_;
0243 #else
0244 mutable std::atomic<Scalar> atom_;
0245 #endif
0246 };
0247
0248 struct ClassData;
0249
0250
0251
0252
0253
0254
0255 template <typename Type>
0256 const ClassData* GetClassData(const Type& msg);
0257
0258 template <const auto* kDefault, const auto* kClassData>
0259 struct GeneratedMessageTraitsT {
0260 static constexpr const void* default_instance() { return kDefault; }
0261 static constexpr const auto* class_data() { return kClassData->base(); }
0262 static constexpr auto StrongPointer() { return default_instance(); }
0263 };
0264
0265 template <typename T>
0266 struct FallbackMessageTraits {
0267 static const void* default_instance() { return &T::default_instance(); }
0268 static constexpr const auto* class_data() {
0269
0270 return GetClassData<MessageLite>(T::default_instance());
0271 }
0272
0273
0274 static constexpr auto StrongPointer() { return &T::default_instance; }
0275 };
0276
0277 template <const uint32_t* kValidationData>
0278 struct EnumTraitsT {
0279 static constexpr const uint32_t* validation_data() { return kValidationData; }
0280 };
0281
0282
0283
0284
0285
0286
0287
0288 struct MessageTraitsImpl {
0289 template <typename T>
0290 static FallbackMessageTraits<T> value;
0291 };
0292 template <typename T>
0293 using MessageTraits = decltype(MessageTraitsImpl::value<T>);
0294
0295 struct EnumTraitsImpl {
0296 struct Undefined;
0297 template <typename T>
0298 static Undefined value;
0299 };
0300 template <typename T>
0301 using EnumTraits = decltype(EnumTraitsImpl::value<T>);
0302
0303 class SwapFieldHelper;
0304
0305
0306 class ParseContext;
0307
0308 struct DescriptorTable;
0309 class DescriptorPoolExtensionFinder;
0310 class ExtensionSet;
0311 class LazyField;
0312 class RepeatedPtrFieldBase;
0313 class TcParser;
0314 struct TcParseTableBase;
0315 class WireFormatLite;
0316 class WeakFieldMap;
0317 class RustMapHelper;
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327 inline int ToCachedSize(size_t size) { return static_cast<int>(size); }
0328
0329
0330
0331
0332
0333
0334 inline size_t FromIntSize(int size) {
0335
0336 return static_cast<unsigned int>(size);
0337 }
0338
0339
0340
0341
0342 inline int ToIntSize(size_t size) {
0343 ABSL_DCHECK_LE(size, static_cast<size_t>(INT_MAX));
0344 return static_cast<int>(size);
0345 }
0346
0347
0348 PROTOBUF_EXPORT inline const std::string& GetEmptyStringAlreadyInited() {
0349 return fixed_address_empty_string.get();
0350 }
0351
0352 struct ClassDataFull;
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363 struct PROTOBUF_EXPORT ClassData {
0364 const MessageLite* prototype;
0365 const internal::TcParseTableBase* tc_table;
0366 void (*on_demand_register_arena_dtor)(MessageLite& msg, Arena& arena);
0367 bool (*is_initialized)(const MessageLite&);
0368 void (*merge_to_from)(MessageLite& to, const MessageLite& from_msg);
0369 internal::MessageCreator message_creator;
0370 #if defined(PROTOBUF_CUSTOM_VTABLE)
0371 void (*destroy_message)(MessageLite& msg);
0372 void (MessageLite::*clear)();
0373 size_t (*byte_size_long)(const MessageLite&);
0374 uint8_t* (*serialize)(const MessageLite& msg, uint8_t* ptr,
0375 io::EpsCopyOutputStream* stream);
0376 #endif
0377
0378
0379 uint32_t cached_size_offset;
0380
0381
0382 bool is_lite;
0383 bool is_dynamic = false;
0384
0385
0386
0387 #if !defined(PROTOBUF_CUSTOM_VTABLE)
0388 constexpr ClassData(
0389 const MessageLite* prototype, const internal::TcParseTableBase* tc_table,
0390 void (*on_demand_register_arena_dtor)(MessageLite&, Arena&),
0391 bool (*is_initialized)(const MessageLite&),
0392 void (*merge_to_from)(MessageLite& to, const MessageLite& from_msg),
0393 internal::MessageCreator message_creator, uint32_t cached_size_offset,
0394 bool is_lite
0395 )
0396 : prototype(prototype),
0397 tc_table(tc_table),
0398 on_demand_register_arena_dtor(on_demand_register_arena_dtor),
0399 is_initialized(is_initialized),
0400 merge_to_from(merge_to_from),
0401 message_creator(message_creator),
0402 cached_size_offset(cached_size_offset),
0403 is_lite(is_lite)
0404 {
0405 }
0406 #endif
0407
0408
0409
0410 constexpr ClassData(
0411 const MessageLite* prototype, const internal::TcParseTableBase* tc_table,
0412 void (*on_demand_register_arena_dtor)(MessageLite&, Arena&),
0413 bool (*is_initialized)(const MessageLite&),
0414 void (*merge_to_from)(MessageLite& to, const MessageLite& from_msg),
0415 internal::MessageCreator message_creator,
0416 [[maybe_unused]] void (*destroy_message)(MessageLite& msg),
0417 [[maybe_unused]] void (MessageLite::*clear)(),
0418 [[maybe_unused]] size_t (*byte_size_long)(const MessageLite&),
0419 [[maybe_unused]] uint8_t* (*serialize)(const MessageLite& msg,
0420 uint8_t* ptr,
0421 io::EpsCopyOutputStream* stream),
0422 uint32_t cached_size_offset, bool is_lite
0423 )
0424 : prototype(prototype),
0425 tc_table(tc_table),
0426 on_demand_register_arena_dtor(on_demand_register_arena_dtor),
0427 is_initialized(is_initialized),
0428 merge_to_from(merge_to_from),
0429 message_creator(message_creator),
0430 #if defined(PROTOBUF_CUSTOM_VTABLE)
0431 destroy_message(destroy_message),
0432 clear(clear),
0433 byte_size_long(byte_size_long),
0434 serialize(serialize),
0435 #endif
0436 cached_size_offset(cached_size_offset),
0437 is_lite(is_lite)
0438 {
0439 }
0440
0441 const ClassDataFull& full() const;
0442
0443 MessageLite* New(Arena* arena) const {
0444 return message_creator.New(prototype, prototype, arena);
0445 }
0446
0447 MessageLite* PlacementNew(void* mem, Arena* arena) const {
0448 return message_creator.PlacementNew(prototype, prototype, mem, arena);
0449 }
0450
0451 uint32_t allocation_size() const { return message_creator.allocation_size(); }
0452
0453 uint8_t alignment() const { return message_creator.alignment(); }
0454 };
0455
0456 template <size_t N>
0457 struct ClassDataLite {
0458 ClassData header;
0459 const char type_name[N];
0460
0461 constexpr const ClassData* base() const { return &header; }
0462 };
0463
0464
0465
0466
0467 struct PROTOBUF_EXPORT DescriptorMethods {
0468 absl::string_view (*get_type_name)(const ClassData* data);
0469 std::string (*initialization_error_string)(const MessageLite&);
0470 const internal::TcParseTableBase* (*get_tc_table)(const MessageLite&);
0471 size_t (*space_used_long)(const MessageLite&);
0472 std::string (*debug_string)(const MessageLite&);
0473 };
0474
0475 struct PROTOBUF_EXPORT ClassDataFull : ClassData {
0476 constexpr ClassDataFull(ClassData base,
0477 const DescriptorMethods* descriptor_methods,
0478 const internal::DescriptorTable* descriptor_table,
0479 void (*get_metadata_tracker)())
0480 : ClassData(base),
0481 descriptor_methods(descriptor_methods),
0482 descriptor_table(descriptor_table),
0483 reflection(),
0484 descriptor(),
0485 get_metadata_tracker(get_metadata_tracker) {}
0486
0487 constexpr const ClassData* base() const { return this; }
0488
0489 const DescriptorMethods* descriptor_methods;
0490
0491
0492
0493
0494
0495 const internal::DescriptorTable* descriptor_table;
0496
0497
0498
0499 mutable const Reflection* reflection;
0500 mutable const Descriptor* descriptor;
0501
0502
0503
0504 void (*get_metadata_tracker)();
0505 };
0506
0507 inline const ClassDataFull& ClassData::full() const {
0508 ABSL_DCHECK(!is_lite);
0509 return *static_cast<const ClassDataFull*>(this);
0510 }
0511
0512 }
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540 class PROTOBUF_EXPORT MessageLite {
0541 public:
0542 MessageLite(const MessageLite&) = delete;
0543 MessageLite& operator=(const MessageLite&) = delete;
0544 PROTOBUF_VIRTUAL ~MessageLite() = default;
0545
0546
0547
0548
0549 absl::string_view GetTypeName() const;
0550
0551
0552
0553 MessageLite* New() const { return New(nullptr); }
0554
0555
0556
0557 MessageLite* New(Arena* arena) const;
0558
0559
0560
0561
0562
0563
0564 Arena* GetArena() const { return _internal_metadata_.arena(); }
0565
0566
0567
0568
0569
0570 #if defined(PROTOBUF_CUSTOM_VTABLE)
0571 void Clear() { (this->*_class_data_->clear)(); }
0572 #else
0573 virtual void Clear() = 0;
0574 #endif
0575
0576
0577 bool IsInitialized() const;
0578
0579
0580
0581
0582 std::string InitializationErrorString() const;
0583
0584
0585
0586 void CheckTypeAndMergeFrom(const MessageLite& other);
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597 std::string DebugString() const;
0598 std::string ShortDebugString() const { return DebugString(); }
0599
0600
0601 std::string Utf8DebugString() const { return DebugString(); }
0602
0603
0604
0605 template <typename Sink>
0606 friend void AbslStringify(Sink& sink, const google::protobuf::MessageLite& msg) {
0607 sink.Append(msg.DebugString());
0608 }
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620 ABSL_ATTRIBUTE_REINITIALIZES bool ParseFromCodedStream(
0621 io::CodedInputStream* input);
0622
0623
0624 ABSL_ATTRIBUTE_REINITIALIZES bool ParsePartialFromCodedStream(
0625 io::CodedInputStream* input);
0626
0627
0628 ABSL_ATTRIBUTE_REINITIALIZES bool ParseFromZeroCopyStream(
0629 io::ZeroCopyInputStream* input);
0630
0631
0632 ABSL_ATTRIBUTE_REINITIALIZES bool ParsePartialFromZeroCopyStream(
0633 io::ZeroCopyInputStream* input);
0634
0635
0636 ABSL_ATTRIBUTE_REINITIALIZES bool ParseFromFileDescriptor(
0637 int file_descriptor);
0638
0639
0640 ABSL_ATTRIBUTE_REINITIALIZES bool ParsePartialFromFileDescriptor(
0641 int file_descriptor);
0642
0643
0644 ABSL_ATTRIBUTE_REINITIALIZES bool ParseFromIstream(std::istream* input);
0645
0646
0647 ABSL_ATTRIBUTE_REINITIALIZES bool ParsePartialFromIstream(
0648 std::istream* input);
0649
0650
0651
0652 bool MergePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input,
0653 int size);
0654
0655
0656 bool MergeFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, int size);
0657 ABSL_ATTRIBUTE_REINITIALIZES bool ParseFromBoundedZeroCopyStream(
0658 io::ZeroCopyInputStream* input, int size);
0659
0660
0661 ABSL_ATTRIBUTE_REINITIALIZES bool ParsePartialFromBoundedZeroCopyStream(
0662 io::ZeroCopyInputStream* input, int size);
0663
0664
0665
0666
0667
0668
0669 ABSL_ATTRIBUTE_REINITIALIZES bool ParseFromString(absl::string_view data);
0670 ABSL_ATTRIBUTE_REINITIALIZES bool ParseFromString(const absl::Cord& data);
0671
0672
0673 ABSL_ATTRIBUTE_REINITIALIZES bool ParsePartialFromString(
0674 absl::string_view data);
0675 ABSL_ATTRIBUTE_REINITIALIZES bool ParsePartialFromString(
0676 const absl::Cord& data);
0677
0678 ABSL_ATTRIBUTE_REINITIALIZES bool ParseFromArray(const void* data, int size);
0679
0680
0681 ABSL_ATTRIBUTE_REINITIALIZES bool ParsePartialFromArray(const void* data,
0682 int size);
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696 bool MergeFromCodedStream(io::CodedInputStream* input);
0697
0698
0699
0700
0701
0702
0703 bool MergePartialFromCodedStream(io::CodedInputStream* input);
0704
0705
0706 bool MergeFromString(absl::string_view data);
0707 bool MergeFromString(const absl::Cord& data);
0708
0709
0710
0711 bool MergePartialFromString(absl::string_view data);
0712 bool MergePartialFromString(const absl::Cord& data);
0713
0714
0715
0716
0717
0718
0719
0720
0721 bool SerializeToCodedStream(io::CodedOutputStream* output) const;
0722
0723 bool SerializePartialToCodedStream(io::CodedOutputStream* output) const;
0724
0725
0726 bool SerializeToZeroCopyStream(io::ZeroCopyOutputStream* output) const;
0727
0728 bool SerializePartialToZeroCopyStream(io::ZeroCopyOutputStream* output) const;
0729
0730
0731 bool SerializeToString(std::string* output) const;
0732
0733
0734 bool SerializeToString(absl::Cord* output) const;
0735
0736 bool SerializePartialToString(std::string* output) const;
0737 bool SerializePartialToString(absl::Cord* output) const;
0738
0739
0740 bool SerializeToArray(void* data, int size) const;
0741
0742 bool SerializePartialToArray(void* data, int size) const;
0743
0744
0745
0746
0747
0748
0749
0750 std::string SerializeAsString() const;
0751
0752 std::string SerializePartialAsString() const;
0753
0754
0755
0756 bool SerializeToFileDescriptor(int file_descriptor) const;
0757
0758 bool SerializePartialToFileDescriptor(int file_descriptor) const;
0759
0760
0761 bool SerializeToOstream(std::ostream* output) const;
0762
0763 bool SerializePartialToOstream(std::ostream* output) const;
0764
0765
0766
0767 bool AppendToString(std::string* output) const;
0768 bool AppendToString(absl::Cord* output) const;
0769
0770 bool AppendPartialToString(std::string* output) const;
0771 bool AppendPartialToString(absl::Cord* output) const;
0772
0773
0774 PROTOBUF_DEPRECATE_AND_INLINE() bool MergeFromCord(const absl::Cord& data) {
0775 return MergeFromString(data);
0776 }
0777
0778
0779 PROTOBUF_DEPRECATE_AND_INLINE()
0780 bool MergePartialFromCord(const absl::Cord& data) {
0781 return MergePartialFromString(data);
0782 }
0783
0784 PROTOBUF_DEPRECATE_AND_INLINE()
0785 ABSL_ATTRIBUTE_REINITIALIZES bool ParseFromCord(const absl::Cord& data) {
0786 return ParseFromString(data);
0787 }
0788
0789
0790 PROTOBUF_DEPRECATE_AND_INLINE()
0791 ABSL_ATTRIBUTE_REINITIALIZES
0792 bool ParsePartialFromCord(const absl::Cord& data) {
0793 return ParsePartialFromString(data);
0794 }
0795
0796
0797
0798 PROTOBUF_DEPRECATE_AND_INLINE()
0799 bool SerializeToCord(absl::Cord* output) const {
0800 return SerializeToString(output);
0801 }
0802
0803 PROTOBUF_DEPRECATE_AND_INLINE()
0804 bool SerializePartialToCord(absl::Cord* output) const {
0805 return SerializePartialToString(output);
0806 }
0807
0808
0809
0810
0811 absl::Cord SerializeAsCord() const;
0812
0813 absl::Cord SerializePartialAsCord() const;
0814
0815
0816
0817 PROTOBUF_DEPRECATE_AND_INLINE() bool AppendToCord(absl::Cord* output) const {
0818 return AppendToString(output);
0819 }
0820
0821 PROTOBUF_DEPRECATE_AND_INLINE()
0822 bool AppendPartialToCord(absl::Cord* output) const {
0823 return AppendPartialToString(output);
0824 }
0825
0826
0827
0828
0829
0830
0831 #if defined(PROTOBUF_CUSTOM_VTABLE)
0832 size_t ByteSizeLong() const { return _class_data_->byte_size_long(*this); }
0833 #else
0834 virtual size_t ByteSizeLong() const = 0;
0835 #endif
0836
0837
0838
0839 [[deprecated("Please use ByteSizeLong() instead")]] int ByteSize() const {
0840 return internal::ToIntSize(ByteSizeLong());
0841 }
0842
0843
0844
0845
0846 void SerializeWithCachedSizes(io::CodedOutputStream* output) const {
0847 output->SetCur(_InternalSerialize(output->Cur(), output->EpsCopy()));
0848 }
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860 uint8_t* SerializeWithCachedSizesToArray(uint8_t* target) const;
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875 #if defined(PROTOBUF_CUSTOM_VTABLE)
0876 int GetCachedSize() const { return AccessCachedSize().Get(); }
0877 #else
0878 int GetCachedSize() const;
0879 #endif
0880
0881 const char* _InternalParse(const char* ptr, internal::ParseContext* ctx);
0882
0883 void OnDemandRegisterArenaDtor(Arena* arena);
0884
0885 protected:
0886
0887 static constexpr internal::InternalVisibility internal_visibility() {
0888 return internal::InternalVisibility{};
0889 }
0890
0891 template <typename T>
0892 PROTOBUF_ALWAYS_INLINE static T* DefaultConstruct(Arena* arena) {
0893 return static_cast<T*>(Arena::DefaultConstruct<T>(arena));
0894 }
0895
0896 template <typename T>
0897 static void* NewImpl(const void*, void* mem, Arena* arena) {
0898 return ::new (mem) T(arena);
0899 }
0900 template <typename T>
0901 static constexpr internal::MessageCreator GetNewImpl() {
0902 if constexpr (internal::EnableCustomNewFor<T>()) {
0903 return T::InternalNewImpl_();
0904 } else {
0905 return internal::MessageCreator(&T::PlacementNew_, sizeof(T), alignof(T));
0906 }
0907 }
0908
0909 #if defined(PROTOBUF_CUSTOM_VTABLE)
0910 template <typename T>
0911 static constexpr auto GetClearImpl() {
0912 return static_cast<void (MessageLite::*)()>(&T::Clear);
0913 }
0914 #else
0915
0916
0917 template <typename T>
0918 using GetClearImpl = std::nullptr_t;
0919 #endif
0920
0921 template <typename T>
0922 PROTOBUF_ALWAYS_INLINE static T* CopyConstruct(Arena* arena, const T& from) {
0923 return static_cast<T*>(Arena::CopyConstruct<T>(arena, &from));
0924 }
0925
0926
0927 static MessageLite* CopyConstruct(Arena* arena, const MessageLite& from);
0928
0929 PROTOBUF_ALWAYS_INLINE static Message* CopyConstruct(Arena* arena,
0930 const Message& from) {
0931 return reinterpret_cast<Message*>(
0932 CopyConstruct(arena, reinterpret_cast<const MessageLite&>(from)));
0933 }
0934
0935 const internal::TcParseTableBase* GetTcParseTable() const {
0936 auto* data = GetClassData();
0937 ABSL_DCHECK(data != nullptr);
0938
0939 auto* tc_table = data->tc_table;
0940 if (ABSL_PREDICT_FALSE(tc_table == nullptr)) {
0941 ABSL_DCHECK(!data->is_lite);
0942 return data->full().descriptor_methods->get_tc_table(*this);
0943 }
0944 return tc_table;
0945 }
0946
0947
0948 #if defined(PROTOBUF_CUSTOM_VTABLE)
0949 explicit constexpr MessageLite(const internal::ClassData* data)
0950 : _class_data_(data) {}
0951 explicit MessageLite(Arena* arena, const internal::ClassData* data)
0952 : _internal_metadata_(arena), _class_data_(data) {}
0953 #else
0954 constexpr MessageLite() {}
0955 explicit MessageLite(Arena* arena) : _internal_metadata_(arena) {}
0956 explicit constexpr MessageLite(const internal::ClassData*) {}
0957 explicit MessageLite(Arena* arena, const internal::ClassData*)
0958 : _internal_metadata_(arena) {}
0959 #endif
0960
0961
0962
0963
0964
0965
0966
0967
0968 #if defined(PROTOBUF_CUSTOM_VTABLE)
0969 const internal::ClassData* GetClassData() const {
0970 ::absl::PrefetchToLocalCache(_class_data_);
0971 return _class_data_;
0972 }
0973 #else
0974 virtual const internal::ClassData* GetClassData() const = 0;
0975 #endif
0976
0977 internal::InternalMetadata _internal_metadata_;
0978 #if defined(PROTOBUF_CUSTOM_VTABLE)
0979 const internal::ClassData* _class_data_;
0980 #endif
0981
0982
0983
0984 const internal::CachedSize& AccessCachedSize() const {
0985 return *reinterpret_cast<const internal::CachedSize*>(
0986 reinterpret_cast<const char*>(this) +
0987 GetClassData()->cached_size_offset);
0988 }
0989
0990 void VerifyHasBitConsistency() const;
0991
0992 public:
0993 enum ParseFlags {
0994
0995
0996
0997
0998 kMerge = 0,
0999 kParse = 1,
1000
1001
1002
1003
1004 kMergePartial = 2,
1005 kParsePartial = 3,
1006
1007
1008
1009
1010
1011
1012 kMergeWithAliasing = 4,
1013 kParseWithAliasing = 5,
1014 kMergePartialWithAliasing = 6,
1015 kParsePartialWithAliasing = 7
1016 };
1017
1018 template <ParseFlags flags, typename T>
1019 bool ParseFrom(const T& input);
1020
1021
1022
1023 #if defined(PROTOBUF_CUSTOM_VTABLE)
1024 uint8_t* _InternalSerialize(uint8_t* ptr,
1025 io::EpsCopyOutputStream* stream) const {
1026 return _class_data_->serialize(*this, ptr, stream);
1027 }
1028 #else
1029 virtual uint8_t* _InternalSerialize(
1030 uint8_t* ptr, io::EpsCopyOutputStream* stream) const = 0;
1031 #endif
1032
1033
1034 bool IsInitializedWithErrors() const {
1035 if (IsInitialized()) return true;
1036 LogInitializationErrorMessage();
1037 return false;
1038 }
1039
1040 #if defined(PROTOBUF_CUSTOM_VTABLE)
1041 void operator delete(MessageLite* msg, std::destroying_delete_t) {
1042 msg->DeleteInstance();
1043 }
1044 #endif
1045
1046 private:
1047 friend class FastReflectionMessageMutator;
1048 friend class AssignDescriptorsHelper;
1049 friend class FastReflectionStringSetter;
1050 friend class Message;
1051 friend class Reflection;
1052 friend class TypeId;
1053 friend class compiler::cpp::MessageTableTester;
1054 friend class internal::DescriptorPoolExtensionFinder;
1055 friend class internal::ExtensionSet;
1056 friend class internal::LazyField;
1057 friend class internal::SwapFieldHelper;
1058 friend class internal::TcParser;
1059 friend struct internal::TcParseTableBase;
1060 friend class internal::UntypedMapBase;
1061 friend class internal::WeakFieldMap;
1062 friend class internal::WireFormatLite;
1063 friend class internal::RustMapHelper;
1064 friend class internal::v2::TableDriven;
1065 friend class internal::v2::TableDrivenMessage;
1066 friend class internal::v2::TableDrivenParse;
1067 friend class internal::MessageCreator;
1068 friend class internal::RepeatedPtrFieldBase;
1069 template <typename Type>
1070 friend class internal::GenericTypeHandler;
1071 template <typename Type>
1072 friend class Arena::InternalHelper;
1073 template <typename Type>
1074 friend struct FallbackMessageTraits;
1075
1076 template <typename Type>
1077 friend const internal::ClassData* internal::GetClassData(const Type& msg);
1078
1079 static bool CheckFieldPresence(const internal::ParseContext& ctx,
1080 const MessageLite& msg,
1081 MessageLite::ParseFlags parse_flags);
1082
1083 void LogInitializationErrorMessage() const;
1084
1085
1086
1087
1088
1089
1090
1091 void MergeFromWithClassData(const MessageLite& other,
1092 const internal::ClassData* data);
1093
1094 bool MergeFromImpl(io::CodedInputStream* input, ParseFlags parse_flags);
1095
1096
1097 void DestroyInstance();
1098
1099
1100 void DeleteInstance();
1101
1102
1103
1104 template <typename T>
1105 static uint32_t GetOneofCaseOffsetForTesting() {
1106 return offsetof(T, _impl_._oneof_case_);
1107 }
1108 };
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122 class TypeId {
1123 public:
1124 static TypeId Get(const MessageLite& msg) {
1125 return TypeId(msg.GetClassData());
1126 }
1127
1128 template <typename T>
1129 static TypeId Get() {
1130 return TypeId(internal::MessageTraits<T>::class_data());
1131 }
1132
1133
1134
1135 absl::string_view name() const;
1136
1137 friend constexpr bool operator==(TypeId a, TypeId b) {
1138 return a.data_ == b.data_;
1139 }
1140 friend constexpr bool operator!=(TypeId a, TypeId b) { return !(a == b); }
1141 friend constexpr bool operator<(TypeId a, TypeId b) {
1142 return a.data_ < b.data_;
1143 }
1144 friend constexpr bool operator>(TypeId a, TypeId b) {
1145 return a.data_ > b.data_;
1146 }
1147 friend constexpr bool operator<=(TypeId a, TypeId b) {
1148 return a.data_ <= b.data_;
1149 }
1150 friend constexpr bool operator>=(TypeId a, TypeId b) {
1151 return a.data_ >= b.data_;
1152 }
1153
1154 #if defined(__cpp_impl_three_way_comparison) && \
1155 __cpp_impl_three_way_comparison >= 201907L
1156 friend constexpr auto operator<=>(TypeId a, TypeId b) {
1157 return a.data_ <=> b.data_;
1158 }
1159 #endif
1160
1161 template <typename H>
1162 friend H AbslHashValue(H state, TypeId id) {
1163 return H::combine(std::move(state), id.data_);
1164 }
1165
1166 private:
1167 constexpr explicit TypeId(const internal::ClassData* data) : data_(data) {}
1168
1169 const internal::ClassData* data_;
1170 };
1171
1172 namespace internal {
1173
1174
1175
1176
1177 template <typename T>
1178 PROTOBUF_NDEBUG_INLINE const ClassData* GetClassData(const T& msg) {
1179 static_assert(std::is_base_of_v<MessageLite, T>);
1180 if constexpr (std::is_same_v<T, MessageLite> || std::is_same_v<Message, T>) {
1181 return msg.GetClassData();
1182 } else {
1183 return MessageTraits<T>::class_data();
1184 }
1185 }
1186
1187 template <bool alias>
1188 bool MergeFromImpl(absl::string_view input, MessageLite* msg,
1189 const internal::TcParseTableBase* tc_table,
1190 MessageLite::ParseFlags parse_flags);
1191 extern template PROTOBUF_EXPORT_TEMPLATE_DECLARE bool MergeFromImpl<false>(
1192 absl::string_view input, MessageLite* msg,
1193 const internal::TcParseTableBase* tc_table,
1194 MessageLite::ParseFlags parse_flags);
1195 extern template PROTOBUF_EXPORT_TEMPLATE_DECLARE bool MergeFromImpl<true>(
1196 absl::string_view input, MessageLite* msg,
1197 const internal::TcParseTableBase* tc_table,
1198 MessageLite::ParseFlags parse_flags);
1199
1200 template <bool alias>
1201 bool MergeFromImpl(io::ZeroCopyInputStream* input, MessageLite* msg,
1202 const internal::TcParseTableBase* tc_table,
1203 MessageLite::ParseFlags parse_flags);
1204 extern template PROTOBUF_EXPORT_TEMPLATE_DECLARE bool MergeFromImpl<false>(
1205 io::ZeroCopyInputStream* input, MessageLite* msg,
1206 const internal::TcParseTableBase* tc_table,
1207 MessageLite::ParseFlags parse_flags);
1208 extern template PROTOBUF_EXPORT_TEMPLATE_DECLARE bool MergeFromImpl<true>(
1209 io::ZeroCopyInputStream* input, MessageLite* msg,
1210 const internal::TcParseTableBase* tc_table,
1211 MessageLite::ParseFlags parse_flags);
1212
1213 struct BoundedZCIS {
1214 io::ZeroCopyInputStream* zcis;
1215 int limit;
1216 };
1217
1218 template <bool alias>
1219 bool MergeFromImpl(BoundedZCIS input, MessageLite* msg,
1220 const internal::TcParseTableBase* tc_table,
1221 MessageLite::ParseFlags parse_flags);
1222 extern template PROTOBUF_EXPORT_TEMPLATE_DECLARE bool MergeFromImpl<false>(
1223 BoundedZCIS input, MessageLite* msg,
1224 const internal::TcParseTableBase* tc_table,
1225 MessageLite::ParseFlags parse_flags);
1226 extern template PROTOBUF_EXPORT_TEMPLATE_DECLARE bool MergeFromImpl<true>(
1227 BoundedZCIS input, MessageLite* msg,
1228 const internal::TcParseTableBase* tc_table,
1229 MessageLite::ParseFlags parse_flags);
1230
1231 template <typename T>
1232 struct SourceWrapper;
1233
1234 template <bool alias, typename T>
1235 bool MergeFromImpl(const SourceWrapper<T>& input, MessageLite* msg,
1236 const internal::TcParseTableBase* tc_table,
1237 MessageLite::ParseFlags parse_flags) {
1238 return input.template MergeInto<alias>(msg, tc_table, parse_flags);
1239 }
1240
1241 }
1242
1243 template <MessageLite::ParseFlags flags, typename T>
1244 bool MessageLite::ParseFrom(const T& input) {
1245 if (flags & kParse) Clear();
1246 constexpr bool alias = (flags & kMergeWithAliasing) != 0;
1247 const internal::TcParseTableBase* tc_table;
1248 PROTOBUF_ALWAYS_INLINE_CALL tc_table = GetTcParseTable();
1249 return internal::MergeFromImpl<alias>(input, this, tc_table, flags);
1250 }
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270 PROTOBUF_EXPORT void ShutdownProtobufLibrary();
1271
1272 namespace internal {
1273
1274
1275 PROTOBUF_EXPORT void OnShutdown(void (*func)());
1276
1277 PROTOBUF_EXPORT void OnShutdownRun(void (*f)(const void*), const void* arg);
1278
1279 template <typename T>
1280 T* OnShutdownDelete(T* p) {
1281 OnShutdownRun([](const void* pp) { delete static_cast<const T*>(pp); }, p);
1282 return p;
1283 }
1284
1285 template <typename MessageLite>
1286 PROTOBUF_ALWAYS_INLINE MessageLite* MessageCreator::PlacementNew(
1287 const MessageLite* prototype_for_func,
1288 const MessageLite* prototype_for_copy, void* mem, Arena* arena) const {
1289 ABSL_DCHECK_EQ(reinterpret_cast<uintptr_t>(mem) % alignment_, 0u);
1290 const Tag as_tag = tag();
1291 static_assert(kFunc < 0 && !(kZeroInit < 0) && !(kMemcpy < 0),
1292 "Only kFunc must be the only negative value");
1293 if (ABSL_PREDICT_FALSE(static_cast<int8_t>(as_tag) < 0)) {
1294 PROTOBUF_DEBUG_COUNTER("MessageCreator.Func").Inc();
1295 return static_cast<MessageLite*>(func_(prototype_for_func, mem, arena));
1296 }
1297
1298 char* dst = static_cast<char*>(mem);
1299 const size_t size = allocation_size_;
1300 const char* src = reinterpret_cast<const char*>(prototype_for_copy);
1301
1302
1303
1304
1305
1306 if (as_tag == kZeroInit) {
1307
1308 ABSL_DCHECK(std::all_of(src + sizeof(MessageLite), src + size,
1309 [](auto c) { return c == 0; }));
1310
1311 if (sizeof(MessageLite) != 16) {
1312 memset(dst, 0, size);
1313 } else if (size <= 32) {
1314 memset(dst + size - 16, 0, 16);
1315 } else if (size <= 64) {
1316 memset(dst + 16, 0, 16);
1317 memset(dst + size - 32, 0, 32);
1318 } else {
1319 for (size_t offset = 16; offset + 64 < size; offset += 64) {
1320 absl::PrefetchToLocalCacheForWrite(dst + offset + 64);
1321 memset(dst + offset, 0, 64);
1322 }
1323 memset(dst + size - 64, 0, 64);
1324 }
1325 } else {
1326 ABSL_DCHECK_EQ(+as_tag, +kMemcpy);
1327
1328 if (sizeof(MessageLite) != 16) {
1329 memcpy(dst, src, size);
1330 } else if (size <= 32) {
1331 memcpy(dst + size - 16, src + size - 16, 16);
1332 } else if (size <= 64) {
1333 memcpy(dst + 16, src + 16, 16);
1334 memcpy(dst + size - 32, src + size - 32, 32);
1335 } else {
1336 for (size_t offset = 16; offset + 64 < size; offset += 64) {
1337 absl::PrefetchToLocalCache(src + offset + 64);
1338 absl::PrefetchToLocalCacheForWrite(dst + offset + 64);
1339 memcpy(dst + offset, src + offset, 64);
1340 }
1341 memcpy(dst + size - 64, src + size - 64, 64);
1342 }
1343 }
1344
1345 if (arena_bits() != 0) {
1346 if (as_tag == kZeroInit) {
1347 PROTOBUF_DEBUG_COUNTER("MessageCreator.ZeroArena").Inc();
1348 } else {
1349 PROTOBUF_DEBUG_COUNTER("MessageCreator.McpyArena").Inc();
1350 }
1351 } else {
1352 if (as_tag == kZeroInit) {
1353 PROTOBUF_DEBUG_COUNTER("MessageCreator.Zero").Inc();
1354 } else {
1355 PROTOBUF_DEBUG_COUNTER("MessageCreator.Mcpy").Inc();
1356 }
1357 }
1358
1359 if (internal::PerformDebugChecks() || arena != nullptr) {
1360 if (uintptr_t offsets = arena_bits()) {
1361 do {
1362 const size_t offset = absl::countr_zero(offsets) * sizeof(Arena*);
1363 ABSL_DCHECK_LE(offset + sizeof(Arena*), size);
1364
1365
1366 ABSL_DCHECK_EQ(*reinterpret_cast<Arena**>(dst + offset), nullptr);
1367 memcpy(dst + offset, &arena, sizeof(arena));
1368 offsets &= offsets - 1;
1369 } while (offsets != 0);
1370 }
1371 }
1372
1373
1374
1375 memcpy(dst, static_cast<const void*>(prototype_for_copy),
1376 sizeof(MessageLite));
1377 memcpy(dst + PROTOBUF_FIELD_OFFSET(MessageLite, _internal_metadata_), &arena,
1378 sizeof(arena));
1379 return Launder(reinterpret_cast<MessageLite*>(mem));
1380 }
1381
1382 template <typename MessageLite>
1383 PROTOBUF_ALWAYS_INLINE MessageLite* MessageCreator::New(
1384 const MessageLite* prototype_for_func,
1385 const MessageLite* prototype_for_copy, Arena* arena) const {
1386 return PlacementNew(prototype_for_func, prototype_for_copy,
1387 arena != nullptr
1388 ? arena->AllocateAligned(allocation_size_)
1389 : ::operator new(allocation_size_),
1390 arena);
1391 }
1392
1393 }
1394
1395 std::string ShortFormat(const MessageLite& message_lite);
1396 std::string Utf8Format(const MessageLite& message_lite);
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414 template <typename T>
1415 const T* DynamicCastMessage(const MessageLite* from) {
1416 static_assert(std::is_base_of<MessageLite, T>::value, "");
1417
1418
1419
1420 if (from == nullptr || TypeId::Get<T>() != TypeId::Get(*from)) {
1421 return nullptr;
1422 }
1423
1424 return static_cast<const T*>(from);
1425 }
1426
1427 template <typename T>
1428 T* DynamicCastMessage(MessageLite* from) {
1429 return const_cast<T*>(
1430 DynamicCastMessage<T>(static_cast<const MessageLite*>(from)));
1431 }
1432
1433 namespace internal {
1434 [[noreturn]] PROTOBUF_EXPORT void FailDynamicCast(const MessageLite& from,
1435 const MessageLite& to);
1436 }
1437
1438 template <typename T>
1439 const T& DynamicCastMessage(const MessageLite& from) {
1440 const T* destination_message = DynamicCastMessage<T>(&from);
1441 if (ABSL_PREDICT_FALSE(destination_message == nullptr)) {
1442
1443
1444 #if defined(ABSL_HAVE_EXCEPTIONS)
1445 throw std::bad_cast();
1446 #endif
1447
1448
1449 internal::FailDynamicCast(from, T::default_instance());
1450 }
1451 return *destination_message;
1452 }
1453
1454 template <typename T>
1455 T& DynamicCastMessage(MessageLite& from) {
1456 return const_cast<T&>(
1457 DynamicCastMessage<T>(static_cast<const MessageLite&>(from)));
1458 }
1459
1460 template <typename T>
1461 const T* DownCastMessage(const MessageLite* from) {
1462 internal::StrongReferenceToType<T>();
1463 ABSL_DCHECK(DynamicCastMessage<T>(from) == from)
1464 << "Cannot downcast " << from->GetTypeName() << " to "
1465 << T::default_instance().GetTypeName();
1466 return static_cast<const T*>(from);
1467 }
1468
1469 template <typename T>
1470 T* DownCastMessage(MessageLite* from) {
1471 return const_cast<T*>(
1472 DownCastMessage<T>(static_cast<const MessageLite*>(from)));
1473 }
1474
1475 template <typename T>
1476 const T& DownCastMessage(const MessageLite& from) {
1477 return *DownCastMessage<T>(&from);
1478 }
1479
1480 template <typename T>
1481 T& DownCastMessage(MessageLite& from) {
1482 return *DownCastMessage<T>(&from);
1483 }
1484
1485 template <>
1486 inline const MessageLite* DynamicCastMessage(const MessageLite* from) {
1487 return from;
1488 }
1489 template <>
1490 inline const MessageLite* DownCastMessage(const MessageLite* from) {
1491 return from;
1492 }
1493
1494
1495
1496 template <typename T>
1497 PROTOBUF_DEPRECATE_AND_INLINE()
1498 const T* DynamicCastToGenerated(const MessageLite* from) {
1499 return DynamicCastMessage<T>(from);
1500 }
1501
1502 template <typename T>
1503 PROTOBUF_DEPRECATE_AND_INLINE()
1504 T* DynamicCastToGenerated(MessageLite* from) {
1505 return DynamicCastMessage<T>(from);
1506 }
1507
1508 template <typename T>
1509 PROTOBUF_DEPRECATE_AND_INLINE()
1510 const T& DynamicCastToGenerated(const MessageLite& from) {
1511 return DynamicCastMessage<T>(from);
1512 }
1513
1514 template <typename T>
1515 PROTOBUF_DEPRECATE_AND_INLINE()
1516 T& DynamicCastToGenerated(MessageLite& from) {
1517 return DynamicCastMessage<T>(from);
1518 }
1519
1520 template <typename T>
1521 PROTOBUF_DEPRECATE_AND_INLINE()
1522 const T* DownCastToGenerated(const MessageLite* from) {
1523 return DownCastMessage<T>(from);
1524 }
1525
1526 template <typename T>
1527 PROTOBUF_DEPRECATE_AND_INLINE()
1528 T* DownCastToGenerated(MessageLite* from) {
1529 return DownCastMessage<T>(from);
1530 }
1531
1532 template <typename T>
1533 PROTOBUF_DEPRECATE_AND_INLINE()
1534 const T& DownCastToGenerated(const MessageLite& from) {
1535 return DownCastMessage<T>(from);
1536 }
1537
1538 template <typename T>
1539 PROTOBUF_DEPRECATE_AND_INLINE()
1540 T& DownCastToGenerated(MessageLite& from) {
1541 return DownCastMessage<T>(from);
1542 }
1543
1544
1545 template <typename T>
1546 std::shared_ptr<T> DynamicCastMessage(std::shared_ptr<MessageLite> ptr) {
1547 if (auto* res = DynamicCastMessage<T>(ptr.get())) {
1548
1549 return std::shared_ptr<T>(std::move(ptr), res);
1550 } else {
1551 return nullptr;
1552 }
1553 }
1554
1555 template <typename T>
1556 std::shared_ptr<const T> DynamicCastMessage(
1557 std::shared_ptr<const MessageLite> ptr) {
1558 if (auto* res = DynamicCastMessage<T>(ptr.get())) {
1559
1560 return std::shared_ptr<const T>(std::move(ptr), res);
1561 } else {
1562 return nullptr;
1563 }
1564 }
1565
1566 }
1567 }
1568
1569 #include "google/protobuf/port_undef.inc"
1570
1571 #endif