|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef GOOGLE_PROTOBUF_METADATA_LITE_H__
|
|
|
#define GOOGLE_PROTOBUF_METADATA_LITE_H__
|
|
|
|
|
|
#include <string>
|
|
|
#include <google/protobuf/stubs/common.h>
|
|
|
#include <google/protobuf/arena.h>
|
|
|
#include <google/protobuf/port.h>
|
|
|
|
|
|
#include <google/protobuf/port_def.inc>
|
|
|
|
|
|
#ifdef SWIG
|
|
|
#error "You cannot SWIG proto headers"
|
|
|
#endif
|
|
|
|
|
|
namespace google {
|
|
|
namespace protobuf {
|
|
|
namespace internal {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class InternalMetadata {
|
|
|
public:
|
|
|
InternalMetadata() : ptr_(nullptr) {}
|
|
|
explicit InternalMetadata(Arena* arena) : ptr_(arena) {}
|
|
|
|
|
|
template <typename T>
|
|
|
void Delete() {
|
|
|
|
|
|
if (have_unknown_fields() && arena() == NULL) {
|
|
|
delete PtrValue<Container<T>>();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
PROTOBUF_ALWAYS_INLINE Arena* arena() const {
|
|
|
if (PROTOBUF_PREDICT_FALSE(have_unknown_fields())) {
|
|
|
return PtrValue<ContainerBase>()->arena;
|
|
|
} else {
|
|
|
return PtrValue<Arena>();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
PROTOBUF_ALWAYS_INLINE bool have_unknown_fields() const {
|
|
|
return PtrTag() == kTagContainer;
|
|
|
}
|
|
|
|
|
|
PROTOBUF_ALWAYS_INLINE void* raw_arena_ptr() const { return ptr_; }
|
|
|
|
|
|
template <typename T>
|
|
|
PROTOBUF_ALWAYS_INLINE const T& unknown_fields(
|
|
|
const T& (*default_instance)()) const {
|
|
|
if (PROTOBUF_PREDICT_FALSE(have_unknown_fields())) {
|
|
|
return PtrValue<Container<T>>()->unknown_fields;
|
|
|
} else {
|
|
|
return default_instance();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
template <typename T>
|
|
|
PROTOBUF_ALWAYS_INLINE T* mutable_unknown_fields() {
|
|
|
if (PROTOBUF_PREDICT_TRUE(have_unknown_fields())) {
|
|
|
return &PtrValue<Container<T>>()->unknown_fields;
|
|
|
} else {
|
|
|
return mutable_unknown_fields_slow<T>();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
template <typename T>
|
|
|
PROTOBUF_ALWAYS_INLINE void Swap(InternalMetadata* other) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (have_unknown_fields() || other->have_unknown_fields()) {
|
|
|
DoSwap<T>(other->mutable_unknown_fields<T>());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
template <typename T>
|
|
|
PROTOBUF_ALWAYS_INLINE void MergeFrom(const InternalMetadata& other) {
|
|
|
if (other.have_unknown_fields()) {
|
|
|
DoMergeFrom<T>(other.unknown_fields<T>(nullptr));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
template <typename T>
|
|
|
PROTOBUF_ALWAYS_INLINE void Clear() {
|
|
|
if (have_unknown_fields()) {
|
|
|
DoClear<T>();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private:
|
|
|
void* ptr_;
|
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
|
kTagArena = 0,
|
|
|
|
|
|
kTagContainer = 1,
|
|
|
};
|
|
|
static constexpr intptr_t kPtrTagMask = 1;
|
|
|
static constexpr intptr_t kPtrValueMask = ~kPtrTagMask;
|
|
|
|
|
|
|
|
|
PROTOBUF_ALWAYS_INLINE int PtrTag() const {
|
|
|
return reinterpret_cast<intptr_t>(ptr_) & kPtrTagMask;
|
|
|
}
|
|
|
|
|
|
template <typename U>
|
|
|
U* PtrValue() const {
|
|
|
return reinterpret_cast<U*>(reinterpret_cast<intptr_t>(ptr_) &
|
|
|
kPtrValueMask);
|
|
|
}
|
|
|
|
|
|
|
|
|
struct ContainerBase {
|
|
|
Arena* arena;
|
|
|
};
|
|
|
|
|
|
template <typename T>
|
|
|
struct Container : public ContainerBase {
|
|
|
T unknown_fields;
|
|
|
};
|
|
|
|
|
|
template <typename T>
|
|
|
PROTOBUF_NOINLINE T* mutable_unknown_fields_slow() {
|
|
|
Arena* my_arena = arena();
|
|
|
Container<T>* container = Arena::Create<Container<T>>(my_arena);
|
|
|
|
|
|
|
|
|
ptr_ = container;
|
|
|
ptr_ = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(ptr_) |
|
|
|
kTagContainer);
|
|
|
container->arena = my_arena;
|
|
|
return &(container->unknown_fields);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
void DoClear() {
|
|
|
mutable_unknown_fields<T>()->Clear();
|
|
|
}
|
|
|
|
|
|
template <typename T>
|
|
|
void DoMergeFrom(const T& other) {
|
|
|
mutable_unknown_fields<T>()->MergeFrom(other);
|
|
|
}
|
|
|
|
|
|
template <typename T>
|
|
|
void DoSwap(T* other) {
|
|
|
mutable_unknown_fields<T>()->Swap(other);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
inline void InternalMetadata::DoClear<std::string>() {
|
|
|
mutable_unknown_fields<std::string>()->clear();
|
|
|
}
|
|
|
|
|
|
template <>
|
|
|
inline void InternalMetadata::DoMergeFrom<std::string>(
|
|
|
const std::string& other) {
|
|
|
mutable_unknown_fields<std::string>()->append(other);
|
|
|
}
|
|
|
|
|
|
template <>
|
|
|
inline void InternalMetadata::DoSwap<std::string>(std::string* other) {
|
|
|
mutable_unknown_fields<std::string>()->swap(*other);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PROTOBUF_EXPORT LiteUnknownFieldSetter {
|
|
|
public:
|
|
|
explicit LiteUnknownFieldSetter(InternalMetadata* metadata)
|
|
|
: metadata_(metadata) {
|
|
|
if (metadata->have_unknown_fields()) {
|
|
|
buffer_.swap(*metadata->mutable_unknown_fields<std::string>());
|
|
|
}
|
|
|
}
|
|
|
~LiteUnknownFieldSetter() {
|
|
|
if (!buffer_.empty())
|
|
|
metadata_->mutable_unknown_fields<std::string>()->swap(buffer_);
|
|
|
}
|
|
|
std::string* buffer() { return &buffer_; }
|
|
|
|
|
|
private:
|
|
|
InternalMetadata* metadata_;
|
|
|
std::string buffer_;
|
|
|
};
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#include <google/protobuf/port_undef.inc>
|
|
|
|
|
|
#endif
|
|
|
|