Index: third_party/protobuf/src/google/protobuf/message.cc |
diff --git a/third_party/protobuf/src/google/protobuf/message.cc b/third_party/protobuf/src/google/protobuf/message.cc |
index ab7efa990b143cc027fcc5acfc3c0f41624ec2b4..276d7de579760aa0fd5826094efb53b91afde70d 100644 |
--- a/third_party/protobuf/src/google/protobuf/message.cc |
+++ b/third_party/protobuf/src/google/protobuf/message.cc |
@@ -1,6 +1,6 @@ |
// Protocol Buffers - Google's data interchange format |
// Copyright 2008 Google Inc. All rights reserved. |
-// http://code.google.com/p/protobuf/ |
+// https://developers.google.com/protocol-buffers/ |
// |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
@@ -32,7 +32,7 @@ |
// Based on original Protocol Buffers design by |
// Sanjay Ghemawat, Jeff Dean, and others. |
-#include <istream> |
+#include <iostream> |
#include <stack> |
#include <google/protobuf/stubs/hash.h> |
@@ -40,6 +40,7 @@ |
#include <google/protobuf/stubs/common.h> |
#include <google/protobuf/stubs/once.h> |
+#include <google/protobuf/reflection_internal.h> |
#include <google/protobuf/io/coded_stream.h> |
#include <google/protobuf/io/zero_copy_stream_impl.h> |
#include <google/protobuf/descriptor.pb.h> |
@@ -48,7 +49,8 @@ |
#include <google/protobuf/reflection_ops.h> |
#include <google/protobuf/wire_format.h> |
#include <google/protobuf/stubs/strutil.h> |
-#include <google/protobuf/stubs/map-util.h> |
+#include <google/protobuf/stubs/map_util.h> |
+#include <google/protobuf/stubs/singleton.h> |
#include <google/protobuf/stubs/stl_util.h> |
namespace google { |
@@ -75,7 +77,7 @@ void Message::CheckTypeAndMergeFrom(const MessageLite& other) { |
void Message::CopyFrom(const Message& from) { |
const Descriptor* descriptor = GetDescriptor(); |
GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor) |
- << ": Tried to copy from a message with a different type." |
+ << ": Tried to copy from a message with a different type. " |
"to: " << descriptor->full_name() << ", " |
"from:" << from.GetDescriptor()->full_name(); |
ReflectionOps::Copy(from, this); |
@@ -100,7 +102,7 @@ void Message::FindInitializationErrors(vector<string>* errors) const { |
string Message::InitializationErrorString() const { |
vector<string> errors; |
FindInitializationErrors(&errors); |
- return JoinStrings(errors, ", "); |
+ return Join(errors, ", "); |
} |
void Message::CheckInitialized() const { |
@@ -149,7 +151,7 @@ int Message::ByteSize() const { |
return size; |
} |
-void Message::SetCachedSize(int size) const { |
+void Message::SetCachedSize(int /* size */) const { |
GOOGLE_LOG(FATAL) << "Message class \"" << GetDescriptor()->full_name() |
<< "\" implements neither SetCachedSize() nor ByteSize(). " |
"Must implement one or the other."; |
@@ -222,6 +224,38 @@ void* Reflection::MutableRawRepeatedString( |
} |
+// Default EnumValue API implementations. Real reflection implementations should |
+// override these. However, there are several legacy implementations that do |
+// not, and cannot easily be changed at the same time as the Reflection API, so |
+// we provide these for now. |
+// TODO: Remove these once all Reflection implementations are updated. |
+int Reflection::GetEnumValue(const Message& message, |
+ const FieldDescriptor* field) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+ return 0; |
+} |
+void Reflection::SetEnumValue(Message* message, |
+ const FieldDescriptor* field, |
+ int value) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+} |
+int Reflection::GetRepeatedEnumValue( |
+ const Message& message, |
+ const FieldDescriptor* field, int index) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+ return 0; |
+} |
+void Reflection::SetRepeatedEnumValue(Message* message, |
+ const FieldDescriptor* field, int index, |
+ int value) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+} |
+void Reflection::AddEnumValue(Message* message, |
+ const FieldDescriptor* field, |
+ int value) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+} |
+ |
// ============================================================================= |
// MessageFactory |
@@ -354,5 +388,99 @@ void MessageFactory::InternalRegisterGeneratedMessage( |
} |
+MessageFactory* Reflection::GetMessageFactory() const { |
+ GOOGLE_LOG(FATAL) << "Not implemented."; |
+ return NULL; |
+} |
+ |
+void* Reflection::RepeatedFieldData( |
+ Message* message, const FieldDescriptor* field, |
+ FieldDescriptor::CppType cpp_type, |
+ const Descriptor* message_type) const { |
+ GOOGLE_LOG(FATAL) << "Not implemented."; |
+ return NULL; |
+} |
+ |
+namespace internal { |
+RepeatedFieldAccessor::~RepeatedFieldAccessor() { |
+} |
+} // namespace internal |
+ |
+const internal::RepeatedFieldAccessor* Reflection::RepeatedFieldAccessor( |
+ const FieldDescriptor* field) const { |
+ GOOGLE_CHECK(field->is_repeated()); |
+ switch (field->cpp_type()) { |
+#define HANDLE_PRIMITIVE_TYPE(TYPE, type) \ |
+ case FieldDescriptor::CPPTYPE_ ## TYPE: \ |
+ return internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<type> >::get(); |
+ HANDLE_PRIMITIVE_TYPE(INT32, int32) |
+ HANDLE_PRIMITIVE_TYPE(UINT32, uint32) |
+ HANDLE_PRIMITIVE_TYPE(INT64, int64) |
+ HANDLE_PRIMITIVE_TYPE(UINT64, uint64) |
+ HANDLE_PRIMITIVE_TYPE(FLOAT, float) |
+ HANDLE_PRIMITIVE_TYPE(DOUBLE, double) |
+ HANDLE_PRIMITIVE_TYPE(BOOL, bool) |
+ HANDLE_PRIMITIVE_TYPE(ENUM, int32) |
+#undef HANDLE_PRIMITIVE_TYPE |
+ case FieldDescriptor::CPPTYPE_STRING: |
+ switch (field->options().ctype()) { |
+ default: |
+ case FieldOptions::STRING: |
+ return internal::Singleton<internal::RepeatedPtrFieldStringAccessor>::get(); |
+ } |
+ break; |
+ case FieldDescriptor::CPPTYPE_MESSAGE: |
+ if (field->is_map()) { |
+ return internal::Singleton<internal::MapFieldAccessor>::get(); |
+ } else { |
+ return internal::Singleton<internal::RepeatedPtrFieldMessageAccessor>::get(); |
+ } |
+ } |
+ GOOGLE_LOG(FATAL) << "Should not reach here."; |
+ return NULL; |
+} |
+ |
+namespace internal { |
+namespace { |
+void ShutdownRepeatedFieldAccessor() { |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<int32> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<uint32> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<int64> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<uint64> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<float> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<double> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<bool> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedPtrFieldStringAccessor>::ShutDown(); |
+ internal::Singleton<internal::RepeatedPtrFieldMessageAccessor>::ShutDown(); |
+ internal::Singleton<internal::MapFieldAccessor>::ShutDown(); |
+} |
+ |
+struct ShutdownRepeatedFieldRegister { |
+ ShutdownRepeatedFieldRegister() { |
+ OnShutdown(&ShutdownRepeatedFieldAccessor); |
+ } |
+} shutdown_; |
+ |
+} // namespace |
+} // namespace internal |
+ |
+namespace internal { |
+template<> |
+Message* GenericTypeHandler<Message>::NewFromPrototype( |
+ const Message* prototype, google::protobuf::Arena* arena) { |
+ return prototype->New(arena); |
+} |
+template<> |
+google::protobuf::Arena* GenericTypeHandler<Message>::GetArena( |
+ Message* value) { |
+ return value->GetArena(); |
+} |
+template<> |
+void* GenericTypeHandler<Message>::GetMaybeArenaPointer( |
+ Message* value) { |
+ return value->GetMaybeArenaPointer(); |
+} |
+} // namespace internal |
+ |
} // namespace protobuf |
} // namespace google |