Go to the documentation of this file.
109 #ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_H__
110 #define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__
121 #include <type_traits>
126 #if !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST)
127 #define PROTOBUF_LITTLE_ENDIAN 1
129 #if defined(_MSC_VER) && _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
132 #pragma runtime_checks("c", off)
136 #include <machine/endian.h>
137 #elif defined(__FreeBSD__)
138 #include <sys/endian.h>
139 #elif (defined(sun) || defined(__sun)) && (defined(__SVR4) || defined(__svr4__))
140 #include <sys/isa_defs.h>
141 #elif defined(_AIX) || defined(__TOS_AIX__)
142 #include <sys/machine.h>
144 #if !defined(__QNX__)
148 #if ((defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \
149 (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN)) && \
150 !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST)
151 #define PROTOBUF_LITTLE_ENDIAN 1
154 #include <google/protobuf/stubs/common.h>
155 #include <google/protobuf/stubs/logging.h>
156 #include <google/protobuf/stubs/strutil.h>
157 #include <google/protobuf/port.h>
158 #include <google/protobuf/stubs/port.h>
161 #include <google/protobuf/port_def.inc>
167 class MessageFactory;
168 class ZeroCopyCodedInputStream;
172 class EpsCopyByteStream;
213 inline bool IsFlat()
const;
226 bool GetDirectBufferPointer(
const void**
data,
int*
size);
230 PROTOBUF_ALWAYS_INLINE
231 void GetDirectBufferPointerInline(
const void**
data,
int*
size);
270 bool ReadVarintSizeAsInt(
int*
value);
281 return last_tag_ = ReadTagNoLastTag();
284 PROTOBUF_ALWAYS_INLINE
uint32_t ReadTagNoLastTag();
294 PROTOBUF_ALWAYS_INLINE
296 std::pair<uint32_t, bool>
result = ReadTagWithCutoffNoLastTag(cutoff);
301 PROTOBUF_ALWAYS_INLINE
302 std::pair<uint32_t, bool> ReadTagWithCutoffNoLastTag(
uint32_t cutoff);
320 PROTOBUF_ALWAYS_INLINE
350 bool ConsumedEntireMessage();
376 Limit PushLimit(
int byte_limit);
380 void PopLimit(
Limit limit);
384 int BytesUntilLimit()
const;
387 int CurrentPosition()
const;
406 void SetTotalBytesLimit(
int total_bytes_limit);
410 int BytesUntilTotalBytesLimit()
const;
419 void SetRecursionLimit(
int limit);
426 bool IncrementRecursionDepth();
429 void DecrementRecursionDepth();
434 void UnsafeDecrementRecursionDepth();
441 std::pair<CodedInputStream::Limit, int> IncrementRecursionDepthAndPushLimit(
445 Limit ReadLengthAndPushLimit();
454 bool DecrementRecursionDepthAndPopLimit(Limit limit);
461 bool CheckEntireMessageConsumedAndPopLimit(Limit limit);
548 int total_bytes_read_;
561 bool legitimate_message_end_;
564 bool aliasing_enabled_;
567 Limit current_limit_;
576 int buffer_size_after_limit_;
580 int total_bytes_limit_;
585 int recursion_budget_;
587 int recursion_limit_;
596 bool SkipFallback(
int count,
int original_buffer_size);
599 void Advance(
int amount);
602 void BackUpInputToCurrentPosition();
606 void RecomputeBufferLimits();
609 void PrintTotalBytesLimitError();
627 int ReadVarintSizeAsIntFallback();
628 std::pair<uint64_t, bool> ReadVarint64Fallback();
631 int ReadVarintSizeAsIntSlow();
643 int BufferSize()
const;
645 static const int kDefaultTotalBytesLimit = INT_MAX;
647 static int default_recursion_limit_;
650 friend class google::protobuf::internal::EpsCopyByteStream;
661 enum { kSlopBytes = 16 };
668 is_serialization_deterministic_(deterministic) {
677 buffer_end_(nullptr),
679 is_serialization_deterministic_(deterministic) {}
684 :
stream_(
stream), is_serialization_deterministic_(deterministic) {
696 if (PROTOBUF_PREDICT_FALSE(
ptr >=
end_)) {
697 return EnsureSpaceFallback(
ptr);
717 if (aliasing_enabled_) {
730 std::ptrdiff_t
size = s.size();
731 if (PROTOBUF_PREDICT_FALSE(
733 return WriteStringMaybeAliasedOutline(
num, s,
ptr);
742 return WriteStringMaybeAliased(
num, s,
ptr);
745 template <
typename T>
748 std::ptrdiff_t
size = s.size();
749 if (PROTOBUF_PREDICT_FALSE(
751 return WriteStringOutline(
num, s,
ptr);
758 template <
typename T>
763 return WriteString(
num, s,
ptr);
766 template <
typename T>
769 return WriteVarintPacked(
num,
r,
size,
ptr, Encode64);
771 template <
typename T>
774 return WriteVarintPacked(
num,
r,
size,
ptr, Encode32);
776 template <
typename T>
781 template <
typename T>
784 return WriteVarintPacked(
num,
r,
size,
ptr, Encode64);
786 template <
typename T>
789 return WriteVarintPacked(
num,
r,
size,
ptr, Encode64);
791 template <
typename T>
796 template <
typename T>
799 return WriteVarintPacked(
num,
r,
size,
ptr, Encode64);
802 template <
typename T>
806 constexpr
auto element_size =
sizeof(
typename T::value_type);
807 auto size =
r.size() * element_size;
809 return WriteRawLittleEndian<element_size>(
r.data(),
static_cast<int>(
size),
826 void EnableAliasing(
bool enabled);
830 is_serialization_deterministic_ =
value;
835 return is_serialization_deterministic_;
848 bool had_error_ =
false;
849 bool aliasing_enabled_ =
false;
850 bool is_serialization_deterministic_;
857 return end_ + kSlopBytes -
ptr;
868 return (
tag < (1 << 7)) ? 1
869 : (
tag < (1 << 14)) ? 2
870 : (
tag < (1 << 21)) ? 3
871 : (
tag < (1 << 28)) ? 4
878 return UnsafeVarint((
num << 3) | wt,
ptr);
884 return UnsafeWriteSize(
size,
ptr);
895 template <
typename T,
typename E>
919 template <
typename T>
922 "Varint serialization must be unsigned");
941 }
while (
value >= 0x80);
947 while (PROTOBUF_PREDICT_FALSE(
value >= 0x80)) {
958 #ifndef PROTOBUF_LITTLE_ENDIAN
969 if (
size > kSlopBytes) {
971 buffer_end_ =
nullptr;
996 inline uint8_t* EpsCopyOutputStream::WriteRawLittleEndian<1>(
const void*
data,
1002 inline uint8_t* EpsCopyOutputStream::WriteRawLittleEndian<4>(
const void*
data,
1005 #ifdef PROTOBUF_LITTLE_ENDIAN
1012 inline uint8_t* EpsCopyOutputStream::WriteRawLittleEndian<8>(
const void*
data,
1015 #ifdef PROTOBUF_LITTLE_ENDIAN
1083 cur_ =
impl_.FlushAndResetBuffer(cur_);
1085 return impl_.HadError();
1123 return impl_.GetDirectBufferForNBytesAndAdvance(
size, &cur_);
1132 void WriteRawMaybeAliased(
const void*
data,
int size);
1152 cur_ =
impl_.EnsureSpace(cur_);
1153 SetCur(WriteLittleEndian32ToArray(
value, Cur()));
1159 cur_ =
impl_.EnsureSpace(cur_);
1160 SetCur(WriteLittleEndian64ToArray(
value, Cur()));
1194 PROTOBUF_ALWAYS_INLINE
1208 static size_t VarintSize32SignExtendedPlusOne(
int32_t value);
1211 template <u
int32_t Value>
1212 struct StaticVarintSize32 {
1213 static const size_t value = (
Value < (1 << 7)) ? 1
1214 : (
Value < (1 << 14)) ? 2
1215 : (
Value < (1 << 21)) ? 3
1216 : (
Value < (1 << 28)) ? 4
1222 return static_cast<int>(
impl_.ByteCount(cur_) - start_count_);
1263 return impl_.IsSerializationDeterministic();
1267 return default_serialization_deterministic_.load(
1268 std::memory_order_relaxed) != 0;
1271 template <
typename Func>
1282 static std::atomic<bool> default_serialization_deterministic_;
1293 default_serialization_deterministic_.store(
true, std::memory_order_relaxed);
1347 #if defined(PROTOBUF_LITTLE_ENDIAN)
1349 return buffer +
sizeof(*value);
1355 return buffer +
sizeof(*value);
1361 #if defined(PROTOBUF_LITTLE_ENDIAN)
1363 return buffer +
sizeof(*value);
1374 return buffer +
sizeof(*value);
1379 #if defined(PROTOBUF_LITTLE_ENDIAN)
1380 if (PROTOBUF_PREDICT_TRUE(
BufferSize() >=
static_cast<int>(
sizeof(*
value)))) {
1392 #if defined(PROTOBUF_LITTLE_ENDIAN)
1393 if (PROTOBUF_PREDICT_TRUE(
BufferSize() >=
static_cast<int>(
sizeof(*
value)))) {
1427 first_byte_or_zero =
buffer_[0];
1429 const uint32_t kMax1ByteVarint = 0x7f;
1432 return std::make_pair(
tag, cutoff >= kMax1ByteVarint ||
tag <= cutoff);
1439 const uint32_t kMax2ByteVarint = (0x7f << 7) + 0x7f;
1448 bool at_or_below_cutoff = cutoff >= kMax2ByteVarint ||
tag <= cutoff;
1449 return std::make_pair(
tag, at_or_below_cutoff);
1454 return std::make_pair(
tag,
static_cast<uint32_t>(
tag - 1) < cutoff);
1466 if (expected < (1 << 7)) {
1474 }
else if (expected < (1 << 14)) {
1475 if (PROTOBUF_PREDICT_TRUE(
BufferSize() >= 2) &&
1491 if (expected < (1 << 7)) {
1492 if (
buffer[0] == expected) {
1495 }
else if (expected < (1 << 14)) {
1550 MessageFactory* factory) {
1569 buffer_end_(nullptr),
1571 total_bytes_read_(0),
1574 legitimate_message_end_(
false),
1575 aliasing_enabled_(
false),
1577 buffer_size_after_limit_(0),
1578 total_bytes_limit_(kDefaultTotalBytesLimit),
1579 recursion_budget_(default_recursion_limit_),
1580 recursion_limit_(default_recursion_limit_),
1581 extension_pool_(nullptr),
1582 extension_factory_(nullptr) {
1591 total_bytes_read_(
size),
1594 legitimate_message_end_(
false),
1595 aliasing_enabled_(
false),
1596 current_limit_(
size),
1597 buffer_size_after_limit_(0),
1598 total_bytes_limit_(kDefaultTotalBytesLimit),
1599 recursion_budget_(default_recursion_limit_),
1600 recursion_limit_(default_recursion_limit_),
1601 extension_pool_(nullptr),
1602 extension_factory_(nullptr) {
1610 if (
count < 0)
return false;
1612 const int original_buffer_size =
BufferSize();
1614 if (
count <= original_buffer_size) {
1654 #if defined(PROTOBUF_LITTLE_ENDIAN)
1667 #if defined(PROTOBUF_LITTLE_ENDIAN)
1711 return static_cast<size_t>((log2value * 9 + 73) / 64);
1717 return static_cast<size_t>((log2value * 9 + 73 + 64) / 64);
1727 return static_cast<size_t>((log2value * 9 + 73) / 64);
1733 return static_cast<size_t>((log2value * 9 + 73 + 64) / 64);
1769 #if defined(_MSC_VER) && _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
1770 #pragma runtime_checks("c", restore)
1771 #endif // _MSC_VER && !defined(__INTEL_COMPILER)
1773 #include <google/protobuf/port_undef.inc>
1775 #endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__
static uint8 * WriteStringToArray(const std::string &str, uint8 *target)
void WriteRawMaybeAliased(const void *data, int size)
void SetSerializationDeterministic(bool value)
uint8_t * WriteRaw(const void *data, int size, uint8_t *ptr)
void WriteRaw(const void *buffer, int size)
const Descriptor::ReservedRange value
PROTOBUF_ALWAYS_INLINE uint8_t * WriteUInt64Packed(int num, const T &r, int size, uint8_t *ptr)
bool IsSerializationDeterministic() const
static void SetDefaultSerializationDeterministic()
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName)
uint8_t * GetDirectBufferForNBytesAndAdvance(int size)
PROTOBUF_ALWAYS_INLINE uint8_t * WriteSInt32Packed(int num, const T &r, int size, uint8_t *ptr)
void SetCur(uint8_t *ptr)
std::unique_ptr< grpc::ClientReaderInterface< OrcaLoadReport > > stream_
GRPC_CUSTOM_ZEROCOPYINPUTSTREAM ZeroCopyInputStream
static PROTOBUF_ALWAYS_INLINE uint8_t * UnsafeVarint(T value, uint8_t *ptr)
static uint8 * WriteVarint64ToArray(uint64 value, uint8 *target)
void WriteVarint64(uint64 value)
static uint8 * WriteVarint32SignExtendedToArray(int32 value, uint8 *target)
static PROTOBUF_ALWAYS_INLINE uint8_t * UnsafeWriteSize(uint32_t value, uint8_t *ptr)
static size_t VarintSize64(uint64 value)
void WriteString(const std::string &str)
uint8 * WriteRawMaybeAliased(const void *data, int size, uint8 *ptr)
PROTOBUF_ALWAYS_INLINE uint8_t * WriteInt32Packed(int num, const T &r, int size, uint8_t *ptr)
static bool IsDefaultSerializationDeterministic()
void WriteLittleEndian32(uint32_t value)
OPENSSL_EXPORT pem_password_cb void * u
uint8 * WriteRaw(const void *data, int size, uint8 *ptr)
GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM ZeroCopyOutputStream
void WriteLittleEndian64(uint64_t value)
EpsCopyOutputStream(ZeroCopyOutputStream *stream, bool deterministic, uint8_t **pp)
void SetSerializationDeterministic(bool value)
static uint8 * WriteLittleEndian64ToArray(uint64 value, uint8 *target)
EpsCopyOutputStream(void *data, int size, bool deterministic)
void MapTestForceDeterministic()
static uint32 Log2FloorNonZero(uint32 n)
uint8_t * WriteBytesMaybeAliased(uint32_t num, const std::string &s, uint8_t *ptr)
static bool IsFlat(const absl::Cord &c)
static AllocList * Next(int i, AllocList *prev, LowLevelAlloc::Arena *arena)
PROTOBUF_ALWAYS_INLINE uint8_t * WriteUInt32Packed(int num, const T &r, int size, uint8_t *ptr)
#define T(upbtypeconst, upbtype, ctype, default_value)
PROTOBUF_ALWAYS_INLINE uint8_t * WriteLengthDelim(int num, uint32_t size, uint8_t *ptr)
void WriteVarint32SignExtended(int32 value)
static size_t VarintSize64PlusOne(uint64_t value)
static size_t VarintSize64(const T *data, const int n)
PROTOBUF_NOINLINE uint8_t * WriteStringMaybeAliased(uint32_t num, const std::string &s, uint8_t *ptr)
static uint8 buffer_[kBufferSize]
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
PROTOBUF_ALWAYS_INLINE uint8_t * WriteEnumPacked(int num, const T &r, int size, uint8_t *ptr)
void EnableAliasing(bool enabled)
CodedOutputStream(ZeroCopyOutputStream *stream)
static uint32_t Encode32(uint32_t v)
std::ptrdiff_t GetSize(uint8_t *ptr) const
void EnsureSpace(uint8 **ptr)
static void * tag(intptr_t t)
FuncOutput(*)(const void *, FuncInput) Func
PROTOBUF_ALWAYS_INLINE uint8_t * WriteSInt64Packed(int num, const T &r, int size, uint8_t *ptr)
std::shared_ptr< ExternalConnectionAcceptorImpl > impl_
PROTOBUF_ALWAYS_INLINE uint8_t * WriteString(uint32_t num, const T &s, uint8_t *ptr)
static size_t VarintSize32PlusOne(uint32_t value)
uint8_t * SetInitialBuffer(void *data, int size)
unsigned __int64 uint64_t
GRPC_CUSTOM_CODEDINPUTSTREAM CodedInputStream
static size_t VarintSize32(uint32 value)
static size_t VarintSize32SignExtended(int32 value)
static uint64_t ZigZagEncode64(int64_t v)
static PROTOBUF_ALWAYS_INLINE uint8 * WriteTagToArray(uint32 value, uint8 *target)
bool ExpectTag(const char *ptr)
static uint8 * WriteRawToArray(const void *buffer, int size, uint8 *target)
static uint32 Log2FloorNonZero64(uint64 n)
GRPC_CUSTOM_CODEDOUTPUTSTREAM CodedOutputStream
PROTOBUF_NOINLINE uint8_t * WriteRawMaybeAliased(const void *data, int size, uint8_t *ptr)
EpsCopyOutputStream * EpsCopy()
PROTOBUF_NOINLINE uint8_t * WriteBytes(uint32_t num, const T &s, uint8_t *ptr)
void WriteTag(uint32 value)
static uint8_t * WriteVarint32ToArrayOutOfLine(uint32_t value, uint8_t *target)
static PerThreadSynch * Skip(PerThreadSynch *x)
EpsCopyOutputStream impl_
uint32_t ReadVarint32(const char **p)
std::pair< const char *, uint32 > ReadTagFallback(const char *p, uint32 res)
uint8 * WriteRawLittleEndian64(const void *data, int size, uint8 *ptr)
PROTOBUF_ALWAYS_INLINE uint8_t * WriteTag(uint32_t num, uint32_t wt, uint8_t *ptr)
static uint8_t * WriteVarint32ToArrayOutOfLineHelper(uint32_t value, uint8_t *target)
bool IsSerializationDeterministic() const
static uint64_t Encode64(uint64_t v)
static PROTOBUF_ALWAYS_INLINE uint8 * UnsafeVarint(T value, uint8 *ptr)
static uint32_t ZigZagEncode32(int32_t v)
static constexpr int TagSize(uint32_t tag)
PROTOBUF_ALWAYS_INLINE uint8_t * WriteInt64Packed(int num, const T &r, int size, uint8_t *ptr)
InternalDescriptorPool * pool
static uint8 * WriteVarint32ToArray(uint32 value, uint8 *target)
uint8 * WriteRawLittleEndian32(const void *data, int size, uint8 *ptr)
PROTOBUF_ALWAYS_INLINE uint8_t * WriteVarintPacked(int num, const T &r, int size, uint8_t *ptr, const E &encode)
EpsCopyOutputStream(void *data, int size, ZeroCopyOutputStream *stream, bool deterministic, uint8_t **pp)
PROTOBUF_ALWAYS_INLINE uint8_t * WriteFixedPacked(int num, const T &r, uint8_t *ptr)
PROTOBUF_NODISCARD uint8_t * EnsureSpace(uint8_t *ptr)
static size_t VarintSize32SignExtendedPlusOne(int32_t value)
void WriteVarint32(uint32 value)
bool GetDirectBufferPointer(void **data, int *size)
static uint8 * WriteLittleEndian32ToArray(uint32 value, uint8 *target)
uint64_t ReadVarint64(const char **p)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:56