diff options
Diffstat (limited to 'src/google/protobuf/reflection_internal.h')
-rw-r--r-- | src/google/protobuf/reflection_internal.h | 159 |
1 files changed, 72 insertions, 87 deletions
diff --git a/src/google/protobuf/reflection_internal.h b/src/google/protobuf/reflection_internal.h index fcb42471..ff62d58d 100644 --- a/src/google/protobuf/reflection_internal.h +++ b/src/google/protobuf/reflection_internal.h @@ -43,36 +43,34 @@ namespace internal { // corresponding random-access methods. class RandomAccessRepeatedFieldAccessor : public RepeatedFieldAccessor { public: - virtual ~RandomAccessRepeatedFieldAccessor() {} - - virtual Iterator* BeginIterator(const Field* data) const { + Iterator* BeginIterator(const Field* data) const override { return PositionToIterator(0); } - virtual Iterator* EndIterator(const Field* data) const { + Iterator* EndIterator(const Field* data) const override { return PositionToIterator(this->Size(data)); } - virtual Iterator* CopyIterator(const Field* data, - const Iterator* iterator) const { + Iterator* CopyIterator(const Field* data, + const Iterator* iterator) const override { return const_cast<Iterator*>(iterator); } - virtual Iterator* AdvanceIterator(const Field* data, - Iterator* iterator) const { + Iterator* AdvanceIterator(const Field* data, + Iterator* iterator) const override { return PositionToIterator(IteratorToPosition(iterator) + 1); } - virtual bool EqualsIterator(const Field* data, - const Iterator* a, - const Iterator* b) const { + bool EqualsIterator(const Field* data, const Iterator* a, + const Iterator* b) const override { return a == b; } - virtual void DeleteIterator(const Field* data, Iterator* iterator) const { - } - virtual const Value* GetIteratorValue(const Field* data, - const Iterator* iterator, - Value* scratch_space) const { + void DeleteIterator(const Field* data, Iterator* iterator) const override {} + const Value* GetIteratorValue(const Field* data, const Iterator* iterator, + Value* scratch_space) const override { return Get(data, static_cast<int>(IteratorToPosition(iterator)), scratch_space); } + protected: + ~RandomAccessRepeatedFieldAccessor() = default; + private: static intptr_t IteratorToPosition(const Iterator* iterator) { return reinterpret_cast<intptr_t>(iterator); @@ -88,34 +86,34 @@ template<typename T> class RepeatedFieldWrapper : public RandomAccessRepeatedFieldAccessor { public: RepeatedFieldWrapper() {} - virtual ~RepeatedFieldWrapper() {} - virtual bool IsEmpty(const Field* data) const { + bool IsEmpty(const Field* data) const override { return GetRepeatedField(data)->empty(); } - virtual int Size(const Field* data) const { + int Size(const Field* data) const override { return GetRepeatedField(data)->size(); } - virtual const Value* Get(const Field* data, int index, - Value* scratch_space) const { + const Value* Get(const Field* data, int index, + Value* scratch_space) const override { return ConvertFromT(GetRepeatedField(data)->Get(index), scratch_space); } - virtual void Clear(Field* data) const { + void Clear(Field* data) const override { MutableRepeatedField(data)->Clear(); } - virtual void Set(Field* data, int index, const Value* value) const { + void Set(Field* data, int index, const Value* value) const override { MutableRepeatedField(data)->Set(index, ConvertToT(value)); } - virtual void Add(Field* data, const Value* value) const { + void Add(Field* data, const Value* value) const override { MutableRepeatedField(data)->Add(ConvertToT(value)); } - virtual void RemoveLast(Field* data) const { + void RemoveLast(Field* data) const override { MutableRepeatedField(data)->RemoveLast(); } - virtual void SwapElements(Field* data, int index1, int index2) const { + void SwapElements(Field* data, int index1, int index2) const override { MutableRepeatedField(data)->SwapElements(index1, index2); } protected: + ~RepeatedFieldWrapper() = default; typedef RepeatedField<T> RepeatedFieldType; static const RepeatedFieldType* GetRepeatedField(const Field* data) { return reinterpret_cast<const RepeatedFieldType*>(data); @@ -142,37 +140,36 @@ class RepeatedFieldWrapper : public RandomAccessRepeatedFieldAccessor { template<typename T> class RepeatedPtrFieldWrapper : public RandomAccessRepeatedFieldAccessor { public: - RepeatedPtrFieldWrapper() {} - virtual ~RepeatedPtrFieldWrapper() {} - virtual bool IsEmpty(const Field* data) const { + bool IsEmpty(const Field* data) const override { return GetRepeatedField(data)->empty(); } - virtual int Size(const Field* data) const { + int Size(const Field* data) const override { return GetRepeatedField(data)->size(); } - virtual const Value* Get(const Field* data, int index, - Value* scratch_space) const { + const Value* Get(const Field* data, int index, + Value* scratch_space) const override { return ConvertFromT(GetRepeatedField(data)->Get(index), scratch_space); } - virtual void Clear(Field* data) const { + void Clear(Field* data) const override { MutableRepeatedField(data)->Clear(); } - virtual void Set(Field* data, int index, const Value* value) const { + void Set(Field* data, int index, const Value* value) const override { ConvertToT(value, MutableRepeatedField(data)->Mutable(index)); } - virtual void Add(Field* data, const Value* value) const { + void Add(Field* data, const Value* value) const override { T* allocated = New(value); ConvertToT(value, allocated); MutableRepeatedField(data)->AddAllocated(allocated); } - virtual void RemoveLast(Field* data) const { + void RemoveLast(Field* data) const override { MutableRepeatedField(data)->RemoveLast(); } - virtual void SwapElements(Field* data, int index1, int index2) const { + void SwapElements(Field* data, int index1, int index2) const override { MutableRepeatedField(data)->SwapElements(index1, index2); } protected: + ~RepeatedPtrFieldWrapper() = default; typedef RepeatedPtrField<T> RepeatedFieldType; static const RepeatedFieldType* GetRepeatedField(const Field* data) { return reinterpret_cast<const RepeatedFieldType*>(data); @@ -202,41 +199,39 @@ class RepeatedPtrFieldWrapper : public RandomAccessRepeatedFieldAccessor { // An implementation of RandomAccessRepeatedFieldAccessor that manipulates // MapFieldBase. -class MapFieldAccessor : public RandomAccessRepeatedFieldAccessor { +class MapFieldAccessor final : public RandomAccessRepeatedFieldAccessor { public: MapFieldAccessor() {} virtual ~MapFieldAccessor() {} virtual bool IsEmpty(const Field* data) const { return GetRepeatedField(data)->empty(); } - virtual int Size(const Field* data) const { + int Size(const Field* data) const override { return GetRepeatedField(data)->size(); } - virtual const Value* Get(const Field* data, int index, - Value* scratch_space) const { + const Value* Get(const Field* data, int index, + Value* scratch_space) const override { return ConvertFromEntry(GetRepeatedField(data)->Get(index), scratch_space); } - virtual void Clear(Field* data) const { + void Clear(Field* data) const override { MutableRepeatedField(data)->Clear(); } - virtual void Set(Field* data, int index, const Value* value) const { + void Set(Field* data, int index, const Value* value) const override { ConvertToEntry(value, MutableRepeatedField(data)->Mutable(index)); } - virtual void Add(Field* data, const Value* value) const { + void Add(Field* data, const Value* value) const override { Message* allocated = New(value); ConvertToEntry(value, allocated); MutableRepeatedField(data)->AddAllocated(allocated); } - virtual void RemoveLast(Field* data) const { + void RemoveLast(Field* data) const override { MutableRepeatedField(data)->RemoveLast(); } - virtual void SwapElements(Field* data, int index1, int index2) const { + void SwapElements(Field* data, int index1, int index2) const override { MutableRepeatedField(data)->SwapElements(index1, index2); } - virtual void Swap( - Field* data, - const internal::RepeatedFieldAccessor* other_mutator, - Field* other_data) const { + void Swap(Field* data, const internal::RepeatedFieldAccessor* other_mutator, + Field* other_data) const override { GOOGLE_CHECK(this == other_mutator); MutableRepeatedField(data)->Swap(MutableRepeatedField(other_data)); } @@ -268,19 +263,16 @@ class MapFieldAccessor : public RandomAccessRepeatedFieldAccessor { }; // Default implementations of RepeatedFieldAccessor for primitive types. -template<typename T> -class RepeatedFieldPrimitiveAccessor : public RepeatedFieldWrapper<T> { +template <typename T> +class RepeatedFieldPrimitiveAccessor final : public RepeatedFieldWrapper<T> { typedef void Field; typedef void Value; using RepeatedFieldWrapper<T>::MutableRepeatedField; public: RepeatedFieldPrimitiveAccessor() {} - virtual ~RepeatedFieldPrimitiveAccessor() {} - virtual void Swap( - Field* data, - const internal::RepeatedFieldAccessor* other_mutator, - Field* other_data) const { + void Swap(Field* data, const internal::RepeatedFieldAccessor* other_mutator, + Field* other_data) const override { // Currently RepeatedFieldPrimitiveAccessor is the only implementation of // RepeatedFieldAccessor for primitive types. As we are using singletons // for these accessors, here "other_mutator" must be "this". @@ -289,90 +281,83 @@ class RepeatedFieldPrimitiveAccessor : public RepeatedFieldWrapper<T> { } protected: - virtual T ConvertToT(const Value* value) const { + T ConvertToT(const Value* value) const override { return *static_cast<const T*>(value); } - virtual const Value* ConvertFromT(const T& value, - Value* scratch_space) const { + const Value* ConvertFromT(const T& value, + Value* scratch_space) const override { return static_cast<const Value*>(&value); } }; // Default implementation of RepeatedFieldAccessor for string fields with // ctype=STRING. -class RepeatedPtrFieldStringAccessor : public RepeatedPtrFieldWrapper<string> { +class RepeatedPtrFieldStringAccessor final + : public RepeatedPtrFieldWrapper<std::string> { typedef void Field; typedef void Value; using RepeatedFieldAccessor::Add; public: RepeatedPtrFieldStringAccessor() {} - virtual ~RepeatedPtrFieldStringAccessor() {} - virtual void Swap( - Field* data, - const internal::RepeatedFieldAccessor* other_mutator, - Field* other_data) const { + void Swap(Field* data, const internal::RepeatedFieldAccessor* other_mutator, + Field* other_data) const override { if (this == other_mutator) { MutableRepeatedField(data)->Swap(MutableRepeatedField(other_data)); } else { - RepeatedPtrField<string> tmp; + RepeatedPtrField<std::string> tmp; tmp.Swap(MutableRepeatedField(data)); int other_size = other_mutator->Size(other_data); for (int i = 0; i < other_size; ++i) { - Add<string>(data, other_mutator->Get<string>(other_data, i)); + Add<std::string>(data, other_mutator->Get<std::string>(other_data, i)); } int size = Size(data); other_mutator->Clear(other_data); for (int i = 0; i < size; ++i) { - other_mutator->Add<string>(other_data, tmp.Get(i)); + other_mutator->Add<std::string>(other_data, tmp.Get(i)); } } } protected: - virtual string* New(const Value*) const { - return new string(); - } - virtual void ConvertToT(const Value* value, string* result) const { - *result = *static_cast<const string*>(value); + std::string* New(const Value*) const override { return new std::string(); } + void ConvertToT(const Value* value, std::string* result) const override { + *result = *static_cast<const std::string*>(value); } - virtual const Value* ConvertFromT(const string& value, - Value* scratch_space) const { + const Value* ConvertFromT(const std::string& value, + Value* scratch_space) const override { return static_cast<const Value*>(&value); } }; -class RepeatedPtrFieldMessageAccessor +class RepeatedPtrFieldMessageAccessor final : public RepeatedPtrFieldWrapper<Message> { typedef void Field; typedef void Value; public: RepeatedPtrFieldMessageAccessor() {} - virtual ~RepeatedPtrFieldMessageAccessor() {} - virtual void Swap( - Field* data, - const internal::RepeatedFieldAccessor* other_mutator, - Field* other_data) const { + void Swap(Field* data, const internal::RepeatedFieldAccessor* other_mutator, + Field* other_data) const override { GOOGLE_CHECK(this == other_mutator); MutableRepeatedField(data)->Swap(MutableRepeatedField(other_data)); } protected: - virtual Message* New(const Value* value) const { + Message* New(const Value* value) const override { return static_cast<const Message*>(value)->New(); } - virtual void ConvertToT(const Value* value, Message* result) const { + void ConvertToT(const Value* value, Message* result) const override { result->CopyFrom(*static_cast<const Message*>(value)); } - virtual const Value* ConvertFromT(const Message& value, - Value* scratch_space) const { + const Value* ConvertFromT(const Message& value, + Value* scratch_space) const override { return static_cast<const Value*>(&value); } }; } // namespace internal } // namespace protobuf - } // namespace google + #endif // GOOGLE_PROTOBUF_REFLECTION_INTERNAL_H__ |