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 vector<const FieldDescriptor*> fields; | 66 std::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 vector<const FieldDescriptor*> fields; | 132 std::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 vector<const FieldDescriptor*> fields; | 155 std::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 vector<const FieldDescriptor*> fields; | 186 std::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 vector<string>* errors) { | 227 std::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 vector<const FieldDescriptor*> fields; | 241 std::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 |