Add InternalVisbility constructors to ImplicitWeakMessage classes

This CLs adds internally visible arena enabled constructors and copy constructors to ImplicitWeakMessage and WeakRepeatedPtrField.

PiperOrigin-RevId: 547544297
pull/13275/head
Martijn Vels 2 years ago committed by Copybara-Service
parent 739a1f8853
commit 4fcd1ddea2
  1. 31
      src/google/protobuf/implicit_weak_message.h

@ -57,14 +57,20 @@ namespace internal {
// message type does not get linked into the binary.
class PROTOBUF_EXPORT ImplicitWeakMessage : public MessageLite {
public:
ImplicitWeakMessage() : data_(new std::string) {}
ImplicitWeakMessage() : ImplicitWeakMessage(nullptr) {}
explicit constexpr ImplicitWeakMessage(ConstantInitialized)
: data_(nullptr) {}
explicit ImplicitWeakMessage(Arena* arena)
: MessageLite(arena), data_(new std::string) {}
ImplicitWeakMessage(const ImplicitWeakMessage&) = delete;
ImplicitWeakMessage& operator=(const ImplicitWeakMessage&) = delete;
// Arena enabled constructors: for internal use only.
ImplicitWeakMessage(internal::InternalVisibility, Arena* arena)
: ImplicitWeakMessage(arena) {}
// TODO(b/290091828): make this constructor private
explicit ImplicitWeakMessage(Arena* arena)
: MessageLite(arena), data_(new std::string) {}
~ImplicitWeakMessage() override {
// data_ will be null in the default instance, but we can safely call delete
// here because the default instance will never be destroyed.
@ -156,8 +162,21 @@ struct WeakRepeatedPtrField {
using DestructorSkippable_ = void;
using TypeHandler = internal::ImplicitWeakTypeHandler<T>;
constexpr WeakRepeatedPtrField() : weak() {}
WeakRepeatedPtrField(const WeakRepeatedPtrField& rhs)
: WeakRepeatedPtrField(nullptr, rhs) {}
// Arena enabled constructors: for internal use only.
WeakRepeatedPtrField(internal::InternalVisibility, Arena* arena)
: WeakRepeatedPtrField(arena) {}
WeakRepeatedPtrField(internal::InternalVisibility, Arena* arena,
const WeakRepeatedPtrField& rhs)
: WeakRepeatedPtrField(arena, rhs) {}
// TODO(b/290091828): make this constructor private
explicit WeakRepeatedPtrField(Arena* arena) : weak(arena) {}
~WeakRepeatedPtrField() { weak.template Destroy<TypeHandler>(); }
typedef internal::RepeatedPtrIterator<MessageLite> iterator;
@ -208,6 +227,12 @@ struct WeakRepeatedPtrField {
union {
RepeatedPtrField<T> weak;
};
private:
WeakRepeatedPtrField(Arena* arena, const WeakRepeatedPtrField& rhs)
: WeakRepeatedPtrField(arena) {
MergeFrom(rhs);
}
};
} // namespace protobuf

Loading…
Cancel
Save