| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 | 56 |
| 57 const Descriptor* descriptor = from.GetDescriptor(); | 57 const Descriptor* descriptor = from.GetDescriptor(); |
| 58 GOOGLE_CHECK_EQ(to->GetDescriptor(), descriptor) | 58 GOOGLE_CHECK_EQ(to->GetDescriptor(), descriptor) |
| 59 << "Tried to merge messages of different types " | 59 << "Tried to merge messages of different types " |
| 60 << "(merge " << descriptor->full_name() | 60 << "(merge " << descriptor->full_name() |
| 61 << " to " << to->GetDescriptor()->full_name() << ")"; | 61 << " to " << to->GetDescriptor()->full_name() << ")"; |
| 62 | 62 |
| 63 const Reflection* from_reflection = from.GetReflection(); | 63 const Reflection* from_reflection = from.GetReflection(); |
| 64 const Reflection* to_reflection = to->GetReflection(); | 64 const Reflection* to_reflection = to->GetReflection(); |
| 65 | 65 |
| 66 std::vector<const FieldDescriptor*> fields; | 66 vector<const FieldDescriptor*> fields; |
| 67 from_reflection->ListFields(from, &fields); | 67 from_reflection->ListFields(from, &fields); |
| 68 for (int i = 0; i < fields.size(); i++) { | 68 for (int i = 0; i < fields.size(); i++) { |
| 69 const FieldDescriptor* field = fields[i]; | 69 const FieldDescriptor* field = fields[i]; |
| 70 | 70 |
| 71 if (field->is_repeated()) { | 71 if (field->is_repeated()) { |
| 72 int count = from_reflection->FieldSize(from, field); | 72 int count = from_reflection->FieldSize(from, field); |
| 73 for (int j = 0; j < count; j++) { | 73 for (int j = 0; j < count; j++) { |
| 74 switch (field->cpp_type()) { | 74 switch (field->cpp_type()) { |
| 75 #define HANDLE_TYPE(CPPTYPE, METHOD) \ | 75 #define HANDLE_TYPE(CPPTYPE, METHOD) \ |
| 76 case FieldDescriptor::CPPTYPE_##CPPTYPE: \ | 76 case FieldDescriptor::CPPTYPE_##CPPTYPE: \ |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 } | 122 } |
| 123 } | 123 } |
| 124 | 124 |
| 125 to_reflection->MutableUnknownFields(to)->MergeFrom( | 125 to_reflection->MutableUnknownFields(to)->MergeFrom( |
| 126 from_reflection->GetUnknownFields(from)); | 126 from_reflection->GetUnknownFields(from)); |
| 127 } | 127 } |
| 128 | 128 |
| 129 void ReflectionOps::Clear(Message* message) { | 129 void ReflectionOps::Clear(Message* message) { |
| 130 const Reflection* reflection = message->GetReflection(); | 130 const Reflection* reflection = message->GetReflection(); |
| 131 | 131 |
| 132 std::vector<const FieldDescriptor*> fields; | 132 vector<const FieldDescriptor*> fields; |
| 133 reflection->ListFields(*message, &fields); | 133 reflection->ListFields(*message, &fields); |
| 134 for (int i = 0; i < fields.size(); i++) { | 134 for (int i = 0; i < fields.size(); i++) { |
| 135 reflection->ClearField(message, fields[i]); | 135 reflection->ClearField(message, fields[i]); |
| 136 } | 136 } |
| 137 | 137 |
| 138 reflection->MutableUnknownFields(message)->Clear(); | 138 reflection->MutableUnknownFields(message)->Clear(); |
| 139 } | 139 } |
| 140 | 140 |
| 141 bool ReflectionOps::IsInitialized(const Message& message) { | 141 bool ReflectionOps::IsInitialized(const Message& message) { |
| 142 const Descriptor* descriptor = message.GetDescriptor(); | 142 const Descriptor* descriptor = message.GetDescriptor(); |
| 143 const Reflection* reflection = message.GetReflection(); | 143 const Reflection* reflection = message.GetReflection(); |
| 144 | 144 |
| 145 // Check required fields of this message. | 145 // Check required fields of this message. |
| 146 for (int i = 0; i < descriptor->field_count(); i++) { | 146 for (int i = 0; i < descriptor->field_count(); i++) { |
| 147 if (descriptor->field(i)->is_required()) { | 147 if (descriptor->field(i)->is_required()) { |
| 148 if (!reflection->HasField(message, descriptor->field(i))) { | 148 if (!reflection->HasField(message, descriptor->field(i))) { |
| 149 return false; | 149 return false; |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 } | 152 } |
| 153 | 153 |
| 154 // Check that sub-messages are initialized. | 154 // Check that sub-messages are initialized. |
| 155 std::vector<const FieldDescriptor*> fields; | 155 vector<const FieldDescriptor*> fields; |
| 156 reflection->ListFields(message, &fields); | 156 reflection->ListFields(message, &fields); |
| 157 for (int i = 0; i < fields.size(); i++) { | 157 for (int i = 0; i < fields.size(); i++) { |
| 158 const FieldDescriptor* field = fields[i]; | 158 const FieldDescriptor* field = fields[i]; |
| 159 if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { | 159 if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { |
| 160 | 160 |
| 161 if (field->is_repeated()) { | 161 if (field->is_repeated()) { |
| 162 int size = reflection->FieldSize(message, field); | 162 int size = reflection->FieldSize(message, field); |
| 163 | 163 |
| 164 for (int j = 0; j < size; j++) { | 164 for (int j = 0; j < size; j++) { |
| 165 if (!reflection->GetRepeatedMessage(message, field, j) | 165 if (!reflection->GetRepeatedMessage(message, field, j) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 176 } | 176 } |
| 177 | 177 |
| 178 return true; | 178 return true; |
| 179 } | 179 } |
| 180 | 180 |
| 181 void ReflectionOps::DiscardUnknownFields(Message* message) { | 181 void ReflectionOps::DiscardUnknownFields(Message* message) { |
| 182 const Reflection* reflection = message->GetReflection(); | 182 const Reflection* reflection = message->GetReflection(); |
| 183 | 183 |
| 184 reflection->MutableUnknownFields(message)->Clear(); | 184 reflection->MutableUnknownFields(message)->Clear(); |
| 185 | 185 |
| 186 std::vector<const FieldDescriptor*> fields; | 186 vector<const FieldDescriptor*> fields; |
| 187 reflection->ListFields(*message, &fields); | 187 reflection->ListFields(*message, &fields); |
| 188 for (int i = 0; i < fields.size(); i++) { | 188 for (int i = 0; i < fields.size(); i++) { |
| 189 const FieldDescriptor* field = fields[i]; | 189 const FieldDescriptor* field = fields[i]; |
| 190 if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { | 190 if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { |
| 191 if (field->is_repeated()) { | 191 if (field->is_repeated()) { |
| 192 int size = reflection->FieldSize(*message, field); | 192 int size = reflection->FieldSize(*message, field); |
| 193 for (int j = 0; j < size; j++) { | 193 for (int j = 0; j < size; j++) { |
| 194 reflection->MutableRepeatedMessage(message, field, j) | 194 reflection->MutableRepeatedMessage(message, field, j) |
| 195 ->DiscardUnknownFields(); | 195 ->DiscardUnknownFields(); |
| 196 } | 196 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 217 result.append(SimpleItoa(index)); | 217 result.append(SimpleItoa(index)); |
| 218 result.append("]"); | 218 result.append("]"); |
| 219 } | 219 } |
| 220 result.append("."); | 220 result.append("."); |
| 221 return result; | 221 return result; |
| 222 } | 222 } |
| 223 | 223 |
| 224 void ReflectionOps::FindInitializationErrors( | 224 void ReflectionOps::FindInitializationErrors( |
| 225 const Message& message, | 225 const Message& message, |
| 226 const string& prefix, | 226 const string& prefix, |
| 227 std::vector<string>* errors) { | 227 vector<string>* errors) { |
| 228 const Descriptor* descriptor = message.GetDescriptor(); | 228 const Descriptor* descriptor = message.GetDescriptor(); |
| 229 const Reflection* reflection = message.GetReflection(); | 229 const Reflection* reflection = message.GetReflection(); |
| 230 | 230 |
| 231 // Check required fields of this message. | 231 // Check required fields of this message. |
| 232 for (int i = 0; i < descriptor->field_count(); i++) { | 232 for (int i = 0; i < descriptor->field_count(); i++) { |
| 233 if (descriptor->field(i)->is_required()) { | 233 if (descriptor->field(i)->is_required()) { |
| 234 if (!reflection->HasField(message, descriptor->field(i))) { | 234 if (!reflection->HasField(message, descriptor->field(i))) { |
| 235 errors->push_back(prefix + descriptor->field(i)->name()); | 235 errors->push_back(prefix + descriptor->field(i)->name()); |
| 236 } | 236 } |
| 237 } | 237 } |
| 238 } | 238 } |
| 239 | 239 |
| 240 // Check sub-messages. | 240 // Check sub-messages. |
| 241 std::vector<const FieldDescriptor*> fields; | 241 vector<const FieldDescriptor*> fields; |
| 242 reflection->ListFields(message, &fields); | 242 reflection->ListFields(message, &fields); |
| 243 for (int i = 0; i < fields.size(); i++) { | 243 for (int i = 0; i < fields.size(); i++) { |
| 244 const FieldDescriptor* field = fields[i]; | 244 const FieldDescriptor* field = fields[i]; |
| 245 if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { | 245 if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { |
| 246 | 246 |
| 247 if (field->is_repeated()) { | 247 if (field->is_repeated()) { |
| 248 int size = reflection->FieldSize(message, field); | 248 int size = reflection->FieldSize(message, field); |
| 249 | 249 |
| 250 for (int j = 0; j < size; j++) { | 250 for (int j = 0; j < size; j++) { |
| 251 const Message& sub_message = | 251 const Message& sub_message = |
| 252 reflection->GetRepeatedMessage(message, field, j); | 252 reflection->GetRepeatedMessage(message, field, j); |
| 253 FindInitializationErrors(sub_message, | 253 FindInitializationErrors(sub_message, |
| 254 SubMessagePrefix(prefix, field, j), | 254 SubMessagePrefix(prefix, field, j), |
| 255 errors); | 255 errors); |
| 256 } | 256 } |
| 257 } else { | 257 } else { |
| 258 const Message& sub_message = reflection->GetMessage(message, field); | 258 const Message& sub_message = reflection->GetMessage(message, field); |
| 259 FindInitializationErrors(sub_message, | 259 FindInitializationErrors(sub_message, |
| 260 SubMessagePrefix(prefix, field, -1), | 260 SubMessagePrefix(prefix, field, -1), |
| 261 errors); | 261 errors); |
| 262 } | 262 } |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 | 266 |
| 267 } // namespace internal | 267 } // namespace internal |
| 268 } // namespace protobuf | 268 } // namespace protobuf |
| 269 } // namespace google | 269 } // namespace google |
| OLD | NEW |