Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(272)

Side by Side Diff: third_party/protobuf/objectivec/GPBDictionary.m

Issue 1842653006: Update //third_party/protobuf to version 3. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 #import "GPBDictionary_PackagePrivate.h"
32
33 #import "GPBCodedInputStream_PackagePrivate.h"
34 #import "GPBCodedOutputStream.h"
35 #import "GPBDescriptor_PackagePrivate.h"
36 #import "GPBMessage_PackagePrivate.h"
37 #import "GPBUtilities_PackagePrivate.h"
38
39 // ------------------------------ NOTE ------------------------------
40 // At the moment, this is all using NSNumbers in NSDictionaries under
41 // the hood, but it is all hidden so we can come back and optimize
42 // with direct CFDictionary usage later. The reason that wasn't
43 // done yet is needing to support 32bit iOS builds. Otherwise
44 // it would be pretty simple to store all this data in CFDictionaries
45 // directly.
46 // ------------------------------------------------------------------
47
48 // Used to include code only visible to specific versions of the static
49 // analyzer. Useful for wrapping code that only exists to silence the analyzer.
50 // Determine the values you want to use for BEGIN_APPLE_BUILD_VERSION,
51 // END_APPLE_BUILD_VERSION using:
52 // xcrun clang -dM -E -x c /dev/null | grep __apple_build_version__
53 // Example usage:
54 // #if GPB_STATIC_ANALYZER_ONLY(5621, 5623) ... #endif
55 #define GPB_STATIC_ANALYZER_ONLY(BEGIN_APPLE_BUILD_VERSION, END_APPLE_BUILD_VERS ION) \
56 (defined(__clang_analyzer__) && \
57 (__apple_build_version__ >= BEGIN_APPLE_BUILD_VERSION && \
58 __apple_build_version__ <= END_APPLE_BUILD_VERSION))
59
60 enum {
61 kMapKeyFieldNumber = 1,
62 kMapValueFieldNumber = 2,
63 };
64
65 static BOOL DictDefault_IsValidValue(int32_t value) {
66 // Anything but the bad value marker is allowed.
67 return (value != kGPBUnrecognizedEnumeratorValue);
68 }
69
70 //%PDDM-DEFINE SERIALIZE_SUPPORT_2_TYPE(VALUE_NAME, VALUE_TYPE, GPBDATATYPE_NAME 1, GPBDATATYPE_NAME2)
71 //%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t f ieldNum, GPBDataType dataType) {
72 //% if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
73 //% return GPBCompute##GPBDATATYPE_NAME1##Size(fieldNum, value);
74 //% } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
75 //% return GPBCompute##GPBDATATYPE_NAME2##Size(fieldNum, value);
76 //% } else {
77 //% NSCAssert(NO, @"Unexpected type %d", dataType);
78 //% return 0;
79 //% }
80 //%}
81 //%
82 //%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_ TYPE value, uint32_t fieldNum, GPBDataType dataType) {
83 //% if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
84 //% [stream write##GPBDATATYPE_NAME1##:fieldNum value:value];
85 //% } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
86 //% [stream write##GPBDATATYPE_NAME2##:fieldNum value:value];
87 //% } else {
88 //% NSCAssert(NO, @"Unexpected type %d", dataType);
89 //% }
90 //%}
91 //%
92 //%PDDM-DEFINE SERIALIZE_SUPPORT_3_TYPE(VALUE_NAME, VALUE_TYPE, GPBDATATYPE_NAME 1, GPBDATATYPE_NAME2, GPBDATATYPE_NAME3)
93 //%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t f ieldNum, GPBDataType dataType) {
94 //% if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
95 //% return GPBCompute##GPBDATATYPE_NAME1##Size(fieldNum, value);
96 //% } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
97 //% return GPBCompute##GPBDATATYPE_NAME2##Size(fieldNum, value);
98 //% } else if (dataType == GPBDataType##GPBDATATYPE_NAME3) {
99 //% return GPBCompute##GPBDATATYPE_NAME3##Size(fieldNum, value);
100 //% } else {
101 //% NSCAssert(NO, @"Unexpected type %d", dataType);
102 //% return 0;
103 //% }
104 //%}
105 //%
106 //%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_ TYPE value, uint32_t fieldNum, GPBDataType dataType) {
107 //% if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
108 //% [stream write##GPBDATATYPE_NAME1##:fieldNum value:value];
109 //% } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) {
110 //% [stream write##GPBDATATYPE_NAME2##:fieldNum value:value];
111 //% } else if (dataType == GPBDataType##GPBDATATYPE_NAME3) {
112 //% [stream write##GPBDATATYPE_NAME3##:fieldNum value:value];
113 //% } else {
114 //% NSCAssert(NO, @"Unexpected type %d", dataType);
115 //% }
116 //%}
117 //%
118 //%PDDM-DEFINE SIMPLE_SERIALIZE_SUPPORT(VALUE_NAME, VALUE_TYPE, VisP)
119 //%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE VisP##value, uint 32_t fieldNum, GPBDataType dataType) {
120 //% NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType);
121 //% #pragma unused(dataType) // For when asserts are off in release.
122 //% return GPBCompute##VALUE_NAME##Size(fieldNum, value);
123 //%}
124 //%
125 //%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_ TYPE VisP##value, uint32_t fieldNum, GPBDataType dataType) {
126 //% NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType);
127 //% #pragma unused(dataType) // For when asserts are off in release.
128 //% [stream write##VALUE_NAME##:fieldNum value:value];
129 //%}
130 //%
131 //%PDDM-DEFINE SERIALIZE_SUPPORT_HELPERS()
132 //%SERIALIZE_SUPPORT_3_TYPE(Int32, int32_t, Int32, SInt32, SFixed32)
133 //%SERIALIZE_SUPPORT_2_TYPE(UInt32, uint32_t, UInt32, Fixed32)
134 //%SERIALIZE_SUPPORT_3_TYPE(Int64, int64_t, Int64, SInt64, SFixed64)
135 //%SERIALIZE_SUPPORT_2_TYPE(UInt64, uint64_t, UInt64, Fixed64)
136 //%SIMPLE_SERIALIZE_SUPPORT(Bool, BOOL, )
137 //%SIMPLE_SERIALIZE_SUPPORT(Enum, int32_t, )
138 //%SIMPLE_SERIALIZE_SUPPORT(Float, float, )
139 //%SIMPLE_SERIALIZE_SUPPORT(Double, double, )
140 //%SIMPLE_SERIALIZE_SUPPORT(String, NSString, *)
141 //%SERIALIZE_SUPPORT_3_TYPE(Object, id, Message, String, Bytes)
142 //%PDDM-EXPAND SERIALIZE_SUPPORT_HELPERS()
143 // This block of code is generated, do not edit it directly.
144
145 static size_t ComputeDictInt32FieldSize(int32_t value, uint32_t fieldNum, GPBDat aType dataType) {
146 if (dataType == GPBDataTypeInt32) {
147 return GPBComputeInt32Size(fieldNum, value);
148 } else if (dataType == GPBDataTypeSInt32) {
149 return GPBComputeSInt32Size(fieldNum, value);
150 } else if (dataType == GPBDataTypeSFixed32) {
151 return GPBComputeSFixed32Size(fieldNum, value);
152 } else {
153 NSCAssert(NO, @"Unexpected type %d", dataType);
154 return 0;
155 }
156 }
157
158 static void WriteDictInt32Field(GPBCodedOutputStream *stream, int32_t value, uin t32_t fieldNum, GPBDataType dataType) {
159 if (dataType == GPBDataTypeInt32) {
160 [stream writeInt32:fieldNum value:value];
161 } else if (dataType == GPBDataTypeSInt32) {
162 [stream writeSInt32:fieldNum value:value];
163 } else if (dataType == GPBDataTypeSFixed32) {
164 [stream writeSFixed32:fieldNum value:value];
165 } else {
166 NSCAssert(NO, @"Unexpected type %d", dataType);
167 }
168 }
169
170 static size_t ComputeDictUInt32FieldSize(uint32_t value, uint32_t fieldNum, GPBD ataType dataType) {
171 if (dataType == GPBDataTypeUInt32) {
172 return GPBComputeUInt32Size(fieldNum, value);
173 } else if (dataType == GPBDataTypeFixed32) {
174 return GPBComputeFixed32Size(fieldNum, value);
175 } else {
176 NSCAssert(NO, @"Unexpected type %d", dataType);
177 return 0;
178 }
179 }
180
181 static void WriteDictUInt32Field(GPBCodedOutputStream *stream, uint32_t value, u int32_t fieldNum, GPBDataType dataType) {
182 if (dataType == GPBDataTypeUInt32) {
183 [stream writeUInt32:fieldNum value:value];
184 } else if (dataType == GPBDataTypeFixed32) {
185 [stream writeFixed32:fieldNum value:value];
186 } else {
187 NSCAssert(NO, @"Unexpected type %d", dataType);
188 }
189 }
190
191 static size_t ComputeDictInt64FieldSize(int64_t value, uint32_t fieldNum, GPBDat aType dataType) {
192 if (dataType == GPBDataTypeInt64) {
193 return GPBComputeInt64Size(fieldNum, value);
194 } else if (dataType == GPBDataTypeSInt64) {
195 return GPBComputeSInt64Size(fieldNum, value);
196 } else if (dataType == GPBDataTypeSFixed64) {
197 return GPBComputeSFixed64Size(fieldNum, value);
198 } else {
199 NSCAssert(NO, @"Unexpected type %d", dataType);
200 return 0;
201 }
202 }
203
204 static void WriteDictInt64Field(GPBCodedOutputStream *stream, int64_t value, uin t32_t fieldNum, GPBDataType dataType) {
205 if (dataType == GPBDataTypeInt64) {
206 [stream writeInt64:fieldNum value:value];
207 } else if (dataType == GPBDataTypeSInt64) {
208 [stream writeSInt64:fieldNum value:value];
209 } else if (dataType == GPBDataTypeSFixed64) {
210 [stream writeSFixed64:fieldNum value:value];
211 } else {
212 NSCAssert(NO, @"Unexpected type %d", dataType);
213 }
214 }
215
216 static size_t ComputeDictUInt64FieldSize(uint64_t value, uint32_t fieldNum, GPBD ataType dataType) {
217 if (dataType == GPBDataTypeUInt64) {
218 return GPBComputeUInt64Size(fieldNum, value);
219 } else if (dataType == GPBDataTypeFixed64) {
220 return GPBComputeFixed64Size(fieldNum, value);
221 } else {
222 NSCAssert(NO, @"Unexpected type %d", dataType);
223 return 0;
224 }
225 }
226
227 static void WriteDictUInt64Field(GPBCodedOutputStream *stream, uint64_t value, u int32_t fieldNum, GPBDataType dataType) {
228 if (dataType == GPBDataTypeUInt64) {
229 [stream writeUInt64:fieldNum value:value];
230 } else if (dataType == GPBDataTypeFixed64) {
231 [stream writeFixed64:fieldNum value:value];
232 } else {
233 NSCAssert(NO, @"Unexpected type %d", dataType);
234 }
235 }
236
237 static size_t ComputeDictBoolFieldSize(BOOL value, uint32_t fieldNum, GPBDataTyp e dataType) {
238 NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType);
239 #pragma unused(dataType) // For when asserts are off in release.
240 return GPBComputeBoolSize(fieldNum, value);
241 }
242
243 static void WriteDictBoolField(GPBCodedOutputStream *stream, BOOL value, uint32_ t fieldNum, GPBDataType dataType) {
244 NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType);
245 #pragma unused(dataType) // For when asserts are off in release.
246 [stream writeBool:fieldNum value:value];
247 }
248
249 static size_t ComputeDictEnumFieldSize(int32_t value, uint32_t fieldNum, GPBData Type dataType) {
250 NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType);
251 #pragma unused(dataType) // For when asserts are off in release.
252 return GPBComputeEnumSize(fieldNum, value);
253 }
254
255 static void WriteDictEnumField(GPBCodedOutputStream *stream, int32_t value, uint 32_t fieldNum, GPBDataType dataType) {
256 NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType);
257 #pragma unused(dataType) // For when asserts are off in release.
258 [stream writeEnum:fieldNum value:value];
259 }
260
261 static size_t ComputeDictFloatFieldSize(float value, uint32_t fieldNum, GPBDataT ype dataType) {
262 NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType);
263 #pragma unused(dataType) // For when asserts are off in release.
264 return GPBComputeFloatSize(fieldNum, value);
265 }
266
267 static void WriteDictFloatField(GPBCodedOutputStream *stream, float value, uint3 2_t fieldNum, GPBDataType dataType) {
268 NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType);
269 #pragma unused(dataType) // For when asserts are off in release.
270 [stream writeFloat:fieldNum value:value];
271 }
272
273 static size_t ComputeDictDoubleFieldSize(double value, uint32_t fieldNum, GPBDat aType dataType) {
274 NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType);
275 #pragma unused(dataType) // For when asserts are off in release.
276 return GPBComputeDoubleSize(fieldNum, value);
277 }
278
279 static void WriteDictDoubleField(GPBCodedOutputStream *stream, double value, uin t32_t fieldNum, GPBDataType dataType) {
280 NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType);
281 #pragma unused(dataType) // For when asserts are off in release.
282 [stream writeDouble:fieldNum value:value];
283 }
284
285 static size_t ComputeDictStringFieldSize(NSString *value, uint32_t fieldNum, GPB DataType dataType) {
286 NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType);
287 #pragma unused(dataType) // For when asserts are off in release.
288 return GPBComputeStringSize(fieldNum, value);
289 }
290
291 static void WriteDictStringField(GPBCodedOutputStream *stream, NSString *value, uint32_t fieldNum, GPBDataType dataType) {
292 NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType);
293 #pragma unused(dataType) // For when asserts are off in release.
294 [stream writeString:fieldNum value:value];
295 }
296
297 static size_t ComputeDictObjectFieldSize(id value, uint32_t fieldNum, GPBDataTyp e dataType) {
298 if (dataType == GPBDataTypeMessage) {
299 return GPBComputeMessageSize(fieldNum, value);
300 } else if (dataType == GPBDataTypeString) {
301 return GPBComputeStringSize(fieldNum, value);
302 } else if (dataType == GPBDataTypeBytes) {
303 return GPBComputeBytesSize(fieldNum, value);
304 } else {
305 NSCAssert(NO, @"Unexpected type %d", dataType);
306 return 0;
307 }
308 }
309
310 static void WriteDictObjectField(GPBCodedOutputStream *stream, id value, uint32_ t fieldNum, GPBDataType dataType) {
311 if (dataType == GPBDataTypeMessage) {
312 [stream writeMessage:fieldNum value:value];
313 } else if (dataType == GPBDataTypeString) {
314 [stream writeString:fieldNum value:value];
315 } else if (dataType == GPBDataTypeBytes) {
316 [stream writeBytes:fieldNum value:value];
317 } else {
318 NSCAssert(NO, @"Unexpected type %d", dataType);
319 }
320 }
321
322 //%PDDM-EXPAND-END SERIALIZE_SUPPORT_HELPERS()
323
324 size_t GPBDictionaryComputeSizeInternalHelper(NSDictionary *dict, GPBFieldDescri ptor *field) {
325 GPBDataType mapValueType = GPBGetFieldDataType(field);
326 __block size_t result = 0;
327 [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
328 #pragma unused(stop)
329 size_t msgSize = GPBComputeStringSize(kMapKeyFieldNumber, key);
330 msgSize += ComputeDictObjectFieldSize(obj, kMapValueFieldNumber, mapValueTyp e);
331 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
332 }];
333 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
334 result += tagSize * dict.count;
335 return result;
336 }
337
338 void GPBDictionaryWriteToStreamInternalHelper(GPBCodedOutputStream *outputStream ,
339 NSDictionary *dict,
340 GPBFieldDescriptor *field) {
341 NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
342 GPBDataType mapValueType = GPBGetFieldDataType(field);
343 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
344 [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
345 #pragma unused(stop)
346 // Write the tag.
347 [outputStream writeInt32NoTag:tag];
348 // Write the size of the message.
349 size_t msgSize = GPBComputeStringSize(kMapKeyFieldNumber, key);
350 msgSize += ComputeDictObjectFieldSize(obj, kMapValueFieldNumber, mapValueTyp e);
351
352 // Write the size and fields.
353 [outputStream writeInt32NoTag:(int32_t)msgSize];
354 [outputStream writeString:kMapKeyFieldNumber value:key];
355 WriteDictObjectField(outputStream, obj, kMapValueFieldNumber, mapValueType);
356 }];
357 }
358
359 BOOL GPBDictionaryIsInitializedInternalHelper(NSDictionary *dict, GPBFieldDescri ptor *field) {
360 NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
361 NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeMessage, @"Unexpected value type");
362 #pragma unused(field) // For when asserts are off in release.
363 for (GPBMessage *msg in [dict objectEnumerator]) {
364 if (!msg.initialized) {
365 return NO;
366 }
367 }
368 return YES;
369 }
370
371 // Note: if the type is an object, it the retain pass back to the caller.
372 static void ReadValue(GPBCodedInputStream *stream,
373 GPBGenericValue *valueToFill,
374 GPBDataType type,
375 GPBExtensionRegistry *registry,
376 GPBFieldDescriptor *field) {
377 switch (type) {
378 case GPBDataTypeBool:
379 valueToFill->valueBool = GPBCodedInputStreamReadBool(&stream->state_);
380 break;
381 case GPBDataTypeFixed32:
382 valueToFill->valueUInt32 = GPBCodedInputStreamReadFixed32(&stream->state_) ;
383 break;
384 case GPBDataTypeSFixed32:
385 valueToFill->valueInt32 = GPBCodedInputStreamReadSFixed32(&stream->state_) ;
386 break;
387 case GPBDataTypeFloat:
388 valueToFill->valueFloat = GPBCodedInputStreamReadFloat(&stream->state_);
389 break;
390 case GPBDataTypeFixed64:
391 valueToFill->valueUInt64 = GPBCodedInputStreamReadFixed64(&stream->state_) ;
392 break;
393 case GPBDataTypeSFixed64:
394 valueToFill->valueInt64 = GPBCodedInputStreamReadSFixed64(&stream->state_) ;
395 break;
396 case GPBDataTypeDouble:
397 valueToFill->valueDouble = GPBCodedInputStreamReadDouble(&stream->state_);
398 break;
399 case GPBDataTypeInt32:
400 valueToFill->valueInt32 = GPBCodedInputStreamReadInt32(&stream->state_);
401 break;
402 case GPBDataTypeInt64:
403 valueToFill->valueInt64 = GPBCodedInputStreamReadInt32(&stream->state_);
404 break;
405 case GPBDataTypeSInt32:
406 valueToFill->valueInt32 = GPBCodedInputStreamReadSInt32(&stream->state_);
407 break;
408 case GPBDataTypeSInt64:
409 valueToFill->valueInt64 = GPBCodedInputStreamReadSInt64(&stream->state_);
410 break;
411 case GPBDataTypeUInt32:
412 valueToFill->valueUInt32 = GPBCodedInputStreamReadUInt32(&stream->state_);
413 break;
414 case GPBDataTypeUInt64:
415 valueToFill->valueUInt64 = GPBCodedInputStreamReadUInt64(&stream->state_);
416 break;
417 case GPBDataTypeBytes:
418 [valueToFill->valueData release];
419 valueToFill->valueData = GPBCodedInputStreamReadRetainedBytes(&stream->sta te_);
420 break;
421 case GPBDataTypeString:
422 [valueToFill->valueString release];
423 valueToFill->valueString = GPBCodedInputStreamReadRetainedString(&stream-> state_);
424 break;
425 case GPBDataTypeMessage: {
426 GPBMessage *message = [[field.msgClass alloc] init];
427 [stream readMessage:message extensionRegistry:registry];
428 [valueToFill->valueMessage release];
429 valueToFill->valueMessage = message;
430 break;
431 }
432 case GPBDataTypeGroup:
433 NSCAssert(NO, @"Can't happen");
434 break;
435 case GPBDataTypeEnum:
436 valueToFill->valueEnum = GPBCodedInputStreamReadEnum(&stream->state_);
437 break;
438 }
439 }
440
441 void GPBDictionaryReadEntry(id mapDictionary,
442 GPBCodedInputStream *stream,
443 GPBExtensionRegistry *registry,
444 GPBFieldDescriptor *field,
445 GPBMessage *parentMessage) {
446 GPBDataType keyDataType = field.mapKeyDataType;
447 GPBDataType valueDataType = GPBGetFieldDataType(field);
448
449 GPBGenericValue key;
450 GPBGenericValue value;
451 // Zero them (but pick up any enum default for proto2).
452 key.valueString = value.valueString = nil;
453 if (valueDataType == GPBDataTypeEnum) {
454 value = field.defaultValue;
455 }
456
457 GPBCodedInputStreamState *state = &stream->state_;
458 uint32_t keyTag =
459 GPBWireFormatMakeTag(kMapKeyFieldNumber, GPBWireFormatForType(keyDataType, NO));
460 uint32_t valueTag =
461 GPBWireFormatMakeTag(kMapValueFieldNumber, GPBWireFormatForType(valueDataT ype, NO));
462
463 BOOL hitError = NO;
464 while (YES) {
465 uint32_t tag = GPBCodedInputStreamReadTag(state);
466 if (tag == keyTag) {
467 ReadValue(stream, &key, keyDataType, registry, field);
468 } else if (tag == valueTag) {
469 ReadValue(stream, &value, valueDataType, registry, field);
470 } else if (tag == 0) {
471 // zero signals EOF / limit reached
472 break;
473 } else { // Unknown
474 if (![stream skipField:tag]){
475 hitError = YES;
476 break;
477 }
478 }
479 }
480
481 if (!hitError) {
482 // Handle the special defaults and/or missing key/value.
483 if ((keyDataType == GPBDataTypeString) && (key.valueString == nil)) {
484 key.valueString = [@"" retain];
485 }
486 if (GPBDataTypeIsObject(valueDataType) && value.valueString == nil) {
487 switch (valueDataType) {
488 case GPBDataTypeString:
489 value.valueString = [@"" retain];
490 break;
491 case GPBDataTypeBytes:
492 value.valueData = [GPBEmptyNSData() retain];
493 break;
494 #if defined(__clang_analyzer__)
495 case GPBDataTypeGroup:
496 // Maps can't really have Groups as the value type, but this case is n eeded
497 // so the analyzer won't report the posibility of send nil in for the value
498 // in the NSMutableDictionary case below.
499 #endif
500 case GPBDataTypeMessage: {
501 value.valueMessage = [[field.msgClass alloc] init];
502 break;
503 }
504 default:
505 // Nothing
506 break;
507 }
508 }
509
510 if ((keyDataType == GPBDataTypeString) && GPBDataTypeIsObject(valueDataType) ) {
511 #if GPB_STATIC_ANALYZER_ONLY(6020053, 7000181)
512 // Limited to Xcode 6.4 - 7.2, are known to fail here. The upper end can
513 // be raised as needed for new Xcodes.
514 //
515 // This is only needed on a "shallow" analyze; on a "deep" analyze, the
516 // existing code path gets this correct. In shallow, the analyzer decides
517 // GPBDataTypeIsObject(valueDataType) is both false and true on a single
518 // path through this function, allowing nil to be used for the
519 // setObject:forKey:.
520 if (value.valueString == nil) {
521 value.valueString = [@"" retain];
522 }
523 #endif
524 // mapDictionary is an NSMutableDictionary
525 [(NSMutableDictionary *)mapDictionary setObject:value.valueString
526 forKey:key.valueString];
527 } else {
528 if (valueDataType == GPBDataTypeEnum) {
529 if (GPBHasPreservingUnknownEnumSemantics([parentMessage descriptor].file .syntax) ||
530 [field isValidEnumValue:value.valueEnum]) {
531 [mapDictionary setGPBGenericValue:&value forGPBGenericValueKey:&key];
532 } else {
533 NSData *data = [mapDictionary serializedDataForUnknownValue:value.valu eEnum
534 forKey:&key
535 keyDataType:keyDataTyp e];
536 [parentMessage addUnknownMapEntry:GPBFieldNumber(field) value:data];
537 }
538 } else {
539 [mapDictionary setGPBGenericValue:&value forGPBGenericValueKey:&key];
540 }
541 }
542 }
543
544 if (GPBDataTypeIsObject(keyDataType)) {
545 [key.valueString release];
546 }
547 if (GPBDataTypeIsObject(valueDataType)) {
548 [value.valueString release];
549 }
550 }
551
552 //
553 // Macros for the common basic cases.
554 //
555
556 //%PDDM-DEFINE DICTIONARY_IMPL_FOR_POD_KEY(KEY_NAME, KEY_TYPE)
557 //%DICTIONARY_POD_IMPL_FOR_KEY(KEY_NAME, KEY_TYPE, , POD)
558 //%DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, Object, id)
559
560 //%PDDM-DEFINE DICTIONARY_POD_IMPL_FOR_KEY(KEY_NAME, KEY_TYPE, KisP, KHELPER)
561 //%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, UInt32, uint32_t, KHELPE R)
562 //%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Int32, int32_t, KHELPER)
563 //%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, UInt64, uint64_t, KHELPE R)
564 //%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Int64, int64_t, KHELPER)
565 //%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Bool, BOOL, KHELPER)
566 //%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Float, float, KHELPER)
567 //%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Double, double, KHELPER)
568 //%DICTIONARY_KEY_TO_ENUM_IMPL(KEY_NAME, KEY_TYPE, KisP, Enum, int32_t, KHELPER)
569
570 //%PDDM-DEFINE DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
571 //%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHEL PER, POD, value)
572
573 //%PDDM-DEFINE DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, VALUE_NAME, VALUE_TYPE)
574 //%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, , VALUE_NAME, VALUE_TYPE, POD, OBJ ECT, object)
575
576 //%PDDM-DEFINE DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALU E_TYPE, KHELPER, VHELPER, VNAME)
577 //%#pragma mark - KEY_NAME -> VALUE_NAME
578 //%
579 //%@implementation GPB##KEY_NAME##VALUE_NAME##Dictionary {
580 //% @package
581 //% NSMutableDictionary *_dictionary;
582 //%}
583 //%
584 //%+ (instancetype)dictionary {
585 //% return [[[self alloc] initWith##VNAME$u##s:NULL forKeys:NULL count:0] autor elease];
586 //%}
587 //%
588 //%+ (instancetype)dictionaryWith##VNAME$u##:(VALUE_TYPE)##VNAME
589 //% ##VNAME$S## forKey:(KEY_TYPE##KisP$S##KisP)key {
590 //% // Cast is needed so the compiler knows what class we are invoking initWith ##VNAME$u##s:forKeys:count:
591 //% // on to get the type correct.
592 //% return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWith##VNA ME$u##s:&##VNAME
593 //% KEY_NAME$S VALUE_NAME$S ##VNAME$S## fo rKeys:&key
594 //% KEY_NAME$S VALUE_NAME$S ##VNAME$S## count:1] autorelease];
595 //%}
596 //%
597 //%+ (instancetype)dictionaryWith##VNAME$u##s:(const VALUE_TYPE [])##VNAME##s
598 //% ##VNAME$S## forKeys:(const KEY_TYPE##KisP$S##KisP [])k eys
599 //% ##VNAME$S## count:(NSUInteger)count {
600 //% // Cast is needed so the compiler knows what class we are invoking initWith ##VNAME$u##s:forKeys:count:
601 //% // on to get the type correct.
602 //% return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWith##VNA ME$u##s:##VNAME##s
603 //% KEY_NAME$S VALUE_NAME$S forKeys: keys
604 //% KEY_NAME$S VALUE_NAME$S count: count] autorelease];
605 //%}
606 //%
607 //%+ (instancetype)dictionaryWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictiona ry *)dictionary {
608 //% // Cast is needed so the compiler knows what class we are invoking initWith Dictionary:
609 //% // on to get the type correct.
610 //% return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWithDicti onary:dictionary] autorelease];
611 //%}
612 //%
613 //%+ (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
614 //% return [[[self alloc] initWithCapacity:numItems] autorelease];
615 //%}
616 //%
617 //%- (instancetype)init {
618 //% return [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
619 //%}
620 //%
621 //%- (instancetype)initWith##VNAME$u##s:(const VALUE_TYPE [])##VNAME##s
622 //% ##VNAME$S## forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
623 //% ##VNAME$S## count:(NSUInteger)count {
624 //% self = [super init];
625 //% if (self) {
626 //% _dictionary = [[NSMutableDictionary alloc] init];
627 //% if (count && VNAME##s && keys) {
628 //% for (NSUInteger i = 0; i < count; ++i) {
629 //%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME##s[i], ______)##DICTIONARY_VALIDATE _KEY_##KHELPER(keys[i], ______) [_dictionary setObject:WRAPPED##VHELPER(V NAME##s[i]) forKey:WRAPPED##KHELPER(keys[i])];
630 //% }
631 //% }
632 //% }
633 //% return self;
634 //%}
635 //%
636 //%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)d ictionary {
637 //% self = [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
638 //% if (self) {
639 //% if (dictionary) {
640 //% [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
641 //% }
642 //% }
643 //% return self;
644 //%}
645 //%
646 //%- (instancetype)initWithCapacity:(NSUInteger)numItems {
647 //% #pragma unused(numItems)
648 //% return [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
649 //%}
650 //%
651 //%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, K HELPER, VHELPER, VNAME, )
652 //%
653 //%VALUE_FOR_KEY_##VHELPER(KEY_TYPE##KisP$S##KisP, VALUE_NAME, VALUE_TYPE, KHELP ER)
654 //%
655 //%DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHE LPER, VHELPER, VNAME, )
656 //%
657 //%@end
658 //%
659
660 //%PDDM-DEFINE DICTIONARY_KEY_TO_ENUM_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
661 //%DICTIONARY_KEY_TO_ENUM_IMPL2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE , KHELPER, POD)
662 //%PDDM-DEFINE DICTIONARY_KEY_TO_ENUM_IMPL2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME , VALUE_TYPE, KHELPER, VHELPER)
663 //%#pragma mark - KEY_NAME -> VALUE_NAME
664 //%
665 //%@implementation GPB##KEY_NAME##VALUE_NAME##Dictionary {
666 //% @package
667 //% NSMutableDictionary *_dictionary;
668 //% GPBEnumValidationFunc _validationFunc;
669 //%}
670 //%
671 //%@synthesize validationFunc = _validationFunc;
672 //%
673 //%+ (instancetype)dictionary {
674 //% return [[[self alloc] initWithValidationFunction:NULL
675 //% rawValues:NULL
676 //% forKeys:NULL
677 //% count:0] autorelease];
678 //%}
679 //%
680 //%+ (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func {
681 //% return [[[self alloc] initWithValidationFunction:func
682 //% rawValues:NULL
683 //% forKeys:NULL
684 //% count:0] autorelease];
685 //%}
686 //%
687 //%+ (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
688 //% rawValue:(VALUE_TYPE)rawValue
689 //% forKey:(KEY_TYPE##KisP$S##KisP)key {
690 //% // Cast is needed so the compiler knows what class we are invoking initWith Values:forKeys:count:
691 //% // on to get the type correct.
692 //% return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWithValid ationFunction:func
693 //% KEY_NAME$S VALUE_NAME$S rawValues:&rawValue
694 //% KEY_NAME$S VALUE_NAME$S forKeys:&key
695 //% KEY_NAME$S VALUE_NAME$S count:1] autorelease];
696 //%}
697 //%
698 //%+ (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
699 //% rawValues:(const VALUE_TYPE [])rawValu es
700 //% forKeys:(const KEY_TYPE##KisP$S##Kis P [])keys
701 //% count:(NSUInteger)count {
702 //% // Cast is needed so the compiler knows what class we are invoking initWith Values:forKeys:count:
703 //% // on to get the type correct.
704 //% return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWithValid ationFunction:func
705 //% KEY_NAME$S VALUE_NAME$S rawValues:rawValues
706 //% KEY_NAME$S VALUE_NAME$S forKeys:keys
707 //% KEY_NAME$S VALUE_NAME$S count:count] autorelease];
708 //%}
709 //%
710 //%+ (instancetype)dictionaryWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictiona ry *)dictionary {
711 //% // Cast is needed so the compiler knows what class we are invoking initWith Values:forKeys:count:
712 //% // on to get the type correct.
713 //% return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWithDicti onary:dictionary] autorelease];
714 //%}
715 //%
716 //%+ (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
717 //% capacity:(NSUInteger)numItems {
718 //% return [[[self alloc] initWithValidationFunction:func capacity:numItems] au torelease];
719 //%}
720 //%
721 //%- (instancetype)init {
722 //% return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL co unt:0];
723 //%}
724 //%
725 //%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
726 //% return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL co unt:0];
727 //%}
728 //%
729 //%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
730 //% rawValues:(const VALUE_TYPE [])rawValues
731 //% forKeys:(const KEY_TYPE##KisP$S##KisP [])k eys
732 //% count:(NSUInteger)count {
733 //% self = [super init];
734 //% if (self) {
735 //% _dictionary = [[NSMutableDictionary alloc] init];
736 //% _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
737 //% if (count && rawValues && keys) {
738 //% for (NSUInteger i = 0; i < count; ++i) {
739 //%DICTIONARY_VALIDATE_KEY_##KHELPER(keys[i], ______) [_dictionary setObj ect:WRAPPED##VHELPER(rawValues[i]) forKey:WRAPPED##KHELPER(keys[i])];
740 //% }
741 //% }
742 //% }
743 //% return self;
744 //%}
745 //%
746 //%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)d ictionary {
747 //% self = [self initWithValidationFunction:dictionary.validationFunc
748 //% rawValues:NULL
749 //% forKeys:NULL
750 //% count:0];
751 //% if (self) {
752 //% if (dictionary) {
753 //% [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
754 //% }
755 //% }
756 //% return self;
757 //%}
758 //%
759 //%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
760 //% capacity:(NSUInteger)numItems {
761 //% #pragma unused(numItems)
762 //% return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL co unt:0];
763 //%}
764 //%
765 //%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, K HELPER, VHELPER, value, Raw)
766 //%
767 //%- (BOOL)valueForKey:(KEY_TYPE##KisP$S##KisP)key value:(VALUE_TYPE *)value {
768 //% NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
769 //% if (wrapped && value) {
770 //% VALUE_TYPE result = UNWRAP##VALUE_NAME(wrapped);
771 //% if (!_validationFunc(result)) {
772 //% result = kGPBUnrecognizedEnumeratorValue;
773 //% }
774 //% *value = result;
775 //% }
776 //% return (wrapped != NULL);
777 //%}
778 //%
779 //%- (BOOL)valueForKey:(KEY_TYPE##KisP$S##KisP)key rawValue:(VALUE_TYPE *)rawVal ue {
780 //% NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
781 //% if (wrapped && rawValue) {
782 //% *rawValue = UNWRAP##VALUE_NAME(wrapped);
783 //% }
784 //% return (wrapped != NULL);
785 //%}
786 //%
787 //%- (void)enumerateKeysAndValuesUsingBlock:
788 //% (void (^)(KEY_TYPE KisP##key, VALUE_TYPE value, BOOL *stop))block {
789 //% GPBEnumValidationFunc func = _validationFunc;
790 //% [_dictionary enumerateKeysAndObjectsUsingBlock:^(ENUM_TYPE##KHELPER(KEY_TYP E)##aKey,
791 //% ENUM_TYPE##VHELPER(VALUE_T YPE)##aValue,
792 //% BOOL *stop) {
793 //% VALUE_TYPE unwrapped = UNWRAP##VALUE_NAME(aValue);
794 //% if (!func(unwrapped)) {
795 //% unwrapped = kGPBUnrecognizedEnumeratorValue;
796 //% }
797 //% block(UNWRAP##KEY_NAME(aKey), unwrapped, stop);
798 //% }];
799 //%}
800 //%
801 //%DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHE LPER, VHELPER, value, Raw)
802 //%
803 //%- (void)setValue:(VALUE_TYPE)value forKey:(KEY_TYPE##KisP$S##KisP)key {
804 //%DICTIONARY_VALIDATE_KEY_##KHELPER(key, ) if (!_validationFunc(value)) {
805 //% [NSException raise:NSInvalidArgumentException
806 //% format:@"GPB##KEY_NAME##VALUE_NAME##Dictionary: Attempt to se t an unknown enum value (%d)",
807 //% value];
808 //% }
809 //%
810 //% [_dictionary setObject:WRAPPED##VHELPER(value) forKey:WRAPPED##KHELPER(key) ];
811 //% if (_autocreator) {
812 //% GPBAutocreatedDictionaryModified(_autocreator, self);
813 //% }
814 //%}
815 //%
816 //%@end
817 //%
818
819 //%PDDM-DEFINE DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, V ALUE_TYPE, KHELPER, VHELPER, VNAME, ACCESSOR_NAME)
820 //%- (void)dealloc {
821 //% NSAssert(!_autocreator,
822 //% @"%@: Autocreator must be cleared before release, autocreator: %@" ,
823 //% [self class], _autocreator);
824 //% [_dictionary release];
825 //% [super dealloc];
826 //%}
827 //%
828 //%- (instancetype)copyWithZone:(NSZone *)zone {
829 //% return [[GPB##KEY_NAME##VALUE_NAME##Dictionary allocWithZone:zone] initWith Dictionary:self];
830 //%}
831 //%
832 //%- (BOOL)isEqual:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)other {
833 //% if (self == other) {
834 //% return YES;
835 //% }
836 //% if (![other isKindOfClass:[GPB##KEY_NAME##VALUE_NAME##Dictionary class]]) {
837 //% return NO;
838 //% }
839 //% return [_dictionary isEqual:other->_dictionary];
840 //%}
841 //%
842 //%- (NSUInteger)hash {
843 //% return _dictionary.count;
844 //%}
845 //%
846 //%- (NSString *)description {
847 //% return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _d ictionary];
848 //%}
849 //%
850 //%- (NSUInteger)count {
851 //% return _dictionary.count;
852 //%}
853 //%
854 //%- (void)enumerateKeysAnd##ACCESSOR_NAME##VNAME$u##sUsingBlock:
855 //% (void (^)(KEY_TYPE KisP##key, VALUE_TYPE VNAME, BOOL *stop))block {
856 //% [_dictionary enumerateKeysAndObjectsUsingBlock:^(ENUM_TYPE##KHELPER(KEY_TYP E)##aKey,
857 //% ENUM_TYPE##VHELPER(VALUE_T YPE)##a##VNAME$u,
858 //% BOOL *stop) {
859 //% block(UNWRAP##KEY_NAME(aKey), UNWRAP##VALUE_NAME(a##VNAME$u), stop);
860 //% }];
861 //%}
862 //%
863 //%EXTRA_METHODS_##VHELPER(KEY_NAME, VALUE_NAME)- (size_t)computeSerializedSizeA sField:(GPBFieldDescriptor *)field {
864 //% NSUInteger count = _dictionary.count;
865 //% if (count == 0) {
866 //% return 0;
867 //% }
868 //%
869 //% GPBDataType valueDataType = GPBGetFieldDataType(field);
870 //% GPBDataType keyDataType = field.mapKeyDataType;
871 //% __block size_t result = 0;
872 //% [_dictionary enumerateKeysAndObjectsUsingBlock:^(ENUM_TYPE##KHELPER(KEY_TYP E)##aKey,
873 //% ENUM_TYPE##VHELPER(VALUE_T YPE)##a##VNAME$u##,
874 //% BOOL *stop) {
875 //% #pragma unused(stop)
876 //% size_t msgSize = ComputeDict##KEY_NAME##FieldSize(UNWRAP##KEY_NAME(aKey), kMapKeyFieldNumber, keyDataType);
877 //% msgSize += ComputeDict##VALUE_NAME##FieldSize(UNWRAP##VALUE_NAME(a##VNAME $u), kMapValueFieldNumber, valueDataType);
878 //% result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
879 //% }];
880 //% size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBData TypeMessage);
881 //% result += tagSize * count;
882 //% return result;
883 //%}
884 //%
885 //%- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
886 //% asField:(GPBFieldDescriptor *)field {
887 //% GPBDataType valueDataType = GPBGetFieldDataType(field);
888 //% GPBDataType keyDataType = field.mapKeyDataType;
889 //% uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLen gthDelimited);
890 //% [_dictionary enumerateKeysAndObjectsUsingBlock:^(ENUM_TYPE##KHELPER(KEY_TYP E)##aKey,
891 //% ENUM_TYPE##VHELPER(VALUE_T YPE)##a##VNAME$u,
892 //% BOOL *stop) {
893 //% #pragma unused(stop)
894 //% // Write the tag.
895 //% [outputStream writeInt32NoTag:tag];
896 //% // Write the size of the message.
897 //% size_t msgSize = ComputeDict##KEY_NAME##FieldSize(UNWRAP##KEY_NAME(aKey), kMapKeyFieldNumber, keyDataType);
898 //% msgSize += ComputeDict##VALUE_NAME##FieldSize(UNWRAP##VALUE_NAME(a##VNAME $u), kMapValueFieldNumber, valueDataType);
899 //% [outputStream writeInt32NoTag:(int32_t)msgSize];
900 //% // Write the fields.
901 //% WriteDict##KEY_NAME##Field(outputStream, UNWRAP##KEY_NAME(aKey), kMapKeyF ieldNumber, keyDataType);
902 //% WriteDict##VALUE_NAME##Field(outputStream, UNWRAP##VALUE_NAME(a##VNAME$u) , kMapValueFieldNumber, valueDataType);
903 //% }];
904 //%}
905 //%
906 //%SERIAL_DATA_FOR_ENTRY_##VHELPER(KEY_NAME, VALUE_NAME)- (void)setGPBGenericVal ue:(GPBGenericValue *)value
907 //% forGPBGenericValueKey:(GPBGenericValue *)key {
908 //% [_dictionary setObject:WRAPPED##VHELPER(value->##GPBVALUE_##VHELPER(VALUE_N AME)##) forKey:WRAPPED##KHELPER(key->value##KEY_NAME)];
909 //%}
910 //%
911 //%- (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
912 //% [self enumerateKeysAnd##ACCESSOR_NAME##VNAME$u##sUsingBlock:^(KEY_TYPE KisP ##key, VALUE_TYPE VNAME, BOOL *stop) {
913 //% #pragma unused(stop)
914 //% block(TEXT_FORMAT_OBJ##KEY_NAME(key), TEXT_FORMAT_OBJ##VALUE_NAME(VNAME ));
915 //% }];
916 //%}
917 //%PDDM-DEFINE DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VAL UE_TYPE, KHELPER, VHELPER, VNAME, ACCESSOR_NAME)
918 //%- (void)add##ACCESSOR_NAME##EntriesFromDictionary:(GPB##KEY_NAME##VALUE_NAME# #Dictionary *)otherDictionary {
919 //% if (otherDictionary) {
920 //% [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
921 //% if (_autocreator) {
922 //% GPBAutocreatedDictionaryModified(_autocreator, self);
923 //% }
924 //% }
925 //%}
926 //%
927 //%- (void)set##ACCESSOR_NAME##VNAME$u##:(VALUE_TYPE)VNAME forKey:(KEY_TYPE##Kis P$S##KisP)key {
928 //%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME, )##DICTIONARY_VALIDATE_KEY_##KHELP ER(key, ) [_dictionary setObject:WRAPPED##VHELPER(VNAME) forKey:WRAPPED##KHELPE R(key)];
929 //% if (_autocreator) {
930 //% GPBAutocreatedDictionaryModified(_autocreator, self);
931 //% }
932 //%}
933 //%
934 //%- (void)remove##VNAME$u##ForKey:(KEY_TYPE##KisP$S##KisP)aKey {
935 //% [_dictionary removeObjectForKey:WRAPPED##KHELPER(aKey)];
936 //%}
937 //%
938 //%- (void)removeAll {
939 //% [_dictionary removeAllObjects];
940 //%}
941
942 //
943 // Custom Generation for Bool keys
944 //
945
946 //%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_POD_IMPL(VALUE_NAME, VALUE_TYPE)
947 //%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, POD, value)
948 //%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(VALUE_NAME, VALUE_TYPE)
949 //%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, OBJECT, object)
950
951 //%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, HELPER, VNAME)
952 //%#pragma mark - Bool -> VALUE_NAME
953 //%
954 //%@implementation GPBBool##VALUE_NAME##Dictionary {
955 //% @package
956 //% VALUE_TYPE _values[2];
957 //%BOOL_DICT_HAS_STORAGE_##HELPER()}
958 //%
959 //%+ (instancetype)dictionary {
960 //% return [[[self alloc] initWith##VNAME$u##s:NULL forKeys:NULL count:0] autor elease];
961 //%}
962 //%
963 //%+ (instancetype)dictionaryWith##VNAME$u##:(VALUE_TYPE)VNAME
964 //% ##VNAME$S## forKey:(BOOL)key {
965 //% // Cast is needed so the compiler knows what class we are invoking initWith ##VNAME$u##s:forKeys:count:
966 //% // on to get the type correct.
967 //% return [[(GPBBool##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME$u## s:&##VNAME
968 //% VALUE_NAME$S ##VNAME$S## forKeys: &key
969 //% VALUE_NAME$S ##VNAME$S## count: 1] autorelease];
970 //%}
971 //%
972 //%+ (instancetype)dictionaryWith##VNAME$u##s:(const VALUE_TYPE [])##VNAME##s
973 //% ##VNAME$S## forKeys:(const BOOL [])keys
974 //% ##VNAME$S## count:(NSUInteger)count {
975 //% // Cast is needed so the compiler knows what class we are invoking initWith ##VNAME$u##s:forKeys:count:
976 //% // on to get the type correct.
977 //% return [[(GPBBool##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME$u## s:##VNAME##s
978 //% VALUE_NAME$S ##VNAME$S## forKeys: keys
979 //% VALUE_NAME$S ##VNAME$S## count: count] autorelease];
980 //%}
981 //%
982 //%+ (instancetype)dictionaryWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)d ictionary {
983 //% // Cast is needed so the compiler knows what class we are invoking initWith Dictionary:
984 //% // on to get the type correct.
985 //% return [[(GPBBool##VALUE_NAME##Dictionary*)[self alloc] initWithDictionary: dictionary] autorelease];
986 //%}
987 //%
988 //%+ (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
989 //% return [[[self alloc] initWithCapacity:numItems] autorelease];
990 //%}
991 //%
992 //%- (instancetype)init {
993 //% return [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
994 //%}
995 //%
996 //%BOOL_DICT_INITS_##HELPER(VALUE_NAME, VALUE_TYPE)
997 //%
998 //%- (instancetype)initWithCapacity:(NSUInteger)numItems {
999 //% #pragma unused(numItems)
1000 //% return [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
1001 //%}
1002 //%
1003 //%BOOL_DICT_DEALLOC##HELPER()
1004 //%
1005 //%- (instancetype)copyWithZone:(NSZone *)zone {
1006 //% return [[GPBBool##VALUE_NAME##Dictionary allocWithZone:zone] initWithDictio nary:self];
1007 //%}
1008 //%
1009 //%- (BOOL)isEqual:(GPBBool##VALUE_NAME##Dictionary *)other {
1010 //% if (self == other) {
1011 //% return YES;
1012 //% }
1013 //% if (![other isKindOfClass:[GPBBool##VALUE_NAME##Dictionary class]]) {
1014 //% return NO;
1015 //% }
1016 //% if ((BOOL_DICT_W_HAS##HELPER(0, ) != BOOL_DICT_W_HAS##HELPER(0, other->)) | |
1017 //% (BOOL_DICT_W_HAS##HELPER(1, ) != BOOL_DICT_W_HAS##HELPER(1, other->))) {
1018 //% return NO;
1019 //% }
1020 //% if ((BOOL_DICT_W_HAS##HELPER(0, ) && (NEQ_##HELPER(_values[0], other->_valu es[0]))) ||
1021 //% (BOOL_DICT_W_HAS##HELPER(1, ) && (NEQ_##HELPER(_values[1], other->_valu es[1])))) {
1022 //% return NO;
1023 //% }
1024 //% return YES;
1025 //%}
1026 //%
1027 //%- (NSUInteger)hash {
1028 //% return (BOOL_DICT_W_HAS##HELPER(0, ) ? 1 : 0) + (BOOL_DICT_W_HAS##HELPER(1, ) ? 1 : 0);
1029 //%}
1030 //%
1031 //%- (NSString *)description {
1032 //% NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [ self class], self];
1033 //% if (BOOL_DICT_W_HAS##HELPER(0, )) {
1034 //% [result appendFormat:@"NO: STR_FORMAT_##HELPER(VALUE_NAME)", _values[0]];
1035 //% }
1036 //% if (BOOL_DICT_W_HAS##HELPER(1, )) {
1037 //% [result appendFormat:@"YES: STR_FORMAT_##HELPER(VALUE_NAME)", _values[1]] ;
1038 //% }
1039 //% [result appendString:@" }"];
1040 //% return result;
1041 //%}
1042 //%
1043 //%- (NSUInteger)count {
1044 //% return (BOOL_DICT_W_HAS##HELPER(0, ) ? 1 : 0) + (BOOL_DICT_W_HAS##HELPER(1, ) ? 1 : 0);
1045 //%}
1046 //%
1047 //%BOOL_VALUE_FOR_KEY_##HELPER(VALUE_TYPE)
1048 //%
1049 //%BOOL_SET_GPBVALUE_FOR_KEY_##HELPER(VALUE_NAME, VALUE_TYPE, VisP)
1050 //%
1051 //%- (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
1052 //% if (BOOL_DICT_HAS##HELPER(0, )) {
1053 //% block(@"false", TEXT_FORMAT_OBJ##VALUE_NAME(_values[0]));
1054 //% }
1055 //% if (BOOL_DICT_W_HAS##HELPER(1, )) {
1056 //% block(@"true", TEXT_FORMAT_OBJ##VALUE_NAME(_values[1]));
1057 //% }
1058 //%}
1059 //%
1060 //%- (void)enumerateKeysAnd##VNAME$u##sUsingBlock:
1061 //% (void (^)(BOOL key, VALUE_TYPE VNAME, BOOL *stop))block {
1062 //% BOOL stop = NO;
1063 //% if (BOOL_DICT_HAS##HELPER(0, )) {
1064 //% block(NO, _values[0], &stop);
1065 //% }
1066 //% if (!stop && BOOL_DICT_W_HAS##HELPER(1, )) {
1067 //% block(YES, _values[1], &stop);
1068 //% }
1069 //%}
1070 //%
1071 //%BOOL_EXTRA_METHODS_##HELPER(Bool, VALUE_NAME)- (size_t)computeSerializedSizeA sField:(GPBFieldDescriptor *)field {
1072 //% GPBDataType valueDataType = GPBGetFieldDataType(field);
1073 //% NSUInteger count = 0;
1074 //% size_t result = 0;
1075 //% for (int i = 0; i < 2; ++i) {
1076 //% if (BOOL_DICT_HAS##HELPER(i, )) {
1077 //% ++count;
1078 //% size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
1079 //% msgSize += ComputeDict##VALUE_NAME##FieldSize(_values[i], kMapValueFiel dNumber, valueDataType);
1080 //% result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1081 //% }
1082 //% }
1083 //% size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBData TypeMessage);
1084 //% result += tagSize * count;
1085 //% return result;
1086 //%}
1087 //%
1088 //%- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1089 //% asField:(GPBFieldDescriptor *)field {
1090 //% GPBDataType valueDataType = GPBGetFieldDataType(field);
1091 //% uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLen gthDelimited);
1092 //% for (int i = 0; i < 2; ++i) {
1093 //% if (BOOL_DICT_HAS##HELPER(i, )) {
1094 //% // Write the tag.
1095 //% [outputStream writeInt32NoTag:tag];
1096 //% // Write the size of the message.
1097 //% size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
1098 //% msgSize += ComputeDict##VALUE_NAME##FieldSize(_values[i], kMapValueFiel dNumber, valueDataType);
1099 //% [outputStream writeInt32NoTag:(int32_t)msgSize];
1100 //% // Write the fields.
1101 //% WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataT ypeBool);
1102 //% WriteDict##VALUE_NAME##Field(outputStream, _values[i], kMapValueFieldNu mber, valueDataType);
1103 //% }
1104 //% }
1105 //%}
1106 //%
1107 //%BOOL_DICT_MUTATIONS_##HELPER(VALUE_NAME, VALUE_TYPE)
1108 //%
1109 //%@end
1110 //%
1111
1112
1113 //
1114 // Helpers for PODs
1115 //
1116
1117 //%PDDM-DEFINE VALUE_FOR_KEY_POD(KEY_TYPE, VALUE_NAME, VALUE_TYPE, KHELPER)
1118 //%- (BOOL)valueForKey:(KEY_TYPE)key value:(VALUE_TYPE *)value {
1119 //% NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
1120 //% if (wrapped && value) {
1121 //% *value = UNWRAP##VALUE_NAME(wrapped);
1122 //% }
1123 //% return (wrapped != NULL);
1124 //%}
1125 //%PDDM-DEFINE WRAPPEDPOD(VALUE)
1126 //%@(VALUE)
1127 //%PDDM-DEFINE UNWRAPUInt32(VALUE)
1128 //%[VALUE unsignedIntValue]
1129 //%PDDM-DEFINE UNWRAPInt32(VALUE)
1130 //%[VALUE intValue]
1131 //%PDDM-DEFINE UNWRAPUInt64(VALUE)
1132 //%[VALUE unsignedLongLongValue]
1133 //%PDDM-DEFINE UNWRAPInt64(VALUE)
1134 //%[VALUE longLongValue]
1135 //%PDDM-DEFINE UNWRAPBool(VALUE)
1136 //%[VALUE boolValue]
1137 //%PDDM-DEFINE UNWRAPFloat(VALUE)
1138 //%[VALUE floatValue]
1139 //%PDDM-DEFINE UNWRAPDouble(VALUE)
1140 //%[VALUE doubleValue]
1141 //%PDDM-DEFINE UNWRAPEnum(VALUE)
1142 //%[VALUE intValue]
1143 //%PDDM-DEFINE TEXT_FORMAT_OBJUInt32(VALUE)
1144 //%[NSString stringWithFormat:@"%u", VALUE]
1145 //%PDDM-DEFINE TEXT_FORMAT_OBJInt32(VALUE)
1146 //%[NSString stringWithFormat:@"%d", VALUE]
1147 //%PDDM-DEFINE TEXT_FORMAT_OBJUInt64(VALUE)
1148 //%[NSString stringWithFormat:@"%llu", VALUE]
1149 //%PDDM-DEFINE TEXT_FORMAT_OBJInt64(VALUE)
1150 //%[NSString stringWithFormat:@"%lld", VALUE]
1151 //%PDDM-DEFINE TEXT_FORMAT_OBJBool(VALUE)
1152 //%(VALUE ? @"true" : @"false")
1153 //%PDDM-DEFINE TEXT_FORMAT_OBJFloat(VALUE)
1154 //%[NSString stringWithFormat:@"%.*g", FLT_DIG, VALUE]
1155 //%PDDM-DEFINE TEXT_FORMAT_OBJDouble(VALUE)
1156 //%[NSString stringWithFormat:@"%.*lg", DBL_DIG, VALUE]
1157 //%PDDM-DEFINE TEXT_FORMAT_OBJEnum(VALUE)
1158 //%@(VALUE)
1159 //%PDDM-DEFINE ENUM_TYPEPOD(TYPE)
1160 //%NSNumber *
1161 //%PDDM-DEFINE NEQ_POD(VAL1, VAL2)
1162 //%VAL1 != VAL2
1163 //%PDDM-DEFINE EXTRA_METHODS_POD(KEY_NAME, VALUE_NAME)
1164 // Empty
1165 //%PDDM-DEFINE BOOL_EXTRA_METHODS_POD(KEY_NAME, VALUE_NAME)
1166 // Empty
1167 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD(KEY_NAME, VALUE_NAME)
1168 //%SERIAL_DATA_FOR_ENTRY_POD_##VALUE_NAME(KEY_NAME)
1169 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_UInt32(KEY_NAME)
1170 // Empty
1171 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Int32(KEY_NAME)
1172 // Empty
1173 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_UInt64(KEY_NAME)
1174 // Empty
1175 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Int64(KEY_NAME)
1176 // Empty
1177 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Bool(KEY_NAME)
1178 // Empty
1179 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Float(KEY_NAME)
1180 // Empty
1181 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Double(KEY_NAME)
1182 // Empty
1183 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Enum(KEY_NAME)
1184 //%- (NSData *)serializedDataForUnknownValue:(int32_t)value
1185 //% forKey:(GPBGenericValue *)key
1186 //% keyDataType:(GPBDataType)keyDataType {
1187 //% size_t msgSize = ComputeDict##KEY_NAME##FieldSize(key->value##KEY_NAME, kMa pKeyFieldNumber, keyDataType);
1188 //% msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTyp eEnum);
1189 //% NSMutableData *data = [NSMutableData dataWithLength:msgSize];
1190 //% GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWith Data:data];
1191 //% WriteDict##KEY_NAME##Field(outputStream, key->value##KEY_NAME, kMapKeyField Number, keyDataType);
1192 //% WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEn um);
1193 //% [outputStream release];
1194 //% return data;
1195 //%}
1196 //%
1197 //%PDDM-DEFINE GPBVALUE_POD(VALUE_NAME)
1198 //%value##VALUE_NAME
1199 //%PDDM-DEFINE DICTIONARY_VALIDATE_VALUE_POD(VALUE_NAME, EXTRA_INDENT)
1200 // Empty
1201 //%PDDM-DEFINE DICTIONARY_VALIDATE_KEY_POD(KEY_NAME, EXTRA_INDENT)
1202 // Empty
1203
1204 //%PDDM-DEFINE BOOL_DICT_HAS_STORAGE_POD()
1205 //% BOOL _valueSet[2];
1206 //%
1207 //%PDDM-DEFINE BOOL_DICT_INITS_POD(VALUE_NAME, VALUE_TYPE)
1208 //%- (instancetype)initWithValues:(const VALUE_TYPE [])values
1209 //% forKeys:(const BOOL [])keys
1210 //% count:(NSUInteger)count {
1211 //% self = [super init];
1212 //% if (self) {
1213 //% for (NSUInteger i = 0; i < count; ++i) {
1214 //% int idx = keys[i] ? 1 : 0;
1215 //% _values[idx] = values[i];
1216 //% _valueSet[idx] = YES;
1217 //% }
1218 //% }
1219 //% return self;
1220 //%}
1221 //%
1222 //%- (instancetype)initWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)diction ary {
1223 //% self = [self initWithValues:NULL forKeys:NULL count:0];
1224 //% if (self) {
1225 //% if (dictionary) {
1226 //% for (int i = 0; i < 2; ++i) {
1227 //% if (dictionary->_valueSet[i]) {
1228 //% _values[i] = dictionary->_values[i];
1229 //% _valueSet[i] = YES;
1230 //% }
1231 //% }
1232 //% }
1233 //% }
1234 //% return self;
1235 //%}
1236 //%PDDM-DEFINE BOOL_DICT_DEALLOCPOD()
1237 //%#if !defined(NS_BLOCK_ASSERTIONS)
1238 //%- (void)dealloc {
1239 //% NSAssert(!_autocreator,
1240 //% @"%@: Autocreator must be cleared before release, autocreator: %@" ,
1241 //% [self class], _autocreator);
1242 //% [super dealloc];
1243 //%}
1244 //%#endif // !defined(NS_BLOCK_ASSERTIONS)
1245 //%PDDM-DEFINE BOOL_DICT_W_HASPOD(IDX, REF)
1246 //%BOOL_DICT_HASPOD(IDX, REF)
1247 //%PDDM-DEFINE BOOL_DICT_HASPOD(IDX, REF)
1248 //%REF##_valueSet[IDX]
1249 //%PDDM-DEFINE BOOL_VALUE_FOR_KEY_POD(VALUE_TYPE)
1250 //%- (BOOL)valueForKey:(BOOL)key value:(VALUE_TYPE *)value {
1251 //% int idx = (key ? 1 : 0);
1252 //% if (_valueSet[idx]) {
1253 //% if (value) {
1254 //% *value = _values[idx];
1255 //% }
1256 //% return YES;
1257 //% }
1258 //% return NO;
1259 //%}
1260 //%PDDM-DEFINE BOOL_SET_GPBVALUE_FOR_KEY_POD(VALUE_NAME, VALUE_TYPE, VisP)
1261 //%- (void)setGPBGenericValue:(GPBGenericValue *)value
1262 //% forGPBGenericValueKey:(GPBGenericValue *)key {
1263 //% int idx = (key->valueBool ? 1 : 0);
1264 //% _values[idx] = value->value##VALUE_NAME;
1265 //% _valueSet[idx] = YES;
1266 //%}
1267 //%PDDM-DEFINE BOOL_DICT_MUTATIONS_POD(VALUE_NAME, VALUE_TYPE)
1268 //%- (void)addEntriesFromDictionary:(GPBBool##VALUE_NAME##Dictionary *)otherDict ionary {
1269 //% if (otherDictionary) {
1270 //% for (int i = 0; i < 2; ++i) {
1271 //% if (otherDictionary->_valueSet[i]) {
1272 //% _valueSet[i] = YES;
1273 //% _values[i] = otherDictionary->_values[i];
1274 //% }
1275 //% }
1276 //% if (_autocreator) {
1277 //% GPBAutocreatedDictionaryModified(_autocreator, self);
1278 //% }
1279 //% }
1280 //%}
1281 //%
1282 //%- (void)setValue:(VALUE_TYPE)value forKey:(BOOL)key {
1283 //% int idx = (key ? 1 : 0);
1284 //% _values[idx] = value;
1285 //% _valueSet[idx] = YES;
1286 //% if (_autocreator) {
1287 //% GPBAutocreatedDictionaryModified(_autocreator, self);
1288 //% }
1289 //%}
1290 //%
1291 //%- (void)removeValueForKey:(BOOL)aKey {
1292 //% _valueSet[aKey ? 1 : 0] = NO;
1293 //%}
1294 //%
1295 //%- (void)removeAll {
1296 //% _valueSet[0] = NO;
1297 //% _valueSet[1] = NO;
1298 //%}
1299 //%PDDM-DEFINE STR_FORMAT_POD(VALUE_NAME)
1300 //%STR_FORMAT_##VALUE_NAME()
1301 //%PDDM-DEFINE STR_FORMAT_UInt32()
1302 //%%u
1303 //%PDDM-DEFINE STR_FORMAT_Int32()
1304 //%%d
1305 //%PDDM-DEFINE STR_FORMAT_UInt64()
1306 //%%llu
1307 //%PDDM-DEFINE STR_FORMAT_Int64()
1308 //%%lld
1309 //%PDDM-DEFINE STR_FORMAT_Bool()
1310 //%%d
1311 //%PDDM-DEFINE STR_FORMAT_Float()
1312 //%%f
1313 //%PDDM-DEFINE STR_FORMAT_Double()
1314 //%%lf
1315
1316 //
1317 // Helpers for Objects
1318 //
1319
1320 //%PDDM-DEFINE VALUE_FOR_KEY_OBJECT(KEY_TYPE, VALUE_NAME, VALUE_TYPE, KHELPER)
1321 //%- (VALUE_TYPE)objectForKey:(KEY_TYPE)key {
1322 //% VALUE_TYPE result = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
1323 //% return result;
1324 //%}
1325 //%PDDM-DEFINE WRAPPEDOBJECT(VALUE)
1326 //%VALUE
1327 //%PDDM-DEFINE UNWRAPString(VALUE)
1328 //%VALUE
1329 //%PDDM-DEFINE UNWRAPObject(VALUE)
1330 //%VALUE
1331 //%PDDM-DEFINE TEXT_FORMAT_OBJString(VALUE)
1332 //%VALUE
1333 //%PDDM-DEFINE TEXT_FORMAT_OBJObject(VALUE)
1334 //%VALUE
1335 //%PDDM-DEFINE ENUM_TYPEOBJECT(TYPE)
1336 //%ENUM_TYPEOBJECT_##TYPE()
1337 //%PDDM-DEFINE ENUM_TYPEOBJECT_NSString()
1338 //%NSString *
1339 //%PDDM-DEFINE ENUM_TYPEOBJECT_id()
1340 //%id ##
1341 //%PDDM-DEFINE NEQ_OBJECT(VAL1, VAL2)
1342 //%![VAL1 isEqual:VAL2]
1343 //%PDDM-DEFINE EXTRA_METHODS_OBJECT(KEY_NAME, VALUE_NAME)
1344 //%- (BOOL)isInitialized {
1345 //% for (GPBMessage *msg in [_dictionary objectEnumerator]) {
1346 //% if (!msg.initialized) {
1347 //% return NO;
1348 //% }
1349 //% }
1350 //% return YES;
1351 //%}
1352 //%
1353 //%- (instancetype)deepCopyWithZone:(NSZone *)zone {
1354 //% GPB##KEY_NAME##VALUE_NAME##Dictionary *newDict =
1355 //% [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init];
1356 //% [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
1357 //% GPBMessage *msg,
1358 //% BOOL *stop) {
1359 //% #pragma unused(stop)
1360 //% GPBMessage *copiedMsg = [msg copyWithZone:zone];
1361 //% [newDict->_dictionary setObject:copiedMsg forKey:aKey];
1362 //% [copiedMsg release];
1363 //% }];
1364 //% return newDict;
1365 //%}
1366 //%
1367 //%
1368 //%PDDM-DEFINE BOOL_EXTRA_METHODS_OBJECT(KEY_NAME, VALUE_NAME)
1369 //%- (BOOL)isInitialized {
1370 //% if (_values[0] && ![_values[0] isInitialized]) {
1371 //% return NO;
1372 //% }
1373 //% if (_values[1] && ![_values[1] isInitialized]) {
1374 //% return NO;
1375 //% }
1376 //% return YES;
1377 //%}
1378 //%
1379 //%- (instancetype)deepCopyWithZone:(NSZone *)zone {
1380 //% GPB##KEY_NAME##VALUE_NAME##Dictionary *newDict =
1381 //% [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init];
1382 //% for (int i = 0; i < 2; ++i) {
1383 //% if (_values[i] != nil) {
1384 //% newDict->_values[i] = [_values[i] copyWithZone:zone];
1385 //% }
1386 //% }
1387 //% return newDict;
1388 //%}
1389 //%
1390 //%
1391 //%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_OBJECT(KEY_NAME, VALUE_NAME)
1392 // Empty
1393 //%PDDM-DEFINE GPBVALUE_OBJECT(VALUE_NAME)
1394 //%valueString
1395 //%PDDM-DEFINE DICTIONARY_VALIDATE_VALUE_OBJECT(VALUE_NAME, EXTRA_INDENT)
1396 //%##EXTRA_INDENT$S## if (!##VALUE_NAME) {
1397 //%##EXTRA_INDENT$S## [NSException raise:NSInvalidArgumentException
1398 //%##EXTRA_INDENT$S## format:@"Attempting to add nil object to a Dictionary"];
1399 //%##EXTRA_INDENT$S## }
1400 //%
1401 //%PDDM-DEFINE DICTIONARY_VALIDATE_KEY_OBJECT(KEY_NAME, EXTRA_INDENT)
1402 //%##EXTRA_INDENT$S## if (!##KEY_NAME) {
1403 //%##EXTRA_INDENT$S## [NSException raise:NSInvalidArgumentException
1404 //%##EXTRA_INDENT$S## format:@"Attempting to add nil key to a Dic tionary"];
1405 //%##EXTRA_INDENT$S## }
1406 //%
1407
1408 //%PDDM-DEFINE BOOL_DICT_HAS_STORAGE_OBJECT()
1409 // Empty
1410 //%PDDM-DEFINE BOOL_DICT_INITS_OBJECT(VALUE_NAME, VALUE_TYPE)
1411 //%- (instancetype)initWithObjects:(const VALUE_TYPE [])objects
1412 //% forKeys:(const BOOL [])keys
1413 //% count:(NSUInteger)count {
1414 //% self = [super init];
1415 //% if (self) {
1416 //% for (NSUInteger i = 0; i < count; ++i) {
1417 //% if (!objects[i]) {
1418 //% [NSException raise:NSInvalidArgumentException
1419 //% format:@"Attempting to add nil object to a Dictionary"];
1420 //% }
1421 //% int idx = keys[i] ? 1 : 0;
1422 //% [_values[idx] release];
1423 //% _values[idx] = (VALUE_TYPE)[objects[i] retain];
1424 //% }
1425 //% }
1426 //% return self;
1427 //%}
1428 //%
1429 //%- (instancetype)initWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)diction ary {
1430 //% self = [self initWithObjects:NULL forKeys:NULL count:0];
1431 //% if (self) {
1432 //% if (dictionary) {
1433 //% _values[0] = [dictionary->_values[0] retain];
1434 //% _values[1] = [dictionary->_values[1] retain];
1435 //% }
1436 //% }
1437 //% return self;
1438 //%}
1439 //%PDDM-DEFINE BOOL_DICT_DEALLOCOBJECT()
1440 //%- (void)dealloc {
1441 //% NSAssert(!_autocreator,
1442 //% @"%@: Autocreator must be cleared before release, autocreator: %@" ,
1443 //% [self class], _autocreator);
1444 //% [_values[0] release];
1445 //% [_values[1] release];
1446 //% [super dealloc];
1447 //%}
1448 //%PDDM-DEFINE BOOL_DICT_W_HASOBJECT(IDX, REF)
1449 //%(BOOL_DICT_HASOBJECT(IDX, REF))
1450 //%PDDM-DEFINE BOOL_DICT_HASOBJECT(IDX, REF)
1451 //%REF##_values[IDX] != nil
1452 //%PDDM-DEFINE BOOL_VALUE_FOR_KEY_OBJECT(VALUE_TYPE)
1453 //%- (VALUE_TYPE)objectForKey:(BOOL)key {
1454 //% return _values[key ? 1 : 0];
1455 //%}
1456 //%PDDM-DEFINE BOOL_SET_GPBVALUE_FOR_KEY_OBJECT(VALUE_NAME, VALUE_TYPE, VisP)
1457 //%- (void)setGPBGenericValue:(GPBGenericValue *)value
1458 //% forGPBGenericValueKey:(GPBGenericValue *)key {
1459 //% int idx = (key->valueBool ? 1 : 0);
1460 //% [_values[idx] release];
1461 //% _values[idx] = [value->valueString retain];
1462 //%}
1463
1464 //%PDDM-DEFINE BOOL_DICT_MUTATIONS_OBJECT(VALUE_NAME, VALUE_TYPE)
1465 //%- (void)addEntriesFromDictionary:(GPBBool##VALUE_NAME##Dictionary *)otherDict ionary {
1466 //% if (otherDictionary) {
1467 //% for (int i = 0; i < 2; ++i) {
1468 //% if (otherDictionary->_values[i] != nil) {
1469 //% [_values[i] release];
1470 //% _values[i] = [otherDictionary->_values[i] retain];
1471 //% }
1472 //% }
1473 //% if (_autocreator) {
1474 //% GPBAutocreatedDictionaryModified(_autocreator, self);
1475 //% }
1476 //% }
1477 //%}
1478 //%
1479 //%- (void)setObject:(VALUE_TYPE)object forKey:(BOOL)key {
1480 //% if (!object) {
1481 //% [NSException raise:NSInvalidArgumentException
1482 //% format:@"Attempting to add nil object to a Dictionary"];
1483 //% }
1484 //% int idx = (key ? 1 : 0);
1485 //% [_values[idx] release];
1486 //% _values[idx] = [object retain];
1487 //% if (_autocreator) {
1488 //% GPBAutocreatedDictionaryModified(_autocreator, self);
1489 //% }
1490 //%}
1491 //%
1492 //%- (void)removeObjectForKey:(BOOL)aKey {
1493 //% int idx = (aKey ? 1 : 0);
1494 //% [_values[idx] release];
1495 //% _values[idx] = nil;
1496 //%}
1497 //%
1498 //%- (void)removeAll {
1499 //% for (int i = 0; i < 2; ++i) {
1500 //% [_values[i] release];
1501 //% _values[i] = nil;
1502 //% }
1503 //%}
1504 //%PDDM-DEFINE STR_FORMAT_OBJECT(VALUE_NAME)
1505 //%%@
1506
1507
1508 //%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt32, uint32_t)
1509 // This block of code is generated, do not edit it directly.
1510
1511 #pragma mark - UInt32 -> UInt32
1512
1513 @implementation GPBUInt32UInt32Dictionary {
1514 @package
1515 NSMutableDictionary *_dictionary;
1516 }
1517
1518 + (instancetype)dictionary {
1519 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
1520 }
1521
1522 + (instancetype)dictionaryWithValue:(uint32_t)value
1523 forKey:(uint32_t)key {
1524 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
1525 // on to get the type correct.
1526 return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithValues:&value
1527 forKeys:&key
1528 count:1] autoreleas e];
1529 }
1530
1531 + (instancetype)dictionaryWithValues:(const uint32_t [])values
1532 forKeys:(const uint32_t [])keys
1533 count:(NSUInteger)count {
1534 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
1535 // on to get the type correct.
1536 return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithValues:values
1537 forKeys:keys
1538 count:count] autore lease];
1539 }
1540
1541 + (instancetype)dictionaryWithDictionary:(GPBUInt32UInt32Dictionary *)dictionary {
1542 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
1543 // on to get the type correct.
1544 return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
1545 }
1546
1547 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
1548 return [[[self alloc] initWithCapacity:numItems] autorelease];
1549 }
1550
1551 - (instancetype)init {
1552 return [self initWithValues:NULL forKeys:NULL count:0];
1553 }
1554
1555 - (instancetype)initWithValues:(const uint32_t [])values
1556 forKeys:(const uint32_t [])keys
1557 count:(NSUInteger)count {
1558 self = [super init];
1559 if (self) {
1560 _dictionary = [[NSMutableDictionary alloc] init];
1561 if (count && values && keys) {
1562 for (NSUInteger i = 0; i < count; ++i) {
1563 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
1564 }
1565 }
1566 }
1567 return self;
1568 }
1569
1570 - (instancetype)initWithDictionary:(GPBUInt32UInt32Dictionary *)dictionary {
1571 self = [self initWithValues:NULL forKeys:NULL count:0];
1572 if (self) {
1573 if (dictionary) {
1574 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
1575 }
1576 }
1577 return self;
1578 }
1579
1580 - (instancetype)initWithCapacity:(NSUInteger)numItems {
1581 #pragma unused(numItems)
1582 return [self initWithValues:NULL forKeys:NULL count:0];
1583 }
1584
1585 - (void)dealloc {
1586 NSAssert(!_autocreator,
1587 @"%@: Autocreator must be cleared before release, autocreator: %@",
1588 [self class], _autocreator);
1589 [_dictionary release];
1590 [super dealloc];
1591 }
1592
1593 - (instancetype)copyWithZone:(NSZone *)zone {
1594 return [[GPBUInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self ];
1595 }
1596
1597 - (BOOL)isEqual:(GPBUInt32UInt32Dictionary *)other {
1598 if (self == other) {
1599 return YES;
1600 }
1601 if (![other isKindOfClass:[GPBUInt32UInt32Dictionary class]]) {
1602 return NO;
1603 }
1604 return [_dictionary isEqual:other->_dictionary];
1605 }
1606
1607 - (NSUInteger)hash {
1608 return _dictionary.count;
1609 }
1610
1611 - (NSString *)description {
1612 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
1613 }
1614
1615 - (NSUInteger)count {
1616 return _dictionary.count;
1617 }
1618
1619 - (void)enumerateKeysAndValuesUsingBlock:
1620 (void (^)(uint32_t key, uint32_t value, BOOL *stop))block {
1621 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
1622 NSNumber *aValue,
1623 BOOL *stop) {
1624 block([aKey unsignedIntValue], [aValue unsignedIntValue], stop);
1625 }];
1626 }
1627
1628 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
1629 NSUInteger count = _dictionary.count;
1630 if (count == 0) {
1631 return 0;
1632 }
1633
1634 GPBDataType valueDataType = GPBGetFieldDataType(field);
1635 GPBDataType keyDataType = field.mapKeyDataType;
1636 __block size_t result = 0;
1637 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
1638 NSNumber *aValue,
1639 BOOL *stop) {
1640 #pragma unused(stop)
1641 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
1642 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
1643 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1644 }];
1645 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
1646 result += tagSize * count;
1647 return result;
1648 }
1649
1650 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1651 asField:(GPBFieldDescriptor *)field {
1652 GPBDataType valueDataType = GPBGetFieldDataType(field);
1653 GPBDataType keyDataType = field.mapKeyDataType;
1654 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
1655 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
1656 NSNumber *aValue,
1657 BOOL *stop) {
1658 #pragma unused(stop)
1659 // Write the tag.
1660 [outputStream writeInt32NoTag:tag];
1661 // Write the size of the message.
1662 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
1663 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
1664 [outputStream writeInt32NoTag:(int32_t)msgSize];
1665 // Write the fields.
1666 WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumb er, keyDataType);
1667 WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueField Number, valueDataType);
1668 }];
1669 }
1670
1671 - (void)setGPBGenericValue:(GPBGenericValue *)value
1672 forGPBGenericValueKey:(GPBGenericValue *)key {
1673 [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueUInt32)];
1674 }
1675
1676 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
1677 [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, uint32_t value, BOOL *s top) {
1678 #pragma unused(stop)
1679 block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@ "%u", value]);
1680 }];
1681 }
1682
1683 - (BOOL)valueForKey:(uint32_t)key value:(uint32_t *)value {
1684 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
1685 if (wrapped && value) {
1686 *value = [wrapped unsignedIntValue];
1687 }
1688 return (wrapped != NULL);
1689 }
1690
1691 - (void)addEntriesFromDictionary:(GPBUInt32UInt32Dictionary *)otherDictionary {
1692 if (otherDictionary) {
1693 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
1694 if (_autocreator) {
1695 GPBAutocreatedDictionaryModified(_autocreator, self);
1696 }
1697 }
1698 }
1699
1700 - (void)setValue:(uint32_t)value forKey:(uint32_t)key {
1701 [_dictionary setObject:@(value) forKey:@(key)];
1702 if (_autocreator) {
1703 GPBAutocreatedDictionaryModified(_autocreator, self);
1704 }
1705 }
1706
1707 - (void)removeValueForKey:(uint32_t)aKey {
1708 [_dictionary removeObjectForKey:@(aKey)];
1709 }
1710
1711 - (void)removeAll {
1712 [_dictionary removeAllObjects];
1713 }
1714
1715 @end
1716
1717 #pragma mark - UInt32 -> Int32
1718
1719 @implementation GPBUInt32Int32Dictionary {
1720 @package
1721 NSMutableDictionary *_dictionary;
1722 }
1723
1724 + (instancetype)dictionary {
1725 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
1726 }
1727
1728 + (instancetype)dictionaryWithValue:(int32_t)value
1729 forKey:(uint32_t)key {
1730 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
1731 // on to get the type correct.
1732 return [[(GPBUInt32Int32Dictionary*)[self alloc] initWithValues:&value
1733 forKeys:&key
1734 count:1] autorelease ];
1735 }
1736
1737 + (instancetype)dictionaryWithValues:(const int32_t [])values
1738 forKeys:(const uint32_t [])keys
1739 count:(NSUInteger)count {
1740 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
1741 // on to get the type correct.
1742 return [[(GPBUInt32Int32Dictionary*)[self alloc] initWithValues:values
1743 forKeys:keys
1744 count:count] autorel ease];
1745 }
1746
1747 + (instancetype)dictionaryWithDictionary:(GPBUInt32Int32Dictionary *)dictionary {
1748 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
1749 // on to get the type correct.
1750 return [[(GPBUInt32Int32Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
1751 }
1752
1753 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
1754 return [[[self alloc] initWithCapacity:numItems] autorelease];
1755 }
1756
1757 - (instancetype)init {
1758 return [self initWithValues:NULL forKeys:NULL count:0];
1759 }
1760
1761 - (instancetype)initWithValues:(const int32_t [])values
1762 forKeys:(const uint32_t [])keys
1763 count:(NSUInteger)count {
1764 self = [super init];
1765 if (self) {
1766 _dictionary = [[NSMutableDictionary alloc] init];
1767 if (count && values && keys) {
1768 for (NSUInteger i = 0; i < count; ++i) {
1769 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
1770 }
1771 }
1772 }
1773 return self;
1774 }
1775
1776 - (instancetype)initWithDictionary:(GPBUInt32Int32Dictionary *)dictionary {
1777 self = [self initWithValues:NULL forKeys:NULL count:0];
1778 if (self) {
1779 if (dictionary) {
1780 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
1781 }
1782 }
1783 return self;
1784 }
1785
1786 - (instancetype)initWithCapacity:(NSUInteger)numItems {
1787 #pragma unused(numItems)
1788 return [self initWithValues:NULL forKeys:NULL count:0];
1789 }
1790
1791 - (void)dealloc {
1792 NSAssert(!_autocreator,
1793 @"%@: Autocreator must be cleared before release, autocreator: %@",
1794 [self class], _autocreator);
1795 [_dictionary release];
1796 [super dealloc];
1797 }
1798
1799 - (instancetype)copyWithZone:(NSZone *)zone {
1800 return [[GPBUInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self] ;
1801 }
1802
1803 - (BOOL)isEqual:(GPBUInt32Int32Dictionary *)other {
1804 if (self == other) {
1805 return YES;
1806 }
1807 if (![other isKindOfClass:[GPBUInt32Int32Dictionary class]]) {
1808 return NO;
1809 }
1810 return [_dictionary isEqual:other->_dictionary];
1811 }
1812
1813 - (NSUInteger)hash {
1814 return _dictionary.count;
1815 }
1816
1817 - (NSString *)description {
1818 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
1819 }
1820
1821 - (NSUInteger)count {
1822 return _dictionary.count;
1823 }
1824
1825 - (void)enumerateKeysAndValuesUsingBlock:
1826 (void (^)(uint32_t key, int32_t value, BOOL *stop))block {
1827 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
1828 NSNumber *aValue,
1829 BOOL *stop) {
1830 block([aKey unsignedIntValue], [aValue intValue], stop);
1831 }];
1832 }
1833
1834 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
1835 NSUInteger count = _dictionary.count;
1836 if (count == 0) {
1837 return 0;
1838 }
1839
1840 GPBDataType valueDataType = GPBGetFieldDataType(field);
1841 GPBDataType keyDataType = field.mapKeyDataType;
1842 __block size_t result = 0;
1843 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
1844 NSNumber *aValue,
1845 BOOL *stop) {
1846 #pragma unused(stop)
1847 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
1848 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
1849 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
1850 }];
1851 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
1852 result += tagSize * count;
1853 return result;
1854 }
1855
1856 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
1857 asField:(GPBFieldDescriptor *)field {
1858 GPBDataType valueDataType = GPBGetFieldDataType(field);
1859 GPBDataType keyDataType = field.mapKeyDataType;
1860 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
1861 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
1862 NSNumber *aValue,
1863 BOOL *stop) {
1864 #pragma unused(stop)
1865 // Write the tag.
1866 [outputStream writeInt32NoTag:tag];
1867 // Write the size of the message.
1868 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
1869 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
1870 [outputStream writeInt32NoTag:(int32_t)msgSize];
1871 // Write the fields.
1872 WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumb er, keyDataType);
1873 WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, v alueDataType);
1874 }];
1875 }
1876
1877 - (void)setGPBGenericValue:(GPBGenericValue *)value
1878 forGPBGenericValueKey:(GPBGenericValue *)key {
1879 [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueUInt32)];
1880 }
1881
1882 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
1883 [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, int32_t value, BOOL *st op) {
1884 #pragma unused(stop)
1885 block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@ "%d", value]);
1886 }];
1887 }
1888
1889 - (BOOL)valueForKey:(uint32_t)key value:(int32_t *)value {
1890 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
1891 if (wrapped && value) {
1892 *value = [wrapped intValue];
1893 }
1894 return (wrapped != NULL);
1895 }
1896
1897 - (void)addEntriesFromDictionary:(GPBUInt32Int32Dictionary *)otherDictionary {
1898 if (otherDictionary) {
1899 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
1900 if (_autocreator) {
1901 GPBAutocreatedDictionaryModified(_autocreator, self);
1902 }
1903 }
1904 }
1905
1906 - (void)setValue:(int32_t)value forKey:(uint32_t)key {
1907 [_dictionary setObject:@(value) forKey:@(key)];
1908 if (_autocreator) {
1909 GPBAutocreatedDictionaryModified(_autocreator, self);
1910 }
1911 }
1912
1913 - (void)removeValueForKey:(uint32_t)aKey {
1914 [_dictionary removeObjectForKey:@(aKey)];
1915 }
1916
1917 - (void)removeAll {
1918 [_dictionary removeAllObjects];
1919 }
1920
1921 @end
1922
1923 #pragma mark - UInt32 -> UInt64
1924
1925 @implementation GPBUInt32UInt64Dictionary {
1926 @package
1927 NSMutableDictionary *_dictionary;
1928 }
1929
1930 + (instancetype)dictionary {
1931 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
1932 }
1933
1934 + (instancetype)dictionaryWithValue:(uint64_t)value
1935 forKey:(uint32_t)key {
1936 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
1937 // on to get the type correct.
1938 return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithValues:&value
1939 forKeys:&key
1940 count:1] autoreleas e];
1941 }
1942
1943 + (instancetype)dictionaryWithValues:(const uint64_t [])values
1944 forKeys:(const uint32_t [])keys
1945 count:(NSUInteger)count {
1946 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
1947 // on to get the type correct.
1948 return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithValues:values
1949 forKeys:keys
1950 count:count] autore lease];
1951 }
1952
1953 + (instancetype)dictionaryWithDictionary:(GPBUInt32UInt64Dictionary *)dictionary {
1954 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
1955 // on to get the type correct.
1956 return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
1957 }
1958
1959 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
1960 return [[[self alloc] initWithCapacity:numItems] autorelease];
1961 }
1962
1963 - (instancetype)init {
1964 return [self initWithValues:NULL forKeys:NULL count:0];
1965 }
1966
1967 - (instancetype)initWithValues:(const uint64_t [])values
1968 forKeys:(const uint32_t [])keys
1969 count:(NSUInteger)count {
1970 self = [super init];
1971 if (self) {
1972 _dictionary = [[NSMutableDictionary alloc] init];
1973 if (count && values && keys) {
1974 for (NSUInteger i = 0; i < count; ++i) {
1975 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
1976 }
1977 }
1978 }
1979 return self;
1980 }
1981
1982 - (instancetype)initWithDictionary:(GPBUInt32UInt64Dictionary *)dictionary {
1983 self = [self initWithValues:NULL forKeys:NULL count:0];
1984 if (self) {
1985 if (dictionary) {
1986 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
1987 }
1988 }
1989 return self;
1990 }
1991
1992 - (instancetype)initWithCapacity:(NSUInteger)numItems {
1993 #pragma unused(numItems)
1994 return [self initWithValues:NULL forKeys:NULL count:0];
1995 }
1996
1997 - (void)dealloc {
1998 NSAssert(!_autocreator,
1999 @"%@: Autocreator must be cleared before release, autocreator: %@",
2000 [self class], _autocreator);
2001 [_dictionary release];
2002 [super dealloc];
2003 }
2004
2005 - (instancetype)copyWithZone:(NSZone *)zone {
2006 return [[GPBUInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self ];
2007 }
2008
2009 - (BOOL)isEqual:(GPBUInt32UInt64Dictionary *)other {
2010 if (self == other) {
2011 return YES;
2012 }
2013 if (![other isKindOfClass:[GPBUInt32UInt64Dictionary class]]) {
2014 return NO;
2015 }
2016 return [_dictionary isEqual:other->_dictionary];
2017 }
2018
2019 - (NSUInteger)hash {
2020 return _dictionary.count;
2021 }
2022
2023 - (NSString *)description {
2024 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
2025 }
2026
2027 - (NSUInteger)count {
2028 return _dictionary.count;
2029 }
2030
2031 - (void)enumerateKeysAndValuesUsingBlock:
2032 (void (^)(uint32_t key, uint64_t value, BOOL *stop))block {
2033 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2034 NSNumber *aValue,
2035 BOOL *stop) {
2036 block([aKey unsignedIntValue], [aValue unsignedLongLongValue], stop);
2037 }];
2038 }
2039
2040 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2041 NSUInteger count = _dictionary.count;
2042 if (count == 0) {
2043 return 0;
2044 }
2045
2046 GPBDataType valueDataType = GPBGetFieldDataType(field);
2047 GPBDataType keyDataType = field.mapKeyDataType;
2048 __block size_t result = 0;
2049 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2050 NSNumber *aValue,
2051 BOOL *stop) {
2052 #pragma unused(stop)
2053 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2054 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
2055 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2056 }];
2057 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
2058 result += tagSize * count;
2059 return result;
2060 }
2061
2062 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2063 asField:(GPBFieldDescriptor *)field {
2064 GPBDataType valueDataType = GPBGetFieldDataType(field);
2065 GPBDataType keyDataType = field.mapKeyDataType;
2066 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
2067 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2068 NSNumber *aValue,
2069 BOOL *stop) {
2070 #pragma unused(stop)
2071 // Write the tag.
2072 [outputStream writeInt32NoTag:tag];
2073 // Write the size of the message.
2074 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2075 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
2076 [outputStream writeInt32NoTag:(int32_t)msgSize];
2077 // Write the fields.
2078 WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumb er, keyDataType);
2079 WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValue FieldNumber, valueDataType);
2080 }];
2081 }
2082
2083 - (void)setGPBGenericValue:(GPBGenericValue *)value
2084 forGPBGenericValueKey:(GPBGenericValue *)key {
2085 [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueUInt32)];
2086 }
2087
2088 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
2089 [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, uint64_t value, BOOL *s top) {
2090 #pragma unused(stop)
2091 block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@ "%llu", value]);
2092 }];
2093 }
2094
2095 - (BOOL)valueForKey:(uint32_t)key value:(uint64_t *)value {
2096 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2097 if (wrapped && value) {
2098 *value = [wrapped unsignedLongLongValue];
2099 }
2100 return (wrapped != NULL);
2101 }
2102
2103 - (void)addEntriesFromDictionary:(GPBUInt32UInt64Dictionary *)otherDictionary {
2104 if (otherDictionary) {
2105 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2106 if (_autocreator) {
2107 GPBAutocreatedDictionaryModified(_autocreator, self);
2108 }
2109 }
2110 }
2111
2112 - (void)setValue:(uint64_t)value forKey:(uint32_t)key {
2113 [_dictionary setObject:@(value) forKey:@(key)];
2114 if (_autocreator) {
2115 GPBAutocreatedDictionaryModified(_autocreator, self);
2116 }
2117 }
2118
2119 - (void)removeValueForKey:(uint32_t)aKey {
2120 [_dictionary removeObjectForKey:@(aKey)];
2121 }
2122
2123 - (void)removeAll {
2124 [_dictionary removeAllObjects];
2125 }
2126
2127 @end
2128
2129 #pragma mark - UInt32 -> Int64
2130
2131 @implementation GPBUInt32Int64Dictionary {
2132 @package
2133 NSMutableDictionary *_dictionary;
2134 }
2135
2136 + (instancetype)dictionary {
2137 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
2138 }
2139
2140 + (instancetype)dictionaryWithValue:(int64_t)value
2141 forKey:(uint32_t)key {
2142 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2143 // on to get the type correct.
2144 return [[(GPBUInt32Int64Dictionary*)[self alloc] initWithValues:&value
2145 forKeys:&key
2146 count:1] autorelease ];
2147 }
2148
2149 + (instancetype)dictionaryWithValues:(const int64_t [])values
2150 forKeys:(const uint32_t [])keys
2151 count:(NSUInteger)count {
2152 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2153 // on to get the type correct.
2154 return [[(GPBUInt32Int64Dictionary*)[self alloc] initWithValues:values
2155 forKeys:keys
2156 count:count] autorel ease];
2157 }
2158
2159 + (instancetype)dictionaryWithDictionary:(GPBUInt32Int64Dictionary *)dictionary {
2160 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
2161 // on to get the type correct.
2162 return [[(GPBUInt32Int64Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
2163 }
2164
2165 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
2166 return [[[self alloc] initWithCapacity:numItems] autorelease];
2167 }
2168
2169 - (instancetype)init {
2170 return [self initWithValues:NULL forKeys:NULL count:0];
2171 }
2172
2173 - (instancetype)initWithValues:(const int64_t [])values
2174 forKeys:(const uint32_t [])keys
2175 count:(NSUInteger)count {
2176 self = [super init];
2177 if (self) {
2178 _dictionary = [[NSMutableDictionary alloc] init];
2179 if (count && values && keys) {
2180 for (NSUInteger i = 0; i < count; ++i) {
2181 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2182 }
2183 }
2184 }
2185 return self;
2186 }
2187
2188 - (instancetype)initWithDictionary:(GPBUInt32Int64Dictionary *)dictionary {
2189 self = [self initWithValues:NULL forKeys:NULL count:0];
2190 if (self) {
2191 if (dictionary) {
2192 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2193 }
2194 }
2195 return self;
2196 }
2197
2198 - (instancetype)initWithCapacity:(NSUInteger)numItems {
2199 #pragma unused(numItems)
2200 return [self initWithValues:NULL forKeys:NULL count:0];
2201 }
2202
2203 - (void)dealloc {
2204 NSAssert(!_autocreator,
2205 @"%@: Autocreator must be cleared before release, autocreator: %@",
2206 [self class], _autocreator);
2207 [_dictionary release];
2208 [super dealloc];
2209 }
2210
2211 - (instancetype)copyWithZone:(NSZone *)zone {
2212 return [[GPBUInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self] ;
2213 }
2214
2215 - (BOOL)isEqual:(GPBUInt32Int64Dictionary *)other {
2216 if (self == other) {
2217 return YES;
2218 }
2219 if (![other isKindOfClass:[GPBUInt32Int64Dictionary class]]) {
2220 return NO;
2221 }
2222 return [_dictionary isEqual:other->_dictionary];
2223 }
2224
2225 - (NSUInteger)hash {
2226 return _dictionary.count;
2227 }
2228
2229 - (NSString *)description {
2230 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
2231 }
2232
2233 - (NSUInteger)count {
2234 return _dictionary.count;
2235 }
2236
2237 - (void)enumerateKeysAndValuesUsingBlock:
2238 (void (^)(uint32_t key, int64_t value, BOOL *stop))block {
2239 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2240 NSNumber *aValue,
2241 BOOL *stop) {
2242 block([aKey unsignedIntValue], [aValue longLongValue], stop);
2243 }];
2244 }
2245
2246 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2247 NSUInteger count = _dictionary.count;
2248 if (count == 0) {
2249 return 0;
2250 }
2251
2252 GPBDataType valueDataType = GPBGetFieldDataType(field);
2253 GPBDataType keyDataType = field.mapKeyDataType;
2254 __block size_t result = 0;
2255 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2256 NSNumber *aValue,
2257 BOOL *stop) {
2258 #pragma unused(stop)
2259 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2260 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
2261 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2262 }];
2263 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
2264 result += tagSize * count;
2265 return result;
2266 }
2267
2268 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2269 asField:(GPBFieldDescriptor *)field {
2270 GPBDataType valueDataType = GPBGetFieldDataType(field);
2271 GPBDataType keyDataType = field.mapKeyDataType;
2272 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
2273 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2274 NSNumber *aValue,
2275 BOOL *stop) {
2276 #pragma unused(stop)
2277 // Write the tag.
2278 [outputStream writeInt32NoTag:tag];
2279 // Write the size of the message.
2280 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2281 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
2282 [outputStream writeInt32NoTag:(int32_t)msgSize];
2283 // Write the fields.
2284 WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumb er, keyDataType);
2285 WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumb er, valueDataType);
2286 }];
2287 }
2288
2289 - (void)setGPBGenericValue:(GPBGenericValue *)value
2290 forGPBGenericValueKey:(GPBGenericValue *)key {
2291 [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueUInt32)];
2292 }
2293
2294 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
2295 [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, int64_t value, BOOL *st op) {
2296 #pragma unused(stop)
2297 block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@ "%lld", value]);
2298 }];
2299 }
2300
2301 - (BOOL)valueForKey:(uint32_t)key value:(int64_t *)value {
2302 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2303 if (wrapped && value) {
2304 *value = [wrapped longLongValue];
2305 }
2306 return (wrapped != NULL);
2307 }
2308
2309 - (void)addEntriesFromDictionary:(GPBUInt32Int64Dictionary *)otherDictionary {
2310 if (otherDictionary) {
2311 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2312 if (_autocreator) {
2313 GPBAutocreatedDictionaryModified(_autocreator, self);
2314 }
2315 }
2316 }
2317
2318 - (void)setValue:(int64_t)value forKey:(uint32_t)key {
2319 [_dictionary setObject:@(value) forKey:@(key)];
2320 if (_autocreator) {
2321 GPBAutocreatedDictionaryModified(_autocreator, self);
2322 }
2323 }
2324
2325 - (void)removeValueForKey:(uint32_t)aKey {
2326 [_dictionary removeObjectForKey:@(aKey)];
2327 }
2328
2329 - (void)removeAll {
2330 [_dictionary removeAllObjects];
2331 }
2332
2333 @end
2334
2335 #pragma mark - UInt32 -> Bool
2336
2337 @implementation GPBUInt32BoolDictionary {
2338 @package
2339 NSMutableDictionary *_dictionary;
2340 }
2341
2342 + (instancetype)dictionary {
2343 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
2344 }
2345
2346 + (instancetype)dictionaryWithValue:(BOOL)value
2347 forKey:(uint32_t)key {
2348 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2349 // on to get the type correct.
2350 return [[(GPBUInt32BoolDictionary*)[self alloc] initWithValues:&value
2351 forKeys:&key
2352 count:1] autorelease] ;
2353 }
2354
2355 + (instancetype)dictionaryWithValues:(const BOOL [])values
2356 forKeys:(const uint32_t [])keys
2357 count:(NSUInteger)count {
2358 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2359 // on to get the type correct.
2360 return [[(GPBUInt32BoolDictionary*)[self alloc] initWithValues:values
2361 forKeys:keys
2362 count:count] autorele ase];
2363 }
2364
2365 + (instancetype)dictionaryWithDictionary:(GPBUInt32BoolDictionary *)dictionary {
2366 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
2367 // on to get the type correct.
2368 return [[(GPBUInt32BoolDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
2369 }
2370
2371 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
2372 return [[[self alloc] initWithCapacity:numItems] autorelease];
2373 }
2374
2375 - (instancetype)init {
2376 return [self initWithValues:NULL forKeys:NULL count:0];
2377 }
2378
2379 - (instancetype)initWithValues:(const BOOL [])values
2380 forKeys:(const uint32_t [])keys
2381 count:(NSUInteger)count {
2382 self = [super init];
2383 if (self) {
2384 _dictionary = [[NSMutableDictionary alloc] init];
2385 if (count && values && keys) {
2386 for (NSUInteger i = 0; i < count; ++i) {
2387 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2388 }
2389 }
2390 }
2391 return self;
2392 }
2393
2394 - (instancetype)initWithDictionary:(GPBUInt32BoolDictionary *)dictionary {
2395 self = [self initWithValues:NULL forKeys:NULL count:0];
2396 if (self) {
2397 if (dictionary) {
2398 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2399 }
2400 }
2401 return self;
2402 }
2403
2404 - (instancetype)initWithCapacity:(NSUInteger)numItems {
2405 #pragma unused(numItems)
2406 return [self initWithValues:NULL forKeys:NULL count:0];
2407 }
2408
2409 - (void)dealloc {
2410 NSAssert(!_autocreator,
2411 @"%@: Autocreator must be cleared before release, autocreator: %@",
2412 [self class], _autocreator);
2413 [_dictionary release];
2414 [super dealloc];
2415 }
2416
2417 - (instancetype)copyWithZone:(NSZone *)zone {
2418 return [[GPBUInt32BoolDictionary allocWithZone:zone] initWithDictionary:self];
2419 }
2420
2421 - (BOOL)isEqual:(GPBUInt32BoolDictionary *)other {
2422 if (self == other) {
2423 return YES;
2424 }
2425 if (![other isKindOfClass:[GPBUInt32BoolDictionary class]]) {
2426 return NO;
2427 }
2428 return [_dictionary isEqual:other->_dictionary];
2429 }
2430
2431 - (NSUInteger)hash {
2432 return _dictionary.count;
2433 }
2434
2435 - (NSString *)description {
2436 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
2437 }
2438
2439 - (NSUInteger)count {
2440 return _dictionary.count;
2441 }
2442
2443 - (void)enumerateKeysAndValuesUsingBlock:
2444 (void (^)(uint32_t key, BOOL value, BOOL *stop))block {
2445 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2446 NSNumber *aValue,
2447 BOOL *stop) {
2448 block([aKey unsignedIntValue], [aValue boolValue], stop);
2449 }];
2450 }
2451
2452 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2453 NSUInteger count = _dictionary.count;
2454 if (count == 0) {
2455 return 0;
2456 }
2457
2458 GPBDataType valueDataType = GPBGetFieldDataType(field);
2459 GPBDataType keyDataType = field.mapKeyDataType;
2460 __block size_t result = 0;
2461 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2462 NSNumber *aValue,
2463 BOOL *stop) {
2464 #pragma unused(stop)
2465 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2466 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
2467 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2468 }];
2469 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
2470 result += tagSize * count;
2471 return result;
2472 }
2473
2474 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2475 asField:(GPBFieldDescriptor *)field {
2476 GPBDataType valueDataType = GPBGetFieldDataType(field);
2477 GPBDataType keyDataType = field.mapKeyDataType;
2478 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
2479 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2480 NSNumber *aValue,
2481 BOOL *stop) {
2482 #pragma unused(stop)
2483 // Write the tag.
2484 [outputStream writeInt32NoTag:tag];
2485 // Write the size of the message.
2486 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2487 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
2488 [outputStream writeInt32NoTag:(int32_t)msgSize];
2489 // Write the fields.
2490 WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumb er, keyDataType);
2491 WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, v alueDataType);
2492 }];
2493 }
2494
2495 - (void)setGPBGenericValue:(GPBGenericValue *)value
2496 forGPBGenericValueKey:(GPBGenericValue *)key {
2497 [_dictionary setObject:@(value->valueBool) forKey:@(key->valueUInt32)];
2498 }
2499
2500 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
2501 [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, BOOL value, BOOL *stop) {
2502 #pragma unused(stop)
2503 block([NSString stringWithFormat:@"%u", key], (value ? @"true" : @"false") );
2504 }];
2505 }
2506
2507 - (BOOL)valueForKey:(uint32_t)key value:(BOOL *)value {
2508 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2509 if (wrapped && value) {
2510 *value = [wrapped boolValue];
2511 }
2512 return (wrapped != NULL);
2513 }
2514
2515 - (void)addEntriesFromDictionary:(GPBUInt32BoolDictionary *)otherDictionary {
2516 if (otherDictionary) {
2517 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2518 if (_autocreator) {
2519 GPBAutocreatedDictionaryModified(_autocreator, self);
2520 }
2521 }
2522 }
2523
2524 - (void)setValue:(BOOL)value forKey:(uint32_t)key {
2525 [_dictionary setObject:@(value) forKey:@(key)];
2526 if (_autocreator) {
2527 GPBAutocreatedDictionaryModified(_autocreator, self);
2528 }
2529 }
2530
2531 - (void)removeValueForKey:(uint32_t)aKey {
2532 [_dictionary removeObjectForKey:@(aKey)];
2533 }
2534
2535 - (void)removeAll {
2536 [_dictionary removeAllObjects];
2537 }
2538
2539 @end
2540
2541 #pragma mark - UInt32 -> Float
2542
2543 @implementation GPBUInt32FloatDictionary {
2544 @package
2545 NSMutableDictionary *_dictionary;
2546 }
2547
2548 + (instancetype)dictionary {
2549 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
2550 }
2551
2552 + (instancetype)dictionaryWithValue:(float)value
2553 forKey:(uint32_t)key {
2554 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2555 // on to get the type correct.
2556 return [[(GPBUInt32FloatDictionary*)[self alloc] initWithValues:&value
2557 forKeys:&key
2558 count:1] autorelease ];
2559 }
2560
2561 + (instancetype)dictionaryWithValues:(const float [])values
2562 forKeys:(const uint32_t [])keys
2563 count:(NSUInteger)count {
2564 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2565 // on to get the type correct.
2566 return [[(GPBUInt32FloatDictionary*)[self alloc] initWithValues:values
2567 forKeys:keys
2568 count:count] autorel ease];
2569 }
2570
2571 + (instancetype)dictionaryWithDictionary:(GPBUInt32FloatDictionary *)dictionary {
2572 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
2573 // on to get the type correct.
2574 return [[(GPBUInt32FloatDictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
2575 }
2576
2577 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
2578 return [[[self alloc] initWithCapacity:numItems] autorelease];
2579 }
2580
2581 - (instancetype)init {
2582 return [self initWithValues:NULL forKeys:NULL count:0];
2583 }
2584
2585 - (instancetype)initWithValues:(const float [])values
2586 forKeys:(const uint32_t [])keys
2587 count:(NSUInteger)count {
2588 self = [super init];
2589 if (self) {
2590 _dictionary = [[NSMutableDictionary alloc] init];
2591 if (count && values && keys) {
2592 for (NSUInteger i = 0; i < count; ++i) {
2593 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2594 }
2595 }
2596 }
2597 return self;
2598 }
2599
2600 - (instancetype)initWithDictionary:(GPBUInt32FloatDictionary *)dictionary {
2601 self = [self initWithValues:NULL forKeys:NULL count:0];
2602 if (self) {
2603 if (dictionary) {
2604 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2605 }
2606 }
2607 return self;
2608 }
2609
2610 - (instancetype)initWithCapacity:(NSUInteger)numItems {
2611 #pragma unused(numItems)
2612 return [self initWithValues:NULL forKeys:NULL count:0];
2613 }
2614
2615 - (void)dealloc {
2616 NSAssert(!_autocreator,
2617 @"%@: Autocreator must be cleared before release, autocreator: %@",
2618 [self class], _autocreator);
2619 [_dictionary release];
2620 [super dealloc];
2621 }
2622
2623 - (instancetype)copyWithZone:(NSZone *)zone {
2624 return [[GPBUInt32FloatDictionary allocWithZone:zone] initWithDictionary:self] ;
2625 }
2626
2627 - (BOOL)isEqual:(GPBUInt32FloatDictionary *)other {
2628 if (self == other) {
2629 return YES;
2630 }
2631 if (![other isKindOfClass:[GPBUInt32FloatDictionary class]]) {
2632 return NO;
2633 }
2634 return [_dictionary isEqual:other->_dictionary];
2635 }
2636
2637 - (NSUInteger)hash {
2638 return _dictionary.count;
2639 }
2640
2641 - (NSString *)description {
2642 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
2643 }
2644
2645 - (NSUInteger)count {
2646 return _dictionary.count;
2647 }
2648
2649 - (void)enumerateKeysAndValuesUsingBlock:
2650 (void (^)(uint32_t key, float value, BOOL *stop))block {
2651 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2652 NSNumber *aValue,
2653 BOOL *stop) {
2654 block([aKey unsignedIntValue], [aValue floatValue], stop);
2655 }];
2656 }
2657
2658 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2659 NSUInteger count = _dictionary.count;
2660 if (count == 0) {
2661 return 0;
2662 }
2663
2664 GPBDataType valueDataType = GPBGetFieldDataType(field);
2665 GPBDataType keyDataType = field.mapKeyDataType;
2666 __block size_t result = 0;
2667 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2668 NSNumber *aValue,
2669 BOOL *stop) {
2670 #pragma unused(stop)
2671 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2672 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
2673 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2674 }];
2675 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
2676 result += tagSize * count;
2677 return result;
2678 }
2679
2680 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2681 asField:(GPBFieldDescriptor *)field {
2682 GPBDataType valueDataType = GPBGetFieldDataType(field);
2683 GPBDataType keyDataType = field.mapKeyDataType;
2684 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
2685 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2686 NSNumber *aValue,
2687 BOOL *stop) {
2688 #pragma unused(stop)
2689 // Write the tag.
2690 [outputStream writeInt32NoTag:tag];
2691 // Write the size of the message.
2692 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2693 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
2694 [outputStream writeInt32NoTag:(int32_t)msgSize];
2695 // Write the fields.
2696 WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumb er, keyDataType);
2697 WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
2698 }];
2699 }
2700
2701 - (void)setGPBGenericValue:(GPBGenericValue *)value
2702 forGPBGenericValueKey:(GPBGenericValue *)key {
2703 [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueUInt32)];
2704 }
2705
2706 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
2707 [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, float value, BOOL *stop ) {
2708 #pragma unused(stop)
2709 block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@ "%.*g", FLT_DIG, value]);
2710 }];
2711 }
2712
2713 - (BOOL)valueForKey:(uint32_t)key value:(float *)value {
2714 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2715 if (wrapped && value) {
2716 *value = [wrapped floatValue];
2717 }
2718 return (wrapped != NULL);
2719 }
2720
2721 - (void)addEntriesFromDictionary:(GPBUInt32FloatDictionary *)otherDictionary {
2722 if (otherDictionary) {
2723 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2724 if (_autocreator) {
2725 GPBAutocreatedDictionaryModified(_autocreator, self);
2726 }
2727 }
2728 }
2729
2730 - (void)setValue:(float)value forKey:(uint32_t)key {
2731 [_dictionary setObject:@(value) forKey:@(key)];
2732 if (_autocreator) {
2733 GPBAutocreatedDictionaryModified(_autocreator, self);
2734 }
2735 }
2736
2737 - (void)removeValueForKey:(uint32_t)aKey {
2738 [_dictionary removeObjectForKey:@(aKey)];
2739 }
2740
2741 - (void)removeAll {
2742 [_dictionary removeAllObjects];
2743 }
2744
2745 @end
2746
2747 #pragma mark - UInt32 -> Double
2748
2749 @implementation GPBUInt32DoubleDictionary {
2750 @package
2751 NSMutableDictionary *_dictionary;
2752 }
2753
2754 + (instancetype)dictionary {
2755 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
2756 }
2757
2758 + (instancetype)dictionaryWithValue:(double)value
2759 forKey:(uint32_t)key {
2760 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2761 // on to get the type correct.
2762 return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithValues:&value
2763 forKeys:&key
2764 count:1] autoreleas e];
2765 }
2766
2767 + (instancetype)dictionaryWithValues:(const double [])values
2768 forKeys:(const uint32_t [])keys
2769 count:(NSUInteger)count {
2770 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2771 // on to get the type correct.
2772 return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithValues:values
2773 forKeys:keys
2774 count:count] autore lease];
2775 }
2776
2777 + (instancetype)dictionaryWithDictionary:(GPBUInt32DoubleDictionary *)dictionary {
2778 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
2779 // on to get the type correct.
2780 return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
2781 }
2782
2783 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
2784 return [[[self alloc] initWithCapacity:numItems] autorelease];
2785 }
2786
2787 - (instancetype)init {
2788 return [self initWithValues:NULL forKeys:NULL count:0];
2789 }
2790
2791 - (instancetype)initWithValues:(const double [])values
2792 forKeys:(const uint32_t [])keys
2793 count:(NSUInteger)count {
2794 self = [super init];
2795 if (self) {
2796 _dictionary = [[NSMutableDictionary alloc] init];
2797 if (count && values && keys) {
2798 for (NSUInteger i = 0; i < count; ++i) {
2799 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
2800 }
2801 }
2802 }
2803 return self;
2804 }
2805
2806 - (instancetype)initWithDictionary:(GPBUInt32DoubleDictionary *)dictionary {
2807 self = [self initWithValues:NULL forKeys:NULL count:0];
2808 if (self) {
2809 if (dictionary) {
2810 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
2811 }
2812 }
2813 return self;
2814 }
2815
2816 - (instancetype)initWithCapacity:(NSUInteger)numItems {
2817 #pragma unused(numItems)
2818 return [self initWithValues:NULL forKeys:NULL count:0];
2819 }
2820
2821 - (void)dealloc {
2822 NSAssert(!_autocreator,
2823 @"%@: Autocreator must be cleared before release, autocreator: %@",
2824 [self class], _autocreator);
2825 [_dictionary release];
2826 [super dealloc];
2827 }
2828
2829 - (instancetype)copyWithZone:(NSZone *)zone {
2830 return [[GPBUInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self ];
2831 }
2832
2833 - (BOOL)isEqual:(GPBUInt32DoubleDictionary *)other {
2834 if (self == other) {
2835 return YES;
2836 }
2837 if (![other isKindOfClass:[GPBUInt32DoubleDictionary class]]) {
2838 return NO;
2839 }
2840 return [_dictionary isEqual:other->_dictionary];
2841 }
2842
2843 - (NSUInteger)hash {
2844 return _dictionary.count;
2845 }
2846
2847 - (NSString *)description {
2848 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
2849 }
2850
2851 - (NSUInteger)count {
2852 return _dictionary.count;
2853 }
2854
2855 - (void)enumerateKeysAndValuesUsingBlock:
2856 (void (^)(uint32_t key, double value, BOOL *stop))block {
2857 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2858 NSNumber *aValue,
2859 BOOL *stop) {
2860 block([aKey unsignedIntValue], [aValue doubleValue], stop);
2861 }];
2862 }
2863
2864 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
2865 NSUInteger count = _dictionary.count;
2866 if (count == 0) {
2867 return 0;
2868 }
2869
2870 GPBDataType valueDataType = GPBGetFieldDataType(field);
2871 GPBDataType keyDataType = field.mapKeyDataType;
2872 __block size_t result = 0;
2873 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2874 NSNumber *aValue,
2875 BOOL *stop) {
2876 #pragma unused(stop)
2877 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2878 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
2879 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
2880 }];
2881 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
2882 result += tagSize * count;
2883 return result;
2884 }
2885
2886 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
2887 asField:(GPBFieldDescriptor *)field {
2888 GPBDataType valueDataType = GPBGetFieldDataType(field);
2889 GPBDataType keyDataType = field.mapKeyDataType;
2890 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
2891 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
2892 NSNumber *aValue,
2893 BOOL *stop) {
2894 #pragma unused(stop)
2895 // Write the tag.
2896 [outputStream writeInt32NoTag:tag];
2897 // Write the size of the message.
2898 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
2899 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
2900 [outputStream writeInt32NoTag:(int32_t)msgSize];
2901 // Write the fields.
2902 WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumb er, keyDataType);
2903 WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumbe r, valueDataType);
2904 }];
2905 }
2906
2907 - (void)setGPBGenericValue:(GPBGenericValue *)value
2908 forGPBGenericValueKey:(GPBGenericValue *)key {
2909 [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueUInt32)];
2910 }
2911
2912 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
2913 [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, double value, BOOL *sto p) {
2914 #pragma unused(stop)
2915 block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@ "%.*lg", DBL_DIG, value]);
2916 }];
2917 }
2918
2919 - (BOOL)valueForKey:(uint32_t)key value:(double *)value {
2920 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
2921 if (wrapped && value) {
2922 *value = [wrapped doubleValue];
2923 }
2924 return (wrapped != NULL);
2925 }
2926
2927 - (void)addEntriesFromDictionary:(GPBUInt32DoubleDictionary *)otherDictionary {
2928 if (otherDictionary) {
2929 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
2930 if (_autocreator) {
2931 GPBAutocreatedDictionaryModified(_autocreator, self);
2932 }
2933 }
2934 }
2935
2936 - (void)setValue:(double)value forKey:(uint32_t)key {
2937 [_dictionary setObject:@(value) forKey:@(key)];
2938 if (_autocreator) {
2939 GPBAutocreatedDictionaryModified(_autocreator, self);
2940 }
2941 }
2942
2943 - (void)removeValueForKey:(uint32_t)aKey {
2944 [_dictionary removeObjectForKey:@(aKey)];
2945 }
2946
2947 - (void)removeAll {
2948 [_dictionary removeAllObjects];
2949 }
2950
2951 @end
2952
2953 #pragma mark - UInt32 -> Enum
2954
2955 @implementation GPBUInt32EnumDictionary {
2956 @package
2957 NSMutableDictionary *_dictionary;
2958 GPBEnumValidationFunc _validationFunc;
2959 }
2960
2961 @synthesize validationFunc = _validationFunc;
2962
2963 + (instancetype)dictionary {
2964 return [[[self alloc] initWithValidationFunction:NULL
2965 rawValues:NULL
2966 forKeys:NULL
2967 count:0] autorelease];
2968 }
2969
2970 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func {
2971 return [[[self alloc] initWithValidationFunction:func
2972 rawValues:NULL
2973 forKeys:NULL
2974 count:0] autorelease];
2975 }
2976
2977 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
2978 rawValue:(int32_t)rawValue
2979 forKey:(uint32_t)key {
2980 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2981 // on to get the type correct.
2982 return [[(GPBUInt32EnumDictionary*)[self alloc] initWithValidationFunction:fun c
2983 rawValues:&ra wValue
2984 forKeys:&ke y
2985 count:1] autorelease];
2986 }
2987
2988 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
2989 rawValues:(const int32_t [])rawValues
2990 forKeys:(const uint32_t [])keys
2991 count:(NSUInteger)count {
2992 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
2993 // on to get the type correct.
2994 return [[(GPBUInt32EnumDictionary*)[self alloc] initWithValidationFunction:fun c
2995 rawValues:raw Values
2996 forKeys:key s
2997 count:cou nt] autorelease];
2998 }
2999
3000 + (instancetype)dictionaryWithDictionary:(GPBUInt32EnumDictionary *)dictionary {
3001 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
3002 // on to get the type correct.
3003 return [[(GPBUInt32EnumDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
3004 }
3005
3006 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
3007 capacity:(NSUInteger)numItems {
3008 return [[[self alloc] initWithValidationFunction:func capacity:numItems] autor elease];
3009 }
3010
3011 - (instancetype)init {
3012 return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count :0];
3013 }
3014
3015 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
3016 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
3017 }
3018
3019 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
3020 rawValues:(const int32_t [])rawValues
3021 forKeys:(const uint32_t [])keys
3022 count:(NSUInteger)count {
3023 self = [super init];
3024 if (self) {
3025 _dictionary = [[NSMutableDictionary alloc] init];
3026 _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
3027 if (count && rawValues && keys) {
3028 for (NSUInteger i = 0; i < count; ++i) {
3029 [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
3030 }
3031 }
3032 }
3033 return self;
3034 }
3035
3036 - (instancetype)initWithDictionary:(GPBUInt32EnumDictionary *)dictionary {
3037 self = [self initWithValidationFunction:dictionary.validationFunc
3038 rawValues:NULL
3039 forKeys:NULL
3040 count:0];
3041 if (self) {
3042 if (dictionary) {
3043 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3044 }
3045 }
3046 return self;
3047 }
3048
3049 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
3050 capacity:(NSUInteger)numItems {
3051 #pragma unused(numItems)
3052 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
3053 }
3054
3055 - (void)dealloc {
3056 NSAssert(!_autocreator,
3057 @"%@: Autocreator must be cleared before release, autocreator: %@",
3058 [self class], _autocreator);
3059 [_dictionary release];
3060 [super dealloc];
3061 }
3062
3063 - (instancetype)copyWithZone:(NSZone *)zone {
3064 return [[GPBUInt32EnumDictionary allocWithZone:zone] initWithDictionary:self];
3065 }
3066
3067 - (BOOL)isEqual:(GPBUInt32EnumDictionary *)other {
3068 if (self == other) {
3069 return YES;
3070 }
3071 if (![other isKindOfClass:[GPBUInt32EnumDictionary class]]) {
3072 return NO;
3073 }
3074 return [_dictionary isEqual:other->_dictionary];
3075 }
3076
3077 - (NSUInteger)hash {
3078 return _dictionary.count;
3079 }
3080
3081 - (NSString *)description {
3082 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
3083 }
3084
3085 - (NSUInteger)count {
3086 return _dictionary.count;
3087 }
3088
3089 - (void)enumerateKeysAndRawValuesUsingBlock:
3090 (void (^)(uint32_t key, int32_t value, BOOL *stop))block {
3091 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3092 NSNumber *aValue,
3093 BOOL *stop) {
3094 block([aKey unsignedIntValue], [aValue intValue], stop);
3095 }];
3096 }
3097
3098 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3099 NSUInteger count = _dictionary.count;
3100 if (count == 0) {
3101 return 0;
3102 }
3103
3104 GPBDataType valueDataType = GPBGetFieldDataType(field);
3105 GPBDataType keyDataType = field.mapKeyDataType;
3106 __block size_t result = 0;
3107 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3108 NSNumber *aValue,
3109 BOOL *stop) {
3110 #pragma unused(stop)
3111 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
3112 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
3113 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3114 }];
3115 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
3116 result += tagSize * count;
3117 return result;
3118 }
3119
3120 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3121 asField:(GPBFieldDescriptor *)field {
3122 GPBDataType valueDataType = GPBGetFieldDataType(field);
3123 GPBDataType keyDataType = field.mapKeyDataType;
3124 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
3125 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3126 NSNumber *aValue,
3127 BOOL *stop) {
3128 #pragma unused(stop)
3129 // Write the tag.
3130 [outputStream writeInt32NoTag:tag];
3131 // Write the size of the message.
3132 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
3133 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
3134 [outputStream writeInt32NoTag:(int32_t)msgSize];
3135 // Write the fields.
3136 WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumb er, keyDataType);
3137 WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, va lueDataType);
3138 }];
3139 }
3140
3141 - (NSData *)serializedDataForUnknownValue:(int32_t)value
3142 forKey:(GPBGenericValue *)key
3143 keyDataType:(GPBDataType)keyDataType {
3144 size_t msgSize = ComputeDictUInt32FieldSize(key->valueUInt32, kMapKeyFieldNumb er, keyDataType);
3145 msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEn um);
3146 NSMutableData *data = [NSMutableData dataWithLength:msgSize];
3147 GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithDat a:data];
3148 WriteDictUInt32Field(outputStream, key->valueUInt32, kMapKeyFieldNumber, keyDa taType);
3149 WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum) ;
3150 [outputStream release];
3151 return data;
3152 }
3153 - (void)setGPBGenericValue:(GPBGenericValue *)value
3154 forGPBGenericValueKey:(GPBGenericValue *)key {
3155 [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueUInt32)];
3156 }
3157
3158 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
3159 [self enumerateKeysAndRawValuesUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) {
3160 #pragma unused(stop)
3161 block([NSString stringWithFormat:@"%u", key], @(value));
3162 }];
3163 }
3164
3165 - (BOOL)valueForKey:(uint32_t)key value:(int32_t *)value {
3166 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3167 if (wrapped && value) {
3168 int32_t result = [wrapped intValue];
3169 if (!_validationFunc(result)) {
3170 result = kGPBUnrecognizedEnumeratorValue;
3171 }
3172 *value = result;
3173 }
3174 return (wrapped != NULL);
3175 }
3176
3177 - (BOOL)valueForKey:(uint32_t)key rawValue:(int32_t *)rawValue {
3178 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3179 if (wrapped && rawValue) {
3180 *rawValue = [wrapped intValue];
3181 }
3182 return (wrapped != NULL);
3183 }
3184
3185 - (void)enumerateKeysAndValuesUsingBlock:
3186 (void (^)(uint32_t key, int32_t value, BOOL *stop))block {
3187 GPBEnumValidationFunc func = _validationFunc;
3188 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3189 NSNumber *aValue,
3190 BOOL *stop) {
3191 int32_t unwrapped = [aValue intValue];
3192 if (!func(unwrapped)) {
3193 unwrapped = kGPBUnrecognizedEnumeratorValue;
3194 }
3195 block([aKey unsignedIntValue], unwrapped, stop);
3196 }];
3197 }
3198
3199 - (void)addRawEntriesFromDictionary:(GPBUInt32EnumDictionary *)otherDictionary {
3200 if (otherDictionary) {
3201 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3202 if (_autocreator) {
3203 GPBAutocreatedDictionaryModified(_autocreator, self);
3204 }
3205 }
3206 }
3207
3208 - (void)setRawValue:(int32_t)value forKey:(uint32_t)key {
3209 [_dictionary setObject:@(value) forKey:@(key)];
3210 if (_autocreator) {
3211 GPBAutocreatedDictionaryModified(_autocreator, self);
3212 }
3213 }
3214
3215 - (void)removeValueForKey:(uint32_t)aKey {
3216 [_dictionary removeObjectForKey:@(aKey)];
3217 }
3218
3219 - (void)removeAll {
3220 [_dictionary removeAllObjects];
3221 }
3222
3223 - (void)setValue:(int32_t)value forKey:(uint32_t)key {
3224 if (!_validationFunc(value)) {
3225 [NSException raise:NSInvalidArgumentException
3226 format:@"GPBUInt32EnumDictionary: Attempt to set an unknown enum value (%d)",
3227 value];
3228 }
3229
3230 [_dictionary setObject:@(value) forKey:@(key)];
3231 if (_autocreator) {
3232 GPBAutocreatedDictionaryModified(_autocreator, self);
3233 }
3234 }
3235
3236 @end
3237
3238 #pragma mark - UInt32 -> Object
3239
3240 @implementation GPBUInt32ObjectDictionary {
3241 @package
3242 NSMutableDictionary *_dictionary;
3243 }
3244
3245 + (instancetype)dictionary {
3246 return [[[self alloc] initWithObjects:NULL forKeys:NULL count:0] autorelease];
3247 }
3248
3249 + (instancetype)dictionaryWithObject:(id)object
3250 forKey:(uint32_t)key {
3251 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
3252 // on to get the type correct.
3253 return [[(GPBUInt32ObjectDictionary*)[self alloc] initWithObjects:&object
3254 forKeys:&key
3255 count:1] autorelea se];
3256 }
3257
3258 + (instancetype)dictionaryWithObjects:(const id [])objects
3259 forKeys:(const uint32_t [])keys
3260 count:(NSUInteger)count {
3261 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
3262 // on to get the type correct.
3263 return [[(GPBUInt32ObjectDictionary*)[self alloc] initWithObjects:objects
3264 forKeys:keys
3265 count:count] autore lease];
3266 }
3267
3268 + (instancetype)dictionaryWithDictionary:(GPBUInt32ObjectDictionary *)dictionary {
3269 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
3270 // on to get the type correct.
3271 return [[(GPBUInt32ObjectDictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
3272 }
3273
3274 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
3275 return [[[self alloc] initWithCapacity:numItems] autorelease];
3276 }
3277
3278 - (instancetype)init {
3279 return [self initWithObjects:NULL forKeys:NULL count:0];
3280 }
3281
3282 - (instancetype)initWithObjects:(const id [])objects
3283 forKeys:(const uint32_t [])keys
3284 count:(NSUInteger)count {
3285 self = [super init];
3286 if (self) {
3287 _dictionary = [[NSMutableDictionary alloc] init];
3288 if (count && objects && keys) {
3289 for (NSUInteger i = 0; i < count; ++i) {
3290 if (!objects[i]) {
3291 [NSException raise:NSInvalidArgumentException
3292 format:@"Attempting to add nil object to a Dictionary"];
3293 }
3294 [_dictionary setObject:objects[i] forKey:@(keys[i])];
3295 }
3296 }
3297 }
3298 return self;
3299 }
3300
3301 - (instancetype)initWithDictionary:(GPBUInt32ObjectDictionary *)dictionary {
3302 self = [self initWithObjects:NULL forKeys:NULL count:0];
3303 if (self) {
3304 if (dictionary) {
3305 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3306 }
3307 }
3308 return self;
3309 }
3310
3311 - (instancetype)initWithCapacity:(NSUInteger)numItems {
3312 #pragma unused(numItems)
3313 return [self initWithObjects:NULL forKeys:NULL count:0];
3314 }
3315
3316 - (void)dealloc {
3317 NSAssert(!_autocreator,
3318 @"%@: Autocreator must be cleared before release, autocreator: %@",
3319 [self class], _autocreator);
3320 [_dictionary release];
3321 [super dealloc];
3322 }
3323
3324 - (instancetype)copyWithZone:(NSZone *)zone {
3325 return [[GPBUInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self ];
3326 }
3327
3328 - (BOOL)isEqual:(GPBUInt32ObjectDictionary *)other {
3329 if (self == other) {
3330 return YES;
3331 }
3332 if (![other isKindOfClass:[GPBUInt32ObjectDictionary class]]) {
3333 return NO;
3334 }
3335 return [_dictionary isEqual:other->_dictionary];
3336 }
3337
3338 - (NSUInteger)hash {
3339 return _dictionary.count;
3340 }
3341
3342 - (NSString *)description {
3343 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
3344 }
3345
3346 - (NSUInteger)count {
3347 return _dictionary.count;
3348 }
3349
3350 - (void)enumerateKeysAndObjectsUsingBlock:
3351 (void (^)(uint32_t key, id object, BOOL *stop))block {
3352 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3353 id aObject,
3354 BOOL *stop) {
3355 block([aKey unsignedIntValue], aObject, stop);
3356 }];
3357 }
3358
3359 - (BOOL)isInitialized {
3360 for (GPBMessage *msg in [_dictionary objectEnumerator]) {
3361 if (!msg.initialized) {
3362 return NO;
3363 }
3364 }
3365 return YES;
3366 }
3367
3368 - (instancetype)deepCopyWithZone:(NSZone *)zone {
3369 GPBUInt32ObjectDictionary *newDict =
3370 [[GPBUInt32ObjectDictionary alloc] init];
3371 [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
3372 GPBMessage *msg,
3373 BOOL *stop) {
3374 #pragma unused(stop)
3375 GPBMessage *copiedMsg = [msg copyWithZone:zone];
3376 [newDict->_dictionary setObject:copiedMsg forKey:aKey];
3377 [copiedMsg release];
3378 }];
3379 return newDict;
3380 }
3381
3382 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3383 NSUInteger count = _dictionary.count;
3384 if (count == 0) {
3385 return 0;
3386 }
3387
3388 GPBDataType valueDataType = GPBGetFieldDataType(field);
3389 GPBDataType keyDataType = field.mapKeyDataType;
3390 __block size_t result = 0;
3391 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3392 id aObject,
3393 BOOL *stop) {
3394 #pragma unused(stop)
3395 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
3396 msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDa taType);
3397 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3398 }];
3399 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
3400 result += tagSize * count;
3401 return result;
3402 }
3403
3404 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3405 asField:(GPBFieldDescriptor *)field {
3406 GPBDataType valueDataType = GPBGetFieldDataType(field);
3407 GPBDataType keyDataType = field.mapKeyDataType;
3408 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
3409 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3410 id aObject,
3411 BOOL *stop) {
3412 #pragma unused(stop)
3413 // Write the tag.
3414 [outputStream writeInt32NoTag:tag];
3415 // Write the size of the message.
3416 size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKey FieldNumber, keyDataType);
3417 msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDa taType);
3418 [outputStream writeInt32NoTag:(int32_t)msgSize];
3419 // Write the fields.
3420 WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumb er, keyDataType);
3421 WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataT ype);
3422 }];
3423 }
3424
3425 - (void)setGPBGenericValue:(GPBGenericValue *)value
3426 forGPBGenericValueKey:(GPBGenericValue *)key {
3427 [_dictionary setObject:value->valueString forKey:@(key->valueUInt32)];
3428 }
3429
3430 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
3431 [self enumerateKeysAndObjectsUsingBlock:^(uint32_t key, id object, BOOL *stop) {
3432 #pragma unused(stop)
3433 block([NSString stringWithFormat:@"%u", key], object);
3434 }];
3435 }
3436
3437 - (id)objectForKey:(uint32_t)key {
3438 id result = [_dictionary objectForKey:@(key)];
3439 return result;
3440 }
3441
3442 - (void)addEntriesFromDictionary:(GPBUInt32ObjectDictionary *)otherDictionary {
3443 if (otherDictionary) {
3444 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3445 if (_autocreator) {
3446 GPBAutocreatedDictionaryModified(_autocreator, self);
3447 }
3448 }
3449 }
3450
3451 - (void)setObject:(id)object forKey:(uint32_t)key {
3452 if (!object) {
3453 [NSException raise:NSInvalidArgumentException
3454 format:@"Attempting to add nil object to a Dictionary"];
3455 }
3456 [_dictionary setObject:object forKey:@(key)];
3457 if (_autocreator) {
3458 GPBAutocreatedDictionaryModified(_autocreator, self);
3459 }
3460 }
3461
3462 - (void)removeObjectForKey:(uint32_t)aKey {
3463 [_dictionary removeObjectForKey:@(aKey)];
3464 }
3465
3466 - (void)removeAll {
3467 [_dictionary removeAllObjects];
3468 }
3469
3470 @end
3471
3472 //%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int32, int32_t)
3473 // This block of code is generated, do not edit it directly.
3474
3475 #pragma mark - Int32 -> UInt32
3476
3477 @implementation GPBInt32UInt32Dictionary {
3478 @package
3479 NSMutableDictionary *_dictionary;
3480 }
3481
3482 + (instancetype)dictionary {
3483 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
3484 }
3485
3486 + (instancetype)dictionaryWithValue:(uint32_t)value
3487 forKey:(int32_t)key {
3488 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
3489 // on to get the type correct.
3490 return [[(GPBInt32UInt32Dictionary*)[self alloc] initWithValues:&value
3491 forKeys:&key
3492 count:1] autorelease ];
3493 }
3494
3495 + (instancetype)dictionaryWithValues:(const uint32_t [])values
3496 forKeys:(const int32_t [])keys
3497 count:(NSUInteger)count {
3498 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
3499 // on to get the type correct.
3500 return [[(GPBInt32UInt32Dictionary*)[self alloc] initWithValues:values
3501 forKeys:keys
3502 count:count] autorel ease];
3503 }
3504
3505 + (instancetype)dictionaryWithDictionary:(GPBInt32UInt32Dictionary *)dictionary {
3506 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
3507 // on to get the type correct.
3508 return [[(GPBInt32UInt32Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
3509 }
3510
3511 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
3512 return [[[self alloc] initWithCapacity:numItems] autorelease];
3513 }
3514
3515 - (instancetype)init {
3516 return [self initWithValues:NULL forKeys:NULL count:0];
3517 }
3518
3519 - (instancetype)initWithValues:(const uint32_t [])values
3520 forKeys:(const int32_t [])keys
3521 count:(NSUInteger)count {
3522 self = [super init];
3523 if (self) {
3524 _dictionary = [[NSMutableDictionary alloc] init];
3525 if (count && values && keys) {
3526 for (NSUInteger i = 0; i < count; ++i) {
3527 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3528 }
3529 }
3530 }
3531 return self;
3532 }
3533
3534 - (instancetype)initWithDictionary:(GPBInt32UInt32Dictionary *)dictionary {
3535 self = [self initWithValues:NULL forKeys:NULL count:0];
3536 if (self) {
3537 if (dictionary) {
3538 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3539 }
3540 }
3541 return self;
3542 }
3543
3544 - (instancetype)initWithCapacity:(NSUInteger)numItems {
3545 #pragma unused(numItems)
3546 return [self initWithValues:NULL forKeys:NULL count:0];
3547 }
3548
3549 - (void)dealloc {
3550 NSAssert(!_autocreator,
3551 @"%@: Autocreator must be cleared before release, autocreator: %@",
3552 [self class], _autocreator);
3553 [_dictionary release];
3554 [super dealloc];
3555 }
3556
3557 - (instancetype)copyWithZone:(NSZone *)zone {
3558 return [[GPBInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self] ;
3559 }
3560
3561 - (BOOL)isEqual:(GPBInt32UInt32Dictionary *)other {
3562 if (self == other) {
3563 return YES;
3564 }
3565 if (![other isKindOfClass:[GPBInt32UInt32Dictionary class]]) {
3566 return NO;
3567 }
3568 return [_dictionary isEqual:other->_dictionary];
3569 }
3570
3571 - (NSUInteger)hash {
3572 return _dictionary.count;
3573 }
3574
3575 - (NSString *)description {
3576 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
3577 }
3578
3579 - (NSUInteger)count {
3580 return _dictionary.count;
3581 }
3582
3583 - (void)enumerateKeysAndValuesUsingBlock:
3584 (void (^)(int32_t key, uint32_t value, BOOL *stop))block {
3585 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3586 NSNumber *aValue,
3587 BOOL *stop) {
3588 block([aKey intValue], [aValue unsignedIntValue], stop);
3589 }];
3590 }
3591
3592 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3593 NSUInteger count = _dictionary.count;
3594 if (count == 0) {
3595 return 0;
3596 }
3597
3598 GPBDataType valueDataType = GPBGetFieldDataType(field);
3599 GPBDataType keyDataType = field.mapKeyDataType;
3600 __block size_t result = 0;
3601 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3602 NSNumber *aValue,
3603 BOOL *stop) {
3604 #pragma unused(stop)
3605 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
3606 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
3607 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3608 }];
3609 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
3610 result += tagSize * count;
3611 return result;
3612 }
3613
3614 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3615 asField:(GPBFieldDescriptor *)field {
3616 GPBDataType valueDataType = GPBGetFieldDataType(field);
3617 GPBDataType keyDataType = field.mapKeyDataType;
3618 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
3619 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3620 NSNumber *aValue,
3621 BOOL *stop) {
3622 #pragma unused(stop)
3623 // Write the tag.
3624 [outputStream writeInt32NoTag:tag];
3625 // Write the size of the message.
3626 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
3627 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
3628 [outputStream writeInt32NoTag:(int32_t)msgSize];
3629 // Write the fields.
3630 WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDa taType);
3631 WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueField Number, valueDataType);
3632 }];
3633 }
3634
3635 - (void)setGPBGenericValue:(GPBGenericValue *)value
3636 forGPBGenericValueKey:(GPBGenericValue *)key {
3637 [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueInt32)];
3638 }
3639
3640 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
3641 [self enumerateKeysAndValuesUsingBlock:^(int32_t key, uint32_t value, BOOL *st op) {
3642 #pragma unused(stop)
3643 block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@ "%u", value]);
3644 }];
3645 }
3646
3647 - (BOOL)valueForKey:(int32_t)key value:(uint32_t *)value {
3648 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3649 if (wrapped && value) {
3650 *value = [wrapped unsignedIntValue];
3651 }
3652 return (wrapped != NULL);
3653 }
3654
3655 - (void)addEntriesFromDictionary:(GPBInt32UInt32Dictionary *)otherDictionary {
3656 if (otherDictionary) {
3657 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3658 if (_autocreator) {
3659 GPBAutocreatedDictionaryModified(_autocreator, self);
3660 }
3661 }
3662 }
3663
3664 - (void)setValue:(uint32_t)value forKey:(int32_t)key {
3665 [_dictionary setObject:@(value) forKey:@(key)];
3666 if (_autocreator) {
3667 GPBAutocreatedDictionaryModified(_autocreator, self);
3668 }
3669 }
3670
3671 - (void)removeValueForKey:(int32_t)aKey {
3672 [_dictionary removeObjectForKey:@(aKey)];
3673 }
3674
3675 - (void)removeAll {
3676 [_dictionary removeAllObjects];
3677 }
3678
3679 @end
3680
3681 #pragma mark - Int32 -> Int32
3682
3683 @implementation GPBInt32Int32Dictionary {
3684 @package
3685 NSMutableDictionary *_dictionary;
3686 }
3687
3688 + (instancetype)dictionary {
3689 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
3690 }
3691
3692 + (instancetype)dictionaryWithValue:(int32_t)value
3693 forKey:(int32_t)key {
3694 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
3695 // on to get the type correct.
3696 return [[(GPBInt32Int32Dictionary*)[self alloc] initWithValues:&value
3697 forKeys:&key
3698 count:1] autorelease] ;
3699 }
3700
3701 + (instancetype)dictionaryWithValues:(const int32_t [])values
3702 forKeys:(const int32_t [])keys
3703 count:(NSUInteger)count {
3704 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
3705 // on to get the type correct.
3706 return [[(GPBInt32Int32Dictionary*)[self alloc] initWithValues:values
3707 forKeys:keys
3708 count:count] autorele ase];
3709 }
3710
3711 + (instancetype)dictionaryWithDictionary:(GPBInt32Int32Dictionary *)dictionary {
3712 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
3713 // on to get the type correct.
3714 return [[(GPBInt32Int32Dictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
3715 }
3716
3717 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
3718 return [[[self alloc] initWithCapacity:numItems] autorelease];
3719 }
3720
3721 - (instancetype)init {
3722 return [self initWithValues:NULL forKeys:NULL count:0];
3723 }
3724
3725 - (instancetype)initWithValues:(const int32_t [])values
3726 forKeys:(const int32_t [])keys
3727 count:(NSUInteger)count {
3728 self = [super init];
3729 if (self) {
3730 _dictionary = [[NSMutableDictionary alloc] init];
3731 if (count && values && keys) {
3732 for (NSUInteger i = 0; i < count; ++i) {
3733 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3734 }
3735 }
3736 }
3737 return self;
3738 }
3739
3740 - (instancetype)initWithDictionary:(GPBInt32Int32Dictionary *)dictionary {
3741 self = [self initWithValues:NULL forKeys:NULL count:0];
3742 if (self) {
3743 if (dictionary) {
3744 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3745 }
3746 }
3747 return self;
3748 }
3749
3750 - (instancetype)initWithCapacity:(NSUInteger)numItems {
3751 #pragma unused(numItems)
3752 return [self initWithValues:NULL forKeys:NULL count:0];
3753 }
3754
3755 - (void)dealloc {
3756 NSAssert(!_autocreator,
3757 @"%@: Autocreator must be cleared before release, autocreator: %@",
3758 [self class], _autocreator);
3759 [_dictionary release];
3760 [super dealloc];
3761 }
3762
3763 - (instancetype)copyWithZone:(NSZone *)zone {
3764 return [[GPBInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self];
3765 }
3766
3767 - (BOOL)isEqual:(GPBInt32Int32Dictionary *)other {
3768 if (self == other) {
3769 return YES;
3770 }
3771 if (![other isKindOfClass:[GPBInt32Int32Dictionary class]]) {
3772 return NO;
3773 }
3774 return [_dictionary isEqual:other->_dictionary];
3775 }
3776
3777 - (NSUInteger)hash {
3778 return _dictionary.count;
3779 }
3780
3781 - (NSString *)description {
3782 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
3783 }
3784
3785 - (NSUInteger)count {
3786 return _dictionary.count;
3787 }
3788
3789 - (void)enumerateKeysAndValuesUsingBlock:
3790 (void (^)(int32_t key, int32_t value, BOOL *stop))block {
3791 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3792 NSNumber *aValue,
3793 BOOL *stop) {
3794 block([aKey intValue], [aValue intValue], stop);
3795 }];
3796 }
3797
3798 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
3799 NSUInteger count = _dictionary.count;
3800 if (count == 0) {
3801 return 0;
3802 }
3803
3804 GPBDataType valueDataType = GPBGetFieldDataType(field);
3805 GPBDataType keyDataType = field.mapKeyDataType;
3806 __block size_t result = 0;
3807 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3808 NSNumber *aValue,
3809 BOOL *stop) {
3810 #pragma unused(stop)
3811 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
3812 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
3813 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
3814 }];
3815 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
3816 result += tagSize * count;
3817 return result;
3818 }
3819
3820 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
3821 asField:(GPBFieldDescriptor *)field {
3822 GPBDataType valueDataType = GPBGetFieldDataType(field);
3823 GPBDataType keyDataType = field.mapKeyDataType;
3824 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
3825 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3826 NSNumber *aValue,
3827 BOOL *stop) {
3828 #pragma unused(stop)
3829 // Write the tag.
3830 [outputStream writeInt32NoTag:tag];
3831 // Write the size of the message.
3832 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
3833 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
3834 [outputStream writeInt32NoTag:(int32_t)msgSize];
3835 // Write the fields.
3836 WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDa taType);
3837 WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, v alueDataType);
3838 }];
3839 }
3840
3841 - (void)setGPBGenericValue:(GPBGenericValue *)value
3842 forGPBGenericValueKey:(GPBGenericValue *)key {
3843 [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueInt32)];
3844 }
3845
3846 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
3847 [self enumerateKeysAndValuesUsingBlock:^(int32_t key, int32_t value, BOOL *sto p) {
3848 #pragma unused(stop)
3849 block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@ "%d", value]);
3850 }];
3851 }
3852
3853 - (BOOL)valueForKey:(int32_t)key value:(int32_t *)value {
3854 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
3855 if (wrapped && value) {
3856 *value = [wrapped intValue];
3857 }
3858 return (wrapped != NULL);
3859 }
3860
3861 - (void)addEntriesFromDictionary:(GPBInt32Int32Dictionary *)otherDictionary {
3862 if (otherDictionary) {
3863 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
3864 if (_autocreator) {
3865 GPBAutocreatedDictionaryModified(_autocreator, self);
3866 }
3867 }
3868 }
3869
3870 - (void)setValue:(int32_t)value forKey:(int32_t)key {
3871 [_dictionary setObject:@(value) forKey:@(key)];
3872 if (_autocreator) {
3873 GPBAutocreatedDictionaryModified(_autocreator, self);
3874 }
3875 }
3876
3877 - (void)removeValueForKey:(int32_t)aKey {
3878 [_dictionary removeObjectForKey:@(aKey)];
3879 }
3880
3881 - (void)removeAll {
3882 [_dictionary removeAllObjects];
3883 }
3884
3885 @end
3886
3887 #pragma mark - Int32 -> UInt64
3888
3889 @implementation GPBInt32UInt64Dictionary {
3890 @package
3891 NSMutableDictionary *_dictionary;
3892 }
3893
3894 + (instancetype)dictionary {
3895 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
3896 }
3897
3898 + (instancetype)dictionaryWithValue:(uint64_t)value
3899 forKey:(int32_t)key {
3900 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
3901 // on to get the type correct.
3902 return [[(GPBInt32UInt64Dictionary*)[self alloc] initWithValues:&value
3903 forKeys:&key
3904 count:1] autorelease ];
3905 }
3906
3907 + (instancetype)dictionaryWithValues:(const uint64_t [])values
3908 forKeys:(const int32_t [])keys
3909 count:(NSUInteger)count {
3910 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
3911 // on to get the type correct.
3912 return [[(GPBInt32UInt64Dictionary*)[self alloc] initWithValues:values
3913 forKeys:keys
3914 count:count] autorel ease];
3915 }
3916
3917 + (instancetype)dictionaryWithDictionary:(GPBInt32UInt64Dictionary *)dictionary {
3918 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
3919 // on to get the type correct.
3920 return [[(GPBInt32UInt64Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
3921 }
3922
3923 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
3924 return [[[self alloc] initWithCapacity:numItems] autorelease];
3925 }
3926
3927 - (instancetype)init {
3928 return [self initWithValues:NULL forKeys:NULL count:0];
3929 }
3930
3931 - (instancetype)initWithValues:(const uint64_t [])values
3932 forKeys:(const int32_t [])keys
3933 count:(NSUInteger)count {
3934 self = [super init];
3935 if (self) {
3936 _dictionary = [[NSMutableDictionary alloc] init];
3937 if (count && values && keys) {
3938 for (NSUInteger i = 0; i < count; ++i) {
3939 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
3940 }
3941 }
3942 }
3943 return self;
3944 }
3945
3946 - (instancetype)initWithDictionary:(GPBInt32UInt64Dictionary *)dictionary {
3947 self = [self initWithValues:NULL forKeys:NULL count:0];
3948 if (self) {
3949 if (dictionary) {
3950 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
3951 }
3952 }
3953 return self;
3954 }
3955
3956 - (instancetype)initWithCapacity:(NSUInteger)numItems {
3957 #pragma unused(numItems)
3958 return [self initWithValues:NULL forKeys:NULL count:0];
3959 }
3960
3961 - (void)dealloc {
3962 NSAssert(!_autocreator,
3963 @"%@: Autocreator must be cleared before release, autocreator: %@",
3964 [self class], _autocreator);
3965 [_dictionary release];
3966 [super dealloc];
3967 }
3968
3969 - (instancetype)copyWithZone:(NSZone *)zone {
3970 return [[GPBInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self] ;
3971 }
3972
3973 - (BOOL)isEqual:(GPBInt32UInt64Dictionary *)other {
3974 if (self == other) {
3975 return YES;
3976 }
3977 if (![other isKindOfClass:[GPBInt32UInt64Dictionary class]]) {
3978 return NO;
3979 }
3980 return [_dictionary isEqual:other->_dictionary];
3981 }
3982
3983 - (NSUInteger)hash {
3984 return _dictionary.count;
3985 }
3986
3987 - (NSString *)description {
3988 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
3989 }
3990
3991 - (NSUInteger)count {
3992 return _dictionary.count;
3993 }
3994
3995 - (void)enumerateKeysAndValuesUsingBlock:
3996 (void (^)(int32_t key, uint64_t value, BOOL *stop))block {
3997 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
3998 NSNumber *aValue,
3999 BOOL *stop) {
4000 block([aKey intValue], [aValue unsignedLongLongValue], stop);
4001 }];
4002 }
4003
4004 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4005 NSUInteger count = _dictionary.count;
4006 if (count == 0) {
4007 return 0;
4008 }
4009
4010 GPBDataType valueDataType = GPBGetFieldDataType(field);
4011 GPBDataType keyDataType = field.mapKeyDataType;
4012 __block size_t result = 0;
4013 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4014 NSNumber *aValue,
4015 BOOL *stop) {
4016 #pragma unused(stop)
4017 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4018 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
4019 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4020 }];
4021 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
4022 result += tagSize * count;
4023 return result;
4024 }
4025
4026 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4027 asField:(GPBFieldDescriptor *)field {
4028 GPBDataType valueDataType = GPBGetFieldDataType(field);
4029 GPBDataType keyDataType = field.mapKeyDataType;
4030 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
4031 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4032 NSNumber *aValue,
4033 BOOL *stop) {
4034 #pragma unused(stop)
4035 // Write the tag.
4036 [outputStream writeInt32NoTag:tag];
4037 // Write the size of the message.
4038 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4039 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
4040 [outputStream writeInt32NoTag:(int32_t)msgSize];
4041 // Write the fields.
4042 WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDa taType);
4043 WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValue FieldNumber, valueDataType);
4044 }];
4045 }
4046
4047 - (void)setGPBGenericValue:(GPBGenericValue *)value
4048 forGPBGenericValueKey:(GPBGenericValue *)key {
4049 [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueInt32)];
4050 }
4051
4052 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
4053 [self enumerateKeysAndValuesUsingBlock:^(int32_t key, uint64_t value, BOOL *st op) {
4054 #pragma unused(stop)
4055 block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@ "%llu", value]);
4056 }];
4057 }
4058
4059 - (BOOL)valueForKey:(int32_t)key value:(uint64_t *)value {
4060 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4061 if (wrapped && value) {
4062 *value = [wrapped unsignedLongLongValue];
4063 }
4064 return (wrapped != NULL);
4065 }
4066
4067 - (void)addEntriesFromDictionary:(GPBInt32UInt64Dictionary *)otherDictionary {
4068 if (otherDictionary) {
4069 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4070 if (_autocreator) {
4071 GPBAutocreatedDictionaryModified(_autocreator, self);
4072 }
4073 }
4074 }
4075
4076 - (void)setValue:(uint64_t)value forKey:(int32_t)key {
4077 [_dictionary setObject:@(value) forKey:@(key)];
4078 if (_autocreator) {
4079 GPBAutocreatedDictionaryModified(_autocreator, self);
4080 }
4081 }
4082
4083 - (void)removeValueForKey:(int32_t)aKey {
4084 [_dictionary removeObjectForKey:@(aKey)];
4085 }
4086
4087 - (void)removeAll {
4088 [_dictionary removeAllObjects];
4089 }
4090
4091 @end
4092
4093 #pragma mark - Int32 -> Int64
4094
4095 @implementation GPBInt32Int64Dictionary {
4096 @package
4097 NSMutableDictionary *_dictionary;
4098 }
4099
4100 + (instancetype)dictionary {
4101 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
4102 }
4103
4104 + (instancetype)dictionaryWithValue:(int64_t)value
4105 forKey:(int32_t)key {
4106 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4107 // on to get the type correct.
4108 return [[(GPBInt32Int64Dictionary*)[self alloc] initWithValues:&value
4109 forKeys:&key
4110 count:1] autorelease] ;
4111 }
4112
4113 + (instancetype)dictionaryWithValues:(const int64_t [])values
4114 forKeys:(const int32_t [])keys
4115 count:(NSUInteger)count {
4116 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4117 // on to get the type correct.
4118 return [[(GPBInt32Int64Dictionary*)[self alloc] initWithValues:values
4119 forKeys:keys
4120 count:count] autorele ase];
4121 }
4122
4123 + (instancetype)dictionaryWithDictionary:(GPBInt32Int64Dictionary *)dictionary {
4124 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
4125 // on to get the type correct.
4126 return [[(GPBInt32Int64Dictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
4127 }
4128
4129 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
4130 return [[[self alloc] initWithCapacity:numItems] autorelease];
4131 }
4132
4133 - (instancetype)init {
4134 return [self initWithValues:NULL forKeys:NULL count:0];
4135 }
4136
4137 - (instancetype)initWithValues:(const int64_t [])values
4138 forKeys:(const int32_t [])keys
4139 count:(NSUInteger)count {
4140 self = [super init];
4141 if (self) {
4142 _dictionary = [[NSMutableDictionary alloc] init];
4143 if (count && values && keys) {
4144 for (NSUInteger i = 0; i < count; ++i) {
4145 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4146 }
4147 }
4148 }
4149 return self;
4150 }
4151
4152 - (instancetype)initWithDictionary:(GPBInt32Int64Dictionary *)dictionary {
4153 self = [self initWithValues:NULL forKeys:NULL count:0];
4154 if (self) {
4155 if (dictionary) {
4156 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4157 }
4158 }
4159 return self;
4160 }
4161
4162 - (instancetype)initWithCapacity:(NSUInteger)numItems {
4163 #pragma unused(numItems)
4164 return [self initWithValues:NULL forKeys:NULL count:0];
4165 }
4166
4167 - (void)dealloc {
4168 NSAssert(!_autocreator,
4169 @"%@: Autocreator must be cleared before release, autocreator: %@",
4170 [self class], _autocreator);
4171 [_dictionary release];
4172 [super dealloc];
4173 }
4174
4175 - (instancetype)copyWithZone:(NSZone *)zone {
4176 return [[GPBInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self];
4177 }
4178
4179 - (BOOL)isEqual:(GPBInt32Int64Dictionary *)other {
4180 if (self == other) {
4181 return YES;
4182 }
4183 if (![other isKindOfClass:[GPBInt32Int64Dictionary class]]) {
4184 return NO;
4185 }
4186 return [_dictionary isEqual:other->_dictionary];
4187 }
4188
4189 - (NSUInteger)hash {
4190 return _dictionary.count;
4191 }
4192
4193 - (NSString *)description {
4194 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
4195 }
4196
4197 - (NSUInteger)count {
4198 return _dictionary.count;
4199 }
4200
4201 - (void)enumerateKeysAndValuesUsingBlock:
4202 (void (^)(int32_t key, int64_t value, BOOL *stop))block {
4203 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4204 NSNumber *aValue,
4205 BOOL *stop) {
4206 block([aKey intValue], [aValue longLongValue], stop);
4207 }];
4208 }
4209
4210 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4211 NSUInteger count = _dictionary.count;
4212 if (count == 0) {
4213 return 0;
4214 }
4215
4216 GPBDataType valueDataType = GPBGetFieldDataType(field);
4217 GPBDataType keyDataType = field.mapKeyDataType;
4218 __block size_t result = 0;
4219 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4220 NSNumber *aValue,
4221 BOOL *stop) {
4222 #pragma unused(stop)
4223 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4224 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
4225 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4226 }];
4227 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
4228 result += tagSize * count;
4229 return result;
4230 }
4231
4232 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4233 asField:(GPBFieldDescriptor *)field {
4234 GPBDataType valueDataType = GPBGetFieldDataType(field);
4235 GPBDataType keyDataType = field.mapKeyDataType;
4236 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
4237 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4238 NSNumber *aValue,
4239 BOOL *stop) {
4240 #pragma unused(stop)
4241 // Write the tag.
4242 [outputStream writeInt32NoTag:tag];
4243 // Write the size of the message.
4244 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4245 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
4246 [outputStream writeInt32NoTag:(int32_t)msgSize];
4247 // Write the fields.
4248 WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDa taType);
4249 WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumb er, valueDataType);
4250 }];
4251 }
4252
4253 - (void)setGPBGenericValue:(GPBGenericValue *)value
4254 forGPBGenericValueKey:(GPBGenericValue *)key {
4255 [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueInt32)];
4256 }
4257
4258 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
4259 [self enumerateKeysAndValuesUsingBlock:^(int32_t key, int64_t value, BOOL *sto p) {
4260 #pragma unused(stop)
4261 block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@ "%lld", value]);
4262 }];
4263 }
4264
4265 - (BOOL)valueForKey:(int32_t)key value:(int64_t *)value {
4266 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4267 if (wrapped && value) {
4268 *value = [wrapped longLongValue];
4269 }
4270 return (wrapped != NULL);
4271 }
4272
4273 - (void)addEntriesFromDictionary:(GPBInt32Int64Dictionary *)otherDictionary {
4274 if (otherDictionary) {
4275 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4276 if (_autocreator) {
4277 GPBAutocreatedDictionaryModified(_autocreator, self);
4278 }
4279 }
4280 }
4281
4282 - (void)setValue:(int64_t)value forKey:(int32_t)key {
4283 [_dictionary setObject:@(value) forKey:@(key)];
4284 if (_autocreator) {
4285 GPBAutocreatedDictionaryModified(_autocreator, self);
4286 }
4287 }
4288
4289 - (void)removeValueForKey:(int32_t)aKey {
4290 [_dictionary removeObjectForKey:@(aKey)];
4291 }
4292
4293 - (void)removeAll {
4294 [_dictionary removeAllObjects];
4295 }
4296
4297 @end
4298
4299 #pragma mark - Int32 -> Bool
4300
4301 @implementation GPBInt32BoolDictionary {
4302 @package
4303 NSMutableDictionary *_dictionary;
4304 }
4305
4306 + (instancetype)dictionary {
4307 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
4308 }
4309
4310 + (instancetype)dictionaryWithValue:(BOOL)value
4311 forKey:(int32_t)key {
4312 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4313 // on to get the type correct.
4314 return [[(GPBInt32BoolDictionary*)[self alloc] initWithValues:&value
4315 forKeys:&key
4316 count:1] autorelease];
4317 }
4318
4319 + (instancetype)dictionaryWithValues:(const BOOL [])values
4320 forKeys:(const int32_t [])keys
4321 count:(NSUInteger)count {
4322 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4323 // on to get the type correct.
4324 return [[(GPBInt32BoolDictionary*)[self alloc] initWithValues:values
4325 forKeys:keys
4326 count:count] autorelea se];
4327 }
4328
4329 + (instancetype)dictionaryWithDictionary:(GPBInt32BoolDictionary *)dictionary {
4330 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
4331 // on to get the type correct.
4332 return [[(GPBInt32BoolDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
4333 }
4334
4335 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
4336 return [[[self alloc] initWithCapacity:numItems] autorelease];
4337 }
4338
4339 - (instancetype)init {
4340 return [self initWithValues:NULL forKeys:NULL count:0];
4341 }
4342
4343 - (instancetype)initWithValues:(const BOOL [])values
4344 forKeys:(const int32_t [])keys
4345 count:(NSUInteger)count {
4346 self = [super init];
4347 if (self) {
4348 _dictionary = [[NSMutableDictionary alloc] init];
4349 if (count && values && keys) {
4350 for (NSUInteger i = 0; i < count; ++i) {
4351 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4352 }
4353 }
4354 }
4355 return self;
4356 }
4357
4358 - (instancetype)initWithDictionary:(GPBInt32BoolDictionary *)dictionary {
4359 self = [self initWithValues:NULL forKeys:NULL count:0];
4360 if (self) {
4361 if (dictionary) {
4362 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4363 }
4364 }
4365 return self;
4366 }
4367
4368 - (instancetype)initWithCapacity:(NSUInteger)numItems {
4369 #pragma unused(numItems)
4370 return [self initWithValues:NULL forKeys:NULL count:0];
4371 }
4372
4373 - (void)dealloc {
4374 NSAssert(!_autocreator,
4375 @"%@: Autocreator must be cleared before release, autocreator: %@",
4376 [self class], _autocreator);
4377 [_dictionary release];
4378 [super dealloc];
4379 }
4380
4381 - (instancetype)copyWithZone:(NSZone *)zone {
4382 return [[GPBInt32BoolDictionary allocWithZone:zone] initWithDictionary:self];
4383 }
4384
4385 - (BOOL)isEqual:(GPBInt32BoolDictionary *)other {
4386 if (self == other) {
4387 return YES;
4388 }
4389 if (![other isKindOfClass:[GPBInt32BoolDictionary class]]) {
4390 return NO;
4391 }
4392 return [_dictionary isEqual:other->_dictionary];
4393 }
4394
4395 - (NSUInteger)hash {
4396 return _dictionary.count;
4397 }
4398
4399 - (NSString *)description {
4400 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
4401 }
4402
4403 - (NSUInteger)count {
4404 return _dictionary.count;
4405 }
4406
4407 - (void)enumerateKeysAndValuesUsingBlock:
4408 (void (^)(int32_t key, BOOL value, BOOL *stop))block {
4409 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4410 NSNumber *aValue,
4411 BOOL *stop) {
4412 block([aKey intValue], [aValue boolValue], stop);
4413 }];
4414 }
4415
4416 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4417 NSUInteger count = _dictionary.count;
4418 if (count == 0) {
4419 return 0;
4420 }
4421
4422 GPBDataType valueDataType = GPBGetFieldDataType(field);
4423 GPBDataType keyDataType = field.mapKeyDataType;
4424 __block size_t result = 0;
4425 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4426 NSNumber *aValue,
4427 BOOL *stop) {
4428 #pragma unused(stop)
4429 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4430 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
4431 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4432 }];
4433 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
4434 result += tagSize * count;
4435 return result;
4436 }
4437
4438 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4439 asField:(GPBFieldDescriptor *)field {
4440 GPBDataType valueDataType = GPBGetFieldDataType(field);
4441 GPBDataType keyDataType = field.mapKeyDataType;
4442 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
4443 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4444 NSNumber *aValue,
4445 BOOL *stop) {
4446 #pragma unused(stop)
4447 // Write the tag.
4448 [outputStream writeInt32NoTag:tag];
4449 // Write the size of the message.
4450 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4451 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
4452 [outputStream writeInt32NoTag:(int32_t)msgSize];
4453 // Write the fields.
4454 WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDa taType);
4455 WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, v alueDataType);
4456 }];
4457 }
4458
4459 - (void)setGPBGenericValue:(GPBGenericValue *)value
4460 forGPBGenericValueKey:(GPBGenericValue *)key {
4461 [_dictionary setObject:@(value->valueBool) forKey:@(key->valueInt32)];
4462 }
4463
4464 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
4465 [self enumerateKeysAndValuesUsingBlock:^(int32_t key, BOOL value, BOOL *stop) {
4466 #pragma unused(stop)
4467 block([NSString stringWithFormat:@"%d", key], (value ? @"true" : @"false") );
4468 }];
4469 }
4470
4471 - (BOOL)valueForKey:(int32_t)key value:(BOOL *)value {
4472 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4473 if (wrapped && value) {
4474 *value = [wrapped boolValue];
4475 }
4476 return (wrapped != NULL);
4477 }
4478
4479 - (void)addEntriesFromDictionary:(GPBInt32BoolDictionary *)otherDictionary {
4480 if (otherDictionary) {
4481 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4482 if (_autocreator) {
4483 GPBAutocreatedDictionaryModified(_autocreator, self);
4484 }
4485 }
4486 }
4487
4488 - (void)setValue:(BOOL)value forKey:(int32_t)key {
4489 [_dictionary setObject:@(value) forKey:@(key)];
4490 if (_autocreator) {
4491 GPBAutocreatedDictionaryModified(_autocreator, self);
4492 }
4493 }
4494
4495 - (void)removeValueForKey:(int32_t)aKey {
4496 [_dictionary removeObjectForKey:@(aKey)];
4497 }
4498
4499 - (void)removeAll {
4500 [_dictionary removeAllObjects];
4501 }
4502
4503 @end
4504
4505 #pragma mark - Int32 -> Float
4506
4507 @implementation GPBInt32FloatDictionary {
4508 @package
4509 NSMutableDictionary *_dictionary;
4510 }
4511
4512 + (instancetype)dictionary {
4513 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
4514 }
4515
4516 + (instancetype)dictionaryWithValue:(float)value
4517 forKey:(int32_t)key {
4518 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4519 // on to get the type correct.
4520 return [[(GPBInt32FloatDictionary*)[self alloc] initWithValues:&value
4521 forKeys:&key
4522 count:1] autorelease] ;
4523 }
4524
4525 + (instancetype)dictionaryWithValues:(const float [])values
4526 forKeys:(const int32_t [])keys
4527 count:(NSUInteger)count {
4528 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4529 // on to get the type correct.
4530 return [[(GPBInt32FloatDictionary*)[self alloc] initWithValues:values
4531 forKeys:keys
4532 count:count] autorele ase];
4533 }
4534
4535 + (instancetype)dictionaryWithDictionary:(GPBInt32FloatDictionary *)dictionary {
4536 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
4537 // on to get the type correct.
4538 return [[(GPBInt32FloatDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
4539 }
4540
4541 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
4542 return [[[self alloc] initWithCapacity:numItems] autorelease];
4543 }
4544
4545 - (instancetype)init {
4546 return [self initWithValues:NULL forKeys:NULL count:0];
4547 }
4548
4549 - (instancetype)initWithValues:(const float [])values
4550 forKeys:(const int32_t [])keys
4551 count:(NSUInteger)count {
4552 self = [super init];
4553 if (self) {
4554 _dictionary = [[NSMutableDictionary alloc] init];
4555 if (count && values && keys) {
4556 for (NSUInteger i = 0; i < count; ++i) {
4557 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4558 }
4559 }
4560 }
4561 return self;
4562 }
4563
4564 - (instancetype)initWithDictionary:(GPBInt32FloatDictionary *)dictionary {
4565 self = [self initWithValues:NULL forKeys:NULL count:0];
4566 if (self) {
4567 if (dictionary) {
4568 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4569 }
4570 }
4571 return self;
4572 }
4573
4574 - (instancetype)initWithCapacity:(NSUInteger)numItems {
4575 #pragma unused(numItems)
4576 return [self initWithValues:NULL forKeys:NULL count:0];
4577 }
4578
4579 - (void)dealloc {
4580 NSAssert(!_autocreator,
4581 @"%@: Autocreator must be cleared before release, autocreator: %@",
4582 [self class], _autocreator);
4583 [_dictionary release];
4584 [super dealloc];
4585 }
4586
4587 - (instancetype)copyWithZone:(NSZone *)zone {
4588 return [[GPBInt32FloatDictionary allocWithZone:zone] initWithDictionary:self];
4589 }
4590
4591 - (BOOL)isEqual:(GPBInt32FloatDictionary *)other {
4592 if (self == other) {
4593 return YES;
4594 }
4595 if (![other isKindOfClass:[GPBInt32FloatDictionary class]]) {
4596 return NO;
4597 }
4598 return [_dictionary isEqual:other->_dictionary];
4599 }
4600
4601 - (NSUInteger)hash {
4602 return _dictionary.count;
4603 }
4604
4605 - (NSString *)description {
4606 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
4607 }
4608
4609 - (NSUInteger)count {
4610 return _dictionary.count;
4611 }
4612
4613 - (void)enumerateKeysAndValuesUsingBlock:
4614 (void (^)(int32_t key, float value, BOOL *stop))block {
4615 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4616 NSNumber *aValue,
4617 BOOL *stop) {
4618 block([aKey intValue], [aValue floatValue], stop);
4619 }];
4620 }
4621
4622 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4623 NSUInteger count = _dictionary.count;
4624 if (count == 0) {
4625 return 0;
4626 }
4627
4628 GPBDataType valueDataType = GPBGetFieldDataType(field);
4629 GPBDataType keyDataType = field.mapKeyDataType;
4630 __block size_t result = 0;
4631 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4632 NSNumber *aValue,
4633 BOOL *stop) {
4634 #pragma unused(stop)
4635 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4636 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
4637 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4638 }];
4639 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
4640 result += tagSize * count;
4641 return result;
4642 }
4643
4644 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4645 asField:(GPBFieldDescriptor *)field {
4646 GPBDataType valueDataType = GPBGetFieldDataType(field);
4647 GPBDataType keyDataType = field.mapKeyDataType;
4648 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
4649 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4650 NSNumber *aValue,
4651 BOOL *stop) {
4652 #pragma unused(stop)
4653 // Write the tag.
4654 [outputStream writeInt32NoTag:tag];
4655 // Write the size of the message.
4656 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4657 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
4658 [outputStream writeInt32NoTag:(int32_t)msgSize];
4659 // Write the fields.
4660 WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDa taType);
4661 WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
4662 }];
4663 }
4664
4665 - (void)setGPBGenericValue:(GPBGenericValue *)value
4666 forGPBGenericValueKey:(GPBGenericValue *)key {
4667 [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueInt32)];
4668 }
4669
4670 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
4671 [self enumerateKeysAndValuesUsingBlock:^(int32_t key, float value, BOOL *stop) {
4672 #pragma unused(stop)
4673 block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@ "%.*g", FLT_DIG, value]);
4674 }];
4675 }
4676
4677 - (BOOL)valueForKey:(int32_t)key value:(float *)value {
4678 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4679 if (wrapped && value) {
4680 *value = [wrapped floatValue];
4681 }
4682 return (wrapped != NULL);
4683 }
4684
4685 - (void)addEntriesFromDictionary:(GPBInt32FloatDictionary *)otherDictionary {
4686 if (otherDictionary) {
4687 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4688 if (_autocreator) {
4689 GPBAutocreatedDictionaryModified(_autocreator, self);
4690 }
4691 }
4692 }
4693
4694 - (void)setValue:(float)value forKey:(int32_t)key {
4695 [_dictionary setObject:@(value) forKey:@(key)];
4696 if (_autocreator) {
4697 GPBAutocreatedDictionaryModified(_autocreator, self);
4698 }
4699 }
4700
4701 - (void)removeValueForKey:(int32_t)aKey {
4702 [_dictionary removeObjectForKey:@(aKey)];
4703 }
4704
4705 - (void)removeAll {
4706 [_dictionary removeAllObjects];
4707 }
4708
4709 @end
4710
4711 #pragma mark - Int32 -> Double
4712
4713 @implementation GPBInt32DoubleDictionary {
4714 @package
4715 NSMutableDictionary *_dictionary;
4716 }
4717
4718 + (instancetype)dictionary {
4719 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
4720 }
4721
4722 + (instancetype)dictionaryWithValue:(double)value
4723 forKey:(int32_t)key {
4724 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4725 // on to get the type correct.
4726 return [[(GPBInt32DoubleDictionary*)[self alloc] initWithValues:&value
4727 forKeys:&key
4728 count:1] autorelease ];
4729 }
4730
4731 + (instancetype)dictionaryWithValues:(const double [])values
4732 forKeys:(const int32_t [])keys
4733 count:(NSUInteger)count {
4734 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4735 // on to get the type correct.
4736 return [[(GPBInt32DoubleDictionary*)[self alloc] initWithValues:values
4737 forKeys:keys
4738 count:count] autorel ease];
4739 }
4740
4741 + (instancetype)dictionaryWithDictionary:(GPBInt32DoubleDictionary *)dictionary {
4742 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
4743 // on to get the type correct.
4744 return [[(GPBInt32DoubleDictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
4745 }
4746
4747 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
4748 return [[[self alloc] initWithCapacity:numItems] autorelease];
4749 }
4750
4751 - (instancetype)init {
4752 return [self initWithValues:NULL forKeys:NULL count:0];
4753 }
4754
4755 - (instancetype)initWithValues:(const double [])values
4756 forKeys:(const int32_t [])keys
4757 count:(NSUInteger)count {
4758 self = [super init];
4759 if (self) {
4760 _dictionary = [[NSMutableDictionary alloc] init];
4761 if (count && values && keys) {
4762 for (NSUInteger i = 0; i < count; ++i) {
4763 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
4764 }
4765 }
4766 }
4767 return self;
4768 }
4769
4770 - (instancetype)initWithDictionary:(GPBInt32DoubleDictionary *)dictionary {
4771 self = [self initWithValues:NULL forKeys:NULL count:0];
4772 if (self) {
4773 if (dictionary) {
4774 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
4775 }
4776 }
4777 return self;
4778 }
4779
4780 - (instancetype)initWithCapacity:(NSUInteger)numItems {
4781 #pragma unused(numItems)
4782 return [self initWithValues:NULL forKeys:NULL count:0];
4783 }
4784
4785 - (void)dealloc {
4786 NSAssert(!_autocreator,
4787 @"%@: Autocreator must be cleared before release, autocreator: %@",
4788 [self class], _autocreator);
4789 [_dictionary release];
4790 [super dealloc];
4791 }
4792
4793 - (instancetype)copyWithZone:(NSZone *)zone {
4794 return [[GPBInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self] ;
4795 }
4796
4797 - (BOOL)isEqual:(GPBInt32DoubleDictionary *)other {
4798 if (self == other) {
4799 return YES;
4800 }
4801 if (![other isKindOfClass:[GPBInt32DoubleDictionary class]]) {
4802 return NO;
4803 }
4804 return [_dictionary isEqual:other->_dictionary];
4805 }
4806
4807 - (NSUInteger)hash {
4808 return _dictionary.count;
4809 }
4810
4811 - (NSString *)description {
4812 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
4813 }
4814
4815 - (NSUInteger)count {
4816 return _dictionary.count;
4817 }
4818
4819 - (void)enumerateKeysAndValuesUsingBlock:
4820 (void (^)(int32_t key, double value, BOOL *stop))block {
4821 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4822 NSNumber *aValue,
4823 BOOL *stop) {
4824 block([aKey intValue], [aValue doubleValue], stop);
4825 }];
4826 }
4827
4828 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
4829 NSUInteger count = _dictionary.count;
4830 if (count == 0) {
4831 return 0;
4832 }
4833
4834 GPBDataType valueDataType = GPBGetFieldDataType(field);
4835 GPBDataType keyDataType = field.mapKeyDataType;
4836 __block size_t result = 0;
4837 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4838 NSNumber *aValue,
4839 BOOL *stop) {
4840 #pragma unused(stop)
4841 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4842 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
4843 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
4844 }];
4845 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
4846 result += tagSize * count;
4847 return result;
4848 }
4849
4850 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
4851 asField:(GPBFieldDescriptor *)field {
4852 GPBDataType valueDataType = GPBGetFieldDataType(field);
4853 GPBDataType keyDataType = field.mapKeyDataType;
4854 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
4855 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
4856 NSNumber *aValue,
4857 BOOL *stop) {
4858 #pragma unused(stop)
4859 // Write the tag.
4860 [outputStream writeInt32NoTag:tag];
4861 // Write the size of the message.
4862 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
4863 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
4864 [outputStream writeInt32NoTag:(int32_t)msgSize];
4865 // Write the fields.
4866 WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDa taType);
4867 WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumbe r, valueDataType);
4868 }];
4869 }
4870
4871 - (void)setGPBGenericValue:(GPBGenericValue *)value
4872 forGPBGenericValueKey:(GPBGenericValue *)key {
4873 [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueInt32)];
4874 }
4875
4876 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
4877 [self enumerateKeysAndValuesUsingBlock:^(int32_t key, double value, BOOL *stop ) {
4878 #pragma unused(stop)
4879 block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@ "%.*lg", DBL_DIG, value]);
4880 }];
4881 }
4882
4883 - (BOOL)valueForKey:(int32_t)key value:(double *)value {
4884 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
4885 if (wrapped && value) {
4886 *value = [wrapped doubleValue];
4887 }
4888 return (wrapped != NULL);
4889 }
4890
4891 - (void)addEntriesFromDictionary:(GPBInt32DoubleDictionary *)otherDictionary {
4892 if (otherDictionary) {
4893 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
4894 if (_autocreator) {
4895 GPBAutocreatedDictionaryModified(_autocreator, self);
4896 }
4897 }
4898 }
4899
4900 - (void)setValue:(double)value forKey:(int32_t)key {
4901 [_dictionary setObject:@(value) forKey:@(key)];
4902 if (_autocreator) {
4903 GPBAutocreatedDictionaryModified(_autocreator, self);
4904 }
4905 }
4906
4907 - (void)removeValueForKey:(int32_t)aKey {
4908 [_dictionary removeObjectForKey:@(aKey)];
4909 }
4910
4911 - (void)removeAll {
4912 [_dictionary removeAllObjects];
4913 }
4914
4915 @end
4916
4917 #pragma mark - Int32 -> Enum
4918
4919 @implementation GPBInt32EnumDictionary {
4920 @package
4921 NSMutableDictionary *_dictionary;
4922 GPBEnumValidationFunc _validationFunc;
4923 }
4924
4925 @synthesize validationFunc = _validationFunc;
4926
4927 + (instancetype)dictionary {
4928 return [[[self alloc] initWithValidationFunction:NULL
4929 rawValues:NULL
4930 forKeys:NULL
4931 count:0] autorelease];
4932 }
4933
4934 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func {
4935 return [[[self alloc] initWithValidationFunction:func
4936 rawValues:NULL
4937 forKeys:NULL
4938 count:0] autorelease];
4939 }
4940
4941 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
4942 rawValue:(int32_t)rawValue
4943 forKey:(int32_t)key {
4944 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4945 // on to get the type correct.
4946 return [[(GPBInt32EnumDictionary*)[self alloc] initWithValidationFunction:func
4947 rawValues:&raw Value
4948 forKeys:&key
4949 count:1] a utorelease];
4950 }
4951
4952 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
4953 rawValues:(const int32_t [])rawValues
4954 forKeys:(const int32_t [])keys
4955 count:(NSUInteger)count {
4956 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4957 // on to get the type correct.
4958 return [[(GPBInt32EnumDictionary*)[self alloc] initWithValidationFunction:func
4959 rawValues:rawV alues
4960 forKeys:keys
4961 count:coun t] autorelease];
4962 }
4963
4964 + (instancetype)dictionaryWithDictionary:(GPBInt32EnumDictionary *)dictionary {
4965 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
4966 // on to get the type correct.
4967 return [[(GPBInt32EnumDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
4968 }
4969
4970 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
4971 capacity:(NSUInteger)numItems {
4972 return [[[self alloc] initWithValidationFunction:func capacity:numItems] autor elease];
4973 }
4974
4975 - (instancetype)init {
4976 return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count :0];
4977 }
4978
4979 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
4980 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
4981 }
4982
4983 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
4984 rawValues:(const int32_t [])rawValues
4985 forKeys:(const int32_t [])keys
4986 count:(NSUInteger)count {
4987 self = [super init];
4988 if (self) {
4989 _dictionary = [[NSMutableDictionary alloc] init];
4990 _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
4991 if (count && rawValues && keys) {
4992 for (NSUInteger i = 0; i < count; ++i) {
4993 [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
4994 }
4995 }
4996 }
4997 return self;
4998 }
4999
5000 - (instancetype)initWithDictionary:(GPBInt32EnumDictionary *)dictionary {
5001 self = [self initWithValidationFunction:dictionary.validationFunc
5002 rawValues:NULL
5003 forKeys:NULL
5004 count:0];
5005 if (self) {
5006 if (dictionary) {
5007 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5008 }
5009 }
5010 return self;
5011 }
5012
5013 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
5014 capacity:(NSUInteger)numItems {
5015 #pragma unused(numItems)
5016 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
5017 }
5018
5019 - (void)dealloc {
5020 NSAssert(!_autocreator,
5021 @"%@: Autocreator must be cleared before release, autocreator: %@",
5022 [self class], _autocreator);
5023 [_dictionary release];
5024 [super dealloc];
5025 }
5026
5027 - (instancetype)copyWithZone:(NSZone *)zone {
5028 return [[GPBInt32EnumDictionary allocWithZone:zone] initWithDictionary:self];
5029 }
5030
5031 - (BOOL)isEqual:(GPBInt32EnumDictionary *)other {
5032 if (self == other) {
5033 return YES;
5034 }
5035 if (![other isKindOfClass:[GPBInt32EnumDictionary class]]) {
5036 return NO;
5037 }
5038 return [_dictionary isEqual:other->_dictionary];
5039 }
5040
5041 - (NSUInteger)hash {
5042 return _dictionary.count;
5043 }
5044
5045 - (NSString *)description {
5046 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
5047 }
5048
5049 - (NSUInteger)count {
5050 return _dictionary.count;
5051 }
5052
5053 - (void)enumerateKeysAndRawValuesUsingBlock:
5054 (void (^)(int32_t key, int32_t value, BOOL *stop))block {
5055 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5056 NSNumber *aValue,
5057 BOOL *stop) {
5058 block([aKey intValue], [aValue intValue], stop);
5059 }];
5060 }
5061
5062 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5063 NSUInteger count = _dictionary.count;
5064 if (count == 0) {
5065 return 0;
5066 }
5067
5068 GPBDataType valueDataType = GPBGetFieldDataType(field);
5069 GPBDataType keyDataType = field.mapKeyDataType;
5070 __block size_t result = 0;
5071 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5072 NSNumber *aValue,
5073 BOOL *stop) {
5074 #pragma unused(stop)
5075 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
5076 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
5077 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5078 }];
5079 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
5080 result += tagSize * count;
5081 return result;
5082 }
5083
5084 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5085 asField:(GPBFieldDescriptor *)field {
5086 GPBDataType valueDataType = GPBGetFieldDataType(field);
5087 GPBDataType keyDataType = field.mapKeyDataType;
5088 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
5089 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5090 NSNumber *aValue,
5091 BOOL *stop) {
5092 #pragma unused(stop)
5093 // Write the tag.
5094 [outputStream writeInt32NoTag:tag];
5095 // Write the size of the message.
5096 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
5097 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
5098 [outputStream writeInt32NoTag:(int32_t)msgSize];
5099 // Write the fields.
5100 WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDa taType);
5101 WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, va lueDataType);
5102 }];
5103 }
5104
5105 - (NSData *)serializedDataForUnknownValue:(int32_t)value
5106 forKey:(GPBGenericValue *)key
5107 keyDataType:(GPBDataType)keyDataType {
5108 size_t msgSize = ComputeDictInt32FieldSize(key->valueInt32, kMapKeyFieldNumber , keyDataType);
5109 msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEn um);
5110 NSMutableData *data = [NSMutableData dataWithLength:msgSize];
5111 GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithDat a:data];
5112 WriteDictInt32Field(outputStream, key->valueInt32, kMapKeyFieldNumber, keyData Type);
5113 WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum) ;
5114 [outputStream release];
5115 return data;
5116 }
5117 - (void)setGPBGenericValue:(GPBGenericValue *)value
5118 forGPBGenericValueKey:(GPBGenericValue *)key {
5119 [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueInt32)];
5120 }
5121
5122 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
5123 [self enumerateKeysAndRawValuesUsingBlock:^(int32_t key, int32_t value, BOOL * stop) {
5124 #pragma unused(stop)
5125 block([NSString stringWithFormat:@"%d", key], @(value));
5126 }];
5127 }
5128
5129 - (BOOL)valueForKey:(int32_t)key value:(int32_t *)value {
5130 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5131 if (wrapped && value) {
5132 int32_t result = [wrapped intValue];
5133 if (!_validationFunc(result)) {
5134 result = kGPBUnrecognizedEnumeratorValue;
5135 }
5136 *value = result;
5137 }
5138 return (wrapped != NULL);
5139 }
5140
5141 - (BOOL)valueForKey:(int32_t)key rawValue:(int32_t *)rawValue {
5142 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5143 if (wrapped && rawValue) {
5144 *rawValue = [wrapped intValue];
5145 }
5146 return (wrapped != NULL);
5147 }
5148
5149 - (void)enumerateKeysAndValuesUsingBlock:
5150 (void (^)(int32_t key, int32_t value, BOOL *stop))block {
5151 GPBEnumValidationFunc func = _validationFunc;
5152 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5153 NSNumber *aValue,
5154 BOOL *stop) {
5155 int32_t unwrapped = [aValue intValue];
5156 if (!func(unwrapped)) {
5157 unwrapped = kGPBUnrecognizedEnumeratorValue;
5158 }
5159 block([aKey intValue], unwrapped, stop);
5160 }];
5161 }
5162
5163 - (void)addRawEntriesFromDictionary:(GPBInt32EnumDictionary *)otherDictionary {
5164 if (otherDictionary) {
5165 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5166 if (_autocreator) {
5167 GPBAutocreatedDictionaryModified(_autocreator, self);
5168 }
5169 }
5170 }
5171
5172 - (void)setRawValue:(int32_t)value forKey:(int32_t)key {
5173 [_dictionary setObject:@(value) forKey:@(key)];
5174 if (_autocreator) {
5175 GPBAutocreatedDictionaryModified(_autocreator, self);
5176 }
5177 }
5178
5179 - (void)removeValueForKey:(int32_t)aKey {
5180 [_dictionary removeObjectForKey:@(aKey)];
5181 }
5182
5183 - (void)removeAll {
5184 [_dictionary removeAllObjects];
5185 }
5186
5187 - (void)setValue:(int32_t)value forKey:(int32_t)key {
5188 if (!_validationFunc(value)) {
5189 [NSException raise:NSInvalidArgumentException
5190 format:@"GPBInt32EnumDictionary: Attempt to set an unknown enum value (%d)",
5191 value];
5192 }
5193
5194 [_dictionary setObject:@(value) forKey:@(key)];
5195 if (_autocreator) {
5196 GPBAutocreatedDictionaryModified(_autocreator, self);
5197 }
5198 }
5199
5200 @end
5201
5202 #pragma mark - Int32 -> Object
5203
5204 @implementation GPBInt32ObjectDictionary {
5205 @package
5206 NSMutableDictionary *_dictionary;
5207 }
5208
5209 + (instancetype)dictionary {
5210 return [[[self alloc] initWithObjects:NULL forKeys:NULL count:0] autorelease];
5211 }
5212
5213 + (instancetype)dictionaryWithObject:(id)object
5214 forKey:(int32_t)key {
5215 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
5216 // on to get the type correct.
5217 return [[(GPBInt32ObjectDictionary*)[self alloc] initWithObjects:&object
5218 forKeys:&key
5219 count:1] autoreleas e];
5220 }
5221
5222 + (instancetype)dictionaryWithObjects:(const id [])objects
5223 forKeys:(const int32_t [])keys
5224 count:(NSUInteger)count {
5225 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
5226 // on to get the type correct.
5227 return [[(GPBInt32ObjectDictionary*)[self alloc] initWithObjects:objects
5228 forKeys:keys
5229 count:count] autorel ease];
5230 }
5231
5232 + (instancetype)dictionaryWithDictionary:(GPBInt32ObjectDictionary *)dictionary {
5233 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
5234 // on to get the type correct.
5235 return [[(GPBInt32ObjectDictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
5236 }
5237
5238 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
5239 return [[[self alloc] initWithCapacity:numItems] autorelease];
5240 }
5241
5242 - (instancetype)init {
5243 return [self initWithObjects:NULL forKeys:NULL count:0];
5244 }
5245
5246 - (instancetype)initWithObjects:(const id [])objects
5247 forKeys:(const int32_t [])keys
5248 count:(NSUInteger)count {
5249 self = [super init];
5250 if (self) {
5251 _dictionary = [[NSMutableDictionary alloc] init];
5252 if (count && objects && keys) {
5253 for (NSUInteger i = 0; i < count; ++i) {
5254 if (!objects[i]) {
5255 [NSException raise:NSInvalidArgumentException
5256 format:@"Attempting to add nil object to a Dictionary"];
5257 }
5258 [_dictionary setObject:objects[i] forKey:@(keys[i])];
5259 }
5260 }
5261 }
5262 return self;
5263 }
5264
5265 - (instancetype)initWithDictionary:(GPBInt32ObjectDictionary *)dictionary {
5266 self = [self initWithObjects:NULL forKeys:NULL count:0];
5267 if (self) {
5268 if (dictionary) {
5269 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5270 }
5271 }
5272 return self;
5273 }
5274
5275 - (instancetype)initWithCapacity:(NSUInteger)numItems {
5276 #pragma unused(numItems)
5277 return [self initWithObjects:NULL forKeys:NULL count:0];
5278 }
5279
5280 - (void)dealloc {
5281 NSAssert(!_autocreator,
5282 @"%@: Autocreator must be cleared before release, autocreator: %@",
5283 [self class], _autocreator);
5284 [_dictionary release];
5285 [super dealloc];
5286 }
5287
5288 - (instancetype)copyWithZone:(NSZone *)zone {
5289 return [[GPBInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self] ;
5290 }
5291
5292 - (BOOL)isEqual:(GPBInt32ObjectDictionary *)other {
5293 if (self == other) {
5294 return YES;
5295 }
5296 if (![other isKindOfClass:[GPBInt32ObjectDictionary class]]) {
5297 return NO;
5298 }
5299 return [_dictionary isEqual:other->_dictionary];
5300 }
5301
5302 - (NSUInteger)hash {
5303 return _dictionary.count;
5304 }
5305
5306 - (NSString *)description {
5307 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
5308 }
5309
5310 - (NSUInteger)count {
5311 return _dictionary.count;
5312 }
5313
5314 - (void)enumerateKeysAndObjectsUsingBlock:
5315 (void (^)(int32_t key, id object, BOOL *stop))block {
5316 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5317 id aObject,
5318 BOOL *stop) {
5319 block([aKey intValue], aObject, stop);
5320 }];
5321 }
5322
5323 - (BOOL)isInitialized {
5324 for (GPBMessage *msg in [_dictionary objectEnumerator]) {
5325 if (!msg.initialized) {
5326 return NO;
5327 }
5328 }
5329 return YES;
5330 }
5331
5332 - (instancetype)deepCopyWithZone:(NSZone *)zone {
5333 GPBInt32ObjectDictionary *newDict =
5334 [[GPBInt32ObjectDictionary alloc] init];
5335 [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
5336 GPBMessage *msg,
5337 BOOL *stop) {
5338 #pragma unused(stop)
5339 GPBMessage *copiedMsg = [msg copyWithZone:zone];
5340 [newDict->_dictionary setObject:copiedMsg forKey:aKey];
5341 [copiedMsg release];
5342 }];
5343 return newDict;
5344 }
5345
5346 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5347 NSUInteger count = _dictionary.count;
5348 if (count == 0) {
5349 return 0;
5350 }
5351
5352 GPBDataType valueDataType = GPBGetFieldDataType(field);
5353 GPBDataType keyDataType = field.mapKeyDataType;
5354 __block size_t result = 0;
5355 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5356 id aObject,
5357 BOOL *stop) {
5358 #pragma unused(stop)
5359 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
5360 msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDa taType);
5361 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5362 }];
5363 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
5364 result += tagSize * count;
5365 return result;
5366 }
5367
5368 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5369 asField:(GPBFieldDescriptor *)field {
5370 GPBDataType valueDataType = GPBGetFieldDataType(field);
5371 GPBDataType keyDataType = field.mapKeyDataType;
5372 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
5373 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5374 id aObject,
5375 BOOL *stop) {
5376 #pragma unused(stop)
5377 // Write the tag.
5378 [outputStream writeInt32NoTag:tag];
5379 // Write the size of the message.
5380 size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumb er, keyDataType);
5381 msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDa taType);
5382 [outputStream writeInt32NoTag:(int32_t)msgSize];
5383 // Write the fields.
5384 WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDa taType);
5385 WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataT ype);
5386 }];
5387 }
5388
5389 - (void)setGPBGenericValue:(GPBGenericValue *)value
5390 forGPBGenericValueKey:(GPBGenericValue *)key {
5391 [_dictionary setObject:value->valueString forKey:@(key->valueInt32)];
5392 }
5393
5394 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
5395 [self enumerateKeysAndObjectsUsingBlock:^(int32_t key, id object, BOOL *stop) {
5396 #pragma unused(stop)
5397 block([NSString stringWithFormat:@"%d", key], object);
5398 }];
5399 }
5400
5401 - (id)objectForKey:(int32_t)key {
5402 id result = [_dictionary objectForKey:@(key)];
5403 return result;
5404 }
5405
5406 - (void)addEntriesFromDictionary:(GPBInt32ObjectDictionary *)otherDictionary {
5407 if (otherDictionary) {
5408 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5409 if (_autocreator) {
5410 GPBAutocreatedDictionaryModified(_autocreator, self);
5411 }
5412 }
5413 }
5414
5415 - (void)setObject:(id)object forKey:(int32_t)key {
5416 if (!object) {
5417 [NSException raise:NSInvalidArgumentException
5418 format:@"Attempting to add nil object to a Dictionary"];
5419 }
5420 [_dictionary setObject:object forKey:@(key)];
5421 if (_autocreator) {
5422 GPBAutocreatedDictionaryModified(_autocreator, self);
5423 }
5424 }
5425
5426 - (void)removeObjectForKey:(int32_t)aKey {
5427 [_dictionary removeObjectForKey:@(aKey)];
5428 }
5429
5430 - (void)removeAll {
5431 [_dictionary removeAllObjects];
5432 }
5433
5434 @end
5435
5436 //%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt64, uint64_t)
5437 // This block of code is generated, do not edit it directly.
5438
5439 #pragma mark - UInt64 -> UInt32
5440
5441 @implementation GPBUInt64UInt32Dictionary {
5442 @package
5443 NSMutableDictionary *_dictionary;
5444 }
5445
5446 + (instancetype)dictionary {
5447 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
5448 }
5449
5450 + (instancetype)dictionaryWithValue:(uint32_t)value
5451 forKey:(uint64_t)key {
5452 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
5453 // on to get the type correct.
5454 return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithValues:&value
5455 forKeys:&key
5456 count:1] autoreleas e];
5457 }
5458
5459 + (instancetype)dictionaryWithValues:(const uint32_t [])values
5460 forKeys:(const uint64_t [])keys
5461 count:(NSUInteger)count {
5462 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
5463 // on to get the type correct.
5464 return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithValues:values
5465 forKeys:keys
5466 count:count] autore lease];
5467 }
5468
5469 + (instancetype)dictionaryWithDictionary:(GPBUInt64UInt32Dictionary *)dictionary {
5470 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
5471 // on to get the type correct.
5472 return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
5473 }
5474
5475 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
5476 return [[[self alloc] initWithCapacity:numItems] autorelease];
5477 }
5478
5479 - (instancetype)init {
5480 return [self initWithValues:NULL forKeys:NULL count:0];
5481 }
5482
5483 - (instancetype)initWithValues:(const uint32_t [])values
5484 forKeys:(const uint64_t [])keys
5485 count:(NSUInteger)count {
5486 self = [super init];
5487 if (self) {
5488 _dictionary = [[NSMutableDictionary alloc] init];
5489 if (count && values && keys) {
5490 for (NSUInteger i = 0; i < count; ++i) {
5491 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5492 }
5493 }
5494 }
5495 return self;
5496 }
5497
5498 - (instancetype)initWithDictionary:(GPBUInt64UInt32Dictionary *)dictionary {
5499 self = [self initWithValues:NULL forKeys:NULL count:0];
5500 if (self) {
5501 if (dictionary) {
5502 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5503 }
5504 }
5505 return self;
5506 }
5507
5508 - (instancetype)initWithCapacity:(NSUInteger)numItems {
5509 #pragma unused(numItems)
5510 return [self initWithValues:NULL forKeys:NULL count:0];
5511 }
5512
5513 - (void)dealloc {
5514 NSAssert(!_autocreator,
5515 @"%@: Autocreator must be cleared before release, autocreator: %@",
5516 [self class], _autocreator);
5517 [_dictionary release];
5518 [super dealloc];
5519 }
5520
5521 - (instancetype)copyWithZone:(NSZone *)zone {
5522 return [[GPBUInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self ];
5523 }
5524
5525 - (BOOL)isEqual:(GPBUInt64UInt32Dictionary *)other {
5526 if (self == other) {
5527 return YES;
5528 }
5529 if (![other isKindOfClass:[GPBUInt64UInt32Dictionary class]]) {
5530 return NO;
5531 }
5532 return [_dictionary isEqual:other->_dictionary];
5533 }
5534
5535 - (NSUInteger)hash {
5536 return _dictionary.count;
5537 }
5538
5539 - (NSString *)description {
5540 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
5541 }
5542
5543 - (NSUInteger)count {
5544 return _dictionary.count;
5545 }
5546
5547 - (void)enumerateKeysAndValuesUsingBlock:
5548 (void (^)(uint64_t key, uint32_t value, BOOL *stop))block {
5549 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5550 NSNumber *aValue,
5551 BOOL *stop) {
5552 block([aKey unsignedLongLongValue], [aValue unsignedIntValue], stop);
5553 }];
5554 }
5555
5556 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5557 NSUInteger count = _dictionary.count;
5558 if (count == 0) {
5559 return 0;
5560 }
5561
5562 GPBDataType valueDataType = GPBGetFieldDataType(field);
5563 GPBDataType keyDataType = field.mapKeyDataType;
5564 __block size_t result = 0;
5565 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5566 NSNumber *aValue,
5567 BOOL *stop) {
5568 #pragma unused(stop)
5569 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
5570 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
5571 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5572 }];
5573 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
5574 result += tagSize * count;
5575 return result;
5576 }
5577
5578 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5579 asField:(GPBFieldDescriptor *)field {
5580 GPBDataType valueDataType = GPBGetFieldDataType(field);
5581 GPBDataType keyDataType = field.mapKeyDataType;
5582 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
5583 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5584 NSNumber *aValue,
5585 BOOL *stop) {
5586 #pragma unused(stop)
5587 // Write the tag.
5588 [outputStream writeInt32NoTag:tag];
5589 // Write the size of the message.
5590 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
5591 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
5592 [outputStream writeInt32NoTag:(int32_t)msgSize];
5593 // Write the fields.
5594 WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFiel dNumber, keyDataType);
5595 WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueField Number, valueDataType);
5596 }];
5597 }
5598
5599 - (void)setGPBGenericValue:(GPBGenericValue *)value
5600 forGPBGenericValueKey:(GPBGenericValue *)key {
5601 [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueUInt64)];
5602 }
5603
5604 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
5605 [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, uint32_t value, BOOL *s top) {
5606 #pragma unused(stop)
5607 block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat :@"%u", value]);
5608 }];
5609 }
5610
5611 - (BOOL)valueForKey:(uint64_t)key value:(uint32_t *)value {
5612 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5613 if (wrapped && value) {
5614 *value = [wrapped unsignedIntValue];
5615 }
5616 return (wrapped != NULL);
5617 }
5618
5619 - (void)addEntriesFromDictionary:(GPBUInt64UInt32Dictionary *)otherDictionary {
5620 if (otherDictionary) {
5621 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5622 if (_autocreator) {
5623 GPBAutocreatedDictionaryModified(_autocreator, self);
5624 }
5625 }
5626 }
5627
5628 - (void)setValue:(uint32_t)value forKey:(uint64_t)key {
5629 [_dictionary setObject:@(value) forKey:@(key)];
5630 if (_autocreator) {
5631 GPBAutocreatedDictionaryModified(_autocreator, self);
5632 }
5633 }
5634
5635 - (void)removeValueForKey:(uint64_t)aKey {
5636 [_dictionary removeObjectForKey:@(aKey)];
5637 }
5638
5639 - (void)removeAll {
5640 [_dictionary removeAllObjects];
5641 }
5642
5643 @end
5644
5645 #pragma mark - UInt64 -> Int32
5646
5647 @implementation GPBUInt64Int32Dictionary {
5648 @package
5649 NSMutableDictionary *_dictionary;
5650 }
5651
5652 + (instancetype)dictionary {
5653 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
5654 }
5655
5656 + (instancetype)dictionaryWithValue:(int32_t)value
5657 forKey:(uint64_t)key {
5658 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
5659 // on to get the type correct.
5660 return [[(GPBUInt64Int32Dictionary*)[self alloc] initWithValues:&value
5661 forKeys:&key
5662 count:1] autorelease ];
5663 }
5664
5665 + (instancetype)dictionaryWithValues:(const int32_t [])values
5666 forKeys:(const uint64_t [])keys
5667 count:(NSUInteger)count {
5668 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
5669 // on to get the type correct.
5670 return [[(GPBUInt64Int32Dictionary*)[self alloc] initWithValues:values
5671 forKeys:keys
5672 count:count] autorel ease];
5673 }
5674
5675 + (instancetype)dictionaryWithDictionary:(GPBUInt64Int32Dictionary *)dictionary {
5676 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
5677 // on to get the type correct.
5678 return [[(GPBUInt64Int32Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
5679 }
5680
5681 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
5682 return [[[self alloc] initWithCapacity:numItems] autorelease];
5683 }
5684
5685 - (instancetype)init {
5686 return [self initWithValues:NULL forKeys:NULL count:0];
5687 }
5688
5689 - (instancetype)initWithValues:(const int32_t [])values
5690 forKeys:(const uint64_t [])keys
5691 count:(NSUInteger)count {
5692 self = [super init];
5693 if (self) {
5694 _dictionary = [[NSMutableDictionary alloc] init];
5695 if (count && values && keys) {
5696 for (NSUInteger i = 0; i < count; ++i) {
5697 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5698 }
5699 }
5700 }
5701 return self;
5702 }
5703
5704 - (instancetype)initWithDictionary:(GPBUInt64Int32Dictionary *)dictionary {
5705 self = [self initWithValues:NULL forKeys:NULL count:0];
5706 if (self) {
5707 if (dictionary) {
5708 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5709 }
5710 }
5711 return self;
5712 }
5713
5714 - (instancetype)initWithCapacity:(NSUInteger)numItems {
5715 #pragma unused(numItems)
5716 return [self initWithValues:NULL forKeys:NULL count:0];
5717 }
5718
5719 - (void)dealloc {
5720 NSAssert(!_autocreator,
5721 @"%@: Autocreator must be cleared before release, autocreator: %@",
5722 [self class], _autocreator);
5723 [_dictionary release];
5724 [super dealloc];
5725 }
5726
5727 - (instancetype)copyWithZone:(NSZone *)zone {
5728 return [[GPBUInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self] ;
5729 }
5730
5731 - (BOOL)isEqual:(GPBUInt64Int32Dictionary *)other {
5732 if (self == other) {
5733 return YES;
5734 }
5735 if (![other isKindOfClass:[GPBUInt64Int32Dictionary class]]) {
5736 return NO;
5737 }
5738 return [_dictionary isEqual:other->_dictionary];
5739 }
5740
5741 - (NSUInteger)hash {
5742 return _dictionary.count;
5743 }
5744
5745 - (NSString *)description {
5746 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
5747 }
5748
5749 - (NSUInteger)count {
5750 return _dictionary.count;
5751 }
5752
5753 - (void)enumerateKeysAndValuesUsingBlock:
5754 (void (^)(uint64_t key, int32_t value, BOOL *stop))block {
5755 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5756 NSNumber *aValue,
5757 BOOL *stop) {
5758 block([aKey unsignedLongLongValue], [aValue intValue], stop);
5759 }];
5760 }
5761
5762 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5763 NSUInteger count = _dictionary.count;
5764 if (count == 0) {
5765 return 0;
5766 }
5767
5768 GPBDataType valueDataType = GPBGetFieldDataType(field);
5769 GPBDataType keyDataType = field.mapKeyDataType;
5770 __block size_t result = 0;
5771 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5772 NSNumber *aValue,
5773 BOOL *stop) {
5774 #pragma unused(stop)
5775 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
5776 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
5777 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5778 }];
5779 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
5780 result += tagSize * count;
5781 return result;
5782 }
5783
5784 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5785 asField:(GPBFieldDescriptor *)field {
5786 GPBDataType valueDataType = GPBGetFieldDataType(field);
5787 GPBDataType keyDataType = field.mapKeyDataType;
5788 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
5789 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5790 NSNumber *aValue,
5791 BOOL *stop) {
5792 #pragma unused(stop)
5793 // Write the tag.
5794 [outputStream writeInt32NoTag:tag];
5795 // Write the size of the message.
5796 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
5797 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
5798 [outputStream writeInt32NoTag:(int32_t)msgSize];
5799 // Write the fields.
5800 WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFiel dNumber, keyDataType);
5801 WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, v alueDataType);
5802 }];
5803 }
5804
5805 - (void)setGPBGenericValue:(GPBGenericValue *)value
5806 forGPBGenericValueKey:(GPBGenericValue *)key {
5807 [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueUInt64)];
5808 }
5809
5810 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
5811 [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, int32_t value, BOOL *st op) {
5812 #pragma unused(stop)
5813 block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat :@"%d", value]);
5814 }];
5815 }
5816
5817 - (BOOL)valueForKey:(uint64_t)key value:(int32_t *)value {
5818 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
5819 if (wrapped && value) {
5820 *value = [wrapped intValue];
5821 }
5822 return (wrapped != NULL);
5823 }
5824
5825 - (void)addEntriesFromDictionary:(GPBUInt64Int32Dictionary *)otherDictionary {
5826 if (otherDictionary) {
5827 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
5828 if (_autocreator) {
5829 GPBAutocreatedDictionaryModified(_autocreator, self);
5830 }
5831 }
5832 }
5833
5834 - (void)setValue:(int32_t)value forKey:(uint64_t)key {
5835 [_dictionary setObject:@(value) forKey:@(key)];
5836 if (_autocreator) {
5837 GPBAutocreatedDictionaryModified(_autocreator, self);
5838 }
5839 }
5840
5841 - (void)removeValueForKey:(uint64_t)aKey {
5842 [_dictionary removeObjectForKey:@(aKey)];
5843 }
5844
5845 - (void)removeAll {
5846 [_dictionary removeAllObjects];
5847 }
5848
5849 @end
5850
5851 #pragma mark - UInt64 -> UInt64
5852
5853 @implementation GPBUInt64UInt64Dictionary {
5854 @package
5855 NSMutableDictionary *_dictionary;
5856 }
5857
5858 + (instancetype)dictionary {
5859 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
5860 }
5861
5862 + (instancetype)dictionaryWithValue:(uint64_t)value
5863 forKey:(uint64_t)key {
5864 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
5865 // on to get the type correct.
5866 return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithValues:&value
5867 forKeys:&key
5868 count:1] autoreleas e];
5869 }
5870
5871 + (instancetype)dictionaryWithValues:(const uint64_t [])values
5872 forKeys:(const uint64_t [])keys
5873 count:(NSUInteger)count {
5874 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
5875 // on to get the type correct.
5876 return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithValues:values
5877 forKeys:keys
5878 count:count] autore lease];
5879 }
5880
5881 + (instancetype)dictionaryWithDictionary:(GPBUInt64UInt64Dictionary *)dictionary {
5882 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
5883 // on to get the type correct.
5884 return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
5885 }
5886
5887 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
5888 return [[[self alloc] initWithCapacity:numItems] autorelease];
5889 }
5890
5891 - (instancetype)init {
5892 return [self initWithValues:NULL forKeys:NULL count:0];
5893 }
5894
5895 - (instancetype)initWithValues:(const uint64_t [])values
5896 forKeys:(const uint64_t [])keys
5897 count:(NSUInteger)count {
5898 self = [super init];
5899 if (self) {
5900 _dictionary = [[NSMutableDictionary alloc] init];
5901 if (count && values && keys) {
5902 for (NSUInteger i = 0; i < count; ++i) {
5903 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
5904 }
5905 }
5906 }
5907 return self;
5908 }
5909
5910 - (instancetype)initWithDictionary:(GPBUInt64UInt64Dictionary *)dictionary {
5911 self = [self initWithValues:NULL forKeys:NULL count:0];
5912 if (self) {
5913 if (dictionary) {
5914 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
5915 }
5916 }
5917 return self;
5918 }
5919
5920 - (instancetype)initWithCapacity:(NSUInteger)numItems {
5921 #pragma unused(numItems)
5922 return [self initWithValues:NULL forKeys:NULL count:0];
5923 }
5924
5925 - (void)dealloc {
5926 NSAssert(!_autocreator,
5927 @"%@: Autocreator must be cleared before release, autocreator: %@",
5928 [self class], _autocreator);
5929 [_dictionary release];
5930 [super dealloc];
5931 }
5932
5933 - (instancetype)copyWithZone:(NSZone *)zone {
5934 return [[GPBUInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self ];
5935 }
5936
5937 - (BOOL)isEqual:(GPBUInt64UInt64Dictionary *)other {
5938 if (self == other) {
5939 return YES;
5940 }
5941 if (![other isKindOfClass:[GPBUInt64UInt64Dictionary class]]) {
5942 return NO;
5943 }
5944 return [_dictionary isEqual:other->_dictionary];
5945 }
5946
5947 - (NSUInteger)hash {
5948 return _dictionary.count;
5949 }
5950
5951 - (NSString *)description {
5952 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
5953 }
5954
5955 - (NSUInteger)count {
5956 return _dictionary.count;
5957 }
5958
5959 - (void)enumerateKeysAndValuesUsingBlock:
5960 (void (^)(uint64_t key, uint64_t value, BOOL *stop))block {
5961 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5962 NSNumber *aValue,
5963 BOOL *stop) {
5964 block([aKey unsignedLongLongValue], [aValue unsignedLongLongValue], stop);
5965 }];
5966 }
5967
5968 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
5969 NSUInteger count = _dictionary.count;
5970 if (count == 0) {
5971 return 0;
5972 }
5973
5974 GPBDataType valueDataType = GPBGetFieldDataType(field);
5975 GPBDataType keyDataType = field.mapKeyDataType;
5976 __block size_t result = 0;
5977 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5978 NSNumber *aValue,
5979 BOOL *stop) {
5980 #pragma unused(stop)
5981 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
5982 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
5983 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
5984 }];
5985 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
5986 result += tagSize * count;
5987 return result;
5988 }
5989
5990 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
5991 asField:(GPBFieldDescriptor *)field {
5992 GPBDataType valueDataType = GPBGetFieldDataType(field);
5993 GPBDataType keyDataType = field.mapKeyDataType;
5994 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
5995 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
5996 NSNumber *aValue,
5997 BOOL *stop) {
5998 #pragma unused(stop)
5999 // Write the tag.
6000 [outputStream writeInt32NoTag:tag];
6001 // Write the size of the message.
6002 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
6003 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
6004 [outputStream writeInt32NoTag:(int32_t)msgSize];
6005 // Write the fields.
6006 WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFiel dNumber, keyDataType);
6007 WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValue FieldNumber, valueDataType);
6008 }];
6009 }
6010
6011 - (void)setGPBGenericValue:(GPBGenericValue *)value
6012 forGPBGenericValueKey:(GPBGenericValue *)key {
6013 [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueUInt64)];
6014 }
6015
6016 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
6017 [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, uint64_t value, BOOL *s top) {
6018 #pragma unused(stop)
6019 block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat :@"%llu", value]);
6020 }];
6021 }
6022
6023 - (BOOL)valueForKey:(uint64_t)key value:(uint64_t *)value {
6024 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6025 if (wrapped && value) {
6026 *value = [wrapped unsignedLongLongValue];
6027 }
6028 return (wrapped != NULL);
6029 }
6030
6031 - (void)addEntriesFromDictionary:(GPBUInt64UInt64Dictionary *)otherDictionary {
6032 if (otherDictionary) {
6033 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6034 if (_autocreator) {
6035 GPBAutocreatedDictionaryModified(_autocreator, self);
6036 }
6037 }
6038 }
6039
6040 - (void)setValue:(uint64_t)value forKey:(uint64_t)key {
6041 [_dictionary setObject:@(value) forKey:@(key)];
6042 if (_autocreator) {
6043 GPBAutocreatedDictionaryModified(_autocreator, self);
6044 }
6045 }
6046
6047 - (void)removeValueForKey:(uint64_t)aKey {
6048 [_dictionary removeObjectForKey:@(aKey)];
6049 }
6050
6051 - (void)removeAll {
6052 [_dictionary removeAllObjects];
6053 }
6054
6055 @end
6056
6057 #pragma mark - UInt64 -> Int64
6058
6059 @implementation GPBUInt64Int64Dictionary {
6060 @package
6061 NSMutableDictionary *_dictionary;
6062 }
6063
6064 + (instancetype)dictionary {
6065 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
6066 }
6067
6068 + (instancetype)dictionaryWithValue:(int64_t)value
6069 forKey:(uint64_t)key {
6070 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6071 // on to get the type correct.
6072 return [[(GPBUInt64Int64Dictionary*)[self alloc] initWithValues:&value
6073 forKeys:&key
6074 count:1] autorelease ];
6075 }
6076
6077 + (instancetype)dictionaryWithValues:(const int64_t [])values
6078 forKeys:(const uint64_t [])keys
6079 count:(NSUInteger)count {
6080 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6081 // on to get the type correct.
6082 return [[(GPBUInt64Int64Dictionary*)[self alloc] initWithValues:values
6083 forKeys:keys
6084 count:count] autorel ease];
6085 }
6086
6087 + (instancetype)dictionaryWithDictionary:(GPBUInt64Int64Dictionary *)dictionary {
6088 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
6089 // on to get the type correct.
6090 return [[(GPBUInt64Int64Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
6091 }
6092
6093 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
6094 return [[[self alloc] initWithCapacity:numItems] autorelease];
6095 }
6096
6097 - (instancetype)init {
6098 return [self initWithValues:NULL forKeys:NULL count:0];
6099 }
6100
6101 - (instancetype)initWithValues:(const int64_t [])values
6102 forKeys:(const uint64_t [])keys
6103 count:(NSUInteger)count {
6104 self = [super init];
6105 if (self) {
6106 _dictionary = [[NSMutableDictionary alloc] init];
6107 if (count && values && keys) {
6108 for (NSUInteger i = 0; i < count; ++i) {
6109 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6110 }
6111 }
6112 }
6113 return self;
6114 }
6115
6116 - (instancetype)initWithDictionary:(GPBUInt64Int64Dictionary *)dictionary {
6117 self = [self initWithValues:NULL forKeys:NULL count:0];
6118 if (self) {
6119 if (dictionary) {
6120 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6121 }
6122 }
6123 return self;
6124 }
6125
6126 - (instancetype)initWithCapacity:(NSUInteger)numItems {
6127 #pragma unused(numItems)
6128 return [self initWithValues:NULL forKeys:NULL count:0];
6129 }
6130
6131 - (void)dealloc {
6132 NSAssert(!_autocreator,
6133 @"%@: Autocreator must be cleared before release, autocreator: %@",
6134 [self class], _autocreator);
6135 [_dictionary release];
6136 [super dealloc];
6137 }
6138
6139 - (instancetype)copyWithZone:(NSZone *)zone {
6140 return [[GPBUInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self] ;
6141 }
6142
6143 - (BOOL)isEqual:(GPBUInt64Int64Dictionary *)other {
6144 if (self == other) {
6145 return YES;
6146 }
6147 if (![other isKindOfClass:[GPBUInt64Int64Dictionary class]]) {
6148 return NO;
6149 }
6150 return [_dictionary isEqual:other->_dictionary];
6151 }
6152
6153 - (NSUInteger)hash {
6154 return _dictionary.count;
6155 }
6156
6157 - (NSString *)description {
6158 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
6159 }
6160
6161 - (NSUInteger)count {
6162 return _dictionary.count;
6163 }
6164
6165 - (void)enumerateKeysAndValuesUsingBlock:
6166 (void (^)(uint64_t key, int64_t value, BOOL *stop))block {
6167 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6168 NSNumber *aValue,
6169 BOOL *stop) {
6170 block([aKey unsignedLongLongValue], [aValue longLongValue], stop);
6171 }];
6172 }
6173
6174 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6175 NSUInteger count = _dictionary.count;
6176 if (count == 0) {
6177 return 0;
6178 }
6179
6180 GPBDataType valueDataType = GPBGetFieldDataType(field);
6181 GPBDataType keyDataType = field.mapKeyDataType;
6182 __block size_t result = 0;
6183 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6184 NSNumber *aValue,
6185 BOOL *stop) {
6186 #pragma unused(stop)
6187 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
6188 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
6189 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6190 }];
6191 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
6192 result += tagSize * count;
6193 return result;
6194 }
6195
6196 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6197 asField:(GPBFieldDescriptor *)field {
6198 GPBDataType valueDataType = GPBGetFieldDataType(field);
6199 GPBDataType keyDataType = field.mapKeyDataType;
6200 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
6201 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6202 NSNumber *aValue,
6203 BOOL *stop) {
6204 #pragma unused(stop)
6205 // Write the tag.
6206 [outputStream writeInt32NoTag:tag];
6207 // Write the size of the message.
6208 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
6209 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
6210 [outputStream writeInt32NoTag:(int32_t)msgSize];
6211 // Write the fields.
6212 WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFiel dNumber, keyDataType);
6213 WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumb er, valueDataType);
6214 }];
6215 }
6216
6217 - (void)setGPBGenericValue:(GPBGenericValue *)value
6218 forGPBGenericValueKey:(GPBGenericValue *)key {
6219 [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueUInt64)];
6220 }
6221
6222 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
6223 [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, int64_t value, BOOL *st op) {
6224 #pragma unused(stop)
6225 block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat :@"%lld", value]);
6226 }];
6227 }
6228
6229 - (BOOL)valueForKey:(uint64_t)key value:(int64_t *)value {
6230 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6231 if (wrapped && value) {
6232 *value = [wrapped longLongValue];
6233 }
6234 return (wrapped != NULL);
6235 }
6236
6237 - (void)addEntriesFromDictionary:(GPBUInt64Int64Dictionary *)otherDictionary {
6238 if (otherDictionary) {
6239 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6240 if (_autocreator) {
6241 GPBAutocreatedDictionaryModified(_autocreator, self);
6242 }
6243 }
6244 }
6245
6246 - (void)setValue:(int64_t)value forKey:(uint64_t)key {
6247 [_dictionary setObject:@(value) forKey:@(key)];
6248 if (_autocreator) {
6249 GPBAutocreatedDictionaryModified(_autocreator, self);
6250 }
6251 }
6252
6253 - (void)removeValueForKey:(uint64_t)aKey {
6254 [_dictionary removeObjectForKey:@(aKey)];
6255 }
6256
6257 - (void)removeAll {
6258 [_dictionary removeAllObjects];
6259 }
6260
6261 @end
6262
6263 #pragma mark - UInt64 -> Bool
6264
6265 @implementation GPBUInt64BoolDictionary {
6266 @package
6267 NSMutableDictionary *_dictionary;
6268 }
6269
6270 + (instancetype)dictionary {
6271 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
6272 }
6273
6274 + (instancetype)dictionaryWithValue:(BOOL)value
6275 forKey:(uint64_t)key {
6276 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6277 // on to get the type correct.
6278 return [[(GPBUInt64BoolDictionary*)[self alloc] initWithValues:&value
6279 forKeys:&key
6280 count:1] autorelease] ;
6281 }
6282
6283 + (instancetype)dictionaryWithValues:(const BOOL [])values
6284 forKeys:(const uint64_t [])keys
6285 count:(NSUInteger)count {
6286 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6287 // on to get the type correct.
6288 return [[(GPBUInt64BoolDictionary*)[self alloc] initWithValues:values
6289 forKeys:keys
6290 count:count] autorele ase];
6291 }
6292
6293 + (instancetype)dictionaryWithDictionary:(GPBUInt64BoolDictionary *)dictionary {
6294 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
6295 // on to get the type correct.
6296 return [[(GPBUInt64BoolDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
6297 }
6298
6299 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
6300 return [[[self alloc] initWithCapacity:numItems] autorelease];
6301 }
6302
6303 - (instancetype)init {
6304 return [self initWithValues:NULL forKeys:NULL count:0];
6305 }
6306
6307 - (instancetype)initWithValues:(const BOOL [])values
6308 forKeys:(const uint64_t [])keys
6309 count:(NSUInteger)count {
6310 self = [super init];
6311 if (self) {
6312 _dictionary = [[NSMutableDictionary alloc] init];
6313 if (count && values && keys) {
6314 for (NSUInteger i = 0; i < count; ++i) {
6315 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6316 }
6317 }
6318 }
6319 return self;
6320 }
6321
6322 - (instancetype)initWithDictionary:(GPBUInt64BoolDictionary *)dictionary {
6323 self = [self initWithValues:NULL forKeys:NULL count:0];
6324 if (self) {
6325 if (dictionary) {
6326 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6327 }
6328 }
6329 return self;
6330 }
6331
6332 - (instancetype)initWithCapacity:(NSUInteger)numItems {
6333 #pragma unused(numItems)
6334 return [self initWithValues:NULL forKeys:NULL count:0];
6335 }
6336
6337 - (void)dealloc {
6338 NSAssert(!_autocreator,
6339 @"%@: Autocreator must be cleared before release, autocreator: %@",
6340 [self class], _autocreator);
6341 [_dictionary release];
6342 [super dealloc];
6343 }
6344
6345 - (instancetype)copyWithZone:(NSZone *)zone {
6346 return [[GPBUInt64BoolDictionary allocWithZone:zone] initWithDictionary:self];
6347 }
6348
6349 - (BOOL)isEqual:(GPBUInt64BoolDictionary *)other {
6350 if (self == other) {
6351 return YES;
6352 }
6353 if (![other isKindOfClass:[GPBUInt64BoolDictionary class]]) {
6354 return NO;
6355 }
6356 return [_dictionary isEqual:other->_dictionary];
6357 }
6358
6359 - (NSUInteger)hash {
6360 return _dictionary.count;
6361 }
6362
6363 - (NSString *)description {
6364 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
6365 }
6366
6367 - (NSUInteger)count {
6368 return _dictionary.count;
6369 }
6370
6371 - (void)enumerateKeysAndValuesUsingBlock:
6372 (void (^)(uint64_t key, BOOL value, BOOL *stop))block {
6373 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6374 NSNumber *aValue,
6375 BOOL *stop) {
6376 block([aKey unsignedLongLongValue], [aValue boolValue], stop);
6377 }];
6378 }
6379
6380 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6381 NSUInteger count = _dictionary.count;
6382 if (count == 0) {
6383 return 0;
6384 }
6385
6386 GPBDataType valueDataType = GPBGetFieldDataType(field);
6387 GPBDataType keyDataType = field.mapKeyDataType;
6388 __block size_t result = 0;
6389 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6390 NSNumber *aValue,
6391 BOOL *stop) {
6392 #pragma unused(stop)
6393 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
6394 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
6395 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6396 }];
6397 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
6398 result += tagSize * count;
6399 return result;
6400 }
6401
6402 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6403 asField:(GPBFieldDescriptor *)field {
6404 GPBDataType valueDataType = GPBGetFieldDataType(field);
6405 GPBDataType keyDataType = field.mapKeyDataType;
6406 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
6407 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6408 NSNumber *aValue,
6409 BOOL *stop) {
6410 #pragma unused(stop)
6411 // Write the tag.
6412 [outputStream writeInt32NoTag:tag];
6413 // Write the size of the message.
6414 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
6415 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
6416 [outputStream writeInt32NoTag:(int32_t)msgSize];
6417 // Write the fields.
6418 WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFiel dNumber, keyDataType);
6419 WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, v alueDataType);
6420 }];
6421 }
6422
6423 - (void)setGPBGenericValue:(GPBGenericValue *)value
6424 forGPBGenericValueKey:(GPBGenericValue *)key {
6425 [_dictionary setObject:@(value->valueBool) forKey:@(key->valueUInt64)];
6426 }
6427
6428 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
6429 [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, BOOL value, BOOL *stop) {
6430 #pragma unused(stop)
6431 block([NSString stringWithFormat:@"%llu", key], (value ? @"true" : @"false "));
6432 }];
6433 }
6434
6435 - (BOOL)valueForKey:(uint64_t)key value:(BOOL *)value {
6436 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6437 if (wrapped && value) {
6438 *value = [wrapped boolValue];
6439 }
6440 return (wrapped != NULL);
6441 }
6442
6443 - (void)addEntriesFromDictionary:(GPBUInt64BoolDictionary *)otherDictionary {
6444 if (otherDictionary) {
6445 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6446 if (_autocreator) {
6447 GPBAutocreatedDictionaryModified(_autocreator, self);
6448 }
6449 }
6450 }
6451
6452 - (void)setValue:(BOOL)value forKey:(uint64_t)key {
6453 [_dictionary setObject:@(value) forKey:@(key)];
6454 if (_autocreator) {
6455 GPBAutocreatedDictionaryModified(_autocreator, self);
6456 }
6457 }
6458
6459 - (void)removeValueForKey:(uint64_t)aKey {
6460 [_dictionary removeObjectForKey:@(aKey)];
6461 }
6462
6463 - (void)removeAll {
6464 [_dictionary removeAllObjects];
6465 }
6466
6467 @end
6468
6469 #pragma mark - UInt64 -> Float
6470
6471 @implementation GPBUInt64FloatDictionary {
6472 @package
6473 NSMutableDictionary *_dictionary;
6474 }
6475
6476 + (instancetype)dictionary {
6477 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
6478 }
6479
6480 + (instancetype)dictionaryWithValue:(float)value
6481 forKey:(uint64_t)key {
6482 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6483 // on to get the type correct.
6484 return [[(GPBUInt64FloatDictionary*)[self alloc] initWithValues:&value
6485 forKeys:&key
6486 count:1] autorelease ];
6487 }
6488
6489 + (instancetype)dictionaryWithValues:(const float [])values
6490 forKeys:(const uint64_t [])keys
6491 count:(NSUInteger)count {
6492 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6493 // on to get the type correct.
6494 return [[(GPBUInt64FloatDictionary*)[self alloc] initWithValues:values
6495 forKeys:keys
6496 count:count] autorel ease];
6497 }
6498
6499 + (instancetype)dictionaryWithDictionary:(GPBUInt64FloatDictionary *)dictionary {
6500 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
6501 // on to get the type correct.
6502 return [[(GPBUInt64FloatDictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
6503 }
6504
6505 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
6506 return [[[self alloc] initWithCapacity:numItems] autorelease];
6507 }
6508
6509 - (instancetype)init {
6510 return [self initWithValues:NULL forKeys:NULL count:0];
6511 }
6512
6513 - (instancetype)initWithValues:(const float [])values
6514 forKeys:(const uint64_t [])keys
6515 count:(NSUInteger)count {
6516 self = [super init];
6517 if (self) {
6518 _dictionary = [[NSMutableDictionary alloc] init];
6519 if (count && values && keys) {
6520 for (NSUInteger i = 0; i < count; ++i) {
6521 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6522 }
6523 }
6524 }
6525 return self;
6526 }
6527
6528 - (instancetype)initWithDictionary:(GPBUInt64FloatDictionary *)dictionary {
6529 self = [self initWithValues:NULL forKeys:NULL count:0];
6530 if (self) {
6531 if (dictionary) {
6532 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6533 }
6534 }
6535 return self;
6536 }
6537
6538 - (instancetype)initWithCapacity:(NSUInteger)numItems {
6539 #pragma unused(numItems)
6540 return [self initWithValues:NULL forKeys:NULL count:0];
6541 }
6542
6543 - (void)dealloc {
6544 NSAssert(!_autocreator,
6545 @"%@: Autocreator must be cleared before release, autocreator: %@",
6546 [self class], _autocreator);
6547 [_dictionary release];
6548 [super dealloc];
6549 }
6550
6551 - (instancetype)copyWithZone:(NSZone *)zone {
6552 return [[GPBUInt64FloatDictionary allocWithZone:zone] initWithDictionary:self] ;
6553 }
6554
6555 - (BOOL)isEqual:(GPBUInt64FloatDictionary *)other {
6556 if (self == other) {
6557 return YES;
6558 }
6559 if (![other isKindOfClass:[GPBUInt64FloatDictionary class]]) {
6560 return NO;
6561 }
6562 return [_dictionary isEqual:other->_dictionary];
6563 }
6564
6565 - (NSUInteger)hash {
6566 return _dictionary.count;
6567 }
6568
6569 - (NSString *)description {
6570 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
6571 }
6572
6573 - (NSUInteger)count {
6574 return _dictionary.count;
6575 }
6576
6577 - (void)enumerateKeysAndValuesUsingBlock:
6578 (void (^)(uint64_t key, float value, BOOL *stop))block {
6579 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6580 NSNumber *aValue,
6581 BOOL *stop) {
6582 block([aKey unsignedLongLongValue], [aValue floatValue], stop);
6583 }];
6584 }
6585
6586 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6587 NSUInteger count = _dictionary.count;
6588 if (count == 0) {
6589 return 0;
6590 }
6591
6592 GPBDataType valueDataType = GPBGetFieldDataType(field);
6593 GPBDataType keyDataType = field.mapKeyDataType;
6594 __block size_t result = 0;
6595 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6596 NSNumber *aValue,
6597 BOOL *stop) {
6598 #pragma unused(stop)
6599 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
6600 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
6601 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6602 }];
6603 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
6604 result += tagSize * count;
6605 return result;
6606 }
6607
6608 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6609 asField:(GPBFieldDescriptor *)field {
6610 GPBDataType valueDataType = GPBGetFieldDataType(field);
6611 GPBDataType keyDataType = field.mapKeyDataType;
6612 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
6613 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6614 NSNumber *aValue,
6615 BOOL *stop) {
6616 #pragma unused(stop)
6617 // Write the tag.
6618 [outputStream writeInt32NoTag:tag];
6619 // Write the size of the message.
6620 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
6621 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
6622 [outputStream writeInt32NoTag:(int32_t)msgSize];
6623 // Write the fields.
6624 WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFiel dNumber, keyDataType);
6625 WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
6626 }];
6627 }
6628
6629 - (void)setGPBGenericValue:(GPBGenericValue *)value
6630 forGPBGenericValueKey:(GPBGenericValue *)key {
6631 [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueUInt64)];
6632 }
6633
6634 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
6635 [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, float value, BOOL *stop ) {
6636 #pragma unused(stop)
6637 block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat :@"%.*g", FLT_DIG, value]);
6638 }];
6639 }
6640
6641 - (BOOL)valueForKey:(uint64_t)key value:(float *)value {
6642 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6643 if (wrapped && value) {
6644 *value = [wrapped floatValue];
6645 }
6646 return (wrapped != NULL);
6647 }
6648
6649 - (void)addEntriesFromDictionary:(GPBUInt64FloatDictionary *)otherDictionary {
6650 if (otherDictionary) {
6651 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6652 if (_autocreator) {
6653 GPBAutocreatedDictionaryModified(_autocreator, self);
6654 }
6655 }
6656 }
6657
6658 - (void)setValue:(float)value forKey:(uint64_t)key {
6659 [_dictionary setObject:@(value) forKey:@(key)];
6660 if (_autocreator) {
6661 GPBAutocreatedDictionaryModified(_autocreator, self);
6662 }
6663 }
6664
6665 - (void)removeValueForKey:(uint64_t)aKey {
6666 [_dictionary removeObjectForKey:@(aKey)];
6667 }
6668
6669 - (void)removeAll {
6670 [_dictionary removeAllObjects];
6671 }
6672
6673 @end
6674
6675 #pragma mark - UInt64 -> Double
6676
6677 @implementation GPBUInt64DoubleDictionary {
6678 @package
6679 NSMutableDictionary *_dictionary;
6680 }
6681
6682 + (instancetype)dictionary {
6683 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
6684 }
6685
6686 + (instancetype)dictionaryWithValue:(double)value
6687 forKey:(uint64_t)key {
6688 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6689 // on to get the type correct.
6690 return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithValues:&value
6691 forKeys:&key
6692 count:1] autoreleas e];
6693 }
6694
6695 + (instancetype)dictionaryWithValues:(const double [])values
6696 forKeys:(const uint64_t [])keys
6697 count:(NSUInteger)count {
6698 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6699 // on to get the type correct.
6700 return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithValues:values
6701 forKeys:keys
6702 count:count] autore lease];
6703 }
6704
6705 + (instancetype)dictionaryWithDictionary:(GPBUInt64DoubleDictionary *)dictionary {
6706 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
6707 // on to get the type correct.
6708 return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
6709 }
6710
6711 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
6712 return [[[self alloc] initWithCapacity:numItems] autorelease];
6713 }
6714
6715 - (instancetype)init {
6716 return [self initWithValues:NULL forKeys:NULL count:0];
6717 }
6718
6719 - (instancetype)initWithValues:(const double [])values
6720 forKeys:(const uint64_t [])keys
6721 count:(NSUInteger)count {
6722 self = [super init];
6723 if (self) {
6724 _dictionary = [[NSMutableDictionary alloc] init];
6725 if (count && values && keys) {
6726 for (NSUInteger i = 0; i < count; ++i) {
6727 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
6728 }
6729 }
6730 }
6731 return self;
6732 }
6733
6734 - (instancetype)initWithDictionary:(GPBUInt64DoubleDictionary *)dictionary {
6735 self = [self initWithValues:NULL forKeys:NULL count:0];
6736 if (self) {
6737 if (dictionary) {
6738 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6739 }
6740 }
6741 return self;
6742 }
6743
6744 - (instancetype)initWithCapacity:(NSUInteger)numItems {
6745 #pragma unused(numItems)
6746 return [self initWithValues:NULL forKeys:NULL count:0];
6747 }
6748
6749 - (void)dealloc {
6750 NSAssert(!_autocreator,
6751 @"%@: Autocreator must be cleared before release, autocreator: %@",
6752 [self class], _autocreator);
6753 [_dictionary release];
6754 [super dealloc];
6755 }
6756
6757 - (instancetype)copyWithZone:(NSZone *)zone {
6758 return [[GPBUInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self ];
6759 }
6760
6761 - (BOOL)isEqual:(GPBUInt64DoubleDictionary *)other {
6762 if (self == other) {
6763 return YES;
6764 }
6765 if (![other isKindOfClass:[GPBUInt64DoubleDictionary class]]) {
6766 return NO;
6767 }
6768 return [_dictionary isEqual:other->_dictionary];
6769 }
6770
6771 - (NSUInteger)hash {
6772 return _dictionary.count;
6773 }
6774
6775 - (NSString *)description {
6776 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
6777 }
6778
6779 - (NSUInteger)count {
6780 return _dictionary.count;
6781 }
6782
6783 - (void)enumerateKeysAndValuesUsingBlock:
6784 (void (^)(uint64_t key, double value, BOOL *stop))block {
6785 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6786 NSNumber *aValue,
6787 BOOL *stop) {
6788 block([aKey unsignedLongLongValue], [aValue doubleValue], stop);
6789 }];
6790 }
6791
6792 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
6793 NSUInteger count = _dictionary.count;
6794 if (count == 0) {
6795 return 0;
6796 }
6797
6798 GPBDataType valueDataType = GPBGetFieldDataType(field);
6799 GPBDataType keyDataType = field.mapKeyDataType;
6800 __block size_t result = 0;
6801 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6802 NSNumber *aValue,
6803 BOOL *stop) {
6804 #pragma unused(stop)
6805 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
6806 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
6807 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
6808 }];
6809 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
6810 result += tagSize * count;
6811 return result;
6812 }
6813
6814 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
6815 asField:(GPBFieldDescriptor *)field {
6816 GPBDataType valueDataType = GPBGetFieldDataType(field);
6817 GPBDataType keyDataType = field.mapKeyDataType;
6818 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
6819 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
6820 NSNumber *aValue,
6821 BOOL *stop) {
6822 #pragma unused(stop)
6823 // Write the tag.
6824 [outputStream writeInt32NoTag:tag];
6825 // Write the size of the message.
6826 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
6827 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
6828 [outputStream writeInt32NoTag:(int32_t)msgSize];
6829 // Write the fields.
6830 WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFiel dNumber, keyDataType);
6831 WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumbe r, valueDataType);
6832 }];
6833 }
6834
6835 - (void)setGPBGenericValue:(GPBGenericValue *)value
6836 forGPBGenericValueKey:(GPBGenericValue *)key {
6837 [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueUInt64)];
6838 }
6839
6840 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
6841 [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, double value, BOOL *sto p) {
6842 #pragma unused(stop)
6843 block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat :@"%.*lg", DBL_DIG, value]);
6844 }];
6845 }
6846
6847 - (BOOL)valueForKey:(uint64_t)key value:(double *)value {
6848 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
6849 if (wrapped && value) {
6850 *value = [wrapped doubleValue];
6851 }
6852 return (wrapped != NULL);
6853 }
6854
6855 - (void)addEntriesFromDictionary:(GPBUInt64DoubleDictionary *)otherDictionary {
6856 if (otherDictionary) {
6857 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
6858 if (_autocreator) {
6859 GPBAutocreatedDictionaryModified(_autocreator, self);
6860 }
6861 }
6862 }
6863
6864 - (void)setValue:(double)value forKey:(uint64_t)key {
6865 [_dictionary setObject:@(value) forKey:@(key)];
6866 if (_autocreator) {
6867 GPBAutocreatedDictionaryModified(_autocreator, self);
6868 }
6869 }
6870
6871 - (void)removeValueForKey:(uint64_t)aKey {
6872 [_dictionary removeObjectForKey:@(aKey)];
6873 }
6874
6875 - (void)removeAll {
6876 [_dictionary removeAllObjects];
6877 }
6878
6879 @end
6880
6881 #pragma mark - UInt64 -> Enum
6882
6883 @implementation GPBUInt64EnumDictionary {
6884 @package
6885 NSMutableDictionary *_dictionary;
6886 GPBEnumValidationFunc _validationFunc;
6887 }
6888
6889 @synthesize validationFunc = _validationFunc;
6890
6891 + (instancetype)dictionary {
6892 return [[[self alloc] initWithValidationFunction:NULL
6893 rawValues:NULL
6894 forKeys:NULL
6895 count:0] autorelease];
6896 }
6897
6898 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func {
6899 return [[[self alloc] initWithValidationFunction:func
6900 rawValues:NULL
6901 forKeys:NULL
6902 count:0] autorelease];
6903 }
6904
6905 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
6906 rawValue:(int32_t)rawValue
6907 forKey:(uint64_t)key {
6908 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6909 // on to get the type correct.
6910 return [[(GPBUInt64EnumDictionary*)[self alloc] initWithValidationFunction:fun c
6911 rawValues:&ra wValue
6912 forKeys:&ke y
6913 count:1] autorelease];
6914 }
6915
6916 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
6917 rawValues:(const int32_t [])rawValues
6918 forKeys:(const uint64_t [])keys
6919 count:(NSUInteger)count {
6920 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6921 // on to get the type correct.
6922 return [[(GPBUInt64EnumDictionary*)[self alloc] initWithValidationFunction:fun c
6923 rawValues:raw Values
6924 forKeys:key s
6925 count:cou nt] autorelease];
6926 }
6927
6928 + (instancetype)dictionaryWithDictionary:(GPBUInt64EnumDictionary *)dictionary {
6929 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
6930 // on to get the type correct.
6931 return [[(GPBUInt64EnumDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
6932 }
6933
6934 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
6935 capacity:(NSUInteger)numItems {
6936 return [[[self alloc] initWithValidationFunction:func capacity:numItems] autor elease];
6937 }
6938
6939 - (instancetype)init {
6940 return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count :0];
6941 }
6942
6943 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
6944 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
6945 }
6946
6947 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
6948 rawValues:(const int32_t [])rawValues
6949 forKeys:(const uint64_t [])keys
6950 count:(NSUInteger)count {
6951 self = [super init];
6952 if (self) {
6953 _dictionary = [[NSMutableDictionary alloc] init];
6954 _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
6955 if (count && rawValues && keys) {
6956 for (NSUInteger i = 0; i < count; ++i) {
6957 [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
6958 }
6959 }
6960 }
6961 return self;
6962 }
6963
6964 - (instancetype)initWithDictionary:(GPBUInt64EnumDictionary *)dictionary {
6965 self = [self initWithValidationFunction:dictionary.validationFunc
6966 rawValues:NULL
6967 forKeys:NULL
6968 count:0];
6969 if (self) {
6970 if (dictionary) {
6971 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
6972 }
6973 }
6974 return self;
6975 }
6976
6977 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
6978 capacity:(NSUInteger)numItems {
6979 #pragma unused(numItems)
6980 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
6981 }
6982
6983 - (void)dealloc {
6984 NSAssert(!_autocreator,
6985 @"%@: Autocreator must be cleared before release, autocreator: %@",
6986 [self class], _autocreator);
6987 [_dictionary release];
6988 [super dealloc];
6989 }
6990
6991 - (instancetype)copyWithZone:(NSZone *)zone {
6992 return [[GPBUInt64EnumDictionary allocWithZone:zone] initWithDictionary:self];
6993 }
6994
6995 - (BOOL)isEqual:(GPBUInt64EnumDictionary *)other {
6996 if (self == other) {
6997 return YES;
6998 }
6999 if (![other isKindOfClass:[GPBUInt64EnumDictionary class]]) {
7000 return NO;
7001 }
7002 return [_dictionary isEqual:other->_dictionary];
7003 }
7004
7005 - (NSUInteger)hash {
7006 return _dictionary.count;
7007 }
7008
7009 - (NSString *)description {
7010 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
7011 }
7012
7013 - (NSUInteger)count {
7014 return _dictionary.count;
7015 }
7016
7017 - (void)enumerateKeysAndRawValuesUsingBlock:
7018 (void (^)(uint64_t key, int32_t value, BOOL *stop))block {
7019 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7020 NSNumber *aValue,
7021 BOOL *stop) {
7022 block([aKey unsignedLongLongValue], [aValue intValue], stop);
7023 }];
7024 }
7025
7026 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7027 NSUInteger count = _dictionary.count;
7028 if (count == 0) {
7029 return 0;
7030 }
7031
7032 GPBDataType valueDataType = GPBGetFieldDataType(field);
7033 GPBDataType keyDataType = field.mapKeyDataType;
7034 __block size_t result = 0;
7035 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7036 NSNumber *aValue,
7037 BOOL *stop) {
7038 #pragma unused(stop)
7039 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
7040 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
7041 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7042 }];
7043 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
7044 result += tagSize * count;
7045 return result;
7046 }
7047
7048 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7049 asField:(GPBFieldDescriptor *)field {
7050 GPBDataType valueDataType = GPBGetFieldDataType(field);
7051 GPBDataType keyDataType = field.mapKeyDataType;
7052 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
7053 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7054 NSNumber *aValue,
7055 BOOL *stop) {
7056 #pragma unused(stop)
7057 // Write the tag.
7058 [outputStream writeInt32NoTag:tag];
7059 // Write the size of the message.
7060 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
7061 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
7062 [outputStream writeInt32NoTag:(int32_t)msgSize];
7063 // Write the fields.
7064 WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFiel dNumber, keyDataType);
7065 WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, va lueDataType);
7066 }];
7067 }
7068
7069 - (NSData *)serializedDataForUnknownValue:(int32_t)value
7070 forKey:(GPBGenericValue *)key
7071 keyDataType:(GPBDataType)keyDataType {
7072 size_t msgSize = ComputeDictUInt64FieldSize(key->valueUInt64, kMapKeyFieldNumb er, keyDataType);
7073 msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEn um);
7074 NSMutableData *data = [NSMutableData dataWithLength:msgSize];
7075 GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithDat a:data];
7076 WriteDictUInt64Field(outputStream, key->valueUInt64, kMapKeyFieldNumber, keyDa taType);
7077 WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum) ;
7078 [outputStream release];
7079 return data;
7080 }
7081 - (void)setGPBGenericValue:(GPBGenericValue *)value
7082 forGPBGenericValueKey:(GPBGenericValue *)key {
7083 [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueUInt64)];
7084 }
7085
7086 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
7087 [self enumerateKeysAndRawValuesUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) {
7088 #pragma unused(stop)
7089 block([NSString stringWithFormat:@"%llu", key], @(value));
7090 }];
7091 }
7092
7093 - (BOOL)valueForKey:(uint64_t)key value:(int32_t *)value {
7094 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7095 if (wrapped && value) {
7096 int32_t result = [wrapped intValue];
7097 if (!_validationFunc(result)) {
7098 result = kGPBUnrecognizedEnumeratorValue;
7099 }
7100 *value = result;
7101 }
7102 return (wrapped != NULL);
7103 }
7104
7105 - (BOOL)valueForKey:(uint64_t)key rawValue:(int32_t *)rawValue {
7106 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7107 if (wrapped && rawValue) {
7108 *rawValue = [wrapped intValue];
7109 }
7110 return (wrapped != NULL);
7111 }
7112
7113 - (void)enumerateKeysAndValuesUsingBlock:
7114 (void (^)(uint64_t key, int32_t value, BOOL *stop))block {
7115 GPBEnumValidationFunc func = _validationFunc;
7116 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7117 NSNumber *aValue,
7118 BOOL *stop) {
7119 int32_t unwrapped = [aValue intValue];
7120 if (!func(unwrapped)) {
7121 unwrapped = kGPBUnrecognizedEnumeratorValue;
7122 }
7123 block([aKey unsignedLongLongValue], unwrapped, stop);
7124 }];
7125 }
7126
7127 - (void)addRawEntriesFromDictionary:(GPBUInt64EnumDictionary *)otherDictionary {
7128 if (otherDictionary) {
7129 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7130 if (_autocreator) {
7131 GPBAutocreatedDictionaryModified(_autocreator, self);
7132 }
7133 }
7134 }
7135
7136 - (void)setRawValue:(int32_t)value forKey:(uint64_t)key {
7137 [_dictionary setObject:@(value) forKey:@(key)];
7138 if (_autocreator) {
7139 GPBAutocreatedDictionaryModified(_autocreator, self);
7140 }
7141 }
7142
7143 - (void)removeValueForKey:(uint64_t)aKey {
7144 [_dictionary removeObjectForKey:@(aKey)];
7145 }
7146
7147 - (void)removeAll {
7148 [_dictionary removeAllObjects];
7149 }
7150
7151 - (void)setValue:(int32_t)value forKey:(uint64_t)key {
7152 if (!_validationFunc(value)) {
7153 [NSException raise:NSInvalidArgumentException
7154 format:@"GPBUInt64EnumDictionary: Attempt to set an unknown enum value (%d)",
7155 value];
7156 }
7157
7158 [_dictionary setObject:@(value) forKey:@(key)];
7159 if (_autocreator) {
7160 GPBAutocreatedDictionaryModified(_autocreator, self);
7161 }
7162 }
7163
7164 @end
7165
7166 #pragma mark - UInt64 -> Object
7167
7168 @implementation GPBUInt64ObjectDictionary {
7169 @package
7170 NSMutableDictionary *_dictionary;
7171 }
7172
7173 + (instancetype)dictionary {
7174 return [[[self alloc] initWithObjects:NULL forKeys:NULL count:0] autorelease];
7175 }
7176
7177 + (instancetype)dictionaryWithObject:(id)object
7178 forKey:(uint64_t)key {
7179 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
7180 // on to get the type correct.
7181 return [[(GPBUInt64ObjectDictionary*)[self alloc] initWithObjects:&object
7182 forKeys:&key
7183 count:1] autorelea se];
7184 }
7185
7186 + (instancetype)dictionaryWithObjects:(const id [])objects
7187 forKeys:(const uint64_t [])keys
7188 count:(NSUInteger)count {
7189 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
7190 // on to get the type correct.
7191 return [[(GPBUInt64ObjectDictionary*)[self alloc] initWithObjects:objects
7192 forKeys:keys
7193 count:count] autore lease];
7194 }
7195
7196 + (instancetype)dictionaryWithDictionary:(GPBUInt64ObjectDictionary *)dictionary {
7197 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
7198 // on to get the type correct.
7199 return [[(GPBUInt64ObjectDictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
7200 }
7201
7202 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
7203 return [[[self alloc] initWithCapacity:numItems] autorelease];
7204 }
7205
7206 - (instancetype)init {
7207 return [self initWithObjects:NULL forKeys:NULL count:0];
7208 }
7209
7210 - (instancetype)initWithObjects:(const id [])objects
7211 forKeys:(const uint64_t [])keys
7212 count:(NSUInteger)count {
7213 self = [super init];
7214 if (self) {
7215 _dictionary = [[NSMutableDictionary alloc] init];
7216 if (count && objects && keys) {
7217 for (NSUInteger i = 0; i < count; ++i) {
7218 if (!objects[i]) {
7219 [NSException raise:NSInvalidArgumentException
7220 format:@"Attempting to add nil object to a Dictionary"];
7221 }
7222 [_dictionary setObject:objects[i] forKey:@(keys[i])];
7223 }
7224 }
7225 }
7226 return self;
7227 }
7228
7229 - (instancetype)initWithDictionary:(GPBUInt64ObjectDictionary *)dictionary {
7230 self = [self initWithObjects:NULL forKeys:NULL count:0];
7231 if (self) {
7232 if (dictionary) {
7233 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7234 }
7235 }
7236 return self;
7237 }
7238
7239 - (instancetype)initWithCapacity:(NSUInteger)numItems {
7240 #pragma unused(numItems)
7241 return [self initWithObjects:NULL forKeys:NULL count:0];
7242 }
7243
7244 - (void)dealloc {
7245 NSAssert(!_autocreator,
7246 @"%@: Autocreator must be cleared before release, autocreator: %@",
7247 [self class], _autocreator);
7248 [_dictionary release];
7249 [super dealloc];
7250 }
7251
7252 - (instancetype)copyWithZone:(NSZone *)zone {
7253 return [[GPBUInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self ];
7254 }
7255
7256 - (BOOL)isEqual:(GPBUInt64ObjectDictionary *)other {
7257 if (self == other) {
7258 return YES;
7259 }
7260 if (![other isKindOfClass:[GPBUInt64ObjectDictionary class]]) {
7261 return NO;
7262 }
7263 return [_dictionary isEqual:other->_dictionary];
7264 }
7265
7266 - (NSUInteger)hash {
7267 return _dictionary.count;
7268 }
7269
7270 - (NSString *)description {
7271 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
7272 }
7273
7274 - (NSUInteger)count {
7275 return _dictionary.count;
7276 }
7277
7278 - (void)enumerateKeysAndObjectsUsingBlock:
7279 (void (^)(uint64_t key, id object, BOOL *stop))block {
7280 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7281 id aObject,
7282 BOOL *stop) {
7283 block([aKey unsignedLongLongValue], aObject, stop);
7284 }];
7285 }
7286
7287 - (BOOL)isInitialized {
7288 for (GPBMessage *msg in [_dictionary objectEnumerator]) {
7289 if (!msg.initialized) {
7290 return NO;
7291 }
7292 }
7293 return YES;
7294 }
7295
7296 - (instancetype)deepCopyWithZone:(NSZone *)zone {
7297 GPBUInt64ObjectDictionary *newDict =
7298 [[GPBUInt64ObjectDictionary alloc] init];
7299 [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
7300 GPBMessage *msg,
7301 BOOL *stop) {
7302 #pragma unused(stop)
7303 GPBMessage *copiedMsg = [msg copyWithZone:zone];
7304 [newDict->_dictionary setObject:copiedMsg forKey:aKey];
7305 [copiedMsg release];
7306 }];
7307 return newDict;
7308 }
7309
7310 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7311 NSUInteger count = _dictionary.count;
7312 if (count == 0) {
7313 return 0;
7314 }
7315
7316 GPBDataType valueDataType = GPBGetFieldDataType(field);
7317 GPBDataType keyDataType = field.mapKeyDataType;
7318 __block size_t result = 0;
7319 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7320 id aObject,
7321 BOOL *stop) {
7322 #pragma unused(stop)
7323 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
7324 msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDa taType);
7325 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7326 }];
7327 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
7328 result += tagSize * count;
7329 return result;
7330 }
7331
7332 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7333 asField:(GPBFieldDescriptor *)field {
7334 GPBDataType valueDataType = GPBGetFieldDataType(field);
7335 GPBDataType keyDataType = field.mapKeyDataType;
7336 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
7337 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7338 id aObject,
7339 BOOL *stop) {
7340 #pragma unused(stop)
7341 // Write the tag.
7342 [outputStream writeInt32NoTag:tag];
7343 // Write the size of the message.
7344 size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kM apKeyFieldNumber, keyDataType);
7345 msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDa taType);
7346 [outputStream writeInt32NoTag:(int32_t)msgSize];
7347 // Write the fields.
7348 WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFiel dNumber, keyDataType);
7349 WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataT ype);
7350 }];
7351 }
7352
7353 - (void)setGPBGenericValue:(GPBGenericValue *)value
7354 forGPBGenericValueKey:(GPBGenericValue *)key {
7355 [_dictionary setObject:value->valueString forKey:@(key->valueUInt64)];
7356 }
7357
7358 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
7359 [self enumerateKeysAndObjectsUsingBlock:^(uint64_t key, id object, BOOL *stop) {
7360 #pragma unused(stop)
7361 block([NSString stringWithFormat:@"%llu", key], object);
7362 }];
7363 }
7364
7365 - (id)objectForKey:(uint64_t)key {
7366 id result = [_dictionary objectForKey:@(key)];
7367 return result;
7368 }
7369
7370 - (void)addEntriesFromDictionary:(GPBUInt64ObjectDictionary *)otherDictionary {
7371 if (otherDictionary) {
7372 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7373 if (_autocreator) {
7374 GPBAutocreatedDictionaryModified(_autocreator, self);
7375 }
7376 }
7377 }
7378
7379 - (void)setObject:(id)object forKey:(uint64_t)key {
7380 if (!object) {
7381 [NSException raise:NSInvalidArgumentException
7382 format:@"Attempting to add nil object to a Dictionary"];
7383 }
7384 [_dictionary setObject:object forKey:@(key)];
7385 if (_autocreator) {
7386 GPBAutocreatedDictionaryModified(_autocreator, self);
7387 }
7388 }
7389
7390 - (void)removeObjectForKey:(uint64_t)aKey {
7391 [_dictionary removeObjectForKey:@(aKey)];
7392 }
7393
7394 - (void)removeAll {
7395 [_dictionary removeAllObjects];
7396 }
7397
7398 @end
7399
7400 //%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int64, int64_t)
7401 // This block of code is generated, do not edit it directly.
7402
7403 #pragma mark - Int64 -> UInt32
7404
7405 @implementation GPBInt64UInt32Dictionary {
7406 @package
7407 NSMutableDictionary *_dictionary;
7408 }
7409
7410 + (instancetype)dictionary {
7411 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
7412 }
7413
7414 + (instancetype)dictionaryWithValue:(uint32_t)value
7415 forKey:(int64_t)key {
7416 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
7417 // on to get the type correct.
7418 return [[(GPBInt64UInt32Dictionary*)[self alloc] initWithValues:&value
7419 forKeys:&key
7420 count:1] autorelease ];
7421 }
7422
7423 + (instancetype)dictionaryWithValues:(const uint32_t [])values
7424 forKeys:(const int64_t [])keys
7425 count:(NSUInteger)count {
7426 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
7427 // on to get the type correct.
7428 return [[(GPBInt64UInt32Dictionary*)[self alloc] initWithValues:values
7429 forKeys:keys
7430 count:count] autorel ease];
7431 }
7432
7433 + (instancetype)dictionaryWithDictionary:(GPBInt64UInt32Dictionary *)dictionary {
7434 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
7435 // on to get the type correct.
7436 return [[(GPBInt64UInt32Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
7437 }
7438
7439 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
7440 return [[[self alloc] initWithCapacity:numItems] autorelease];
7441 }
7442
7443 - (instancetype)init {
7444 return [self initWithValues:NULL forKeys:NULL count:0];
7445 }
7446
7447 - (instancetype)initWithValues:(const uint32_t [])values
7448 forKeys:(const int64_t [])keys
7449 count:(NSUInteger)count {
7450 self = [super init];
7451 if (self) {
7452 _dictionary = [[NSMutableDictionary alloc] init];
7453 if (count && values && keys) {
7454 for (NSUInteger i = 0; i < count; ++i) {
7455 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7456 }
7457 }
7458 }
7459 return self;
7460 }
7461
7462 - (instancetype)initWithDictionary:(GPBInt64UInt32Dictionary *)dictionary {
7463 self = [self initWithValues:NULL forKeys:NULL count:0];
7464 if (self) {
7465 if (dictionary) {
7466 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7467 }
7468 }
7469 return self;
7470 }
7471
7472 - (instancetype)initWithCapacity:(NSUInteger)numItems {
7473 #pragma unused(numItems)
7474 return [self initWithValues:NULL forKeys:NULL count:0];
7475 }
7476
7477 - (void)dealloc {
7478 NSAssert(!_autocreator,
7479 @"%@: Autocreator must be cleared before release, autocreator: %@",
7480 [self class], _autocreator);
7481 [_dictionary release];
7482 [super dealloc];
7483 }
7484
7485 - (instancetype)copyWithZone:(NSZone *)zone {
7486 return [[GPBInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self] ;
7487 }
7488
7489 - (BOOL)isEqual:(GPBInt64UInt32Dictionary *)other {
7490 if (self == other) {
7491 return YES;
7492 }
7493 if (![other isKindOfClass:[GPBInt64UInt32Dictionary class]]) {
7494 return NO;
7495 }
7496 return [_dictionary isEqual:other->_dictionary];
7497 }
7498
7499 - (NSUInteger)hash {
7500 return _dictionary.count;
7501 }
7502
7503 - (NSString *)description {
7504 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
7505 }
7506
7507 - (NSUInteger)count {
7508 return _dictionary.count;
7509 }
7510
7511 - (void)enumerateKeysAndValuesUsingBlock:
7512 (void (^)(int64_t key, uint32_t value, BOOL *stop))block {
7513 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7514 NSNumber *aValue,
7515 BOOL *stop) {
7516 block([aKey longLongValue], [aValue unsignedIntValue], stop);
7517 }];
7518 }
7519
7520 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7521 NSUInteger count = _dictionary.count;
7522 if (count == 0) {
7523 return 0;
7524 }
7525
7526 GPBDataType valueDataType = GPBGetFieldDataType(field);
7527 GPBDataType keyDataType = field.mapKeyDataType;
7528 __block size_t result = 0;
7529 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7530 NSNumber *aValue,
7531 BOOL *stop) {
7532 #pragma unused(stop)
7533 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
7534 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
7535 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7536 }];
7537 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
7538 result += tagSize * count;
7539 return result;
7540 }
7541
7542 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7543 asField:(GPBFieldDescriptor *)field {
7544 GPBDataType valueDataType = GPBGetFieldDataType(field);
7545 GPBDataType keyDataType = field.mapKeyDataType;
7546 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
7547 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7548 NSNumber *aValue,
7549 BOOL *stop) {
7550 #pragma unused(stop)
7551 // Write the tag.
7552 [outputStream writeInt32NoTag:tag];
7553 // Write the size of the message.
7554 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
7555 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
7556 [outputStream writeInt32NoTag:(int32_t)msgSize];
7557 // Write the fields.
7558 WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7559 WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueField Number, valueDataType);
7560 }];
7561 }
7562
7563 - (void)setGPBGenericValue:(GPBGenericValue *)value
7564 forGPBGenericValueKey:(GPBGenericValue *)key {
7565 [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueInt64)];
7566 }
7567
7568 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
7569 [self enumerateKeysAndValuesUsingBlock:^(int64_t key, uint32_t value, BOOL *st op) {
7570 #pragma unused(stop)
7571 block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat :@"%u", value]);
7572 }];
7573 }
7574
7575 - (BOOL)valueForKey:(int64_t)key value:(uint32_t *)value {
7576 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7577 if (wrapped && value) {
7578 *value = [wrapped unsignedIntValue];
7579 }
7580 return (wrapped != NULL);
7581 }
7582
7583 - (void)addEntriesFromDictionary:(GPBInt64UInt32Dictionary *)otherDictionary {
7584 if (otherDictionary) {
7585 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7586 if (_autocreator) {
7587 GPBAutocreatedDictionaryModified(_autocreator, self);
7588 }
7589 }
7590 }
7591
7592 - (void)setValue:(uint32_t)value forKey:(int64_t)key {
7593 [_dictionary setObject:@(value) forKey:@(key)];
7594 if (_autocreator) {
7595 GPBAutocreatedDictionaryModified(_autocreator, self);
7596 }
7597 }
7598
7599 - (void)removeValueForKey:(int64_t)aKey {
7600 [_dictionary removeObjectForKey:@(aKey)];
7601 }
7602
7603 - (void)removeAll {
7604 [_dictionary removeAllObjects];
7605 }
7606
7607 @end
7608
7609 #pragma mark - Int64 -> Int32
7610
7611 @implementation GPBInt64Int32Dictionary {
7612 @package
7613 NSMutableDictionary *_dictionary;
7614 }
7615
7616 + (instancetype)dictionary {
7617 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
7618 }
7619
7620 + (instancetype)dictionaryWithValue:(int32_t)value
7621 forKey:(int64_t)key {
7622 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
7623 // on to get the type correct.
7624 return [[(GPBInt64Int32Dictionary*)[self alloc] initWithValues:&value
7625 forKeys:&key
7626 count:1] autorelease] ;
7627 }
7628
7629 + (instancetype)dictionaryWithValues:(const int32_t [])values
7630 forKeys:(const int64_t [])keys
7631 count:(NSUInteger)count {
7632 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
7633 // on to get the type correct.
7634 return [[(GPBInt64Int32Dictionary*)[self alloc] initWithValues:values
7635 forKeys:keys
7636 count:count] autorele ase];
7637 }
7638
7639 + (instancetype)dictionaryWithDictionary:(GPBInt64Int32Dictionary *)dictionary {
7640 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
7641 // on to get the type correct.
7642 return [[(GPBInt64Int32Dictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
7643 }
7644
7645 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
7646 return [[[self alloc] initWithCapacity:numItems] autorelease];
7647 }
7648
7649 - (instancetype)init {
7650 return [self initWithValues:NULL forKeys:NULL count:0];
7651 }
7652
7653 - (instancetype)initWithValues:(const int32_t [])values
7654 forKeys:(const int64_t [])keys
7655 count:(NSUInteger)count {
7656 self = [super init];
7657 if (self) {
7658 _dictionary = [[NSMutableDictionary alloc] init];
7659 if (count && values && keys) {
7660 for (NSUInteger i = 0; i < count; ++i) {
7661 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7662 }
7663 }
7664 }
7665 return self;
7666 }
7667
7668 - (instancetype)initWithDictionary:(GPBInt64Int32Dictionary *)dictionary {
7669 self = [self initWithValues:NULL forKeys:NULL count:0];
7670 if (self) {
7671 if (dictionary) {
7672 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7673 }
7674 }
7675 return self;
7676 }
7677
7678 - (instancetype)initWithCapacity:(NSUInteger)numItems {
7679 #pragma unused(numItems)
7680 return [self initWithValues:NULL forKeys:NULL count:0];
7681 }
7682
7683 - (void)dealloc {
7684 NSAssert(!_autocreator,
7685 @"%@: Autocreator must be cleared before release, autocreator: %@",
7686 [self class], _autocreator);
7687 [_dictionary release];
7688 [super dealloc];
7689 }
7690
7691 - (instancetype)copyWithZone:(NSZone *)zone {
7692 return [[GPBInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self];
7693 }
7694
7695 - (BOOL)isEqual:(GPBInt64Int32Dictionary *)other {
7696 if (self == other) {
7697 return YES;
7698 }
7699 if (![other isKindOfClass:[GPBInt64Int32Dictionary class]]) {
7700 return NO;
7701 }
7702 return [_dictionary isEqual:other->_dictionary];
7703 }
7704
7705 - (NSUInteger)hash {
7706 return _dictionary.count;
7707 }
7708
7709 - (NSString *)description {
7710 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
7711 }
7712
7713 - (NSUInteger)count {
7714 return _dictionary.count;
7715 }
7716
7717 - (void)enumerateKeysAndValuesUsingBlock:
7718 (void (^)(int64_t key, int32_t value, BOOL *stop))block {
7719 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7720 NSNumber *aValue,
7721 BOOL *stop) {
7722 block([aKey longLongValue], [aValue intValue], stop);
7723 }];
7724 }
7725
7726 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7727 NSUInteger count = _dictionary.count;
7728 if (count == 0) {
7729 return 0;
7730 }
7731
7732 GPBDataType valueDataType = GPBGetFieldDataType(field);
7733 GPBDataType keyDataType = field.mapKeyDataType;
7734 __block size_t result = 0;
7735 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7736 NSNumber *aValue,
7737 BOOL *stop) {
7738 #pragma unused(stop)
7739 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
7740 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
7741 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7742 }];
7743 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
7744 result += tagSize * count;
7745 return result;
7746 }
7747
7748 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7749 asField:(GPBFieldDescriptor *)field {
7750 GPBDataType valueDataType = GPBGetFieldDataType(field);
7751 GPBDataType keyDataType = field.mapKeyDataType;
7752 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
7753 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7754 NSNumber *aValue,
7755 BOOL *stop) {
7756 #pragma unused(stop)
7757 // Write the tag.
7758 [outputStream writeInt32NoTag:tag];
7759 // Write the size of the message.
7760 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
7761 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
7762 [outputStream writeInt32NoTag:(int32_t)msgSize];
7763 // Write the fields.
7764 WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7765 WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, v alueDataType);
7766 }];
7767 }
7768
7769 - (void)setGPBGenericValue:(GPBGenericValue *)value
7770 forGPBGenericValueKey:(GPBGenericValue *)key {
7771 [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueInt64)];
7772 }
7773
7774 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
7775 [self enumerateKeysAndValuesUsingBlock:^(int64_t key, int32_t value, BOOL *sto p) {
7776 #pragma unused(stop)
7777 block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat :@"%d", value]);
7778 }];
7779 }
7780
7781 - (BOOL)valueForKey:(int64_t)key value:(int32_t *)value {
7782 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7783 if (wrapped && value) {
7784 *value = [wrapped intValue];
7785 }
7786 return (wrapped != NULL);
7787 }
7788
7789 - (void)addEntriesFromDictionary:(GPBInt64Int32Dictionary *)otherDictionary {
7790 if (otherDictionary) {
7791 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7792 if (_autocreator) {
7793 GPBAutocreatedDictionaryModified(_autocreator, self);
7794 }
7795 }
7796 }
7797
7798 - (void)setValue:(int32_t)value forKey:(int64_t)key {
7799 [_dictionary setObject:@(value) forKey:@(key)];
7800 if (_autocreator) {
7801 GPBAutocreatedDictionaryModified(_autocreator, self);
7802 }
7803 }
7804
7805 - (void)removeValueForKey:(int64_t)aKey {
7806 [_dictionary removeObjectForKey:@(aKey)];
7807 }
7808
7809 - (void)removeAll {
7810 [_dictionary removeAllObjects];
7811 }
7812
7813 @end
7814
7815 #pragma mark - Int64 -> UInt64
7816
7817 @implementation GPBInt64UInt64Dictionary {
7818 @package
7819 NSMutableDictionary *_dictionary;
7820 }
7821
7822 + (instancetype)dictionary {
7823 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
7824 }
7825
7826 + (instancetype)dictionaryWithValue:(uint64_t)value
7827 forKey:(int64_t)key {
7828 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
7829 // on to get the type correct.
7830 return [[(GPBInt64UInt64Dictionary*)[self alloc] initWithValues:&value
7831 forKeys:&key
7832 count:1] autorelease ];
7833 }
7834
7835 + (instancetype)dictionaryWithValues:(const uint64_t [])values
7836 forKeys:(const int64_t [])keys
7837 count:(NSUInteger)count {
7838 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
7839 // on to get the type correct.
7840 return [[(GPBInt64UInt64Dictionary*)[self alloc] initWithValues:values
7841 forKeys:keys
7842 count:count] autorel ease];
7843 }
7844
7845 + (instancetype)dictionaryWithDictionary:(GPBInt64UInt64Dictionary *)dictionary {
7846 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
7847 // on to get the type correct.
7848 return [[(GPBInt64UInt64Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
7849 }
7850
7851 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
7852 return [[[self alloc] initWithCapacity:numItems] autorelease];
7853 }
7854
7855 - (instancetype)init {
7856 return [self initWithValues:NULL forKeys:NULL count:0];
7857 }
7858
7859 - (instancetype)initWithValues:(const uint64_t [])values
7860 forKeys:(const int64_t [])keys
7861 count:(NSUInteger)count {
7862 self = [super init];
7863 if (self) {
7864 _dictionary = [[NSMutableDictionary alloc] init];
7865 if (count && values && keys) {
7866 for (NSUInteger i = 0; i < count; ++i) {
7867 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
7868 }
7869 }
7870 }
7871 return self;
7872 }
7873
7874 - (instancetype)initWithDictionary:(GPBInt64UInt64Dictionary *)dictionary {
7875 self = [self initWithValues:NULL forKeys:NULL count:0];
7876 if (self) {
7877 if (dictionary) {
7878 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
7879 }
7880 }
7881 return self;
7882 }
7883
7884 - (instancetype)initWithCapacity:(NSUInteger)numItems {
7885 #pragma unused(numItems)
7886 return [self initWithValues:NULL forKeys:NULL count:0];
7887 }
7888
7889 - (void)dealloc {
7890 NSAssert(!_autocreator,
7891 @"%@: Autocreator must be cleared before release, autocreator: %@",
7892 [self class], _autocreator);
7893 [_dictionary release];
7894 [super dealloc];
7895 }
7896
7897 - (instancetype)copyWithZone:(NSZone *)zone {
7898 return [[GPBInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self] ;
7899 }
7900
7901 - (BOOL)isEqual:(GPBInt64UInt64Dictionary *)other {
7902 if (self == other) {
7903 return YES;
7904 }
7905 if (![other isKindOfClass:[GPBInt64UInt64Dictionary class]]) {
7906 return NO;
7907 }
7908 return [_dictionary isEqual:other->_dictionary];
7909 }
7910
7911 - (NSUInteger)hash {
7912 return _dictionary.count;
7913 }
7914
7915 - (NSString *)description {
7916 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
7917 }
7918
7919 - (NSUInteger)count {
7920 return _dictionary.count;
7921 }
7922
7923 - (void)enumerateKeysAndValuesUsingBlock:
7924 (void (^)(int64_t key, uint64_t value, BOOL *stop))block {
7925 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7926 NSNumber *aValue,
7927 BOOL *stop) {
7928 block([aKey longLongValue], [aValue unsignedLongLongValue], stop);
7929 }];
7930 }
7931
7932 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
7933 NSUInteger count = _dictionary.count;
7934 if (count == 0) {
7935 return 0;
7936 }
7937
7938 GPBDataType valueDataType = GPBGetFieldDataType(field);
7939 GPBDataType keyDataType = field.mapKeyDataType;
7940 __block size_t result = 0;
7941 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7942 NSNumber *aValue,
7943 BOOL *stop) {
7944 #pragma unused(stop)
7945 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
7946 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
7947 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
7948 }];
7949 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
7950 result += tagSize * count;
7951 return result;
7952 }
7953
7954 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
7955 asField:(GPBFieldDescriptor *)field {
7956 GPBDataType valueDataType = GPBGetFieldDataType(field);
7957 GPBDataType keyDataType = field.mapKeyDataType;
7958 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
7959 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
7960 NSNumber *aValue,
7961 BOOL *stop) {
7962 #pragma unused(stop)
7963 // Write the tag.
7964 [outputStream writeInt32NoTag:tag];
7965 // Write the size of the message.
7966 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
7967 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
7968 [outputStream writeInt32NoTag:(int32_t)msgSize];
7969 // Write the fields.
7970 WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
7971 WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValue FieldNumber, valueDataType);
7972 }];
7973 }
7974
7975 - (void)setGPBGenericValue:(GPBGenericValue *)value
7976 forGPBGenericValueKey:(GPBGenericValue *)key {
7977 [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueInt64)];
7978 }
7979
7980 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
7981 [self enumerateKeysAndValuesUsingBlock:^(int64_t key, uint64_t value, BOOL *st op) {
7982 #pragma unused(stop)
7983 block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat :@"%llu", value]);
7984 }];
7985 }
7986
7987 - (BOOL)valueForKey:(int64_t)key value:(uint64_t *)value {
7988 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
7989 if (wrapped && value) {
7990 *value = [wrapped unsignedLongLongValue];
7991 }
7992 return (wrapped != NULL);
7993 }
7994
7995 - (void)addEntriesFromDictionary:(GPBInt64UInt64Dictionary *)otherDictionary {
7996 if (otherDictionary) {
7997 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
7998 if (_autocreator) {
7999 GPBAutocreatedDictionaryModified(_autocreator, self);
8000 }
8001 }
8002 }
8003
8004 - (void)setValue:(uint64_t)value forKey:(int64_t)key {
8005 [_dictionary setObject:@(value) forKey:@(key)];
8006 if (_autocreator) {
8007 GPBAutocreatedDictionaryModified(_autocreator, self);
8008 }
8009 }
8010
8011 - (void)removeValueForKey:(int64_t)aKey {
8012 [_dictionary removeObjectForKey:@(aKey)];
8013 }
8014
8015 - (void)removeAll {
8016 [_dictionary removeAllObjects];
8017 }
8018
8019 @end
8020
8021 #pragma mark - Int64 -> Int64
8022
8023 @implementation GPBInt64Int64Dictionary {
8024 @package
8025 NSMutableDictionary *_dictionary;
8026 }
8027
8028 + (instancetype)dictionary {
8029 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
8030 }
8031
8032 + (instancetype)dictionaryWithValue:(int64_t)value
8033 forKey:(int64_t)key {
8034 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8035 // on to get the type correct.
8036 return [[(GPBInt64Int64Dictionary*)[self alloc] initWithValues:&value
8037 forKeys:&key
8038 count:1] autorelease] ;
8039 }
8040
8041 + (instancetype)dictionaryWithValues:(const int64_t [])values
8042 forKeys:(const int64_t [])keys
8043 count:(NSUInteger)count {
8044 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8045 // on to get the type correct.
8046 return [[(GPBInt64Int64Dictionary*)[self alloc] initWithValues:values
8047 forKeys:keys
8048 count:count] autorele ase];
8049 }
8050
8051 + (instancetype)dictionaryWithDictionary:(GPBInt64Int64Dictionary *)dictionary {
8052 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
8053 // on to get the type correct.
8054 return [[(GPBInt64Int64Dictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
8055 }
8056
8057 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
8058 return [[[self alloc] initWithCapacity:numItems] autorelease];
8059 }
8060
8061 - (instancetype)init {
8062 return [self initWithValues:NULL forKeys:NULL count:0];
8063 }
8064
8065 - (instancetype)initWithValues:(const int64_t [])values
8066 forKeys:(const int64_t [])keys
8067 count:(NSUInteger)count {
8068 self = [super init];
8069 if (self) {
8070 _dictionary = [[NSMutableDictionary alloc] init];
8071 if (count && values && keys) {
8072 for (NSUInteger i = 0; i < count; ++i) {
8073 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
8074 }
8075 }
8076 }
8077 return self;
8078 }
8079
8080 - (instancetype)initWithDictionary:(GPBInt64Int64Dictionary *)dictionary {
8081 self = [self initWithValues:NULL forKeys:NULL count:0];
8082 if (self) {
8083 if (dictionary) {
8084 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8085 }
8086 }
8087 return self;
8088 }
8089
8090 - (instancetype)initWithCapacity:(NSUInteger)numItems {
8091 #pragma unused(numItems)
8092 return [self initWithValues:NULL forKeys:NULL count:0];
8093 }
8094
8095 - (void)dealloc {
8096 NSAssert(!_autocreator,
8097 @"%@: Autocreator must be cleared before release, autocreator: %@",
8098 [self class], _autocreator);
8099 [_dictionary release];
8100 [super dealloc];
8101 }
8102
8103 - (instancetype)copyWithZone:(NSZone *)zone {
8104 return [[GPBInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self];
8105 }
8106
8107 - (BOOL)isEqual:(GPBInt64Int64Dictionary *)other {
8108 if (self == other) {
8109 return YES;
8110 }
8111 if (![other isKindOfClass:[GPBInt64Int64Dictionary class]]) {
8112 return NO;
8113 }
8114 return [_dictionary isEqual:other->_dictionary];
8115 }
8116
8117 - (NSUInteger)hash {
8118 return _dictionary.count;
8119 }
8120
8121 - (NSString *)description {
8122 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
8123 }
8124
8125 - (NSUInteger)count {
8126 return _dictionary.count;
8127 }
8128
8129 - (void)enumerateKeysAndValuesUsingBlock:
8130 (void (^)(int64_t key, int64_t value, BOOL *stop))block {
8131 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8132 NSNumber *aValue,
8133 BOOL *stop) {
8134 block([aKey longLongValue], [aValue longLongValue], stop);
8135 }];
8136 }
8137
8138 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8139 NSUInteger count = _dictionary.count;
8140 if (count == 0) {
8141 return 0;
8142 }
8143
8144 GPBDataType valueDataType = GPBGetFieldDataType(field);
8145 GPBDataType keyDataType = field.mapKeyDataType;
8146 __block size_t result = 0;
8147 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8148 NSNumber *aValue,
8149 BOOL *stop) {
8150 #pragma unused(stop)
8151 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
8152 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
8153 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8154 }];
8155 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
8156 result += tagSize * count;
8157 return result;
8158 }
8159
8160 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8161 asField:(GPBFieldDescriptor *)field {
8162 GPBDataType valueDataType = GPBGetFieldDataType(field);
8163 GPBDataType keyDataType = field.mapKeyDataType;
8164 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
8165 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8166 NSNumber *aValue,
8167 BOOL *stop) {
8168 #pragma unused(stop)
8169 // Write the tag.
8170 [outputStream writeInt32NoTag:tag];
8171 // Write the size of the message.
8172 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
8173 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
8174 [outputStream writeInt32NoTag:(int32_t)msgSize];
8175 // Write the fields.
8176 WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
8177 WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumb er, valueDataType);
8178 }];
8179 }
8180
8181 - (void)setGPBGenericValue:(GPBGenericValue *)value
8182 forGPBGenericValueKey:(GPBGenericValue *)key {
8183 [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueInt64)];
8184 }
8185
8186 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
8187 [self enumerateKeysAndValuesUsingBlock:^(int64_t key, int64_t value, BOOL *sto p) {
8188 #pragma unused(stop)
8189 block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat :@"%lld", value]);
8190 }];
8191 }
8192
8193 - (BOOL)valueForKey:(int64_t)key value:(int64_t *)value {
8194 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
8195 if (wrapped && value) {
8196 *value = [wrapped longLongValue];
8197 }
8198 return (wrapped != NULL);
8199 }
8200
8201 - (void)addEntriesFromDictionary:(GPBInt64Int64Dictionary *)otherDictionary {
8202 if (otherDictionary) {
8203 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8204 if (_autocreator) {
8205 GPBAutocreatedDictionaryModified(_autocreator, self);
8206 }
8207 }
8208 }
8209
8210 - (void)setValue:(int64_t)value forKey:(int64_t)key {
8211 [_dictionary setObject:@(value) forKey:@(key)];
8212 if (_autocreator) {
8213 GPBAutocreatedDictionaryModified(_autocreator, self);
8214 }
8215 }
8216
8217 - (void)removeValueForKey:(int64_t)aKey {
8218 [_dictionary removeObjectForKey:@(aKey)];
8219 }
8220
8221 - (void)removeAll {
8222 [_dictionary removeAllObjects];
8223 }
8224
8225 @end
8226
8227 #pragma mark - Int64 -> Bool
8228
8229 @implementation GPBInt64BoolDictionary {
8230 @package
8231 NSMutableDictionary *_dictionary;
8232 }
8233
8234 + (instancetype)dictionary {
8235 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
8236 }
8237
8238 + (instancetype)dictionaryWithValue:(BOOL)value
8239 forKey:(int64_t)key {
8240 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8241 // on to get the type correct.
8242 return [[(GPBInt64BoolDictionary*)[self alloc] initWithValues:&value
8243 forKeys:&key
8244 count:1] autorelease];
8245 }
8246
8247 + (instancetype)dictionaryWithValues:(const BOOL [])values
8248 forKeys:(const int64_t [])keys
8249 count:(NSUInteger)count {
8250 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8251 // on to get the type correct.
8252 return [[(GPBInt64BoolDictionary*)[self alloc] initWithValues:values
8253 forKeys:keys
8254 count:count] autorelea se];
8255 }
8256
8257 + (instancetype)dictionaryWithDictionary:(GPBInt64BoolDictionary *)dictionary {
8258 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
8259 // on to get the type correct.
8260 return [[(GPBInt64BoolDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
8261 }
8262
8263 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
8264 return [[[self alloc] initWithCapacity:numItems] autorelease];
8265 }
8266
8267 - (instancetype)init {
8268 return [self initWithValues:NULL forKeys:NULL count:0];
8269 }
8270
8271 - (instancetype)initWithValues:(const BOOL [])values
8272 forKeys:(const int64_t [])keys
8273 count:(NSUInteger)count {
8274 self = [super init];
8275 if (self) {
8276 _dictionary = [[NSMutableDictionary alloc] init];
8277 if (count && values && keys) {
8278 for (NSUInteger i = 0; i < count; ++i) {
8279 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
8280 }
8281 }
8282 }
8283 return self;
8284 }
8285
8286 - (instancetype)initWithDictionary:(GPBInt64BoolDictionary *)dictionary {
8287 self = [self initWithValues:NULL forKeys:NULL count:0];
8288 if (self) {
8289 if (dictionary) {
8290 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8291 }
8292 }
8293 return self;
8294 }
8295
8296 - (instancetype)initWithCapacity:(NSUInteger)numItems {
8297 #pragma unused(numItems)
8298 return [self initWithValues:NULL forKeys:NULL count:0];
8299 }
8300
8301 - (void)dealloc {
8302 NSAssert(!_autocreator,
8303 @"%@: Autocreator must be cleared before release, autocreator: %@",
8304 [self class], _autocreator);
8305 [_dictionary release];
8306 [super dealloc];
8307 }
8308
8309 - (instancetype)copyWithZone:(NSZone *)zone {
8310 return [[GPBInt64BoolDictionary allocWithZone:zone] initWithDictionary:self];
8311 }
8312
8313 - (BOOL)isEqual:(GPBInt64BoolDictionary *)other {
8314 if (self == other) {
8315 return YES;
8316 }
8317 if (![other isKindOfClass:[GPBInt64BoolDictionary class]]) {
8318 return NO;
8319 }
8320 return [_dictionary isEqual:other->_dictionary];
8321 }
8322
8323 - (NSUInteger)hash {
8324 return _dictionary.count;
8325 }
8326
8327 - (NSString *)description {
8328 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
8329 }
8330
8331 - (NSUInteger)count {
8332 return _dictionary.count;
8333 }
8334
8335 - (void)enumerateKeysAndValuesUsingBlock:
8336 (void (^)(int64_t key, BOOL value, BOOL *stop))block {
8337 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8338 NSNumber *aValue,
8339 BOOL *stop) {
8340 block([aKey longLongValue], [aValue boolValue], stop);
8341 }];
8342 }
8343
8344 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8345 NSUInteger count = _dictionary.count;
8346 if (count == 0) {
8347 return 0;
8348 }
8349
8350 GPBDataType valueDataType = GPBGetFieldDataType(field);
8351 GPBDataType keyDataType = field.mapKeyDataType;
8352 __block size_t result = 0;
8353 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8354 NSNumber *aValue,
8355 BOOL *stop) {
8356 #pragma unused(stop)
8357 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
8358 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
8359 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8360 }];
8361 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
8362 result += tagSize * count;
8363 return result;
8364 }
8365
8366 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8367 asField:(GPBFieldDescriptor *)field {
8368 GPBDataType valueDataType = GPBGetFieldDataType(field);
8369 GPBDataType keyDataType = field.mapKeyDataType;
8370 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
8371 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8372 NSNumber *aValue,
8373 BOOL *stop) {
8374 #pragma unused(stop)
8375 // Write the tag.
8376 [outputStream writeInt32NoTag:tag];
8377 // Write the size of the message.
8378 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
8379 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
8380 [outputStream writeInt32NoTag:(int32_t)msgSize];
8381 // Write the fields.
8382 WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
8383 WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, v alueDataType);
8384 }];
8385 }
8386
8387 - (void)setGPBGenericValue:(GPBGenericValue *)value
8388 forGPBGenericValueKey:(GPBGenericValue *)key {
8389 [_dictionary setObject:@(value->valueBool) forKey:@(key->valueInt64)];
8390 }
8391
8392 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
8393 [self enumerateKeysAndValuesUsingBlock:^(int64_t key, BOOL value, BOOL *stop) {
8394 #pragma unused(stop)
8395 block([NSString stringWithFormat:@"%lld", key], (value ? @"true" : @"false "));
8396 }];
8397 }
8398
8399 - (BOOL)valueForKey:(int64_t)key value:(BOOL *)value {
8400 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
8401 if (wrapped && value) {
8402 *value = [wrapped boolValue];
8403 }
8404 return (wrapped != NULL);
8405 }
8406
8407 - (void)addEntriesFromDictionary:(GPBInt64BoolDictionary *)otherDictionary {
8408 if (otherDictionary) {
8409 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8410 if (_autocreator) {
8411 GPBAutocreatedDictionaryModified(_autocreator, self);
8412 }
8413 }
8414 }
8415
8416 - (void)setValue:(BOOL)value forKey:(int64_t)key {
8417 [_dictionary setObject:@(value) forKey:@(key)];
8418 if (_autocreator) {
8419 GPBAutocreatedDictionaryModified(_autocreator, self);
8420 }
8421 }
8422
8423 - (void)removeValueForKey:(int64_t)aKey {
8424 [_dictionary removeObjectForKey:@(aKey)];
8425 }
8426
8427 - (void)removeAll {
8428 [_dictionary removeAllObjects];
8429 }
8430
8431 @end
8432
8433 #pragma mark - Int64 -> Float
8434
8435 @implementation GPBInt64FloatDictionary {
8436 @package
8437 NSMutableDictionary *_dictionary;
8438 }
8439
8440 + (instancetype)dictionary {
8441 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
8442 }
8443
8444 + (instancetype)dictionaryWithValue:(float)value
8445 forKey:(int64_t)key {
8446 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8447 // on to get the type correct.
8448 return [[(GPBInt64FloatDictionary*)[self alloc] initWithValues:&value
8449 forKeys:&key
8450 count:1] autorelease] ;
8451 }
8452
8453 + (instancetype)dictionaryWithValues:(const float [])values
8454 forKeys:(const int64_t [])keys
8455 count:(NSUInteger)count {
8456 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8457 // on to get the type correct.
8458 return [[(GPBInt64FloatDictionary*)[self alloc] initWithValues:values
8459 forKeys:keys
8460 count:count] autorele ase];
8461 }
8462
8463 + (instancetype)dictionaryWithDictionary:(GPBInt64FloatDictionary *)dictionary {
8464 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
8465 // on to get the type correct.
8466 return [[(GPBInt64FloatDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
8467 }
8468
8469 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
8470 return [[[self alloc] initWithCapacity:numItems] autorelease];
8471 }
8472
8473 - (instancetype)init {
8474 return [self initWithValues:NULL forKeys:NULL count:0];
8475 }
8476
8477 - (instancetype)initWithValues:(const float [])values
8478 forKeys:(const int64_t [])keys
8479 count:(NSUInteger)count {
8480 self = [super init];
8481 if (self) {
8482 _dictionary = [[NSMutableDictionary alloc] init];
8483 if (count && values && keys) {
8484 for (NSUInteger i = 0; i < count; ++i) {
8485 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
8486 }
8487 }
8488 }
8489 return self;
8490 }
8491
8492 - (instancetype)initWithDictionary:(GPBInt64FloatDictionary *)dictionary {
8493 self = [self initWithValues:NULL forKeys:NULL count:0];
8494 if (self) {
8495 if (dictionary) {
8496 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8497 }
8498 }
8499 return self;
8500 }
8501
8502 - (instancetype)initWithCapacity:(NSUInteger)numItems {
8503 #pragma unused(numItems)
8504 return [self initWithValues:NULL forKeys:NULL count:0];
8505 }
8506
8507 - (void)dealloc {
8508 NSAssert(!_autocreator,
8509 @"%@: Autocreator must be cleared before release, autocreator: %@",
8510 [self class], _autocreator);
8511 [_dictionary release];
8512 [super dealloc];
8513 }
8514
8515 - (instancetype)copyWithZone:(NSZone *)zone {
8516 return [[GPBInt64FloatDictionary allocWithZone:zone] initWithDictionary:self];
8517 }
8518
8519 - (BOOL)isEqual:(GPBInt64FloatDictionary *)other {
8520 if (self == other) {
8521 return YES;
8522 }
8523 if (![other isKindOfClass:[GPBInt64FloatDictionary class]]) {
8524 return NO;
8525 }
8526 return [_dictionary isEqual:other->_dictionary];
8527 }
8528
8529 - (NSUInteger)hash {
8530 return _dictionary.count;
8531 }
8532
8533 - (NSString *)description {
8534 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
8535 }
8536
8537 - (NSUInteger)count {
8538 return _dictionary.count;
8539 }
8540
8541 - (void)enumerateKeysAndValuesUsingBlock:
8542 (void (^)(int64_t key, float value, BOOL *stop))block {
8543 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8544 NSNumber *aValue,
8545 BOOL *stop) {
8546 block([aKey longLongValue], [aValue floatValue], stop);
8547 }];
8548 }
8549
8550 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8551 NSUInteger count = _dictionary.count;
8552 if (count == 0) {
8553 return 0;
8554 }
8555
8556 GPBDataType valueDataType = GPBGetFieldDataType(field);
8557 GPBDataType keyDataType = field.mapKeyDataType;
8558 __block size_t result = 0;
8559 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8560 NSNumber *aValue,
8561 BOOL *stop) {
8562 #pragma unused(stop)
8563 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
8564 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
8565 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8566 }];
8567 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
8568 result += tagSize * count;
8569 return result;
8570 }
8571
8572 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8573 asField:(GPBFieldDescriptor *)field {
8574 GPBDataType valueDataType = GPBGetFieldDataType(field);
8575 GPBDataType keyDataType = field.mapKeyDataType;
8576 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
8577 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8578 NSNumber *aValue,
8579 BOOL *stop) {
8580 #pragma unused(stop)
8581 // Write the tag.
8582 [outputStream writeInt32NoTag:tag];
8583 // Write the size of the message.
8584 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
8585 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
8586 [outputStream writeInt32NoTag:(int32_t)msgSize];
8587 // Write the fields.
8588 WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
8589 WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
8590 }];
8591 }
8592
8593 - (void)setGPBGenericValue:(GPBGenericValue *)value
8594 forGPBGenericValueKey:(GPBGenericValue *)key {
8595 [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueInt64)];
8596 }
8597
8598 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
8599 [self enumerateKeysAndValuesUsingBlock:^(int64_t key, float value, BOOL *stop) {
8600 #pragma unused(stop)
8601 block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat :@"%.*g", FLT_DIG, value]);
8602 }];
8603 }
8604
8605 - (BOOL)valueForKey:(int64_t)key value:(float *)value {
8606 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
8607 if (wrapped && value) {
8608 *value = [wrapped floatValue];
8609 }
8610 return (wrapped != NULL);
8611 }
8612
8613 - (void)addEntriesFromDictionary:(GPBInt64FloatDictionary *)otherDictionary {
8614 if (otherDictionary) {
8615 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8616 if (_autocreator) {
8617 GPBAutocreatedDictionaryModified(_autocreator, self);
8618 }
8619 }
8620 }
8621
8622 - (void)setValue:(float)value forKey:(int64_t)key {
8623 [_dictionary setObject:@(value) forKey:@(key)];
8624 if (_autocreator) {
8625 GPBAutocreatedDictionaryModified(_autocreator, self);
8626 }
8627 }
8628
8629 - (void)removeValueForKey:(int64_t)aKey {
8630 [_dictionary removeObjectForKey:@(aKey)];
8631 }
8632
8633 - (void)removeAll {
8634 [_dictionary removeAllObjects];
8635 }
8636
8637 @end
8638
8639 #pragma mark - Int64 -> Double
8640
8641 @implementation GPBInt64DoubleDictionary {
8642 @package
8643 NSMutableDictionary *_dictionary;
8644 }
8645
8646 + (instancetype)dictionary {
8647 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
8648 }
8649
8650 + (instancetype)dictionaryWithValue:(double)value
8651 forKey:(int64_t)key {
8652 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8653 // on to get the type correct.
8654 return [[(GPBInt64DoubleDictionary*)[self alloc] initWithValues:&value
8655 forKeys:&key
8656 count:1] autorelease ];
8657 }
8658
8659 + (instancetype)dictionaryWithValues:(const double [])values
8660 forKeys:(const int64_t [])keys
8661 count:(NSUInteger)count {
8662 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8663 // on to get the type correct.
8664 return [[(GPBInt64DoubleDictionary*)[self alloc] initWithValues:values
8665 forKeys:keys
8666 count:count] autorel ease];
8667 }
8668
8669 + (instancetype)dictionaryWithDictionary:(GPBInt64DoubleDictionary *)dictionary {
8670 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
8671 // on to get the type correct.
8672 return [[(GPBInt64DoubleDictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
8673 }
8674
8675 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
8676 return [[[self alloc] initWithCapacity:numItems] autorelease];
8677 }
8678
8679 - (instancetype)init {
8680 return [self initWithValues:NULL forKeys:NULL count:0];
8681 }
8682
8683 - (instancetype)initWithValues:(const double [])values
8684 forKeys:(const int64_t [])keys
8685 count:(NSUInteger)count {
8686 self = [super init];
8687 if (self) {
8688 _dictionary = [[NSMutableDictionary alloc] init];
8689 if (count && values && keys) {
8690 for (NSUInteger i = 0; i < count; ++i) {
8691 [_dictionary setObject:@(values[i]) forKey:@(keys[i])];
8692 }
8693 }
8694 }
8695 return self;
8696 }
8697
8698 - (instancetype)initWithDictionary:(GPBInt64DoubleDictionary *)dictionary {
8699 self = [self initWithValues:NULL forKeys:NULL count:0];
8700 if (self) {
8701 if (dictionary) {
8702 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8703 }
8704 }
8705 return self;
8706 }
8707
8708 - (instancetype)initWithCapacity:(NSUInteger)numItems {
8709 #pragma unused(numItems)
8710 return [self initWithValues:NULL forKeys:NULL count:0];
8711 }
8712
8713 - (void)dealloc {
8714 NSAssert(!_autocreator,
8715 @"%@: Autocreator must be cleared before release, autocreator: %@",
8716 [self class], _autocreator);
8717 [_dictionary release];
8718 [super dealloc];
8719 }
8720
8721 - (instancetype)copyWithZone:(NSZone *)zone {
8722 return [[GPBInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self] ;
8723 }
8724
8725 - (BOOL)isEqual:(GPBInt64DoubleDictionary *)other {
8726 if (self == other) {
8727 return YES;
8728 }
8729 if (![other isKindOfClass:[GPBInt64DoubleDictionary class]]) {
8730 return NO;
8731 }
8732 return [_dictionary isEqual:other->_dictionary];
8733 }
8734
8735 - (NSUInteger)hash {
8736 return _dictionary.count;
8737 }
8738
8739 - (NSString *)description {
8740 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
8741 }
8742
8743 - (NSUInteger)count {
8744 return _dictionary.count;
8745 }
8746
8747 - (void)enumerateKeysAndValuesUsingBlock:
8748 (void (^)(int64_t key, double value, BOOL *stop))block {
8749 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8750 NSNumber *aValue,
8751 BOOL *stop) {
8752 block([aKey longLongValue], [aValue doubleValue], stop);
8753 }];
8754 }
8755
8756 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8757 NSUInteger count = _dictionary.count;
8758 if (count == 0) {
8759 return 0;
8760 }
8761
8762 GPBDataType valueDataType = GPBGetFieldDataType(field);
8763 GPBDataType keyDataType = field.mapKeyDataType;
8764 __block size_t result = 0;
8765 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8766 NSNumber *aValue,
8767 BOOL *stop) {
8768 #pragma unused(stop)
8769 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
8770 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
8771 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
8772 }];
8773 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
8774 result += tagSize * count;
8775 return result;
8776 }
8777
8778 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
8779 asField:(GPBFieldDescriptor *)field {
8780 GPBDataType valueDataType = GPBGetFieldDataType(field);
8781 GPBDataType keyDataType = field.mapKeyDataType;
8782 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
8783 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8784 NSNumber *aValue,
8785 BOOL *stop) {
8786 #pragma unused(stop)
8787 // Write the tag.
8788 [outputStream writeInt32NoTag:tag];
8789 // Write the size of the message.
8790 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
8791 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
8792 [outputStream writeInt32NoTag:(int32_t)msgSize];
8793 // Write the fields.
8794 WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
8795 WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumbe r, valueDataType);
8796 }];
8797 }
8798
8799 - (void)setGPBGenericValue:(GPBGenericValue *)value
8800 forGPBGenericValueKey:(GPBGenericValue *)key {
8801 [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueInt64)];
8802 }
8803
8804 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
8805 [self enumerateKeysAndValuesUsingBlock:^(int64_t key, double value, BOOL *stop ) {
8806 #pragma unused(stop)
8807 block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat :@"%.*lg", DBL_DIG, value]);
8808 }];
8809 }
8810
8811 - (BOOL)valueForKey:(int64_t)key value:(double *)value {
8812 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
8813 if (wrapped && value) {
8814 *value = [wrapped doubleValue];
8815 }
8816 return (wrapped != NULL);
8817 }
8818
8819 - (void)addEntriesFromDictionary:(GPBInt64DoubleDictionary *)otherDictionary {
8820 if (otherDictionary) {
8821 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
8822 if (_autocreator) {
8823 GPBAutocreatedDictionaryModified(_autocreator, self);
8824 }
8825 }
8826 }
8827
8828 - (void)setValue:(double)value forKey:(int64_t)key {
8829 [_dictionary setObject:@(value) forKey:@(key)];
8830 if (_autocreator) {
8831 GPBAutocreatedDictionaryModified(_autocreator, self);
8832 }
8833 }
8834
8835 - (void)removeValueForKey:(int64_t)aKey {
8836 [_dictionary removeObjectForKey:@(aKey)];
8837 }
8838
8839 - (void)removeAll {
8840 [_dictionary removeAllObjects];
8841 }
8842
8843 @end
8844
8845 #pragma mark - Int64 -> Enum
8846
8847 @implementation GPBInt64EnumDictionary {
8848 @package
8849 NSMutableDictionary *_dictionary;
8850 GPBEnumValidationFunc _validationFunc;
8851 }
8852
8853 @synthesize validationFunc = _validationFunc;
8854
8855 + (instancetype)dictionary {
8856 return [[[self alloc] initWithValidationFunction:NULL
8857 rawValues:NULL
8858 forKeys:NULL
8859 count:0] autorelease];
8860 }
8861
8862 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func {
8863 return [[[self alloc] initWithValidationFunction:func
8864 rawValues:NULL
8865 forKeys:NULL
8866 count:0] autorelease];
8867 }
8868
8869 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
8870 rawValue:(int32_t)rawValue
8871 forKey:(int64_t)key {
8872 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8873 // on to get the type correct.
8874 return [[(GPBInt64EnumDictionary*)[self alloc] initWithValidationFunction:func
8875 rawValues:&raw Value
8876 forKeys:&key
8877 count:1] a utorelease];
8878 }
8879
8880 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
8881 rawValues:(const int32_t [])rawValues
8882 forKeys:(const int64_t [])keys
8883 count:(NSUInteger)count {
8884 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8885 // on to get the type correct.
8886 return [[(GPBInt64EnumDictionary*)[self alloc] initWithValidationFunction:func
8887 rawValues:rawV alues
8888 forKeys:keys
8889 count:coun t] autorelease];
8890 }
8891
8892 + (instancetype)dictionaryWithDictionary:(GPBInt64EnumDictionary *)dictionary {
8893 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
8894 // on to get the type correct.
8895 return [[(GPBInt64EnumDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
8896 }
8897
8898 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
8899 capacity:(NSUInteger)numItems {
8900 return [[[self alloc] initWithValidationFunction:func capacity:numItems] autor elease];
8901 }
8902
8903 - (instancetype)init {
8904 return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count :0];
8905 }
8906
8907 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
8908 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
8909 }
8910
8911 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
8912 rawValues:(const int32_t [])rawValues
8913 forKeys:(const int64_t [])keys
8914 count:(NSUInteger)count {
8915 self = [super init];
8916 if (self) {
8917 _dictionary = [[NSMutableDictionary alloc] init];
8918 _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
8919 if (count && rawValues && keys) {
8920 for (NSUInteger i = 0; i < count; ++i) {
8921 [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])];
8922 }
8923 }
8924 }
8925 return self;
8926 }
8927
8928 - (instancetype)initWithDictionary:(GPBInt64EnumDictionary *)dictionary {
8929 self = [self initWithValidationFunction:dictionary.validationFunc
8930 rawValues:NULL
8931 forKeys:NULL
8932 count:0];
8933 if (self) {
8934 if (dictionary) {
8935 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
8936 }
8937 }
8938 return self;
8939 }
8940
8941 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
8942 capacity:(NSUInteger)numItems {
8943 #pragma unused(numItems)
8944 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
8945 }
8946
8947 - (void)dealloc {
8948 NSAssert(!_autocreator,
8949 @"%@: Autocreator must be cleared before release, autocreator: %@",
8950 [self class], _autocreator);
8951 [_dictionary release];
8952 [super dealloc];
8953 }
8954
8955 - (instancetype)copyWithZone:(NSZone *)zone {
8956 return [[GPBInt64EnumDictionary allocWithZone:zone] initWithDictionary:self];
8957 }
8958
8959 - (BOOL)isEqual:(GPBInt64EnumDictionary *)other {
8960 if (self == other) {
8961 return YES;
8962 }
8963 if (![other isKindOfClass:[GPBInt64EnumDictionary class]]) {
8964 return NO;
8965 }
8966 return [_dictionary isEqual:other->_dictionary];
8967 }
8968
8969 - (NSUInteger)hash {
8970 return _dictionary.count;
8971 }
8972
8973 - (NSString *)description {
8974 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
8975 }
8976
8977 - (NSUInteger)count {
8978 return _dictionary.count;
8979 }
8980
8981 - (void)enumerateKeysAndRawValuesUsingBlock:
8982 (void (^)(int64_t key, int32_t value, BOOL *stop))block {
8983 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
8984 NSNumber *aValue,
8985 BOOL *stop) {
8986 block([aKey longLongValue], [aValue intValue], stop);
8987 }];
8988 }
8989
8990 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
8991 NSUInteger count = _dictionary.count;
8992 if (count == 0) {
8993 return 0;
8994 }
8995
8996 GPBDataType valueDataType = GPBGetFieldDataType(field);
8997 GPBDataType keyDataType = field.mapKeyDataType;
8998 __block size_t result = 0;
8999 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
9000 NSNumber *aValue,
9001 BOOL *stop) {
9002 #pragma unused(stop)
9003 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
9004 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
9005 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9006 }];
9007 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
9008 result += tagSize * count;
9009 return result;
9010 }
9011
9012 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9013 asField:(GPBFieldDescriptor *)field {
9014 GPBDataType valueDataType = GPBGetFieldDataType(field);
9015 GPBDataType keyDataType = field.mapKeyDataType;
9016 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
9017 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
9018 NSNumber *aValue,
9019 BOOL *stop) {
9020 #pragma unused(stop)
9021 // Write the tag.
9022 [outputStream writeInt32NoTag:tag];
9023 // Write the size of the message.
9024 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
9025 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
9026 [outputStream writeInt32NoTag:(int32_t)msgSize];
9027 // Write the fields.
9028 WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
9029 WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, va lueDataType);
9030 }];
9031 }
9032
9033 - (NSData *)serializedDataForUnknownValue:(int32_t)value
9034 forKey:(GPBGenericValue *)key
9035 keyDataType:(GPBDataType)keyDataType {
9036 size_t msgSize = ComputeDictInt64FieldSize(key->valueInt64, kMapKeyFieldNumber , keyDataType);
9037 msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEn um);
9038 NSMutableData *data = [NSMutableData dataWithLength:msgSize];
9039 GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithDat a:data];
9040 WriteDictInt64Field(outputStream, key->valueInt64, kMapKeyFieldNumber, keyData Type);
9041 WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum) ;
9042 [outputStream release];
9043 return data;
9044 }
9045 - (void)setGPBGenericValue:(GPBGenericValue *)value
9046 forGPBGenericValueKey:(GPBGenericValue *)key {
9047 [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueInt64)];
9048 }
9049
9050 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
9051 [self enumerateKeysAndRawValuesUsingBlock:^(int64_t key, int32_t value, BOOL * stop) {
9052 #pragma unused(stop)
9053 block([NSString stringWithFormat:@"%lld", key], @(value));
9054 }];
9055 }
9056
9057 - (BOOL)valueForKey:(int64_t)key value:(int32_t *)value {
9058 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
9059 if (wrapped && value) {
9060 int32_t result = [wrapped intValue];
9061 if (!_validationFunc(result)) {
9062 result = kGPBUnrecognizedEnumeratorValue;
9063 }
9064 *value = result;
9065 }
9066 return (wrapped != NULL);
9067 }
9068
9069 - (BOOL)valueForKey:(int64_t)key rawValue:(int32_t *)rawValue {
9070 NSNumber *wrapped = [_dictionary objectForKey:@(key)];
9071 if (wrapped && rawValue) {
9072 *rawValue = [wrapped intValue];
9073 }
9074 return (wrapped != NULL);
9075 }
9076
9077 - (void)enumerateKeysAndValuesUsingBlock:
9078 (void (^)(int64_t key, int32_t value, BOOL *stop))block {
9079 GPBEnumValidationFunc func = _validationFunc;
9080 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
9081 NSNumber *aValue,
9082 BOOL *stop) {
9083 int32_t unwrapped = [aValue intValue];
9084 if (!func(unwrapped)) {
9085 unwrapped = kGPBUnrecognizedEnumeratorValue;
9086 }
9087 block([aKey longLongValue], unwrapped, stop);
9088 }];
9089 }
9090
9091 - (void)addRawEntriesFromDictionary:(GPBInt64EnumDictionary *)otherDictionary {
9092 if (otherDictionary) {
9093 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9094 if (_autocreator) {
9095 GPBAutocreatedDictionaryModified(_autocreator, self);
9096 }
9097 }
9098 }
9099
9100 - (void)setRawValue:(int32_t)value forKey:(int64_t)key {
9101 [_dictionary setObject:@(value) forKey:@(key)];
9102 if (_autocreator) {
9103 GPBAutocreatedDictionaryModified(_autocreator, self);
9104 }
9105 }
9106
9107 - (void)removeValueForKey:(int64_t)aKey {
9108 [_dictionary removeObjectForKey:@(aKey)];
9109 }
9110
9111 - (void)removeAll {
9112 [_dictionary removeAllObjects];
9113 }
9114
9115 - (void)setValue:(int32_t)value forKey:(int64_t)key {
9116 if (!_validationFunc(value)) {
9117 [NSException raise:NSInvalidArgumentException
9118 format:@"GPBInt64EnumDictionary: Attempt to set an unknown enum value (%d)",
9119 value];
9120 }
9121
9122 [_dictionary setObject:@(value) forKey:@(key)];
9123 if (_autocreator) {
9124 GPBAutocreatedDictionaryModified(_autocreator, self);
9125 }
9126 }
9127
9128 @end
9129
9130 #pragma mark - Int64 -> Object
9131
9132 @implementation GPBInt64ObjectDictionary {
9133 @package
9134 NSMutableDictionary *_dictionary;
9135 }
9136
9137 + (instancetype)dictionary {
9138 return [[[self alloc] initWithObjects:NULL forKeys:NULL count:0] autorelease];
9139 }
9140
9141 + (instancetype)dictionaryWithObject:(id)object
9142 forKey:(int64_t)key {
9143 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
9144 // on to get the type correct.
9145 return [[(GPBInt64ObjectDictionary*)[self alloc] initWithObjects:&object
9146 forKeys:&key
9147 count:1] autoreleas e];
9148 }
9149
9150 + (instancetype)dictionaryWithObjects:(const id [])objects
9151 forKeys:(const int64_t [])keys
9152 count:(NSUInteger)count {
9153 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
9154 // on to get the type correct.
9155 return [[(GPBInt64ObjectDictionary*)[self alloc] initWithObjects:objects
9156 forKeys:keys
9157 count:count] autorel ease];
9158 }
9159
9160 + (instancetype)dictionaryWithDictionary:(GPBInt64ObjectDictionary *)dictionary {
9161 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
9162 // on to get the type correct.
9163 return [[(GPBInt64ObjectDictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
9164 }
9165
9166 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
9167 return [[[self alloc] initWithCapacity:numItems] autorelease];
9168 }
9169
9170 - (instancetype)init {
9171 return [self initWithObjects:NULL forKeys:NULL count:0];
9172 }
9173
9174 - (instancetype)initWithObjects:(const id [])objects
9175 forKeys:(const int64_t [])keys
9176 count:(NSUInteger)count {
9177 self = [super init];
9178 if (self) {
9179 _dictionary = [[NSMutableDictionary alloc] init];
9180 if (count && objects && keys) {
9181 for (NSUInteger i = 0; i < count; ++i) {
9182 if (!objects[i]) {
9183 [NSException raise:NSInvalidArgumentException
9184 format:@"Attempting to add nil object to a Dictionary"];
9185 }
9186 [_dictionary setObject:objects[i] forKey:@(keys[i])];
9187 }
9188 }
9189 }
9190 return self;
9191 }
9192
9193 - (instancetype)initWithDictionary:(GPBInt64ObjectDictionary *)dictionary {
9194 self = [self initWithObjects:NULL forKeys:NULL count:0];
9195 if (self) {
9196 if (dictionary) {
9197 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9198 }
9199 }
9200 return self;
9201 }
9202
9203 - (instancetype)initWithCapacity:(NSUInteger)numItems {
9204 #pragma unused(numItems)
9205 return [self initWithObjects:NULL forKeys:NULL count:0];
9206 }
9207
9208 - (void)dealloc {
9209 NSAssert(!_autocreator,
9210 @"%@: Autocreator must be cleared before release, autocreator: %@",
9211 [self class], _autocreator);
9212 [_dictionary release];
9213 [super dealloc];
9214 }
9215
9216 - (instancetype)copyWithZone:(NSZone *)zone {
9217 return [[GPBInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self] ;
9218 }
9219
9220 - (BOOL)isEqual:(GPBInt64ObjectDictionary *)other {
9221 if (self == other) {
9222 return YES;
9223 }
9224 if (![other isKindOfClass:[GPBInt64ObjectDictionary class]]) {
9225 return NO;
9226 }
9227 return [_dictionary isEqual:other->_dictionary];
9228 }
9229
9230 - (NSUInteger)hash {
9231 return _dictionary.count;
9232 }
9233
9234 - (NSString *)description {
9235 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
9236 }
9237
9238 - (NSUInteger)count {
9239 return _dictionary.count;
9240 }
9241
9242 - (void)enumerateKeysAndObjectsUsingBlock:
9243 (void (^)(int64_t key, id object, BOOL *stop))block {
9244 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
9245 id aObject,
9246 BOOL *stop) {
9247 block([aKey longLongValue], aObject, stop);
9248 }];
9249 }
9250
9251 - (BOOL)isInitialized {
9252 for (GPBMessage *msg in [_dictionary objectEnumerator]) {
9253 if (!msg.initialized) {
9254 return NO;
9255 }
9256 }
9257 return YES;
9258 }
9259
9260 - (instancetype)deepCopyWithZone:(NSZone *)zone {
9261 GPBInt64ObjectDictionary *newDict =
9262 [[GPBInt64ObjectDictionary alloc] init];
9263 [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
9264 GPBMessage *msg,
9265 BOOL *stop) {
9266 #pragma unused(stop)
9267 GPBMessage *copiedMsg = [msg copyWithZone:zone];
9268 [newDict->_dictionary setObject:copiedMsg forKey:aKey];
9269 [copiedMsg release];
9270 }];
9271 return newDict;
9272 }
9273
9274 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9275 NSUInteger count = _dictionary.count;
9276 if (count == 0) {
9277 return 0;
9278 }
9279
9280 GPBDataType valueDataType = GPBGetFieldDataType(field);
9281 GPBDataType keyDataType = field.mapKeyDataType;
9282 __block size_t result = 0;
9283 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
9284 id aObject,
9285 BOOL *stop) {
9286 #pragma unused(stop)
9287 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
9288 msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDa taType);
9289 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9290 }];
9291 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
9292 result += tagSize * count;
9293 return result;
9294 }
9295
9296 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9297 asField:(GPBFieldDescriptor *)field {
9298 GPBDataType valueDataType = GPBGetFieldDataType(field);
9299 GPBDataType keyDataType = field.mapKeyDataType;
9300 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
9301 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
9302 id aObject,
9303 BOOL *stop) {
9304 #pragma unused(stop)
9305 // Write the tag.
9306 [outputStream writeInt32NoTag:tag];
9307 // Write the size of the message.
9308 size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFiel dNumber, keyDataType);
9309 msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDa taType);
9310 [outputStream writeInt32NoTag:(int32_t)msgSize];
9311 // Write the fields.
9312 WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
9313 WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataT ype);
9314 }];
9315 }
9316
9317 - (void)setGPBGenericValue:(GPBGenericValue *)value
9318 forGPBGenericValueKey:(GPBGenericValue *)key {
9319 [_dictionary setObject:value->valueString forKey:@(key->valueInt64)];
9320 }
9321
9322 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
9323 [self enumerateKeysAndObjectsUsingBlock:^(int64_t key, id object, BOOL *stop) {
9324 #pragma unused(stop)
9325 block([NSString stringWithFormat:@"%lld", key], object);
9326 }];
9327 }
9328
9329 - (id)objectForKey:(int64_t)key {
9330 id result = [_dictionary objectForKey:@(key)];
9331 return result;
9332 }
9333
9334 - (void)addEntriesFromDictionary:(GPBInt64ObjectDictionary *)otherDictionary {
9335 if (otherDictionary) {
9336 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9337 if (_autocreator) {
9338 GPBAutocreatedDictionaryModified(_autocreator, self);
9339 }
9340 }
9341 }
9342
9343 - (void)setObject:(id)object forKey:(int64_t)key {
9344 if (!object) {
9345 [NSException raise:NSInvalidArgumentException
9346 format:@"Attempting to add nil object to a Dictionary"];
9347 }
9348 [_dictionary setObject:object forKey:@(key)];
9349 if (_autocreator) {
9350 GPBAutocreatedDictionaryModified(_autocreator, self);
9351 }
9352 }
9353
9354 - (void)removeObjectForKey:(int64_t)aKey {
9355 [_dictionary removeObjectForKey:@(aKey)];
9356 }
9357
9358 - (void)removeAll {
9359 [_dictionary removeAllObjects];
9360 }
9361
9362 @end
9363
9364 //%PDDM-EXPAND DICTIONARY_POD_IMPL_FOR_KEY(String, NSString, *, OBJECT)
9365 // This block of code is generated, do not edit it directly.
9366
9367 #pragma mark - String -> UInt32
9368
9369 @implementation GPBStringUInt32Dictionary {
9370 @package
9371 NSMutableDictionary *_dictionary;
9372 }
9373
9374 + (instancetype)dictionary {
9375 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
9376 }
9377
9378 + (instancetype)dictionaryWithValue:(uint32_t)value
9379 forKey:(NSString *)key {
9380 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
9381 // on to get the type correct.
9382 return [[(GPBStringUInt32Dictionary*)[self alloc] initWithValues:&value
9383 forKeys:&key
9384 count:1] autoreleas e];
9385 }
9386
9387 + (instancetype)dictionaryWithValues:(const uint32_t [])values
9388 forKeys:(const NSString * [])keys
9389 count:(NSUInteger)count {
9390 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
9391 // on to get the type correct.
9392 return [[(GPBStringUInt32Dictionary*)[self alloc] initWithValues:values
9393 forKeys:keys
9394 count:count] autore lease];
9395 }
9396
9397 + (instancetype)dictionaryWithDictionary:(GPBStringUInt32Dictionary *)dictionary {
9398 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
9399 // on to get the type correct.
9400 return [[(GPBStringUInt32Dictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
9401 }
9402
9403 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
9404 return [[[self alloc] initWithCapacity:numItems] autorelease];
9405 }
9406
9407 - (instancetype)init {
9408 return [self initWithValues:NULL forKeys:NULL count:0];
9409 }
9410
9411 - (instancetype)initWithValues:(const uint32_t [])values
9412 forKeys:(const NSString * [])keys
9413 count:(NSUInteger)count {
9414 self = [super init];
9415 if (self) {
9416 _dictionary = [[NSMutableDictionary alloc] init];
9417 if (count && values && keys) {
9418 for (NSUInteger i = 0; i < count; ++i) {
9419 if (!keys[i]) {
9420 [NSException raise:NSInvalidArgumentException
9421 format:@"Attempting to add nil key to a Dictionary"];
9422 }
9423 [_dictionary setObject:@(values[i]) forKey:keys[i]];
9424 }
9425 }
9426 }
9427 return self;
9428 }
9429
9430 - (instancetype)initWithDictionary:(GPBStringUInt32Dictionary *)dictionary {
9431 self = [self initWithValues:NULL forKeys:NULL count:0];
9432 if (self) {
9433 if (dictionary) {
9434 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9435 }
9436 }
9437 return self;
9438 }
9439
9440 - (instancetype)initWithCapacity:(NSUInteger)numItems {
9441 #pragma unused(numItems)
9442 return [self initWithValues:NULL forKeys:NULL count:0];
9443 }
9444
9445 - (void)dealloc {
9446 NSAssert(!_autocreator,
9447 @"%@: Autocreator must be cleared before release, autocreator: %@",
9448 [self class], _autocreator);
9449 [_dictionary release];
9450 [super dealloc];
9451 }
9452
9453 - (instancetype)copyWithZone:(NSZone *)zone {
9454 return [[GPBStringUInt32Dictionary allocWithZone:zone] initWithDictionary:self ];
9455 }
9456
9457 - (BOOL)isEqual:(GPBStringUInt32Dictionary *)other {
9458 if (self == other) {
9459 return YES;
9460 }
9461 if (![other isKindOfClass:[GPBStringUInt32Dictionary class]]) {
9462 return NO;
9463 }
9464 return [_dictionary isEqual:other->_dictionary];
9465 }
9466
9467 - (NSUInteger)hash {
9468 return _dictionary.count;
9469 }
9470
9471 - (NSString *)description {
9472 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
9473 }
9474
9475 - (NSUInteger)count {
9476 return _dictionary.count;
9477 }
9478
9479 - (void)enumerateKeysAndValuesUsingBlock:
9480 (void (^)(NSString *key, uint32_t value, BOOL *stop))block {
9481 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
9482 NSNumber *aValue,
9483 BOOL *stop) {
9484 block(aKey, [aValue unsignedIntValue], stop);
9485 }];
9486 }
9487
9488 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9489 NSUInteger count = _dictionary.count;
9490 if (count == 0) {
9491 return 0;
9492 }
9493
9494 GPBDataType valueDataType = GPBGetFieldDataType(field);
9495 GPBDataType keyDataType = field.mapKeyDataType;
9496 __block size_t result = 0;
9497 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
9498 NSNumber *aValue,
9499 BOOL *stop) {
9500 #pragma unused(stop)
9501 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
9502 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
9503 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9504 }];
9505 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
9506 result += tagSize * count;
9507 return result;
9508 }
9509
9510 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9511 asField:(GPBFieldDescriptor *)field {
9512 GPBDataType valueDataType = GPBGetFieldDataType(field);
9513 GPBDataType keyDataType = field.mapKeyDataType;
9514 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
9515 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
9516 NSNumber *aValue,
9517 BOOL *stop) {
9518 #pragma unused(stop)
9519 // Write the tag.
9520 [outputStream writeInt32NoTag:tag];
9521 // Write the size of the message.
9522 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
9523 msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFi eldNumber, valueDataType);
9524 [outputStream writeInt32NoTag:(int32_t)msgSize];
9525 // Write the fields.
9526 WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
9527 WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueField Number, valueDataType);
9528 }];
9529 }
9530
9531 - (void)setGPBGenericValue:(GPBGenericValue *)value
9532 forGPBGenericValueKey:(GPBGenericValue *)key {
9533 [_dictionary setObject:@(value->valueUInt32) forKey:key->valueString];
9534 }
9535
9536 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
9537 [self enumerateKeysAndValuesUsingBlock:^(NSString *key, uint32_t value, BOOL * stop) {
9538 #pragma unused(stop)
9539 block(key, [NSString stringWithFormat:@"%u", value]);
9540 }];
9541 }
9542
9543 - (BOOL)valueForKey:(NSString *)key value:(uint32_t *)value {
9544 NSNumber *wrapped = [_dictionary objectForKey:key];
9545 if (wrapped && value) {
9546 *value = [wrapped unsignedIntValue];
9547 }
9548 return (wrapped != NULL);
9549 }
9550
9551 - (void)addEntriesFromDictionary:(GPBStringUInt32Dictionary *)otherDictionary {
9552 if (otherDictionary) {
9553 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9554 if (_autocreator) {
9555 GPBAutocreatedDictionaryModified(_autocreator, self);
9556 }
9557 }
9558 }
9559
9560 - (void)setValue:(uint32_t)value forKey:(NSString *)key {
9561 if (!key) {
9562 [NSException raise:NSInvalidArgumentException
9563 format:@"Attempting to add nil key to a Dictionary"];
9564 }
9565 [_dictionary setObject:@(value) forKey:key];
9566 if (_autocreator) {
9567 GPBAutocreatedDictionaryModified(_autocreator, self);
9568 }
9569 }
9570
9571 - (void)removeValueForKey:(NSString *)aKey {
9572 [_dictionary removeObjectForKey:aKey];
9573 }
9574
9575 - (void)removeAll {
9576 [_dictionary removeAllObjects];
9577 }
9578
9579 @end
9580
9581 #pragma mark - String -> Int32
9582
9583 @implementation GPBStringInt32Dictionary {
9584 @package
9585 NSMutableDictionary *_dictionary;
9586 }
9587
9588 + (instancetype)dictionary {
9589 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
9590 }
9591
9592 + (instancetype)dictionaryWithValue:(int32_t)value
9593 forKey:(NSString *)key {
9594 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
9595 // on to get the type correct.
9596 return [[(GPBStringInt32Dictionary*)[self alloc] initWithValues:&value
9597 forKeys:&key
9598 count:1] autorelease ];
9599 }
9600
9601 + (instancetype)dictionaryWithValues:(const int32_t [])values
9602 forKeys:(const NSString * [])keys
9603 count:(NSUInteger)count {
9604 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
9605 // on to get the type correct.
9606 return [[(GPBStringInt32Dictionary*)[self alloc] initWithValues:values
9607 forKeys:keys
9608 count:count] autorel ease];
9609 }
9610
9611 + (instancetype)dictionaryWithDictionary:(GPBStringInt32Dictionary *)dictionary {
9612 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
9613 // on to get the type correct.
9614 return [[(GPBStringInt32Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
9615 }
9616
9617 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
9618 return [[[self alloc] initWithCapacity:numItems] autorelease];
9619 }
9620
9621 - (instancetype)init {
9622 return [self initWithValues:NULL forKeys:NULL count:0];
9623 }
9624
9625 - (instancetype)initWithValues:(const int32_t [])values
9626 forKeys:(const NSString * [])keys
9627 count:(NSUInteger)count {
9628 self = [super init];
9629 if (self) {
9630 _dictionary = [[NSMutableDictionary alloc] init];
9631 if (count && values && keys) {
9632 for (NSUInteger i = 0; i < count; ++i) {
9633 if (!keys[i]) {
9634 [NSException raise:NSInvalidArgumentException
9635 format:@"Attempting to add nil key to a Dictionary"];
9636 }
9637 [_dictionary setObject:@(values[i]) forKey:keys[i]];
9638 }
9639 }
9640 }
9641 return self;
9642 }
9643
9644 - (instancetype)initWithDictionary:(GPBStringInt32Dictionary *)dictionary {
9645 self = [self initWithValues:NULL forKeys:NULL count:0];
9646 if (self) {
9647 if (dictionary) {
9648 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9649 }
9650 }
9651 return self;
9652 }
9653
9654 - (instancetype)initWithCapacity:(NSUInteger)numItems {
9655 #pragma unused(numItems)
9656 return [self initWithValues:NULL forKeys:NULL count:0];
9657 }
9658
9659 - (void)dealloc {
9660 NSAssert(!_autocreator,
9661 @"%@: Autocreator must be cleared before release, autocreator: %@",
9662 [self class], _autocreator);
9663 [_dictionary release];
9664 [super dealloc];
9665 }
9666
9667 - (instancetype)copyWithZone:(NSZone *)zone {
9668 return [[GPBStringInt32Dictionary allocWithZone:zone] initWithDictionary:self] ;
9669 }
9670
9671 - (BOOL)isEqual:(GPBStringInt32Dictionary *)other {
9672 if (self == other) {
9673 return YES;
9674 }
9675 if (![other isKindOfClass:[GPBStringInt32Dictionary class]]) {
9676 return NO;
9677 }
9678 return [_dictionary isEqual:other->_dictionary];
9679 }
9680
9681 - (NSUInteger)hash {
9682 return _dictionary.count;
9683 }
9684
9685 - (NSString *)description {
9686 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
9687 }
9688
9689 - (NSUInteger)count {
9690 return _dictionary.count;
9691 }
9692
9693 - (void)enumerateKeysAndValuesUsingBlock:
9694 (void (^)(NSString *key, int32_t value, BOOL *stop))block {
9695 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
9696 NSNumber *aValue,
9697 BOOL *stop) {
9698 block(aKey, [aValue intValue], stop);
9699 }];
9700 }
9701
9702 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9703 NSUInteger count = _dictionary.count;
9704 if (count == 0) {
9705 return 0;
9706 }
9707
9708 GPBDataType valueDataType = GPBGetFieldDataType(field);
9709 GPBDataType keyDataType = field.mapKeyDataType;
9710 __block size_t result = 0;
9711 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
9712 NSNumber *aValue,
9713 BOOL *stop) {
9714 #pragma unused(stop)
9715 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
9716 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
9717 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9718 }];
9719 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
9720 result += tagSize * count;
9721 return result;
9722 }
9723
9724 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9725 asField:(GPBFieldDescriptor *)field {
9726 GPBDataType valueDataType = GPBGetFieldDataType(field);
9727 GPBDataType keyDataType = field.mapKeyDataType;
9728 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
9729 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
9730 NSNumber *aValue,
9731 BOOL *stop) {
9732 #pragma unused(stop)
9733 // Write the tag.
9734 [outputStream writeInt32NoTag:tag];
9735 // Write the size of the message.
9736 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
9737 msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber , valueDataType);
9738 [outputStream writeInt32NoTag:(int32_t)msgSize];
9739 // Write the fields.
9740 WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
9741 WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, v alueDataType);
9742 }];
9743 }
9744
9745 - (void)setGPBGenericValue:(GPBGenericValue *)value
9746 forGPBGenericValueKey:(GPBGenericValue *)key {
9747 [_dictionary setObject:@(value->valueInt32) forKey:key->valueString];
9748 }
9749
9750 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
9751 [self enumerateKeysAndValuesUsingBlock:^(NSString *key, int32_t value, BOOL *s top) {
9752 #pragma unused(stop)
9753 block(key, [NSString stringWithFormat:@"%d", value]);
9754 }];
9755 }
9756
9757 - (BOOL)valueForKey:(NSString *)key value:(int32_t *)value {
9758 NSNumber *wrapped = [_dictionary objectForKey:key];
9759 if (wrapped && value) {
9760 *value = [wrapped intValue];
9761 }
9762 return (wrapped != NULL);
9763 }
9764
9765 - (void)addEntriesFromDictionary:(GPBStringInt32Dictionary *)otherDictionary {
9766 if (otherDictionary) {
9767 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9768 if (_autocreator) {
9769 GPBAutocreatedDictionaryModified(_autocreator, self);
9770 }
9771 }
9772 }
9773
9774 - (void)setValue:(int32_t)value forKey:(NSString *)key {
9775 if (!key) {
9776 [NSException raise:NSInvalidArgumentException
9777 format:@"Attempting to add nil key to a Dictionary"];
9778 }
9779 [_dictionary setObject:@(value) forKey:key];
9780 if (_autocreator) {
9781 GPBAutocreatedDictionaryModified(_autocreator, self);
9782 }
9783 }
9784
9785 - (void)removeValueForKey:(NSString *)aKey {
9786 [_dictionary removeObjectForKey:aKey];
9787 }
9788
9789 - (void)removeAll {
9790 [_dictionary removeAllObjects];
9791 }
9792
9793 @end
9794
9795 #pragma mark - String -> UInt64
9796
9797 @implementation GPBStringUInt64Dictionary {
9798 @package
9799 NSMutableDictionary *_dictionary;
9800 }
9801
9802 + (instancetype)dictionary {
9803 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
9804 }
9805
9806 + (instancetype)dictionaryWithValue:(uint64_t)value
9807 forKey:(NSString *)key {
9808 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
9809 // on to get the type correct.
9810 return [[(GPBStringUInt64Dictionary*)[self alloc] initWithValues:&value
9811 forKeys:&key
9812 count:1] autoreleas e];
9813 }
9814
9815 + (instancetype)dictionaryWithValues:(const uint64_t [])values
9816 forKeys:(const NSString * [])keys
9817 count:(NSUInteger)count {
9818 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
9819 // on to get the type correct.
9820 return [[(GPBStringUInt64Dictionary*)[self alloc] initWithValues:values
9821 forKeys:keys
9822 count:count] autore lease];
9823 }
9824
9825 + (instancetype)dictionaryWithDictionary:(GPBStringUInt64Dictionary *)dictionary {
9826 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
9827 // on to get the type correct.
9828 return [[(GPBStringUInt64Dictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
9829 }
9830
9831 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
9832 return [[[self alloc] initWithCapacity:numItems] autorelease];
9833 }
9834
9835 - (instancetype)init {
9836 return [self initWithValues:NULL forKeys:NULL count:0];
9837 }
9838
9839 - (instancetype)initWithValues:(const uint64_t [])values
9840 forKeys:(const NSString * [])keys
9841 count:(NSUInteger)count {
9842 self = [super init];
9843 if (self) {
9844 _dictionary = [[NSMutableDictionary alloc] init];
9845 if (count && values && keys) {
9846 for (NSUInteger i = 0; i < count; ++i) {
9847 if (!keys[i]) {
9848 [NSException raise:NSInvalidArgumentException
9849 format:@"Attempting to add nil key to a Dictionary"];
9850 }
9851 [_dictionary setObject:@(values[i]) forKey:keys[i]];
9852 }
9853 }
9854 }
9855 return self;
9856 }
9857
9858 - (instancetype)initWithDictionary:(GPBStringUInt64Dictionary *)dictionary {
9859 self = [self initWithValues:NULL forKeys:NULL count:0];
9860 if (self) {
9861 if (dictionary) {
9862 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
9863 }
9864 }
9865 return self;
9866 }
9867
9868 - (instancetype)initWithCapacity:(NSUInteger)numItems {
9869 #pragma unused(numItems)
9870 return [self initWithValues:NULL forKeys:NULL count:0];
9871 }
9872
9873 - (void)dealloc {
9874 NSAssert(!_autocreator,
9875 @"%@: Autocreator must be cleared before release, autocreator: %@",
9876 [self class], _autocreator);
9877 [_dictionary release];
9878 [super dealloc];
9879 }
9880
9881 - (instancetype)copyWithZone:(NSZone *)zone {
9882 return [[GPBStringUInt64Dictionary allocWithZone:zone] initWithDictionary:self ];
9883 }
9884
9885 - (BOOL)isEqual:(GPBStringUInt64Dictionary *)other {
9886 if (self == other) {
9887 return YES;
9888 }
9889 if (![other isKindOfClass:[GPBStringUInt64Dictionary class]]) {
9890 return NO;
9891 }
9892 return [_dictionary isEqual:other->_dictionary];
9893 }
9894
9895 - (NSUInteger)hash {
9896 return _dictionary.count;
9897 }
9898
9899 - (NSString *)description {
9900 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
9901 }
9902
9903 - (NSUInteger)count {
9904 return _dictionary.count;
9905 }
9906
9907 - (void)enumerateKeysAndValuesUsingBlock:
9908 (void (^)(NSString *key, uint64_t value, BOOL *stop))block {
9909 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
9910 NSNumber *aValue,
9911 BOOL *stop) {
9912 block(aKey, [aValue unsignedLongLongValue], stop);
9913 }];
9914 }
9915
9916 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
9917 NSUInteger count = _dictionary.count;
9918 if (count == 0) {
9919 return 0;
9920 }
9921
9922 GPBDataType valueDataType = GPBGetFieldDataType(field);
9923 GPBDataType keyDataType = field.mapKeyDataType;
9924 __block size_t result = 0;
9925 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
9926 NSNumber *aValue,
9927 BOOL *stop) {
9928 #pragma unused(stop)
9929 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
9930 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
9931 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
9932 }];
9933 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
9934 result += tagSize * count;
9935 return result;
9936 }
9937
9938 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
9939 asField:(GPBFieldDescriptor *)field {
9940 GPBDataType valueDataType = GPBGetFieldDataType(field);
9941 GPBDataType keyDataType = field.mapKeyDataType;
9942 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
9943 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
9944 NSNumber *aValue,
9945 BOOL *stop) {
9946 #pragma unused(stop)
9947 // Write the tag.
9948 [outputStream writeInt32NoTag:tag];
9949 // Write the size of the message.
9950 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
9951 msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapVa lueFieldNumber, valueDataType);
9952 [outputStream writeInt32NoTag:(int32_t)msgSize];
9953 // Write the fields.
9954 WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
9955 WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValue FieldNumber, valueDataType);
9956 }];
9957 }
9958
9959 - (void)setGPBGenericValue:(GPBGenericValue *)value
9960 forGPBGenericValueKey:(GPBGenericValue *)key {
9961 [_dictionary setObject:@(value->valueUInt64) forKey:key->valueString];
9962 }
9963
9964 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
9965 [self enumerateKeysAndValuesUsingBlock:^(NSString *key, uint64_t value, BOOL * stop) {
9966 #pragma unused(stop)
9967 block(key, [NSString stringWithFormat:@"%llu", value]);
9968 }];
9969 }
9970
9971 - (BOOL)valueForKey:(NSString *)key value:(uint64_t *)value {
9972 NSNumber *wrapped = [_dictionary objectForKey:key];
9973 if (wrapped && value) {
9974 *value = [wrapped unsignedLongLongValue];
9975 }
9976 return (wrapped != NULL);
9977 }
9978
9979 - (void)addEntriesFromDictionary:(GPBStringUInt64Dictionary *)otherDictionary {
9980 if (otherDictionary) {
9981 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
9982 if (_autocreator) {
9983 GPBAutocreatedDictionaryModified(_autocreator, self);
9984 }
9985 }
9986 }
9987
9988 - (void)setValue:(uint64_t)value forKey:(NSString *)key {
9989 if (!key) {
9990 [NSException raise:NSInvalidArgumentException
9991 format:@"Attempting to add nil key to a Dictionary"];
9992 }
9993 [_dictionary setObject:@(value) forKey:key];
9994 if (_autocreator) {
9995 GPBAutocreatedDictionaryModified(_autocreator, self);
9996 }
9997 }
9998
9999 - (void)removeValueForKey:(NSString *)aKey {
10000 [_dictionary removeObjectForKey:aKey];
10001 }
10002
10003 - (void)removeAll {
10004 [_dictionary removeAllObjects];
10005 }
10006
10007 @end
10008
10009 #pragma mark - String -> Int64
10010
10011 @implementation GPBStringInt64Dictionary {
10012 @package
10013 NSMutableDictionary *_dictionary;
10014 }
10015
10016 + (instancetype)dictionary {
10017 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
10018 }
10019
10020 + (instancetype)dictionaryWithValue:(int64_t)value
10021 forKey:(NSString *)key {
10022 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10023 // on to get the type correct.
10024 return [[(GPBStringInt64Dictionary*)[self alloc] initWithValues:&value
10025 forKeys:&key
10026 count:1] autorelease ];
10027 }
10028
10029 + (instancetype)dictionaryWithValues:(const int64_t [])values
10030 forKeys:(const NSString * [])keys
10031 count:(NSUInteger)count {
10032 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10033 // on to get the type correct.
10034 return [[(GPBStringInt64Dictionary*)[self alloc] initWithValues:values
10035 forKeys:keys
10036 count:count] autorel ease];
10037 }
10038
10039 + (instancetype)dictionaryWithDictionary:(GPBStringInt64Dictionary *)dictionary {
10040 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
10041 // on to get the type correct.
10042 return [[(GPBStringInt64Dictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
10043 }
10044
10045 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
10046 return [[[self alloc] initWithCapacity:numItems] autorelease];
10047 }
10048
10049 - (instancetype)init {
10050 return [self initWithValues:NULL forKeys:NULL count:0];
10051 }
10052
10053 - (instancetype)initWithValues:(const int64_t [])values
10054 forKeys:(const NSString * [])keys
10055 count:(NSUInteger)count {
10056 self = [super init];
10057 if (self) {
10058 _dictionary = [[NSMutableDictionary alloc] init];
10059 if (count && values && keys) {
10060 for (NSUInteger i = 0; i < count; ++i) {
10061 if (!keys[i]) {
10062 [NSException raise:NSInvalidArgumentException
10063 format:@"Attempting to add nil key to a Dictionary"];
10064 }
10065 [_dictionary setObject:@(values[i]) forKey:keys[i]];
10066 }
10067 }
10068 }
10069 return self;
10070 }
10071
10072 - (instancetype)initWithDictionary:(GPBStringInt64Dictionary *)dictionary {
10073 self = [self initWithValues:NULL forKeys:NULL count:0];
10074 if (self) {
10075 if (dictionary) {
10076 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
10077 }
10078 }
10079 return self;
10080 }
10081
10082 - (instancetype)initWithCapacity:(NSUInteger)numItems {
10083 #pragma unused(numItems)
10084 return [self initWithValues:NULL forKeys:NULL count:0];
10085 }
10086
10087 - (void)dealloc {
10088 NSAssert(!_autocreator,
10089 @"%@: Autocreator must be cleared before release, autocreator: %@",
10090 [self class], _autocreator);
10091 [_dictionary release];
10092 [super dealloc];
10093 }
10094
10095 - (instancetype)copyWithZone:(NSZone *)zone {
10096 return [[GPBStringInt64Dictionary allocWithZone:zone] initWithDictionary:self] ;
10097 }
10098
10099 - (BOOL)isEqual:(GPBStringInt64Dictionary *)other {
10100 if (self == other) {
10101 return YES;
10102 }
10103 if (![other isKindOfClass:[GPBStringInt64Dictionary class]]) {
10104 return NO;
10105 }
10106 return [_dictionary isEqual:other->_dictionary];
10107 }
10108
10109 - (NSUInteger)hash {
10110 return _dictionary.count;
10111 }
10112
10113 - (NSString *)description {
10114 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
10115 }
10116
10117 - (NSUInteger)count {
10118 return _dictionary.count;
10119 }
10120
10121 - (void)enumerateKeysAndValuesUsingBlock:
10122 (void (^)(NSString *key, int64_t value, BOOL *stop))block {
10123 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10124 NSNumber *aValue,
10125 BOOL *stop) {
10126 block(aKey, [aValue longLongValue], stop);
10127 }];
10128 }
10129
10130 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10131 NSUInteger count = _dictionary.count;
10132 if (count == 0) {
10133 return 0;
10134 }
10135
10136 GPBDataType valueDataType = GPBGetFieldDataType(field);
10137 GPBDataType keyDataType = field.mapKeyDataType;
10138 __block size_t result = 0;
10139 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10140 NSNumber *aValue,
10141 BOOL *stop) {
10142 #pragma unused(stop)
10143 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
10144 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
10145 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10146 }];
10147 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
10148 result += tagSize * count;
10149 return result;
10150 }
10151
10152 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10153 asField:(GPBFieldDescriptor *)field {
10154 GPBDataType valueDataType = GPBGetFieldDataType(field);
10155 GPBDataType keyDataType = field.mapKeyDataType;
10156 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
10157 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10158 NSNumber *aValue,
10159 BOOL *stop) {
10160 #pragma unused(stop)
10161 // Write the tag.
10162 [outputStream writeInt32NoTag:tag];
10163 // Write the size of the message.
10164 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
10165 msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldN umber, valueDataType);
10166 [outputStream writeInt32NoTag:(int32_t)msgSize];
10167 // Write the fields.
10168 WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
10169 WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumb er, valueDataType);
10170 }];
10171 }
10172
10173 - (void)setGPBGenericValue:(GPBGenericValue *)value
10174 forGPBGenericValueKey:(GPBGenericValue *)key {
10175 [_dictionary setObject:@(value->valueInt64) forKey:key->valueString];
10176 }
10177
10178 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
10179 [self enumerateKeysAndValuesUsingBlock:^(NSString *key, int64_t value, BOOL *s top) {
10180 #pragma unused(stop)
10181 block(key, [NSString stringWithFormat:@"%lld", value]);
10182 }];
10183 }
10184
10185 - (BOOL)valueForKey:(NSString *)key value:(int64_t *)value {
10186 NSNumber *wrapped = [_dictionary objectForKey:key];
10187 if (wrapped && value) {
10188 *value = [wrapped longLongValue];
10189 }
10190 return (wrapped != NULL);
10191 }
10192
10193 - (void)addEntriesFromDictionary:(GPBStringInt64Dictionary *)otherDictionary {
10194 if (otherDictionary) {
10195 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
10196 if (_autocreator) {
10197 GPBAutocreatedDictionaryModified(_autocreator, self);
10198 }
10199 }
10200 }
10201
10202 - (void)setValue:(int64_t)value forKey:(NSString *)key {
10203 if (!key) {
10204 [NSException raise:NSInvalidArgumentException
10205 format:@"Attempting to add nil key to a Dictionary"];
10206 }
10207 [_dictionary setObject:@(value) forKey:key];
10208 if (_autocreator) {
10209 GPBAutocreatedDictionaryModified(_autocreator, self);
10210 }
10211 }
10212
10213 - (void)removeValueForKey:(NSString *)aKey {
10214 [_dictionary removeObjectForKey:aKey];
10215 }
10216
10217 - (void)removeAll {
10218 [_dictionary removeAllObjects];
10219 }
10220
10221 @end
10222
10223 #pragma mark - String -> Bool
10224
10225 @implementation GPBStringBoolDictionary {
10226 @package
10227 NSMutableDictionary *_dictionary;
10228 }
10229
10230 + (instancetype)dictionary {
10231 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
10232 }
10233
10234 + (instancetype)dictionaryWithValue:(BOOL)value
10235 forKey:(NSString *)key {
10236 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10237 // on to get the type correct.
10238 return [[(GPBStringBoolDictionary*)[self alloc] initWithValues:&value
10239 forKeys:&key
10240 count:1] autorelease] ;
10241 }
10242
10243 + (instancetype)dictionaryWithValues:(const BOOL [])values
10244 forKeys:(const NSString * [])keys
10245 count:(NSUInteger)count {
10246 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10247 // on to get the type correct.
10248 return [[(GPBStringBoolDictionary*)[self alloc] initWithValues:values
10249 forKeys:keys
10250 count:count] autorele ase];
10251 }
10252
10253 + (instancetype)dictionaryWithDictionary:(GPBStringBoolDictionary *)dictionary {
10254 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
10255 // on to get the type correct.
10256 return [[(GPBStringBoolDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
10257 }
10258
10259 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
10260 return [[[self alloc] initWithCapacity:numItems] autorelease];
10261 }
10262
10263 - (instancetype)init {
10264 return [self initWithValues:NULL forKeys:NULL count:0];
10265 }
10266
10267 - (instancetype)initWithValues:(const BOOL [])values
10268 forKeys:(const NSString * [])keys
10269 count:(NSUInteger)count {
10270 self = [super init];
10271 if (self) {
10272 _dictionary = [[NSMutableDictionary alloc] init];
10273 if (count && values && keys) {
10274 for (NSUInteger i = 0; i < count; ++i) {
10275 if (!keys[i]) {
10276 [NSException raise:NSInvalidArgumentException
10277 format:@"Attempting to add nil key to a Dictionary"];
10278 }
10279 [_dictionary setObject:@(values[i]) forKey:keys[i]];
10280 }
10281 }
10282 }
10283 return self;
10284 }
10285
10286 - (instancetype)initWithDictionary:(GPBStringBoolDictionary *)dictionary {
10287 self = [self initWithValues:NULL forKeys:NULL count:0];
10288 if (self) {
10289 if (dictionary) {
10290 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
10291 }
10292 }
10293 return self;
10294 }
10295
10296 - (instancetype)initWithCapacity:(NSUInteger)numItems {
10297 #pragma unused(numItems)
10298 return [self initWithValues:NULL forKeys:NULL count:0];
10299 }
10300
10301 - (void)dealloc {
10302 NSAssert(!_autocreator,
10303 @"%@: Autocreator must be cleared before release, autocreator: %@",
10304 [self class], _autocreator);
10305 [_dictionary release];
10306 [super dealloc];
10307 }
10308
10309 - (instancetype)copyWithZone:(NSZone *)zone {
10310 return [[GPBStringBoolDictionary allocWithZone:zone] initWithDictionary:self];
10311 }
10312
10313 - (BOOL)isEqual:(GPBStringBoolDictionary *)other {
10314 if (self == other) {
10315 return YES;
10316 }
10317 if (![other isKindOfClass:[GPBStringBoolDictionary class]]) {
10318 return NO;
10319 }
10320 return [_dictionary isEqual:other->_dictionary];
10321 }
10322
10323 - (NSUInteger)hash {
10324 return _dictionary.count;
10325 }
10326
10327 - (NSString *)description {
10328 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
10329 }
10330
10331 - (NSUInteger)count {
10332 return _dictionary.count;
10333 }
10334
10335 - (void)enumerateKeysAndValuesUsingBlock:
10336 (void (^)(NSString *key, BOOL value, BOOL *stop))block {
10337 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10338 NSNumber *aValue,
10339 BOOL *stop) {
10340 block(aKey, [aValue boolValue], stop);
10341 }];
10342 }
10343
10344 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10345 NSUInteger count = _dictionary.count;
10346 if (count == 0) {
10347 return 0;
10348 }
10349
10350 GPBDataType valueDataType = GPBGetFieldDataType(field);
10351 GPBDataType keyDataType = field.mapKeyDataType;
10352 __block size_t result = 0;
10353 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10354 NSNumber *aValue,
10355 BOOL *stop) {
10356 #pragma unused(stop)
10357 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
10358 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
10359 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10360 }];
10361 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
10362 result += tagSize * count;
10363 return result;
10364 }
10365
10366 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10367 asField:(GPBFieldDescriptor *)field {
10368 GPBDataType valueDataType = GPBGetFieldDataType(field);
10369 GPBDataType keyDataType = field.mapKeyDataType;
10370 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
10371 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10372 NSNumber *aValue,
10373 BOOL *stop) {
10374 #pragma unused(stop)
10375 // Write the tag.
10376 [outputStream writeInt32NoTag:tag];
10377 // Write the size of the message.
10378 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
10379 msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber , valueDataType);
10380 [outputStream writeInt32NoTag:(int32_t)msgSize];
10381 // Write the fields.
10382 WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
10383 WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, v alueDataType);
10384 }];
10385 }
10386
10387 - (void)setGPBGenericValue:(GPBGenericValue *)value
10388 forGPBGenericValueKey:(GPBGenericValue *)key {
10389 [_dictionary setObject:@(value->valueBool) forKey:key->valueString];
10390 }
10391
10392 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
10393 [self enumerateKeysAndValuesUsingBlock:^(NSString *key, BOOL value, BOOL *stop ) {
10394 #pragma unused(stop)
10395 block(key, (value ? @"true" : @"false"));
10396 }];
10397 }
10398
10399 - (BOOL)valueForKey:(NSString *)key value:(BOOL *)value {
10400 NSNumber *wrapped = [_dictionary objectForKey:key];
10401 if (wrapped && value) {
10402 *value = [wrapped boolValue];
10403 }
10404 return (wrapped != NULL);
10405 }
10406
10407 - (void)addEntriesFromDictionary:(GPBStringBoolDictionary *)otherDictionary {
10408 if (otherDictionary) {
10409 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
10410 if (_autocreator) {
10411 GPBAutocreatedDictionaryModified(_autocreator, self);
10412 }
10413 }
10414 }
10415
10416 - (void)setValue:(BOOL)value forKey:(NSString *)key {
10417 if (!key) {
10418 [NSException raise:NSInvalidArgumentException
10419 format:@"Attempting to add nil key to a Dictionary"];
10420 }
10421 [_dictionary setObject:@(value) forKey:key];
10422 if (_autocreator) {
10423 GPBAutocreatedDictionaryModified(_autocreator, self);
10424 }
10425 }
10426
10427 - (void)removeValueForKey:(NSString *)aKey {
10428 [_dictionary removeObjectForKey:aKey];
10429 }
10430
10431 - (void)removeAll {
10432 [_dictionary removeAllObjects];
10433 }
10434
10435 @end
10436
10437 #pragma mark - String -> Float
10438
10439 @implementation GPBStringFloatDictionary {
10440 @package
10441 NSMutableDictionary *_dictionary;
10442 }
10443
10444 + (instancetype)dictionary {
10445 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
10446 }
10447
10448 + (instancetype)dictionaryWithValue:(float)value
10449 forKey:(NSString *)key {
10450 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10451 // on to get the type correct.
10452 return [[(GPBStringFloatDictionary*)[self alloc] initWithValues:&value
10453 forKeys:&key
10454 count:1] autorelease ];
10455 }
10456
10457 + (instancetype)dictionaryWithValues:(const float [])values
10458 forKeys:(const NSString * [])keys
10459 count:(NSUInteger)count {
10460 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10461 // on to get the type correct.
10462 return [[(GPBStringFloatDictionary*)[self alloc] initWithValues:values
10463 forKeys:keys
10464 count:count] autorel ease];
10465 }
10466
10467 + (instancetype)dictionaryWithDictionary:(GPBStringFloatDictionary *)dictionary {
10468 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
10469 // on to get the type correct.
10470 return [[(GPBStringFloatDictionary*)[self alloc] initWithDictionary:dictionary ] autorelease];
10471 }
10472
10473 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
10474 return [[[self alloc] initWithCapacity:numItems] autorelease];
10475 }
10476
10477 - (instancetype)init {
10478 return [self initWithValues:NULL forKeys:NULL count:0];
10479 }
10480
10481 - (instancetype)initWithValues:(const float [])values
10482 forKeys:(const NSString * [])keys
10483 count:(NSUInteger)count {
10484 self = [super init];
10485 if (self) {
10486 _dictionary = [[NSMutableDictionary alloc] init];
10487 if (count && values && keys) {
10488 for (NSUInteger i = 0; i < count; ++i) {
10489 if (!keys[i]) {
10490 [NSException raise:NSInvalidArgumentException
10491 format:@"Attempting to add nil key to a Dictionary"];
10492 }
10493 [_dictionary setObject:@(values[i]) forKey:keys[i]];
10494 }
10495 }
10496 }
10497 return self;
10498 }
10499
10500 - (instancetype)initWithDictionary:(GPBStringFloatDictionary *)dictionary {
10501 self = [self initWithValues:NULL forKeys:NULL count:0];
10502 if (self) {
10503 if (dictionary) {
10504 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
10505 }
10506 }
10507 return self;
10508 }
10509
10510 - (instancetype)initWithCapacity:(NSUInteger)numItems {
10511 #pragma unused(numItems)
10512 return [self initWithValues:NULL forKeys:NULL count:0];
10513 }
10514
10515 - (void)dealloc {
10516 NSAssert(!_autocreator,
10517 @"%@: Autocreator must be cleared before release, autocreator: %@",
10518 [self class], _autocreator);
10519 [_dictionary release];
10520 [super dealloc];
10521 }
10522
10523 - (instancetype)copyWithZone:(NSZone *)zone {
10524 return [[GPBStringFloatDictionary allocWithZone:zone] initWithDictionary:self] ;
10525 }
10526
10527 - (BOOL)isEqual:(GPBStringFloatDictionary *)other {
10528 if (self == other) {
10529 return YES;
10530 }
10531 if (![other isKindOfClass:[GPBStringFloatDictionary class]]) {
10532 return NO;
10533 }
10534 return [_dictionary isEqual:other->_dictionary];
10535 }
10536
10537 - (NSUInteger)hash {
10538 return _dictionary.count;
10539 }
10540
10541 - (NSString *)description {
10542 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
10543 }
10544
10545 - (NSUInteger)count {
10546 return _dictionary.count;
10547 }
10548
10549 - (void)enumerateKeysAndValuesUsingBlock:
10550 (void (^)(NSString *key, float value, BOOL *stop))block {
10551 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10552 NSNumber *aValue,
10553 BOOL *stop) {
10554 block(aKey, [aValue floatValue], stop);
10555 }];
10556 }
10557
10558 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10559 NSUInteger count = _dictionary.count;
10560 if (count == 0) {
10561 return 0;
10562 }
10563
10564 GPBDataType valueDataType = GPBGetFieldDataType(field);
10565 GPBDataType keyDataType = field.mapKeyDataType;
10566 __block size_t result = 0;
10567 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10568 NSNumber *aValue,
10569 BOOL *stop) {
10570 #pragma unused(stop)
10571 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
10572 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
10573 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10574 }];
10575 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
10576 result += tagSize * count;
10577 return result;
10578 }
10579
10580 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10581 asField:(GPBFieldDescriptor *)field {
10582 GPBDataType valueDataType = GPBGetFieldDataType(field);
10583 GPBDataType keyDataType = field.mapKeyDataType;
10584 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
10585 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10586 NSNumber *aValue,
10587 BOOL *stop) {
10588 #pragma unused(stop)
10589 // Write the tag.
10590 [outputStream writeInt32NoTag:tag];
10591 // Write the size of the message.
10592 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
10593 msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumb er, valueDataType);
10594 [outputStream writeInt32NoTag:(int32_t)msgSize];
10595 // Write the fields.
10596 WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
10597 WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
10598 }];
10599 }
10600
10601 - (void)setGPBGenericValue:(GPBGenericValue *)value
10602 forGPBGenericValueKey:(GPBGenericValue *)key {
10603 [_dictionary setObject:@(value->valueFloat) forKey:key->valueString];
10604 }
10605
10606 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
10607 [self enumerateKeysAndValuesUsingBlock:^(NSString *key, float value, BOOL *sto p) {
10608 #pragma unused(stop)
10609 block(key, [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
10610 }];
10611 }
10612
10613 - (BOOL)valueForKey:(NSString *)key value:(float *)value {
10614 NSNumber *wrapped = [_dictionary objectForKey:key];
10615 if (wrapped && value) {
10616 *value = [wrapped floatValue];
10617 }
10618 return (wrapped != NULL);
10619 }
10620
10621 - (void)addEntriesFromDictionary:(GPBStringFloatDictionary *)otherDictionary {
10622 if (otherDictionary) {
10623 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
10624 if (_autocreator) {
10625 GPBAutocreatedDictionaryModified(_autocreator, self);
10626 }
10627 }
10628 }
10629
10630 - (void)setValue:(float)value forKey:(NSString *)key {
10631 if (!key) {
10632 [NSException raise:NSInvalidArgumentException
10633 format:@"Attempting to add nil key to a Dictionary"];
10634 }
10635 [_dictionary setObject:@(value) forKey:key];
10636 if (_autocreator) {
10637 GPBAutocreatedDictionaryModified(_autocreator, self);
10638 }
10639 }
10640
10641 - (void)removeValueForKey:(NSString *)aKey {
10642 [_dictionary removeObjectForKey:aKey];
10643 }
10644
10645 - (void)removeAll {
10646 [_dictionary removeAllObjects];
10647 }
10648
10649 @end
10650
10651 #pragma mark - String -> Double
10652
10653 @implementation GPBStringDoubleDictionary {
10654 @package
10655 NSMutableDictionary *_dictionary;
10656 }
10657
10658 + (instancetype)dictionary {
10659 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
10660 }
10661
10662 + (instancetype)dictionaryWithValue:(double)value
10663 forKey:(NSString *)key {
10664 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10665 // on to get the type correct.
10666 return [[(GPBStringDoubleDictionary*)[self alloc] initWithValues:&value
10667 forKeys:&key
10668 count:1] autoreleas e];
10669 }
10670
10671 + (instancetype)dictionaryWithValues:(const double [])values
10672 forKeys:(const NSString * [])keys
10673 count:(NSUInteger)count {
10674 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10675 // on to get the type correct.
10676 return [[(GPBStringDoubleDictionary*)[self alloc] initWithValues:values
10677 forKeys:keys
10678 count:count] autore lease];
10679 }
10680
10681 + (instancetype)dictionaryWithDictionary:(GPBStringDoubleDictionary *)dictionary {
10682 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
10683 // on to get the type correct.
10684 return [[(GPBStringDoubleDictionary*)[self alloc] initWithDictionary:dictionar y] autorelease];
10685 }
10686
10687 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
10688 return [[[self alloc] initWithCapacity:numItems] autorelease];
10689 }
10690
10691 - (instancetype)init {
10692 return [self initWithValues:NULL forKeys:NULL count:0];
10693 }
10694
10695 - (instancetype)initWithValues:(const double [])values
10696 forKeys:(const NSString * [])keys
10697 count:(NSUInteger)count {
10698 self = [super init];
10699 if (self) {
10700 _dictionary = [[NSMutableDictionary alloc] init];
10701 if (count && values && keys) {
10702 for (NSUInteger i = 0; i < count; ++i) {
10703 if (!keys[i]) {
10704 [NSException raise:NSInvalidArgumentException
10705 format:@"Attempting to add nil key to a Dictionary"];
10706 }
10707 [_dictionary setObject:@(values[i]) forKey:keys[i]];
10708 }
10709 }
10710 }
10711 return self;
10712 }
10713
10714 - (instancetype)initWithDictionary:(GPBStringDoubleDictionary *)dictionary {
10715 self = [self initWithValues:NULL forKeys:NULL count:0];
10716 if (self) {
10717 if (dictionary) {
10718 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
10719 }
10720 }
10721 return self;
10722 }
10723
10724 - (instancetype)initWithCapacity:(NSUInteger)numItems {
10725 #pragma unused(numItems)
10726 return [self initWithValues:NULL forKeys:NULL count:0];
10727 }
10728
10729 - (void)dealloc {
10730 NSAssert(!_autocreator,
10731 @"%@: Autocreator must be cleared before release, autocreator: %@",
10732 [self class], _autocreator);
10733 [_dictionary release];
10734 [super dealloc];
10735 }
10736
10737 - (instancetype)copyWithZone:(NSZone *)zone {
10738 return [[GPBStringDoubleDictionary allocWithZone:zone] initWithDictionary:self ];
10739 }
10740
10741 - (BOOL)isEqual:(GPBStringDoubleDictionary *)other {
10742 if (self == other) {
10743 return YES;
10744 }
10745 if (![other isKindOfClass:[GPBStringDoubleDictionary class]]) {
10746 return NO;
10747 }
10748 return [_dictionary isEqual:other->_dictionary];
10749 }
10750
10751 - (NSUInteger)hash {
10752 return _dictionary.count;
10753 }
10754
10755 - (NSString *)description {
10756 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
10757 }
10758
10759 - (NSUInteger)count {
10760 return _dictionary.count;
10761 }
10762
10763 - (void)enumerateKeysAndValuesUsingBlock:
10764 (void (^)(NSString *key, double value, BOOL *stop))block {
10765 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10766 NSNumber *aValue,
10767 BOOL *stop) {
10768 block(aKey, [aValue doubleValue], stop);
10769 }];
10770 }
10771
10772 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
10773 NSUInteger count = _dictionary.count;
10774 if (count == 0) {
10775 return 0;
10776 }
10777
10778 GPBDataType valueDataType = GPBGetFieldDataType(field);
10779 GPBDataType keyDataType = field.mapKeyDataType;
10780 __block size_t result = 0;
10781 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10782 NSNumber *aValue,
10783 BOOL *stop) {
10784 #pragma unused(stop)
10785 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
10786 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
10787 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
10788 }];
10789 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
10790 result += tagSize * count;
10791 return result;
10792 }
10793
10794 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
10795 asField:(GPBFieldDescriptor *)field {
10796 GPBDataType valueDataType = GPBGetFieldDataType(field);
10797 GPBDataType keyDataType = field.mapKeyDataType;
10798 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
10799 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
10800 NSNumber *aValue,
10801 BOOL *stop) {
10802 #pragma unused(stop)
10803 // Write the tag.
10804 [outputStream writeInt32NoTag:tag];
10805 // Write the size of the message.
10806 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
10807 msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNu mber, valueDataType);
10808 [outputStream writeInt32NoTag:(int32_t)msgSize];
10809 // Write the fields.
10810 WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
10811 WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumbe r, valueDataType);
10812 }];
10813 }
10814
10815 - (void)setGPBGenericValue:(GPBGenericValue *)value
10816 forGPBGenericValueKey:(GPBGenericValue *)key {
10817 [_dictionary setObject:@(value->valueDouble) forKey:key->valueString];
10818 }
10819
10820 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
10821 [self enumerateKeysAndValuesUsingBlock:^(NSString *key, double value, BOOL *st op) {
10822 #pragma unused(stop)
10823 block(key, [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
10824 }];
10825 }
10826
10827 - (BOOL)valueForKey:(NSString *)key value:(double *)value {
10828 NSNumber *wrapped = [_dictionary objectForKey:key];
10829 if (wrapped && value) {
10830 *value = [wrapped doubleValue];
10831 }
10832 return (wrapped != NULL);
10833 }
10834
10835 - (void)addEntriesFromDictionary:(GPBStringDoubleDictionary *)otherDictionary {
10836 if (otherDictionary) {
10837 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
10838 if (_autocreator) {
10839 GPBAutocreatedDictionaryModified(_autocreator, self);
10840 }
10841 }
10842 }
10843
10844 - (void)setValue:(double)value forKey:(NSString *)key {
10845 if (!key) {
10846 [NSException raise:NSInvalidArgumentException
10847 format:@"Attempting to add nil key to a Dictionary"];
10848 }
10849 [_dictionary setObject:@(value) forKey:key];
10850 if (_autocreator) {
10851 GPBAutocreatedDictionaryModified(_autocreator, self);
10852 }
10853 }
10854
10855 - (void)removeValueForKey:(NSString *)aKey {
10856 [_dictionary removeObjectForKey:aKey];
10857 }
10858
10859 - (void)removeAll {
10860 [_dictionary removeAllObjects];
10861 }
10862
10863 @end
10864
10865 #pragma mark - String -> Enum
10866
10867 @implementation GPBStringEnumDictionary {
10868 @package
10869 NSMutableDictionary *_dictionary;
10870 GPBEnumValidationFunc _validationFunc;
10871 }
10872
10873 @synthesize validationFunc = _validationFunc;
10874
10875 + (instancetype)dictionary {
10876 return [[[self alloc] initWithValidationFunction:NULL
10877 rawValues:NULL
10878 forKeys:NULL
10879 count:0] autorelease];
10880 }
10881
10882 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func {
10883 return [[[self alloc] initWithValidationFunction:func
10884 rawValues:NULL
10885 forKeys:NULL
10886 count:0] autorelease];
10887 }
10888
10889 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
10890 rawValue:(int32_t)rawValue
10891 forKey:(NSString *)key {
10892 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10893 // on to get the type correct.
10894 return [[(GPBStringEnumDictionary*)[self alloc] initWithValidationFunction:fun c
10895 rawValues:&ra wValue
10896 forKeys:&ke y
10897 count:1] autorelease];
10898 }
10899
10900 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
10901 rawValues:(const int32_t [])rawValues
10902 forKeys:(const NSString * [])keys
10903 count:(NSUInteger)count {
10904 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10905 // on to get the type correct.
10906 return [[(GPBStringEnumDictionary*)[self alloc] initWithValidationFunction:fun c
10907 rawValues:raw Values
10908 forKeys:key s
10909 count:cou nt] autorelease];
10910 }
10911
10912 + (instancetype)dictionaryWithDictionary:(GPBStringEnumDictionary *)dictionary {
10913 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
10914 // on to get the type correct.
10915 return [[(GPBStringEnumDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
10916 }
10917
10918 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
10919 capacity:(NSUInteger)numItems {
10920 return [[[self alloc] initWithValidationFunction:func capacity:numItems] autor elease];
10921 }
10922
10923 - (instancetype)init {
10924 return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count :0];
10925 }
10926
10927 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
10928 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
10929 }
10930
10931 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
10932 rawValues:(const int32_t [])rawValues
10933 forKeys:(const NSString * [])keys
10934 count:(NSUInteger)count {
10935 self = [super init];
10936 if (self) {
10937 _dictionary = [[NSMutableDictionary alloc] init];
10938 _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
10939 if (count && rawValues && keys) {
10940 for (NSUInteger i = 0; i < count; ++i) {
10941 if (!keys[i]) {
10942 [NSException raise:NSInvalidArgumentException
10943 format:@"Attempting to add nil key to a Dictionary"];
10944 }
10945 [_dictionary setObject:@(rawValues[i]) forKey:keys[i]];
10946 }
10947 }
10948 }
10949 return self;
10950 }
10951
10952 - (instancetype)initWithDictionary:(GPBStringEnumDictionary *)dictionary {
10953 self = [self initWithValidationFunction:dictionary.validationFunc
10954 rawValues:NULL
10955 forKeys:NULL
10956 count:0];
10957 if (self) {
10958 if (dictionary) {
10959 [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
10960 }
10961 }
10962 return self;
10963 }
10964
10965 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
10966 capacity:(NSUInteger)numItems {
10967 #pragma unused(numItems)
10968 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
10969 }
10970
10971 - (void)dealloc {
10972 NSAssert(!_autocreator,
10973 @"%@: Autocreator must be cleared before release, autocreator: %@",
10974 [self class], _autocreator);
10975 [_dictionary release];
10976 [super dealloc];
10977 }
10978
10979 - (instancetype)copyWithZone:(NSZone *)zone {
10980 return [[GPBStringEnumDictionary allocWithZone:zone] initWithDictionary:self];
10981 }
10982
10983 - (BOOL)isEqual:(GPBStringEnumDictionary *)other {
10984 if (self == other) {
10985 return YES;
10986 }
10987 if (![other isKindOfClass:[GPBStringEnumDictionary class]]) {
10988 return NO;
10989 }
10990 return [_dictionary isEqual:other->_dictionary];
10991 }
10992
10993 - (NSUInteger)hash {
10994 return _dictionary.count;
10995 }
10996
10997 - (NSString *)description {
10998 return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dict ionary];
10999 }
11000
11001 - (NSUInteger)count {
11002 return _dictionary.count;
11003 }
11004
11005 - (void)enumerateKeysAndRawValuesUsingBlock:
11006 (void (^)(NSString *key, int32_t value, BOOL *stop))block {
11007 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
11008 NSNumber *aValue,
11009 BOOL *stop) {
11010 block(aKey, [aValue intValue], stop);
11011 }];
11012 }
11013
11014 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11015 NSUInteger count = _dictionary.count;
11016 if (count == 0) {
11017 return 0;
11018 }
11019
11020 GPBDataType valueDataType = GPBGetFieldDataType(field);
11021 GPBDataType keyDataType = field.mapKeyDataType;
11022 __block size_t result = 0;
11023 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
11024 NSNumber *aValue,
11025 BOOL *stop) {
11026 #pragma unused(stop)
11027 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
11028 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
11029 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11030 }];
11031 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
11032 result += tagSize * count;
11033 return result;
11034 }
11035
11036 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11037 asField:(GPBFieldDescriptor *)field {
11038 GPBDataType valueDataType = GPBGetFieldDataType(field);
11039 GPBDataType keyDataType = field.mapKeyDataType;
11040 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
11041 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
11042 NSNumber *aValue,
11043 BOOL *stop) {
11044 #pragma unused(stop)
11045 // Write the tag.
11046 [outputStream writeInt32NoTag:tag];
11047 // Write the size of the message.
11048 size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDat aType);
11049 msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
11050 [outputStream writeInt32NoTag:(int32_t)msgSize];
11051 // Write the fields.
11052 WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
11053 WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, va lueDataType);
11054 }];
11055 }
11056
11057 - (NSData *)serializedDataForUnknownValue:(int32_t)value
11058 forKey:(GPBGenericValue *)key
11059 keyDataType:(GPBDataType)keyDataType {
11060 size_t msgSize = ComputeDictStringFieldSize(key->valueString, kMapKeyFieldNumb er, keyDataType);
11061 msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEn um);
11062 NSMutableData *data = [NSMutableData dataWithLength:msgSize];
11063 GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithDat a:data];
11064 WriteDictStringField(outputStream, key->valueString, kMapKeyFieldNumber, keyDa taType);
11065 WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum) ;
11066 [outputStream release];
11067 return data;
11068 }
11069 - (void)setGPBGenericValue:(GPBGenericValue *)value
11070 forGPBGenericValueKey:(GPBGenericValue *)key {
11071 [_dictionary setObject:@(value->valueEnum) forKey:key->valueString];
11072 }
11073
11074 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
11075 [self enumerateKeysAndRawValuesUsingBlock:^(NSString *key, int32_t value, BOOL *stop) {
11076 #pragma unused(stop)
11077 block(key, @(value));
11078 }];
11079 }
11080
11081 - (BOOL)valueForKey:(NSString *)key value:(int32_t *)value {
11082 NSNumber *wrapped = [_dictionary objectForKey:key];
11083 if (wrapped && value) {
11084 int32_t result = [wrapped intValue];
11085 if (!_validationFunc(result)) {
11086 result = kGPBUnrecognizedEnumeratorValue;
11087 }
11088 *value = result;
11089 }
11090 return (wrapped != NULL);
11091 }
11092
11093 - (BOOL)valueForKey:(NSString *)key rawValue:(int32_t *)rawValue {
11094 NSNumber *wrapped = [_dictionary objectForKey:key];
11095 if (wrapped && rawValue) {
11096 *rawValue = [wrapped intValue];
11097 }
11098 return (wrapped != NULL);
11099 }
11100
11101 - (void)enumerateKeysAndValuesUsingBlock:
11102 (void (^)(NSString *key, int32_t value, BOOL *stop))block {
11103 GPBEnumValidationFunc func = _validationFunc;
11104 [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
11105 NSNumber *aValue,
11106 BOOL *stop) {
11107 int32_t unwrapped = [aValue intValue];
11108 if (!func(unwrapped)) {
11109 unwrapped = kGPBUnrecognizedEnumeratorValue;
11110 }
11111 block(aKey, unwrapped, stop);
11112 }];
11113 }
11114
11115 - (void)addRawEntriesFromDictionary:(GPBStringEnumDictionary *)otherDictionary {
11116 if (otherDictionary) {
11117 [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
11118 if (_autocreator) {
11119 GPBAutocreatedDictionaryModified(_autocreator, self);
11120 }
11121 }
11122 }
11123
11124 - (void)setRawValue:(int32_t)value forKey:(NSString *)key {
11125 if (!key) {
11126 [NSException raise:NSInvalidArgumentException
11127 format:@"Attempting to add nil key to a Dictionary"];
11128 }
11129 [_dictionary setObject:@(value) forKey:key];
11130 if (_autocreator) {
11131 GPBAutocreatedDictionaryModified(_autocreator, self);
11132 }
11133 }
11134
11135 - (void)removeValueForKey:(NSString *)aKey {
11136 [_dictionary removeObjectForKey:aKey];
11137 }
11138
11139 - (void)removeAll {
11140 [_dictionary removeAllObjects];
11141 }
11142
11143 - (void)setValue:(int32_t)value forKey:(NSString *)key {
11144 if (!key) {
11145 [NSException raise:NSInvalidArgumentException
11146 format:@"Attempting to add nil key to a Dictionary"];
11147 }
11148 if (!_validationFunc(value)) {
11149 [NSException raise:NSInvalidArgumentException
11150 format:@"GPBStringEnumDictionary: Attempt to set an unknown enum value (%d)",
11151 value];
11152 }
11153
11154 [_dictionary setObject:@(value) forKey:key];
11155 if (_autocreator) {
11156 GPBAutocreatedDictionaryModified(_autocreator, self);
11157 }
11158 }
11159
11160 @end
11161
11162 //%PDDM-EXPAND-END (5 expansions)
11163
11164
11165 //%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt32, uint32_t)
11166 // This block of code is generated, do not edit it directly.
11167
11168 #pragma mark - Bool -> UInt32
11169
11170 @implementation GPBBoolUInt32Dictionary {
11171 @package
11172 uint32_t _values[2];
11173 BOOL _valueSet[2];
11174 }
11175
11176 + (instancetype)dictionary {
11177 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
11178 }
11179
11180 + (instancetype)dictionaryWithValue:(uint32_t)value
11181 forKey:(BOOL)key {
11182 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
11183 // on to get the type correct.
11184 return [[(GPBBoolUInt32Dictionary*)[self alloc] initWithValues:&value
11185 forKeys:&key
11186 count:1] autorelease] ;
11187 }
11188
11189 + (instancetype)dictionaryWithValues:(const uint32_t [])values
11190 forKeys:(const BOOL [])keys
11191 count:(NSUInteger)count {
11192 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
11193 // on to get the type correct.
11194 return [[(GPBBoolUInt32Dictionary*)[self alloc] initWithValues:values
11195 forKeys:keys
11196 count:count] autorele ase];
11197 }
11198
11199 + (instancetype)dictionaryWithDictionary:(GPBBoolUInt32Dictionary *)dictionary {
11200 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
11201 // on to get the type correct.
11202 return [[(GPBBoolUInt32Dictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
11203 }
11204
11205 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
11206 return [[[self alloc] initWithCapacity:numItems] autorelease];
11207 }
11208
11209 - (instancetype)init {
11210 return [self initWithValues:NULL forKeys:NULL count:0];
11211 }
11212
11213 - (instancetype)initWithValues:(const uint32_t [])values
11214 forKeys:(const BOOL [])keys
11215 count:(NSUInteger)count {
11216 self = [super init];
11217 if (self) {
11218 for (NSUInteger i = 0; i < count; ++i) {
11219 int idx = keys[i] ? 1 : 0;
11220 _values[idx] = values[i];
11221 _valueSet[idx] = YES;
11222 }
11223 }
11224 return self;
11225 }
11226
11227 - (instancetype)initWithDictionary:(GPBBoolUInt32Dictionary *)dictionary {
11228 self = [self initWithValues:NULL forKeys:NULL count:0];
11229 if (self) {
11230 if (dictionary) {
11231 for (int i = 0; i < 2; ++i) {
11232 if (dictionary->_valueSet[i]) {
11233 _values[i] = dictionary->_values[i];
11234 _valueSet[i] = YES;
11235 }
11236 }
11237 }
11238 }
11239 return self;
11240 }
11241
11242 - (instancetype)initWithCapacity:(NSUInteger)numItems {
11243 #pragma unused(numItems)
11244 return [self initWithValues:NULL forKeys:NULL count:0];
11245 }
11246
11247 #if !defined(NS_BLOCK_ASSERTIONS)
11248 - (void)dealloc {
11249 NSAssert(!_autocreator,
11250 @"%@: Autocreator must be cleared before release, autocreator: %@",
11251 [self class], _autocreator);
11252 [super dealloc];
11253 }
11254 #endif // !defined(NS_BLOCK_ASSERTIONS)
11255
11256 - (instancetype)copyWithZone:(NSZone *)zone {
11257 return [[GPBBoolUInt32Dictionary allocWithZone:zone] initWithDictionary:self];
11258 }
11259
11260 - (BOOL)isEqual:(GPBBoolUInt32Dictionary *)other {
11261 if (self == other) {
11262 return YES;
11263 }
11264 if (![other isKindOfClass:[GPBBoolUInt32Dictionary class]]) {
11265 return NO;
11266 }
11267 if ((_valueSet[0] != other->_valueSet[0]) ||
11268 (_valueSet[1] != other->_valueSet[1])) {
11269 return NO;
11270 }
11271 if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
11272 (_valueSet[1] && (_values[1] != other->_values[1]))) {
11273 return NO;
11274 }
11275 return YES;
11276 }
11277
11278 - (NSUInteger)hash {
11279 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11280 }
11281
11282 - (NSString *)description {
11283 NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [sel f class], self];
11284 if (_valueSet[0]) {
11285 [result appendFormat:@"NO: %u", _values[0]];
11286 }
11287 if (_valueSet[1]) {
11288 [result appendFormat:@"YES: %u", _values[1]];
11289 }
11290 [result appendString:@" }"];
11291 return result;
11292 }
11293
11294 - (NSUInteger)count {
11295 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11296 }
11297
11298 - (BOOL)valueForKey:(BOOL)key value:(uint32_t *)value {
11299 int idx = (key ? 1 : 0);
11300 if (_valueSet[idx]) {
11301 if (value) {
11302 *value = _values[idx];
11303 }
11304 return YES;
11305 }
11306 return NO;
11307 }
11308
11309 - (void)setGPBGenericValue:(GPBGenericValue *)value
11310 forGPBGenericValueKey:(GPBGenericValue *)key {
11311 int idx = (key->valueBool ? 1 : 0);
11312 _values[idx] = value->valueUInt32;
11313 _valueSet[idx] = YES;
11314 }
11315
11316 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
11317 if (_valueSet[0]) {
11318 block(@"false", [NSString stringWithFormat:@"%u", _values[0]]);
11319 }
11320 if (_valueSet[1]) {
11321 block(@"true", [NSString stringWithFormat:@"%u", _values[1]]);
11322 }
11323 }
11324
11325 - (void)enumerateKeysAndValuesUsingBlock:
11326 (void (^)(BOOL key, uint32_t value, BOOL *stop))block {
11327 BOOL stop = NO;
11328 if (_valueSet[0]) {
11329 block(NO, _values[0], &stop);
11330 }
11331 if (!stop && _valueSet[1]) {
11332 block(YES, _values[1], &stop);
11333 }
11334 }
11335
11336 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11337 GPBDataType valueDataType = GPBGetFieldDataType(field);
11338 NSUInteger count = 0;
11339 size_t result = 0;
11340 for (int i = 0; i < 2; ++i) {
11341 if (_valueSet[i]) {
11342 ++count;
11343 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
11344 msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, va lueDataType);
11345 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11346 }
11347 }
11348 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
11349 result += tagSize * count;
11350 return result;
11351 }
11352
11353 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11354 asField:(GPBFieldDescriptor *)field {
11355 GPBDataType valueDataType = GPBGetFieldDataType(field);
11356 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
11357 for (int i = 0; i < 2; ++i) {
11358 if (_valueSet[i]) {
11359 // Write the tag.
11360 [outputStream writeInt32NoTag:tag];
11361 // Write the size of the message.
11362 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
11363 msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, va lueDataType);
11364 [outputStream writeInt32NoTag:(int32_t)msgSize];
11365 // Write the fields.
11366 WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataType Bool);
11367 WriteDictUInt32Field(outputStream, _values[i], kMapValueFieldNumber, value DataType);
11368 }
11369 }
11370 }
11371
11372 - (void)addEntriesFromDictionary:(GPBBoolUInt32Dictionary *)otherDictionary {
11373 if (otherDictionary) {
11374 for (int i = 0; i < 2; ++i) {
11375 if (otherDictionary->_valueSet[i]) {
11376 _valueSet[i] = YES;
11377 _values[i] = otherDictionary->_values[i];
11378 }
11379 }
11380 if (_autocreator) {
11381 GPBAutocreatedDictionaryModified(_autocreator, self);
11382 }
11383 }
11384 }
11385
11386 - (void)setValue:(uint32_t)value forKey:(BOOL)key {
11387 int idx = (key ? 1 : 0);
11388 _values[idx] = value;
11389 _valueSet[idx] = YES;
11390 if (_autocreator) {
11391 GPBAutocreatedDictionaryModified(_autocreator, self);
11392 }
11393 }
11394
11395 - (void)removeValueForKey:(BOOL)aKey {
11396 _valueSet[aKey ? 1 : 0] = NO;
11397 }
11398
11399 - (void)removeAll {
11400 _valueSet[0] = NO;
11401 _valueSet[1] = NO;
11402 }
11403
11404 @end
11405
11406 //%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int32, int32_t)
11407 // This block of code is generated, do not edit it directly.
11408
11409 #pragma mark - Bool -> Int32
11410
11411 @implementation GPBBoolInt32Dictionary {
11412 @package
11413 int32_t _values[2];
11414 BOOL _valueSet[2];
11415 }
11416
11417 + (instancetype)dictionary {
11418 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
11419 }
11420
11421 + (instancetype)dictionaryWithValue:(int32_t)value
11422 forKey:(BOOL)key {
11423 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
11424 // on to get the type correct.
11425 return [[(GPBBoolInt32Dictionary*)[self alloc] initWithValues:&value
11426 forKeys:&key
11427 count:1] autorelease];
11428 }
11429
11430 + (instancetype)dictionaryWithValues:(const int32_t [])values
11431 forKeys:(const BOOL [])keys
11432 count:(NSUInteger)count {
11433 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
11434 // on to get the type correct.
11435 return [[(GPBBoolInt32Dictionary*)[self alloc] initWithValues:values
11436 forKeys:keys
11437 count:count] autorelea se];
11438 }
11439
11440 + (instancetype)dictionaryWithDictionary:(GPBBoolInt32Dictionary *)dictionary {
11441 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
11442 // on to get the type correct.
11443 return [[(GPBBoolInt32Dictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
11444 }
11445
11446 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
11447 return [[[self alloc] initWithCapacity:numItems] autorelease];
11448 }
11449
11450 - (instancetype)init {
11451 return [self initWithValues:NULL forKeys:NULL count:0];
11452 }
11453
11454 - (instancetype)initWithValues:(const int32_t [])values
11455 forKeys:(const BOOL [])keys
11456 count:(NSUInteger)count {
11457 self = [super init];
11458 if (self) {
11459 for (NSUInteger i = 0; i < count; ++i) {
11460 int idx = keys[i] ? 1 : 0;
11461 _values[idx] = values[i];
11462 _valueSet[idx] = YES;
11463 }
11464 }
11465 return self;
11466 }
11467
11468 - (instancetype)initWithDictionary:(GPBBoolInt32Dictionary *)dictionary {
11469 self = [self initWithValues:NULL forKeys:NULL count:0];
11470 if (self) {
11471 if (dictionary) {
11472 for (int i = 0; i < 2; ++i) {
11473 if (dictionary->_valueSet[i]) {
11474 _values[i] = dictionary->_values[i];
11475 _valueSet[i] = YES;
11476 }
11477 }
11478 }
11479 }
11480 return self;
11481 }
11482
11483 - (instancetype)initWithCapacity:(NSUInteger)numItems {
11484 #pragma unused(numItems)
11485 return [self initWithValues:NULL forKeys:NULL count:0];
11486 }
11487
11488 #if !defined(NS_BLOCK_ASSERTIONS)
11489 - (void)dealloc {
11490 NSAssert(!_autocreator,
11491 @"%@: Autocreator must be cleared before release, autocreator: %@",
11492 [self class], _autocreator);
11493 [super dealloc];
11494 }
11495 #endif // !defined(NS_BLOCK_ASSERTIONS)
11496
11497 - (instancetype)copyWithZone:(NSZone *)zone {
11498 return [[GPBBoolInt32Dictionary allocWithZone:zone] initWithDictionary:self];
11499 }
11500
11501 - (BOOL)isEqual:(GPBBoolInt32Dictionary *)other {
11502 if (self == other) {
11503 return YES;
11504 }
11505 if (![other isKindOfClass:[GPBBoolInt32Dictionary class]]) {
11506 return NO;
11507 }
11508 if ((_valueSet[0] != other->_valueSet[0]) ||
11509 (_valueSet[1] != other->_valueSet[1])) {
11510 return NO;
11511 }
11512 if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
11513 (_valueSet[1] && (_values[1] != other->_values[1]))) {
11514 return NO;
11515 }
11516 return YES;
11517 }
11518
11519 - (NSUInteger)hash {
11520 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11521 }
11522
11523 - (NSString *)description {
11524 NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [sel f class], self];
11525 if (_valueSet[0]) {
11526 [result appendFormat:@"NO: %d", _values[0]];
11527 }
11528 if (_valueSet[1]) {
11529 [result appendFormat:@"YES: %d", _values[1]];
11530 }
11531 [result appendString:@" }"];
11532 return result;
11533 }
11534
11535 - (NSUInteger)count {
11536 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11537 }
11538
11539 - (BOOL)valueForKey:(BOOL)key value:(int32_t *)value {
11540 int idx = (key ? 1 : 0);
11541 if (_valueSet[idx]) {
11542 if (value) {
11543 *value = _values[idx];
11544 }
11545 return YES;
11546 }
11547 return NO;
11548 }
11549
11550 - (void)setGPBGenericValue:(GPBGenericValue *)value
11551 forGPBGenericValueKey:(GPBGenericValue *)key {
11552 int idx = (key->valueBool ? 1 : 0);
11553 _values[idx] = value->valueInt32;
11554 _valueSet[idx] = YES;
11555 }
11556
11557 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
11558 if (_valueSet[0]) {
11559 block(@"false", [NSString stringWithFormat:@"%d", _values[0]]);
11560 }
11561 if (_valueSet[1]) {
11562 block(@"true", [NSString stringWithFormat:@"%d", _values[1]]);
11563 }
11564 }
11565
11566 - (void)enumerateKeysAndValuesUsingBlock:
11567 (void (^)(BOOL key, int32_t value, BOOL *stop))block {
11568 BOOL stop = NO;
11569 if (_valueSet[0]) {
11570 block(NO, _values[0], &stop);
11571 }
11572 if (!stop && _valueSet[1]) {
11573 block(YES, _values[1], &stop);
11574 }
11575 }
11576
11577 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11578 GPBDataType valueDataType = GPBGetFieldDataType(field);
11579 NSUInteger count = 0;
11580 size_t result = 0;
11581 for (int i = 0; i < 2; ++i) {
11582 if (_valueSet[i]) {
11583 ++count;
11584 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
11585 msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, val ueDataType);
11586 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11587 }
11588 }
11589 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
11590 result += tagSize * count;
11591 return result;
11592 }
11593
11594 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11595 asField:(GPBFieldDescriptor *)field {
11596 GPBDataType valueDataType = GPBGetFieldDataType(field);
11597 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
11598 for (int i = 0; i < 2; ++i) {
11599 if (_valueSet[i]) {
11600 // Write the tag.
11601 [outputStream writeInt32NoTag:tag];
11602 // Write the size of the message.
11603 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
11604 msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, val ueDataType);
11605 [outputStream writeInt32NoTag:(int32_t)msgSize];
11606 // Write the fields.
11607 WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataType Bool);
11608 WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueD ataType);
11609 }
11610 }
11611 }
11612
11613 - (void)addEntriesFromDictionary:(GPBBoolInt32Dictionary *)otherDictionary {
11614 if (otherDictionary) {
11615 for (int i = 0; i < 2; ++i) {
11616 if (otherDictionary->_valueSet[i]) {
11617 _valueSet[i] = YES;
11618 _values[i] = otherDictionary->_values[i];
11619 }
11620 }
11621 if (_autocreator) {
11622 GPBAutocreatedDictionaryModified(_autocreator, self);
11623 }
11624 }
11625 }
11626
11627 - (void)setValue:(int32_t)value forKey:(BOOL)key {
11628 int idx = (key ? 1 : 0);
11629 _values[idx] = value;
11630 _valueSet[idx] = YES;
11631 if (_autocreator) {
11632 GPBAutocreatedDictionaryModified(_autocreator, self);
11633 }
11634 }
11635
11636 - (void)removeValueForKey:(BOOL)aKey {
11637 _valueSet[aKey ? 1 : 0] = NO;
11638 }
11639
11640 - (void)removeAll {
11641 _valueSet[0] = NO;
11642 _valueSet[1] = NO;
11643 }
11644
11645 @end
11646
11647 //%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt64, uint64_t)
11648 // This block of code is generated, do not edit it directly.
11649
11650 #pragma mark - Bool -> UInt64
11651
11652 @implementation GPBBoolUInt64Dictionary {
11653 @package
11654 uint64_t _values[2];
11655 BOOL _valueSet[2];
11656 }
11657
11658 + (instancetype)dictionary {
11659 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
11660 }
11661
11662 + (instancetype)dictionaryWithValue:(uint64_t)value
11663 forKey:(BOOL)key {
11664 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
11665 // on to get the type correct.
11666 return [[(GPBBoolUInt64Dictionary*)[self alloc] initWithValues:&value
11667 forKeys:&key
11668 count:1] autorelease] ;
11669 }
11670
11671 + (instancetype)dictionaryWithValues:(const uint64_t [])values
11672 forKeys:(const BOOL [])keys
11673 count:(NSUInteger)count {
11674 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
11675 // on to get the type correct.
11676 return [[(GPBBoolUInt64Dictionary*)[self alloc] initWithValues:values
11677 forKeys:keys
11678 count:count] autorele ase];
11679 }
11680
11681 + (instancetype)dictionaryWithDictionary:(GPBBoolUInt64Dictionary *)dictionary {
11682 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
11683 // on to get the type correct.
11684 return [[(GPBBoolUInt64Dictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
11685 }
11686
11687 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
11688 return [[[self alloc] initWithCapacity:numItems] autorelease];
11689 }
11690
11691 - (instancetype)init {
11692 return [self initWithValues:NULL forKeys:NULL count:0];
11693 }
11694
11695 - (instancetype)initWithValues:(const uint64_t [])values
11696 forKeys:(const BOOL [])keys
11697 count:(NSUInteger)count {
11698 self = [super init];
11699 if (self) {
11700 for (NSUInteger i = 0; i < count; ++i) {
11701 int idx = keys[i] ? 1 : 0;
11702 _values[idx] = values[i];
11703 _valueSet[idx] = YES;
11704 }
11705 }
11706 return self;
11707 }
11708
11709 - (instancetype)initWithDictionary:(GPBBoolUInt64Dictionary *)dictionary {
11710 self = [self initWithValues:NULL forKeys:NULL count:0];
11711 if (self) {
11712 if (dictionary) {
11713 for (int i = 0; i < 2; ++i) {
11714 if (dictionary->_valueSet[i]) {
11715 _values[i] = dictionary->_values[i];
11716 _valueSet[i] = YES;
11717 }
11718 }
11719 }
11720 }
11721 return self;
11722 }
11723
11724 - (instancetype)initWithCapacity:(NSUInteger)numItems {
11725 #pragma unused(numItems)
11726 return [self initWithValues:NULL forKeys:NULL count:0];
11727 }
11728
11729 #if !defined(NS_BLOCK_ASSERTIONS)
11730 - (void)dealloc {
11731 NSAssert(!_autocreator,
11732 @"%@: Autocreator must be cleared before release, autocreator: %@",
11733 [self class], _autocreator);
11734 [super dealloc];
11735 }
11736 #endif // !defined(NS_BLOCK_ASSERTIONS)
11737
11738 - (instancetype)copyWithZone:(NSZone *)zone {
11739 return [[GPBBoolUInt64Dictionary allocWithZone:zone] initWithDictionary:self];
11740 }
11741
11742 - (BOOL)isEqual:(GPBBoolUInt64Dictionary *)other {
11743 if (self == other) {
11744 return YES;
11745 }
11746 if (![other isKindOfClass:[GPBBoolUInt64Dictionary class]]) {
11747 return NO;
11748 }
11749 if ((_valueSet[0] != other->_valueSet[0]) ||
11750 (_valueSet[1] != other->_valueSet[1])) {
11751 return NO;
11752 }
11753 if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
11754 (_valueSet[1] && (_values[1] != other->_values[1]))) {
11755 return NO;
11756 }
11757 return YES;
11758 }
11759
11760 - (NSUInteger)hash {
11761 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11762 }
11763
11764 - (NSString *)description {
11765 NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [sel f class], self];
11766 if (_valueSet[0]) {
11767 [result appendFormat:@"NO: %llu", _values[0]];
11768 }
11769 if (_valueSet[1]) {
11770 [result appendFormat:@"YES: %llu", _values[1]];
11771 }
11772 [result appendString:@" }"];
11773 return result;
11774 }
11775
11776 - (NSUInteger)count {
11777 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
11778 }
11779
11780 - (BOOL)valueForKey:(BOOL)key value:(uint64_t *)value {
11781 int idx = (key ? 1 : 0);
11782 if (_valueSet[idx]) {
11783 if (value) {
11784 *value = _values[idx];
11785 }
11786 return YES;
11787 }
11788 return NO;
11789 }
11790
11791 - (void)setGPBGenericValue:(GPBGenericValue *)value
11792 forGPBGenericValueKey:(GPBGenericValue *)key {
11793 int idx = (key->valueBool ? 1 : 0);
11794 _values[idx] = value->valueUInt64;
11795 _valueSet[idx] = YES;
11796 }
11797
11798 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
11799 if (_valueSet[0]) {
11800 block(@"false", [NSString stringWithFormat:@"%llu", _values[0]]);
11801 }
11802 if (_valueSet[1]) {
11803 block(@"true", [NSString stringWithFormat:@"%llu", _values[1]]);
11804 }
11805 }
11806
11807 - (void)enumerateKeysAndValuesUsingBlock:
11808 (void (^)(BOOL key, uint64_t value, BOOL *stop))block {
11809 BOOL stop = NO;
11810 if (_valueSet[0]) {
11811 block(NO, _values[0], &stop);
11812 }
11813 if (!stop && _valueSet[1]) {
11814 block(YES, _values[1], &stop);
11815 }
11816 }
11817
11818 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
11819 GPBDataType valueDataType = GPBGetFieldDataType(field);
11820 NSUInteger count = 0;
11821 size_t result = 0;
11822 for (int i = 0; i < 2; ++i) {
11823 if (_valueSet[i]) {
11824 ++count;
11825 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
11826 msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, va lueDataType);
11827 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
11828 }
11829 }
11830 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
11831 result += tagSize * count;
11832 return result;
11833 }
11834
11835 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
11836 asField:(GPBFieldDescriptor *)field {
11837 GPBDataType valueDataType = GPBGetFieldDataType(field);
11838 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
11839 for (int i = 0; i < 2; ++i) {
11840 if (_valueSet[i]) {
11841 // Write the tag.
11842 [outputStream writeInt32NoTag:tag];
11843 // Write the size of the message.
11844 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
11845 msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, va lueDataType);
11846 [outputStream writeInt32NoTag:(int32_t)msgSize];
11847 // Write the fields.
11848 WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataType Bool);
11849 WriteDictUInt64Field(outputStream, _values[i], kMapValueFieldNumber, value DataType);
11850 }
11851 }
11852 }
11853
11854 - (void)addEntriesFromDictionary:(GPBBoolUInt64Dictionary *)otherDictionary {
11855 if (otherDictionary) {
11856 for (int i = 0; i < 2; ++i) {
11857 if (otherDictionary->_valueSet[i]) {
11858 _valueSet[i] = YES;
11859 _values[i] = otherDictionary->_values[i];
11860 }
11861 }
11862 if (_autocreator) {
11863 GPBAutocreatedDictionaryModified(_autocreator, self);
11864 }
11865 }
11866 }
11867
11868 - (void)setValue:(uint64_t)value forKey:(BOOL)key {
11869 int idx = (key ? 1 : 0);
11870 _values[idx] = value;
11871 _valueSet[idx] = YES;
11872 if (_autocreator) {
11873 GPBAutocreatedDictionaryModified(_autocreator, self);
11874 }
11875 }
11876
11877 - (void)removeValueForKey:(BOOL)aKey {
11878 _valueSet[aKey ? 1 : 0] = NO;
11879 }
11880
11881 - (void)removeAll {
11882 _valueSet[0] = NO;
11883 _valueSet[1] = NO;
11884 }
11885
11886 @end
11887
11888 //%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int64, int64_t)
11889 // This block of code is generated, do not edit it directly.
11890
11891 #pragma mark - Bool -> Int64
11892
11893 @implementation GPBBoolInt64Dictionary {
11894 @package
11895 int64_t _values[2];
11896 BOOL _valueSet[2];
11897 }
11898
11899 + (instancetype)dictionary {
11900 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
11901 }
11902
11903 + (instancetype)dictionaryWithValue:(int64_t)value
11904 forKey:(BOOL)key {
11905 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
11906 // on to get the type correct.
11907 return [[(GPBBoolInt64Dictionary*)[self alloc] initWithValues:&value
11908 forKeys:&key
11909 count:1] autorelease];
11910 }
11911
11912 + (instancetype)dictionaryWithValues:(const int64_t [])values
11913 forKeys:(const BOOL [])keys
11914 count:(NSUInteger)count {
11915 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
11916 // on to get the type correct.
11917 return [[(GPBBoolInt64Dictionary*)[self alloc] initWithValues:values
11918 forKeys:keys
11919 count:count] autorelea se];
11920 }
11921
11922 + (instancetype)dictionaryWithDictionary:(GPBBoolInt64Dictionary *)dictionary {
11923 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
11924 // on to get the type correct.
11925 return [[(GPBBoolInt64Dictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
11926 }
11927
11928 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
11929 return [[[self alloc] initWithCapacity:numItems] autorelease];
11930 }
11931
11932 - (instancetype)init {
11933 return [self initWithValues:NULL forKeys:NULL count:0];
11934 }
11935
11936 - (instancetype)initWithValues:(const int64_t [])values
11937 forKeys:(const BOOL [])keys
11938 count:(NSUInteger)count {
11939 self = [super init];
11940 if (self) {
11941 for (NSUInteger i = 0; i < count; ++i) {
11942 int idx = keys[i] ? 1 : 0;
11943 _values[idx] = values[i];
11944 _valueSet[idx] = YES;
11945 }
11946 }
11947 return self;
11948 }
11949
11950 - (instancetype)initWithDictionary:(GPBBoolInt64Dictionary *)dictionary {
11951 self = [self initWithValues:NULL forKeys:NULL count:0];
11952 if (self) {
11953 if (dictionary) {
11954 for (int i = 0; i < 2; ++i) {
11955 if (dictionary->_valueSet[i]) {
11956 _values[i] = dictionary->_values[i];
11957 _valueSet[i] = YES;
11958 }
11959 }
11960 }
11961 }
11962 return self;
11963 }
11964
11965 - (instancetype)initWithCapacity:(NSUInteger)numItems {
11966 #pragma unused(numItems)
11967 return [self initWithValues:NULL forKeys:NULL count:0];
11968 }
11969
11970 #if !defined(NS_BLOCK_ASSERTIONS)
11971 - (void)dealloc {
11972 NSAssert(!_autocreator,
11973 @"%@: Autocreator must be cleared before release, autocreator: %@",
11974 [self class], _autocreator);
11975 [super dealloc];
11976 }
11977 #endif // !defined(NS_BLOCK_ASSERTIONS)
11978
11979 - (instancetype)copyWithZone:(NSZone *)zone {
11980 return [[GPBBoolInt64Dictionary allocWithZone:zone] initWithDictionary:self];
11981 }
11982
11983 - (BOOL)isEqual:(GPBBoolInt64Dictionary *)other {
11984 if (self == other) {
11985 return YES;
11986 }
11987 if (![other isKindOfClass:[GPBBoolInt64Dictionary class]]) {
11988 return NO;
11989 }
11990 if ((_valueSet[0] != other->_valueSet[0]) ||
11991 (_valueSet[1] != other->_valueSet[1])) {
11992 return NO;
11993 }
11994 if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
11995 (_valueSet[1] && (_values[1] != other->_values[1]))) {
11996 return NO;
11997 }
11998 return YES;
11999 }
12000
12001 - (NSUInteger)hash {
12002 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
12003 }
12004
12005 - (NSString *)description {
12006 NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [sel f class], self];
12007 if (_valueSet[0]) {
12008 [result appendFormat:@"NO: %lld", _values[0]];
12009 }
12010 if (_valueSet[1]) {
12011 [result appendFormat:@"YES: %lld", _values[1]];
12012 }
12013 [result appendString:@" }"];
12014 return result;
12015 }
12016
12017 - (NSUInteger)count {
12018 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
12019 }
12020
12021 - (BOOL)valueForKey:(BOOL)key value:(int64_t *)value {
12022 int idx = (key ? 1 : 0);
12023 if (_valueSet[idx]) {
12024 if (value) {
12025 *value = _values[idx];
12026 }
12027 return YES;
12028 }
12029 return NO;
12030 }
12031
12032 - (void)setGPBGenericValue:(GPBGenericValue *)value
12033 forGPBGenericValueKey:(GPBGenericValue *)key {
12034 int idx = (key->valueBool ? 1 : 0);
12035 _values[idx] = value->valueInt64;
12036 _valueSet[idx] = YES;
12037 }
12038
12039 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
12040 if (_valueSet[0]) {
12041 block(@"false", [NSString stringWithFormat:@"%lld", _values[0]]);
12042 }
12043 if (_valueSet[1]) {
12044 block(@"true", [NSString stringWithFormat:@"%lld", _values[1]]);
12045 }
12046 }
12047
12048 - (void)enumerateKeysAndValuesUsingBlock:
12049 (void (^)(BOOL key, int64_t value, BOOL *stop))block {
12050 BOOL stop = NO;
12051 if (_valueSet[0]) {
12052 block(NO, _values[0], &stop);
12053 }
12054 if (!stop && _valueSet[1]) {
12055 block(YES, _values[1], &stop);
12056 }
12057 }
12058
12059 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
12060 GPBDataType valueDataType = GPBGetFieldDataType(field);
12061 NSUInteger count = 0;
12062 size_t result = 0;
12063 for (int i = 0; i < 2; ++i) {
12064 if (_valueSet[i]) {
12065 ++count;
12066 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
12067 msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, val ueDataType);
12068 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
12069 }
12070 }
12071 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
12072 result += tagSize * count;
12073 return result;
12074 }
12075
12076 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
12077 asField:(GPBFieldDescriptor *)field {
12078 GPBDataType valueDataType = GPBGetFieldDataType(field);
12079 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
12080 for (int i = 0; i < 2; ++i) {
12081 if (_valueSet[i]) {
12082 // Write the tag.
12083 [outputStream writeInt32NoTag:tag];
12084 // Write the size of the message.
12085 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
12086 msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, val ueDataType);
12087 [outputStream writeInt32NoTag:(int32_t)msgSize];
12088 // Write the fields.
12089 WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataType Bool);
12090 WriteDictInt64Field(outputStream, _values[i], kMapValueFieldNumber, valueD ataType);
12091 }
12092 }
12093 }
12094
12095 - (void)addEntriesFromDictionary:(GPBBoolInt64Dictionary *)otherDictionary {
12096 if (otherDictionary) {
12097 for (int i = 0; i < 2; ++i) {
12098 if (otherDictionary->_valueSet[i]) {
12099 _valueSet[i] = YES;
12100 _values[i] = otherDictionary->_values[i];
12101 }
12102 }
12103 if (_autocreator) {
12104 GPBAutocreatedDictionaryModified(_autocreator, self);
12105 }
12106 }
12107 }
12108
12109 - (void)setValue:(int64_t)value forKey:(BOOL)key {
12110 int idx = (key ? 1 : 0);
12111 _values[idx] = value;
12112 _valueSet[idx] = YES;
12113 if (_autocreator) {
12114 GPBAutocreatedDictionaryModified(_autocreator, self);
12115 }
12116 }
12117
12118 - (void)removeValueForKey:(BOOL)aKey {
12119 _valueSet[aKey ? 1 : 0] = NO;
12120 }
12121
12122 - (void)removeAll {
12123 _valueSet[0] = NO;
12124 _valueSet[1] = NO;
12125 }
12126
12127 @end
12128
12129 //%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Bool, BOOL)
12130 // This block of code is generated, do not edit it directly.
12131
12132 #pragma mark - Bool -> Bool
12133
12134 @implementation GPBBoolBoolDictionary {
12135 @package
12136 BOOL _values[2];
12137 BOOL _valueSet[2];
12138 }
12139
12140 + (instancetype)dictionary {
12141 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
12142 }
12143
12144 + (instancetype)dictionaryWithValue:(BOOL)value
12145 forKey:(BOOL)key {
12146 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
12147 // on to get the type correct.
12148 return [[(GPBBoolBoolDictionary*)[self alloc] initWithValues:&value
12149 forKeys:&key
12150 count:1] autorelease];
12151 }
12152
12153 + (instancetype)dictionaryWithValues:(const BOOL [])values
12154 forKeys:(const BOOL [])keys
12155 count:(NSUInteger)count {
12156 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
12157 // on to get the type correct.
12158 return [[(GPBBoolBoolDictionary*)[self alloc] initWithValues:values
12159 forKeys:keys
12160 count:count] autoreleas e];
12161 }
12162
12163 + (instancetype)dictionaryWithDictionary:(GPBBoolBoolDictionary *)dictionary {
12164 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
12165 // on to get the type correct.
12166 return [[(GPBBoolBoolDictionary*)[self alloc] initWithDictionary:dictionary] a utorelease];
12167 }
12168
12169 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
12170 return [[[self alloc] initWithCapacity:numItems] autorelease];
12171 }
12172
12173 - (instancetype)init {
12174 return [self initWithValues:NULL forKeys:NULL count:0];
12175 }
12176
12177 - (instancetype)initWithValues:(const BOOL [])values
12178 forKeys:(const BOOL [])keys
12179 count:(NSUInteger)count {
12180 self = [super init];
12181 if (self) {
12182 for (NSUInteger i = 0; i < count; ++i) {
12183 int idx = keys[i] ? 1 : 0;
12184 _values[idx] = values[i];
12185 _valueSet[idx] = YES;
12186 }
12187 }
12188 return self;
12189 }
12190
12191 - (instancetype)initWithDictionary:(GPBBoolBoolDictionary *)dictionary {
12192 self = [self initWithValues:NULL forKeys:NULL count:0];
12193 if (self) {
12194 if (dictionary) {
12195 for (int i = 0; i < 2; ++i) {
12196 if (dictionary->_valueSet[i]) {
12197 _values[i] = dictionary->_values[i];
12198 _valueSet[i] = YES;
12199 }
12200 }
12201 }
12202 }
12203 return self;
12204 }
12205
12206 - (instancetype)initWithCapacity:(NSUInteger)numItems {
12207 #pragma unused(numItems)
12208 return [self initWithValues:NULL forKeys:NULL count:0];
12209 }
12210
12211 #if !defined(NS_BLOCK_ASSERTIONS)
12212 - (void)dealloc {
12213 NSAssert(!_autocreator,
12214 @"%@: Autocreator must be cleared before release, autocreator: %@",
12215 [self class], _autocreator);
12216 [super dealloc];
12217 }
12218 #endif // !defined(NS_BLOCK_ASSERTIONS)
12219
12220 - (instancetype)copyWithZone:(NSZone *)zone {
12221 return [[GPBBoolBoolDictionary allocWithZone:zone] initWithDictionary:self];
12222 }
12223
12224 - (BOOL)isEqual:(GPBBoolBoolDictionary *)other {
12225 if (self == other) {
12226 return YES;
12227 }
12228 if (![other isKindOfClass:[GPBBoolBoolDictionary class]]) {
12229 return NO;
12230 }
12231 if ((_valueSet[0] != other->_valueSet[0]) ||
12232 (_valueSet[1] != other->_valueSet[1])) {
12233 return NO;
12234 }
12235 if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
12236 (_valueSet[1] && (_values[1] != other->_values[1]))) {
12237 return NO;
12238 }
12239 return YES;
12240 }
12241
12242 - (NSUInteger)hash {
12243 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
12244 }
12245
12246 - (NSString *)description {
12247 NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [sel f class], self];
12248 if (_valueSet[0]) {
12249 [result appendFormat:@"NO: %d", _values[0]];
12250 }
12251 if (_valueSet[1]) {
12252 [result appendFormat:@"YES: %d", _values[1]];
12253 }
12254 [result appendString:@" }"];
12255 return result;
12256 }
12257
12258 - (NSUInteger)count {
12259 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
12260 }
12261
12262 - (BOOL)valueForKey:(BOOL)key value:(BOOL *)value {
12263 int idx = (key ? 1 : 0);
12264 if (_valueSet[idx]) {
12265 if (value) {
12266 *value = _values[idx];
12267 }
12268 return YES;
12269 }
12270 return NO;
12271 }
12272
12273 - (void)setGPBGenericValue:(GPBGenericValue *)value
12274 forGPBGenericValueKey:(GPBGenericValue *)key {
12275 int idx = (key->valueBool ? 1 : 0);
12276 _values[idx] = value->valueBool;
12277 _valueSet[idx] = YES;
12278 }
12279
12280 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
12281 if (_valueSet[0]) {
12282 block(@"false", (_values[0] ? @"true" : @"false"));
12283 }
12284 if (_valueSet[1]) {
12285 block(@"true", (_values[1] ? @"true" : @"false"));
12286 }
12287 }
12288
12289 - (void)enumerateKeysAndValuesUsingBlock:
12290 (void (^)(BOOL key, BOOL value, BOOL *stop))block {
12291 BOOL stop = NO;
12292 if (_valueSet[0]) {
12293 block(NO, _values[0], &stop);
12294 }
12295 if (!stop && _valueSet[1]) {
12296 block(YES, _values[1], &stop);
12297 }
12298 }
12299
12300 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
12301 GPBDataType valueDataType = GPBGetFieldDataType(field);
12302 NSUInteger count = 0;
12303 size_t result = 0;
12304 for (int i = 0; i < 2; ++i) {
12305 if (_valueSet[i]) {
12306 ++count;
12307 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
12308 msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valu eDataType);
12309 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
12310 }
12311 }
12312 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
12313 result += tagSize * count;
12314 return result;
12315 }
12316
12317 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
12318 asField:(GPBFieldDescriptor *)field {
12319 GPBDataType valueDataType = GPBGetFieldDataType(field);
12320 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
12321 for (int i = 0; i < 2; ++i) {
12322 if (_valueSet[i]) {
12323 // Write the tag.
12324 [outputStream writeInt32NoTag:tag];
12325 // Write the size of the message.
12326 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
12327 msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valu eDataType);
12328 [outputStream writeInt32NoTag:(int32_t)msgSize];
12329 // Write the fields.
12330 WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataType Bool);
12331 WriteDictBoolField(outputStream, _values[i], kMapValueFieldNumber, valueDa taType);
12332 }
12333 }
12334 }
12335
12336 - (void)addEntriesFromDictionary:(GPBBoolBoolDictionary *)otherDictionary {
12337 if (otherDictionary) {
12338 for (int i = 0; i < 2; ++i) {
12339 if (otherDictionary->_valueSet[i]) {
12340 _valueSet[i] = YES;
12341 _values[i] = otherDictionary->_values[i];
12342 }
12343 }
12344 if (_autocreator) {
12345 GPBAutocreatedDictionaryModified(_autocreator, self);
12346 }
12347 }
12348 }
12349
12350 - (void)setValue:(BOOL)value forKey:(BOOL)key {
12351 int idx = (key ? 1 : 0);
12352 _values[idx] = value;
12353 _valueSet[idx] = YES;
12354 if (_autocreator) {
12355 GPBAutocreatedDictionaryModified(_autocreator, self);
12356 }
12357 }
12358
12359 - (void)removeValueForKey:(BOOL)aKey {
12360 _valueSet[aKey ? 1 : 0] = NO;
12361 }
12362
12363 - (void)removeAll {
12364 _valueSet[0] = NO;
12365 _valueSet[1] = NO;
12366 }
12367
12368 @end
12369
12370 //%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Float, float)
12371 // This block of code is generated, do not edit it directly.
12372
12373 #pragma mark - Bool -> Float
12374
12375 @implementation GPBBoolFloatDictionary {
12376 @package
12377 float _values[2];
12378 BOOL _valueSet[2];
12379 }
12380
12381 + (instancetype)dictionary {
12382 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
12383 }
12384
12385 + (instancetype)dictionaryWithValue:(float)value
12386 forKey:(BOOL)key {
12387 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
12388 // on to get the type correct.
12389 return [[(GPBBoolFloatDictionary*)[self alloc] initWithValues:&value
12390 forKeys:&key
12391 count:1] autorelease];
12392 }
12393
12394 + (instancetype)dictionaryWithValues:(const float [])values
12395 forKeys:(const BOOL [])keys
12396 count:(NSUInteger)count {
12397 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
12398 // on to get the type correct.
12399 return [[(GPBBoolFloatDictionary*)[self alloc] initWithValues:values
12400 forKeys:keys
12401 count:count] autorelea se];
12402 }
12403
12404 + (instancetype)dictionaryWithDictionary:(GPBBoolFloatDictionary *)dictionary {
12405 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
12406 // on to get the type correct.
12407 return [[(GPBBoolFloatDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
12408 }
12409
12410 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
12411 return [[[self alloc] initWithCapacity:numItems] autorelease];
12412 }
12413
12414 - (instancetype)init {
12415 return [self initWithValues:NULL forKeys:NULL count:0];
12416 }
12417
12418 - (instancetype)initWithValues:(const float [])values
12419 forKeys:(const BOOL [])keys
12420 count:(NSUInteger)count {
12421 self = [super init];
12422 if (self) {
12423 for (NSUInteger i = 0; i < count; ++i) {
12424 int idx = keys[i] ? 1 : 0;
12425 _values[idx] = values[i];
12426 _valueSet[idx] = YES;
12427 }
12428 }
12429 return self;
12430 }
12431
12432 - (instancetype)initWithDictionary:(GPBBoolFloatDictionary *)dictionary {
12433 self = [self initWithValues:NULL forKeys:NULL count:0];
12434 if (self) {
12435 if (dictionary) {
12436 for (int i = 0; i < 2; ++i) {
12437 if (dictionary->_valueSet[i]) {
12438 _values[i] = dictionary->_values[i];
12439 _valueSet[i] = YES;
12440 }
12441 }
12442 }
12443 }
12444 return self;
12445 }
12446
12447 - (instancetype)initWithCapacity:(NSUInteger)numItems {
12448 #pragma unused(numItems)
12449 return [self initWithValues:NULL forKeys:NULL count:0];
12450 }
12451
12452 #if !defined(NS_BLOCK_ASSERTIONS)
12453 - (void)dealloc {
12454 NSAssert(!_autocreator,
12455 @"%@: Autocreator must be cleared before release, autocreator: %@",
12456 [self class], _autocreator);
12457 [super dealloc];
12458 }
12459 #endif // !defined(NS_BLOCK_ASSERTIONS)
12460
12461 - (instancetype)copyWithZone:(NSZone *)zone {
12462 return [[GPBBoolFloatDictionary allocWithZone:zone] initWithDictionary:self];
12463 }
12464
12465 - (BOOL)isEqual:(GPBBoolFloatDictionary *)other {
12466 if (self == other) {
12467 return YES;
12468 }
12469 if (![other isKindOfClass:[GPBBoolFloatDictionary class]]) {
12470 return NO;
12471 }
12472 if ((_valueSet[0] != other->_valueSet[0]) ||
12473 (_valueSet[1] != other->_valueSet[1])) {
12474 return NO;
12475 }
12476 if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
12477 (_valueSet[1] && (_values[1] != other->_values[1]))) {
12478 return NO;
12479 }
12480 return YES;
12481 }
12482
12483 - (NSUInteger)hash {
12484 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
12485 }
12486
12487 - (NSString *)description {
12488 NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [sel f class], self];
12489 if (_valueSet[0]) {
12490 [result appendFormat:@"NO: %f", _values[0]];
12491 }
12492 if (_valueSet[1]) {
12493 [result appendFormat:@"YES: %f", _values[1]];
12494 }
12495 [result appendString:@" }"];
12496 return result;
12497 }
12498
12499 - (NSUInteger)count {
12500 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
12501 }
12502
12503 - (BOOL)valueForKey:(BOOL)key value:(float *)value {
12504 int idx = (key ? 1 : 0);
12505 if (_valueSet[idx]) {
12506 if (value) {
12507 *value = _values[idx];
12508 }
12509 return YES;
12510 }
12511 return NO;
12512 }
12513
12514 - (void)setGPBGenericValue:(GPBGenericValue *)value
12515 forGPBGenericValueKey:(GPBGenericValue *)key {
12516 int idx = (key->valueBool ? 1 : 0);
12517 _values[idx] = value->valueFloat;
12518 _valueSet[idx] = YES;
12519 }
12520
12521 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
12522 if (_valueSet[0]) {
12523 block(@"false", [NSString stringWithFormat:@"%.*g", FLT_DIG, _values[0]]);
12524 }
12525 if (_valueSet[1]) {
12526 block(@"true", [NSString stringWithFormat:@"%.*g", FLT_DIG, _values[1]]);
12527 }
12528 }
12529
12530 - (void)enumerateKeysAndValuesUsingBlock:
12531 (void (^)(BOOL key, float value, BOOL *stop))block {
12532 BOOL stop = NO;
12533 if (_valueSet[0]) {
12534 block(NO, _values[0], &stop);
12535 }
12536 if (!stop && _valueSet[1]) {
12537 block(YES, _values[1], &stop);
12538 }
12539 }
12540
12541 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
12542 GPBDataType valueDataType = GPBGetFieldDataType(field);
12543 NSUInteger count = 0;
12544 size_t result = 0;
12545 for (int i = 0; i < 2; ++i) {
12546 if (_valueSet[i]) {
12547 ++count;
12548 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
12549 msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, val ueDataType);
12550 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
12551 }
12552 }
12553 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
12554 result += tagSize * count;
12555 return result;
12556 }
12557
12558 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
12559 asField:(GPBFieldDescriptor *)field {
12560 GPBDataType valueDataType = GPBGetFieldDataType(field);
12561 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
12562 for (int i = 0; i < 2; ++i) {
12563 if (_valueSet[i]) {
12564 // Write the tag.
12565 [outputStream writeInt32NoTag:tag];
12566 // Write the size of the message.
12567 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
12568 msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, val ueDataType);
12569 [outputStream writeInt32NoTag:(int32_t)msgSize];
12570 // Write the fields.
12571 WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataType Bool);
12572 WriteDictFloatField(outputStream, _values[i], kMapValueFieldNumber, valueD ataType);
12573 }
12574 }
12575 }
12576
12577 - (void)addEntriesFromDictionary:(GPBBoolFloatDictionary *)otherDictionary {
12578 if (otherDictionary) {
12579 for (int i = 0; i < 2; ++i) {
12580 if (otherDictionary->_valueSet[i]) {
12581 _valueSet[i] = YES;
12582 _values[i] = otherDictionary->_values[i];
12583 }
12584 }
12585 if (_autocreator) {
12586 GPBAutocreatedDictionaryModified(_autocreator, self);
12587 }
12588 }
12589 }
12590
12591 - (void)setValue:(float)value forKey:(BOOL)key {
12592 int idx = (key ? 1 : 0);
12593 _values[idx] = value;
12594 _valueSet[idx] = YES;
12595 if (_autocreator) {
12596 GPBAutocreatedDictionaryModified(_autocreator, self);
12597 }
12598 }
12599
12600 - (void)removeValueForKey:(BOOL)aKey {
12601 _valueSet[aKey ? 1 : 0] = NO;
12602 }
12603
12604 - (void)removeAll {
12605 _valueSet[0] = NO;
12606 _valueSet[1] = NO;
12607 }
12608
12609 @end
12610
12611 //%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Double, double)
12612 // This block of code is generated, do not edit it directly.
12613
12614 #pragma mark - Bool -> Double
12615
12616 @implementation GPBBoolDoubleDictionary {
12617 @package
12618 double _values[2];
12619 BOOL _valueSet[2];
12620 }
12621
12622 + (instancetype)dictionary {
12623 return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
12624 }
12625
12626 + (instancetype)dictionaryWithValue:(double)value
12627 forKey:(BOOL)key {
12628 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
12629 // on to get the type correct.
12630 return [[(GPBBoolDoubleDictionary*)[self alloc] initWithValues:&value
12631 forKeys:&key
12632 count:1] autorelease] ;
12633 }
12634
12635 + (instancetype)dictionaryWithValues:(const double [])values
12636 forKeys:(const BOOL [])keys
12637 count:(NSUInteger)count {
12638 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
12639 // on to get the type correct.
12640 return [[(GPBBoolDoubleDictionary*)[self alloc] initWithValues:values
12641 forKeys:keys
12642 count:count] autorele ase];
12643 }
12644
12645 + (instancetype)dictionaryWithDictionary:(GPBBoolDoubleDictionary *)dictionary {
12646 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
12647 // on to get the type correct.
12648 return [[(GPBBoolDoubleDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
12649 }
12650
12651 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
12652 return [[[self alloc] initWithCapacity:numItems] autorelease];
12653 }
12654
12655 - (instancetype)init {
12656 return [self initWithValues:NULL forKeys:NULL count:0];
12657 }
12658
12659 - (instancetype)initWithValues:(const double [])values
12660 forKeys:(const BOOL [])keys
12661 count:(NSUInteger)count {
12662 self = [super init];
12663 if (self) {
12664 for (NSUInteger i = 0; i < count; ++i) {
12665 int idx = keys[i] ? 1 : 0;
12666 _values[idx] = values[i];
12667 _valueSet[idx] = YES;
12668 }
12669 }
12670 return self;
12671 }
12672
12673 - (instancetype)initWithDictionary:(GPBBoolDoubleDictionary *)dictionary {
12674 self = [self initWithValues:NULL forKeys:NULL count:0];
12675 if (self) {
12676 if (dictionary) {
12677 for (int i = 0; i < 2; ++i) {
12678 if (dictionary->_valueSet[i]) {
12679 _values[i] = dictionary->_values[i];
12680 _valueSet[i] = YES;
12681 }
12682 }
12683 }
12684 }
12685 return self;
12686 }
12687
12688 - (instancetype)initWithCapacity:(NSUInteger)numItems {
12689 #pragma unused(numItems)
12690 return [self initWithValues:NULL forKeys:NULL count:0];
12691 }
12692
12693 #if !defined(NS_BLOCK_ASSERTIONS)
12694 - (void)dealloc {
12695 NSAssert(!_autocreator,
12696 @"%@: Autocreator must be cleared before release, autocreator: %@",
12697 [self class], _autocreator);
12698 [super dealloc];
12699 }
12700 #endif // !defined(NS_BLOCK_ASSERTIONS)
12701
12702 - (instancetype)copyWithZone:(NSZone *)zone {
12703 return [[GPBBoolDoubleDictionary allocWithZone:zone] initWithDictionary:self];
12704 }
12705
12706 - (BOOL)isEqual:(GPBBoolDoubleDictionary *)other {
12707 if (self == other) {
12708 return YES;
12709 }
12710 if (![other isKindOfClass:[GPBBoolDoubleDictionary class]]) {
12711 return NO;
12712 }
12713 if ((_valueSet[0] != other->_valueSet[0]) ||
12714 (_valueSet[1] != other->_valueSet[1])) {
12715 return NO;
12716 }
12717 if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
12718 (_valueSet[1] && (_values[1] != other->_values[1]))) {
12719 return NO;
12720 }
12721 return YES;
12722 }
12723
12724 - (NSUInteger)hash {
12725 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
12726 }
12727
12728 - (NSString *)description {
12729 NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [sel f class], self];
12730 if (_valueSet[0]) {
12731 [result appendFormat:@"NO: %lf", _values[0]];
12732 }
12733 if (_valueSet[1]) {
12734 [result appendFormat:@"YES: %lf", _values[1]];
12735 }
12736 [result appendString:@" }"];
12737 return result;
12738 }
12739
12740 - (NSUInteger)count {
12741 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
12742 }
12743
12744 - (BOOL)valueForKey:(BOOL)key value:(double *)value {
12745 int idx = (key ? 1 : 0);
12746 if (_valueSet[idx]) {
12747 if (value) {
12748 *value = _values[idx];
12749 }
12750 return YES;
12751 }
12752 return NO;
12753 }
12754
12755 - (void)setGPBGenericValue:(GPBGenericValue *)value
12756 forGPBGenericValueKey:(GPBGenericValue *)key {
12757 int idx = (key->valueBool ? 1 : 0);
12758 _values[idx] = value->valueDouble;
12759 _valueSet[idx] = YES;
12760 }
12761
12762 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
12763 if (_valueSet[0]) {
12764 block(@"false", [NSString stringWithFormat:@"%.*lg", DBL_DIG, _values[0]]);
12765 }
12766 if (_valueSet[1]) {
12767 block(@"true", [NSString stringWithFormat:@"%.*lg", DBL_DIG, _values[1]]);
12768 }
12769 }
12770
12771 - (void)enumerateKeysAndValuesUsingBlock:
12772 (void (^)(BOOL key, double value, BOOL *stop))block {
12773 BOOL stop = NO;
12774 if (_valueSet[0]) {
12775 block(NO, _values[0], &stop);
12776 }
12777 if (!stop && _valueSet[1]) {
12778 block(YES, _values[1], &stop);
12779 }
12780 }
12781
12782 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
12783 GPBDataType valueDataType = GPBGetFieldDataType(field);
12784 NSUInteger count = 0;
12785 size_t result = 0;
12786 for (int i = 0; i < 2; ++i) {
12787 if (_valueSet[i]) {
12788 ++count;
12789 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
12790 msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, va lueDataType);
12791 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
12792 }
12793 }
12794 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
12795 result += tagSize * count;
12796 return result;
12797 }
12798
12799 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
12800 asField:(GPBFieldDescriptor *)field {
12801 GPBDataType valueDataType = GPBGetFieldDataType(field);
12802 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
12803 for (int i = 0; i < 2; ++i) {
12804 if (_valueSet[i]) {
12805 // Write the tag.
12806 [outputStream writeInt32NoTag:tag];
12807 // Write the size of the message.
12808 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
12809 msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, va lueDataType);
12810 [outputStream writeInt32NoTag:(int32_t)msgSize];
12811 // Write the fields.
12812 WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataType Bool);
12813 WriteDictDoubleField(outputStream, _values[i], kMapValueFieldNumber, value DataType);
12814 }
12815 }
12816 }
12817
12818 - (void)addEntriesFromDictionary:(GPBBoolDoubleDictionary *)otherDictionary {
12819 if (otherDictionary) {
12820 for (int i = 0; i < 2; ++i) {
12821 if (otherDictionary->_valueSet[i]) {
12822 _valueSet[i] = YES;
12823 _values[i] = otherDictionary->_values[i];
12824 }
12825 }
12826 if (_autocreator) {
12827 GPBAutocreatedDictionaryModified(_autocreator, self);
12828 }
12829 }
12830 }
12831
12832 - (void)setValue:(double)value forKey:(BOOL)key {
12833 int idx = (key ? 1 : 0);
12834 _values[idx] = value;
12835 _valueSet[idx] = YES;
12836 if (_autocreator) {
12837 GPBAutocreatedDictionaryModified(_autocreator, self);
12838 }
12839 }
12840
12841 - (void)removeValueForKey:(BOOL)aKey {
12842 _valueSet[aKey ? 1 : 0] = NO;
12843 }
12844
12845 - (void)removeAll {
12846 _valueSet[0] = NO;
12847 _valueSet[1] = NO;
12848 }
12849
12850 @end
12851
12852 //%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(Object, id)
12853 // This block of code is generated, do not edit it directly.
12854
12855 #pragma mark - Bool -> Object
12856
12857 @implementation GPBBoolObjectDictionary {
12858 @package
12859 id _values[2];
12860 }
12861
12862 + (instancetype)dictionary {
12863 return [[[self alloc] initWithObjects:NULL forKeys:NULL count:0] autorelease];
12864 }
12865
12866 + (instancetype)dictionaryWithObject:(id)object
12867 forKey:(BOOL)key {
12868 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
12869 // on to get the type correct.
12870 return [[(GPBBoolObjectDictionary*)[self alloc] initWithObjects:&object
12871 forKeys:&key
12872 count:1] autorelease ];
12873 }
12874
12875 + (instancetype)dictionaryWithObjects:(const id [])objects
12876 forKeys:(const BOOL [])keys
12877 count:(NSUInteger)count {
12878 // Cast is needed so the compiler knows what class we are invoking initWithObj ects:forKeys:count:
12879 // on to get the type correct.
12880 return [[(GPBBoolObjectDictionary*)[self alloc] initWithObjects:objects
12881 forKeys:keys
12882 count:count] autorel ease];
12883 }
12884
12885 + (instancetype)dictionaryWithDictionary:(GPBBoolObjectDictionary *)dictionary {
12886 // Cast is needed so the compiler knows what class we are invoking initWithDic tionary:
12887 // on to get the type correct.
12888 return [[(GPBBoolObjectDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
12889 }
12890
12891 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems {
12892 return [[[self alloc] initWithCapacity:numItems] autorelease];
12893 }
12894
12895 - (instancetype)init {
12896 return [self initWithObjects:NULL forKeys:NULL count:0];
12897 }
12898
12899 - (instancetype)initWithObjects:(const id [])objects
12900 forKeys:(const BOOL [])keys
12901 count:(NSUInteger)count {
12902 self = [super init];
12903 if (self) {
12904 for (NSUInteger i = 0; i < count; ++i) {
12905 if (!objects[i]) {
12906 [NSException raise:NSInvalidArgumentException
12907 format:@"Attempting to add nil object to a Dictionary"];
12908 }
12909 int idx = keys[i] ? 1 : 0;
12910 [_values[idx] release];
12911 _values[idx] = (id)[objects[i] retain];
12912 }
12913 }
12914 return self;
12915 }
12916
12917 - (instancetype)initWithDictionary:(GPBBoolObjectDictionary *)dictionary {
12918 self = [self initWithObjects:NULL forKeys:NULL count:0];
12919 if (self) {
12920 if (dictionary) {
12921 _values[0] = [dictionary->_values[0] retain];
12922 _values[1] = [dictionary->_values[1] retain];
12923 }
12924 }
12925 return self;
12926 }
12927
12928 - (instancetype)initWithCapacity:(NSUInteger)numItems {
12929 #pragma unused(numItems)
12930 return [self initWithObjects:NULL forKeys:NULL count:0];
12931 }
12932
12933 - (void)dealloc {
12934 NSAssert(!_autocreator,
12935 @"%@: Autocreator must be cleared before release, autocreator: %@",
12936 [self class], _autocreator);
12937 [_values[0] release];
12938 [_values[1] release];
12939 [super dealloc];
12940 }
12941
12942 - (instancetype)copyWithZone:(NSZone *)zone {
12943 return [[GPBBoolObjectDictionary allocWithZone:zone] initWithDictionary:self];
12944 }
12945
12946 - (BOOL)isEqual:(GPBBoolObjectDictionary *)other {
12947 if (self == other) {
12948 return YES;
12949 }
12950 if (![other isKindOfClass:[GPBBoolObjectDictionary class]]) {
12951 return NO;
12952 }
12953 if (((_values[0] != nil) != (other->_values[0] != nil)) ||
12954 ((_values[1] != nil) != (other->_values[1] != nil))) {
12955 return NO;
12956 }
12957 if (((_values[0] != nil) && (![_values[0] isEqual:other->_values[0]])) ||
12958 ((_values[1] != nil) && (![_values[1] isEqual:other->_values[1]]))) {
12959 return NO;
12960 }
12961 return YES;
12962 }
12963
12964 - (NSUInteger)hash {
12965 return ((_values[0] != nil) ? 1 : 0) + ((_values[1] != nil) ? 1 : 0);
12966 }
12967
12968 - (NSString *)description {
12969 NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [sel f class], self];
12970 if ((_values[0] != nil)) {
12971 [result appendFormat:@"NO: %@", _values[0]];
12972 }
12973 if ((_values[1] != nil)) {
12974 [result appendFormat:@"YES: %@", _values[1]];
12975 }
12976 [result appendString:@" }"];
12977 return result;
12978 }
12979
12980 - (NSUInteger)count {
12981 return ((_values[0] != nil) ? 1 : 0) + ((_values[1] != nil) ? 1 : 0);
12982 }
12983
12984 - (id)objectForKey:(BOOL)key {
12985 return _values[key ? 1 : 0];
12986 }
12987
12988 - (void)setGPBGenericValue:(GPBGenericValue *)value
12989 forGPBGenericValueKey:(GPBGenericValue *)key {
12990 int idx = (key->valueBool ? 1 : 0);
12991 [_values[idx] release];
12992 _values[idx] = [value->valueString retain];
12993 }
12994
12995 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
12996 if (_values[0] != nil) {
12997 block(@"false", _values[0]);
12998 }
12999 if ((_values[1] != nil)) {
13000 block(@"true", _values[1]);
13001 }
13002 }
13003
13004 - (void)enumerateKeysAndObjectsUsingBlock:
13005 (void (^)(BOOL key, id object, BOOL *stop))block {
13006 BOOL stop = NO;
13007 if (_values[0] != nil) {
13008 block(NO, _values[0], &stop);
13009 }
13010 if (!stop && (_values[1] != nil)) {
13011 block(YES, _values[1], &stop);
13012 }
13013 }
13014
13015 - (BOOL)isInitialized {
13016 if (_values[0] && ![_values[0] isInitialized]) {
13017 return NO;
13018 }
13019 if (_values[1] && ![_values[1] isInitialized]) {
13020 return NO;
13021 }
13022 return YES;
13023 }
13024
13025 - (instancetype)deepCopyWithZone:(NSZone *)zone {
13026 GPBBoolObjectDictionary *newDict =
13027 [[GPBBoolObjectDictionary alloc] init];
13028 for (int i = 0; i < 2; ++i) {
13029 if (_values[i] != nil) {
13030 newDict->_values[i] = [_values[i] copyWithZone:zone];
13031 }
13032 }
13033 return newDict;
13034 }
13035
13036 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
13037 GPBDataType valueDataType = GPBGetFieldDataType(field);
13038 NSUInteger count = 0;
13039 size_t result = 0;
13040 for (int i = 0; i < 2; ++i) {
13041 if (_values[i] != nil) {
13042 ++count;
13043 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
13044 msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, va lueDataType);
13045 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
13046 }
13047 }
13048 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
13049 result += tagSize * count;
13050 return result;
13051 }
13052
13053 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
13054 asField:(GPBFieldDescriptor *)field {
13055 GPBDataType valueDataType = GPBGetFieldDataType(field);
13056 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
13057 for (int i = 0; i < 2; ++i) {
13058 if (_values[i] != nil) {
13059 // Write the tag.
13060 [outputStream writeInt32NoTag:tag];
13061 // Write the size of the message.
13062 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
13063 msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, va lueDataType);
13064 [outputStream writeInt32NoTag:(int32_t)msgSize];
13065 // Write the fields.
13066 WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataType Bool);
13067 WriteDictObjectField(outputStream, _values[i], kMapValueFieldNumber, value DataType);
13068 }
13069 }
13070 }
13071
13072 - (void)addEntriesFromDictionary:(GPBBoolObjectDictionary *)otherDictionary {
13073 if (otherDictionary) {
13074 for (int i = 0; i < 2; ++i) {
13075 if (otherDictionary->_values[i] != nil) {
13076 [_values[i] release];
13077 _values[i] = [otherDictionary->_values[i] retain];
13078 }
13079 }
13080 if (_autocreator) {
13081 GPBAutocreatedDictionaryModified(_autocreator, self);
13082 }
13083 }
13084 }
13085
13086 - (void)setObject:(id)object forKey:(BOOL)key {
13087 if (!object) {
13088 [NSException raise:NSInvalidArgumentException
13089 format:@"Attempting to add nil object to a Dictionary"];
13090 }
13091 int idx = (key ? 1 : 0);
13092 [_values[idx] release];
13093 _values[idx] = [object retain];
13094 if (_autocreator) {
13095 GPBAutocreatedDictionaryModified(_autocreator, self);
13096 }
13097 }
13098
13099 - (void)removeObjectForKey:(BOOL)aKey {
13100 int idx = (aKey ? 1 : 0);
13101 [_values[idx] release];
13102 _values[idx] = nil;
13103 }
13104
13105 - (void)removeAll {
13106 for (int i = 0; i < 2; ++i) {
13107 [_values[i] release];
13108 _values[i] = nil;
13109 }
13110 }
13111
13112 @end
13113
13114 //%PDDM-EXPAND-END (8 expansions)
13115
13116 #pragma mark - Bool -> Enum
13117
13118 @implementation GPBBoolEnumDictionary {
13119 @package
13120 GPBEnumValidationFunc _validationFunc;
13121 int32_t _values[2];
13122 BOOL _valueSet[2];
13123 }
13124
13125 @synthesize validationFunc = _validationFunc;
13126
13127 + (instancetype)dictionary {
13128 return [[[self alloc] initWithValidationFunction:NULL
13129 rawValues:NULL
13130 forKeys:NULL
13131 count:0] autorelease];
13132 }
13133
13134 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func {
13135 return [[[self alloc] initWithValidationFunction:func
13136 rawValues:NULL
13137 forKeys:NULL
13138 count:0] autorelease];
13139 }
13140
13141 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
13142 rawValue:(int32_t)rawValue
13143 forKey:(BOOL)key {
13144 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
13145 // on to get the type correct.
13146 return [[(GPBBoolEnumDictionary*)[self alloc] initWithValidationFunction:func
13147 rawValues:&rawV alue
13148 forKeys:&key
13149 count:1] au torelease];
13150 }
13151
13152 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
13153 rawValues:(const int32_t [])values
13154 forKeys:(const BOOL [])keys
13155 count:(NSUInteger)count {
13156 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
13157 // on to get the type correct.
13158 return [[(GPBBoolEnumDictionary*)[self alloc] initWithValidationFunction:func
13159 rawValues:value s
13160 forKeys:keys
13161 count:count ] autorelease];
13162 }
13163
13164 + (instancetype)dictionaryWithDictionary:(GPBBoolEnumDictionary *)dictionary {
13165 // Cast is needed so the compiler knows what class we are invoking initWithVal ues:forKeys:count:
13166 // on to get the type correct.
13167 return [[(GPBBoolEnumDictionary*)[self alloc] initWithDictionary:dictionary] a utorelease];
13168 }
13169
13170 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
13171 capacity:(NSUInteger)numItems {
13172 return [[[self alloc] initWithValidationFunction:func capacity:numItems] autor elease];
13173 }
13174
13175 - (instancetype)init {
13176 return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count :0];
13177 }
13178
13179 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
13180 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
13181 }
13182
13183 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
13184 rawValues:(const int32_t [])rawValues
13185 forKeys:(const BOOL [])keys
13186 count:(NSUInteger)count {
13187 self = [super init];
13188 if (self) {
13189 _validationFunc = (func != NULL ? func : DictDefault_IsValidValue);
13190 for (NSUInteger i = 0; i < count; ++i) {
13191 int idx = keys[i] ? 1 : 0;
13192 _values[idx] = rawValues[i];
13193 _valueSet[idx] = YES;
13194 }
13195 }
13196 return self;
13197 }
13198
13199 - (instancetype)initWithDictionary:(GPBBoolEnumDictionary *)dictionary {
13200 self = [self initWithValidationFunction:dictionary.validationFunc
13201 rawValues:NULL
13202 forKeys:NULL
13203 count:0];
13204 if (self) {
13205 if (dictionary) {
13206 for (int i = 0; i < 2; ++i) {
13207 if (dictionary->_valueSet[i]) {
13208 _values[i] = dictionary->_values[i];
13209 _valueSet[i] = YES;
13210 }
13211 }
13212 }
13213 }
13214 return self;
13215 }
13216
13217 - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
13218 capacity:(NSUInteger)numItems {
13219 #pragma unused(numItems)
13220 return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count :0];
13221 }
13222
13223 #if !defined(NS_BLOCK_ASSERTIONS)
13224 - (void)dealloc {
13225 NSAssert(!_autocreator,
13226 @"%@: Autocreator must be cleared before release, autocreator: %@",
13227 [self class], _autocreator);
13228 [super dealloc];
13229 }
13230 #endif // !defined(NS_BLOCK_ASSERTIONS)
13231
13232 - (instancetype)copyWithZone:(NSZone *)zone {
13233 return [[GPBBoolEnumDictionary allocWithZone:zone] initWithDictionary:self];
13234 }
13235
13236 - (BOOL)isEqual:(GPBBoolEnumDictionary *)other {
13237 if (self == other) {
13238 return YES;
13239 }
13240 if (![other isKindOfClass:[GPBBoolEnumDictionary class]]) {
13241 return NO;
13242 }
13243 if ((_valueSet[0] != other->_valueSet[0]) ||
13244 (_valueSet[1] != other->_valueSet[1])) {
13245 return NO;
13246 }
13247 if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
13248 (_valueSet[1] && (_values[1] != other->_values[1]))) {
13249 return NO;
13250 }
13251 return YES;
13252 }
13253
13254 - (NSUInteger)hash {
13255 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
13256 }
13257
13258 - (NSString *)description {
13259 NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [sel f class], self];
13260 if (_valueSet[0]) {
13261 [result appendFormat:@"NO: %d", _values[0]];
13262 }
13263 if (_valueSet[1]) {
13264 [result appendFormat:@"YES: %d", _values[1]];
13265 }
13266 [result appendString:@" }"];
13267 return result;
13268 }
13269
13270 - (NSUInteger)count {
13271 return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
13272 }
13273
13274 - (BOOL)valueForKey:(BOOL)key value:(int32_t*)value {
13275 int idx = (key ? 1 : 0);
13276 if (_valueSet[idx]) {
13277 if (value) {
13278 int32_t result = _values[idx];
13279 if (!_validationFunc(result)) {
13280 result = kGPBUnrecognizedEnumeratorValue;
13281 }
13282 *value = result;
13283 }
13284 return YES;
13285 }
13286 return NO;
13287 }
13288
13289 - (BOOL)valueForKey:(BOOL)key rawValue:(int32_t*)rawValue {
13290 int idx = (key ? 1 : 0);
13291 if (_valueSet[idx]) {
13292 if (rawValue) {
13293 *rawValue = _values[idx];
13294 }
13295 return YES;
13296 }
13297 return NO;
13298 }
13299
13300 - (void)enumerateKeysAndValuesUsingBlock:
13301 (void (^)(BOOL key, int32_t value, BOOL *stop))block {
13302 BOOL stop = NO;
13303 if (_valueSet[0]) {
13304 block(NO, _values[0], &stop);
13305 }
13306 if (!stop && _valueSet[1]) {
13307 block(YES, _values[1], &stop);
13308 }
13309 }
13310
13311 - (void)enumerateKeysAndRawValuesUsingBlock:
13312 (void (^)(BOOL key, int32_t rawValue, BOOL *stop))block {
13313 BOOL stop = NO;
13314 GPBEnumValidationFunc func = _validationFunc;
13315 int32_t validatedValue;
13316 if (_valueSet[0]) {
13317 validatedValue = _values[0];
13318 if (!func(validatedValue)) {
13319 validatedValue = kGPBUnrecognizedEnumeratorValue;
13320 }
13321 block(NO, validatedValue, &stop);
13322 }
13323 if (!stop && _valueSet[1]) {
13324 validatedValue = _values[1];
13325 if (!func(validatedValue)) {
13326 validatedValue = kGPBUnrecognizedEnumeratorValue;
13327 }
13328 block(YES, validatedValue, &stop);
13329 }
13330 }
13331
13332 //%PDDM-EXPAND SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool)
13333 // This block of code is generated, do not edit it directly.
13334
13335 - (NSData *)serializedDataForUnknownValue:(int32_t)value
13336 forKey:(GPBGenericValue *)key
13337 keyDataType:(GPBDataType)keyDataType {
13338 size_t msgSize = ComputeDictBoolFieldSize(key->valueBool, kMapKeyFieldNumber, keyDataType);
13339 msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEn um);
13340 NSMutableData *data = [NSMutableData dataWithLength:msgSize];
13341 GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithDat a:data];
13342 WriteDictBoolField(outputStream, key->valueBool, kMapKeyFieldNumber, keyDataTy pe);
13343 WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum) ;
13344 [outputStream release];
13345 return data;
13346 }
13347
13348 //%PDDM-EXPAND-END SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool)
13349
13350 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
13351 GPBDataType valueDataType = GPBGetFieldDataType(field);
13352 NSUInteger count = 0;
13353 size_t result = 0;
13354 for (int i = 0; i < 2; ++i) {
13355 if (_valueSet[i]) {
13356 ++count;
13357 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
13358 msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, val ueDataType);
13359 result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
13360 }
13361 }
13362 size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTyp eMessage);
13363 result += tagSize * count;
13364 return result;
13365 }
13366
13367 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
13368 asField:(GPBFieldDescriptor *)field {
13369 GPBDataType valueDataType = GPBGetFieldDataType(field);
13370 uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLength Delimited);
13371 for (int i = 0; i < 2; ++i) {
13372 if (_valueSet[i]) {
13373 // Write the tag.
13374 [outputStream writeInt32NoTag:tag];
13375 // Write the size of the message.
13376 size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GP BDataTypeBool);
13377 msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, val ueDataType);
13378 [outputStream writeInt32NoTag:(int32_t)msgSize];
13379 // Write the fields.
13380 WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataType Bool);
13381 WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueD ataType);
13382 }
13383 }
13384 }
13385
13386 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
13387 if (_valueSet[0]) {
13388 block(@"false", @(_values[0]));
13389 }
13390 if (_valueSet[1]) {
13391 block(@"true", @(_values[1]));
13392 }
13393 }
13394
13395 - (void)setGPBGenericValue:(GPBGenericValue *)value
13396 forGPBGenericValueKey:(GPBGenericValue *)key {
13397 int idx = (key->valueBool ? 1 : 0);
13398 _values[idx] = value->valueInt32;
13399 _valueSet[idx] = YES;
13400 }
13401
13402 - (void)addRawEntriesFromDictionary:(GPBBoolEnumDictionary *)otherDictionary {
13403 if (otherDictionary) {
13404 for (int i = 0; i < 2; ++i) {
13405 if (otherDictionary->_valueSet[i]) {
13406 _valueSet[i] = YES;
13407 _values[i] = otherDictionary->_values[i];
13408 }
13409 }
13410 if (_autocreator) {
13411 GPBAutocreatedDictionaryModified(_autocreator, self);
13412 }
13413 }
13414 }
13415
13416 - (void)setValue:(int32_t)value forKey:(BOOL)key {
13417 if (!_validationFunc(value)) {
13418 [NSException raise:NSInvalidArgumentException
13419 format:@"GPBBoolEnumDictionary: Attempt to set an unknown enum v alue (%d)",
13420 value];
13421 }
13422 int idx = (key ? 1 : 0);
13423 _values[idx] = value;
13424 _valueSet[idx] = YES;
13425 if (_autocreator) {
13426 GPBAutocreatedDictionaryModified(_autocreator, self);
13427 }
13428 }
13429
13430 - (void)setRawValue:(int32_t)rawValue forKey:(BOOL)key {
13431 int idx = (key ? 1 : 0);
13432 _values[idx] = rawValue;
13433 _valueSet[idx] = YES;
13434 if (_autocreator) {
13435 GPBAutocreatedDictionaryModified(_autocreator, self);
13436 }
13437 }
13438
13439 - (void)removeValueForKey:(BOOL)aKey {
13440 _valueSet[aKey ? 1 : 0] = NO;
13441 }
13442
13443 - (void)removeAll {
13444 _valueSet[0] = NO;
13445 _valueSet[1] = NO;
13446 }
13447
13448 @end
13449
13450 #pragma mark - NSDictionary Subclass
13451
13452 @implementation GPBAutocreatedDictionary {
13453 NSMutableDictionary *_dictionary;
13454 }
13455
13456 - (void)dealloc {
13457 NSAssert(!_autocreator,
13458 @"%@: Autocreator must be cleared before release, autocreator: %@",
13459 [self class], _autocreator);
13460 [_dictionary release];
13461 [super dealloc];
13462 }
13463
13464 #pragma mark Required NSDictionary overrides
13465
13466 - (instancetype)initWithObjects:(const id [])objects
13467 forKeys:(const id<NSCopying> [])keys
13468 count:(NSUInteger)count {
13469 self = [super init];
13470 if (self) {
13471 _dictionary = [[NSMutableDictionary alloc] initWithObjects:objects
13472 forKeys:keys
13473 count:count];
13474 }
13475 return self;
13476 }
13477
13478 - (NSUInteger)count {
13479 return [_dictionary count];
13480 }
13481
13482 - (id)objectForKey:(id)aKey {
13483 return [_dictionary objectForKey:aKey];
13484 }
13485
13486 - (NSEnumerator *)keyEnumerator {
13487 if (_dictionary == nil) {
13488 _dictionary = [[NSMutableDictionary alloc] init];
13489 }
13490 return [_dictionary keyEnumerator];
13491 }
13492
13493 #pragma mark Required NSMutableDictionary overrides
13494
13495 // Only need to call GPBAutocreatedDictionaryModified() when adding things
13496 // since we only autocreate empty dictionaries.
13497
13498 - (void)setObject:(id)anObject forKey:(id<NSCopying>)aKey {
13499 if (_dictionary == nil) {
13500 _dictionary = [[NSMutableDictionary alloc] init];
13501 }
13502 [_dictionary setObject:anObject forKey:aKey];
13503 if (_autocreator) {
13504 GPBAutocreatedDictionaryModified(_autocreator, self);
13505 }
13506 }
13507
13508 - (void)removeObjectForKey:(id)aKey {
13509 [_dictionary removeObjectForKey:aKey];
13510 }
13511
13512 #pragma mark Extra things hooked
13513
13514 - (id)copyWithZone:(NSZone *)zone {
13515 if (_dictionary == nil) {
13516 _dictionary = [[NSMutableDictionary alloc] init];
13517 }
13518 return [_dictionary copyWithZone:zone];
13519 }
13520
13521 - (id)mutableCopyWithZone:(NSZone *)zone {
13522 if (_dictionary == nil) {
13523 _dictionary = [[NSMutableDictionary alloc] init];
13524 }
13525 return [_dictionary mutableCopyWithZone:zone];
13526 }
13527
13528 - (id)objectForKeyedSubscript:(id)key {
13529 return [_dictionary objectForKeyedSubscript:key];
13530 }
13531
13532 - (void)setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key {
13533 if (_dictionary == nil) {
13534 _dictionary = [[NSMutableDictionary alloc] init];
13535 }
13536 [_dictionary setObject:obj forKeyedSubscript:key];
13537 if (_autocreator) {
13538 GPBAutocreatedDictionaryModified(_autocreator, self);
13539 }
13540 }
13541
13542 - (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key,
13543 id obj,
13544 BOOL *stop))block {
13545 [_dictionary enumerateKeysAndObjectsUsingBlock:block];
13546 }
13547
13548 - (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts
13549 usingBlock:(void (^)(id key,
13550 id obj,
13551 BOOL *stop))block {
13552 [_dictionary enumerateKeysAndObjectsWithOptions:opts usingBlock:block];
13553 }
13554
13555 @end
OLDNEW
« no previous file with comments | « third_party/protobuf/objectivec/GPBDictionary.h ('k') | third_party/protobuf/objectivec/GPBDictionary_PackagePrivate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698