Home | History | Annotate | Download | only in objectivec
      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_PackagePrivate.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_VERSION) \
     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_NAME1, GPBDATATYPE_NAME2)
     71 //%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t fieldNum, 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_NAME1, GPBDATATYPE_NAME2, GPBDATATYPE_NAME3)
     93 //%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t fieldNum, 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, uint32_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, GPBDataType 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, uint32_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, GPBDataType 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, uint32_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, GPBDataType 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, uint32_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, GPBDataType 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, uint32_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, GPBDataType 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, GPBDataType 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, uint32_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, GPBDataType 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, uint32_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, GPBDataType 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, uint32_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, GPBDataType 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, GPBDataType 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, GPBFieldDescriptor *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, mapValueType);
    331     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
    332   }];
    333   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
    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), GPBWireFormatLengthDelimited);
    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, mapValueType);
    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, GPBFieldDescriptor *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->state_);
    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(valueDataType, 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 needed
    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.valueEnum
    534                                                                forKey:&key
    535                                                           keyDataType:keyDataType];
    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, KHELPER)
    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, KHELPER)
    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, KHELPER, 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, OBJECT, object)
    575 
    576 //%PDDM-DEFINE DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_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] autorelease];
    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##VNAME$u##s:&##VNAME
    593 //%               KEY_NAME$S VALUE_NAME$S                        ##VNAME$S##  forKeys:&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 [])keys
    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##VNAME$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##Dictionary *)dictionary {
    608 //%  // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
    609 //%  // on to get the type correct.
    610 //%  return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWithDictionary: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(VNAME##s[i]) forKey:WRAPPED##KHELPER(keys[i])];
    630 //%      }
    631 //%    }
    632 //%  }
    633 //%  return self;
    634 //%}
    635 //%
    636 //%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary {
    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, KHELPER, VHELPER, VNAME, )
    652 //%
    653 //%VALUE_FOR_KEY_##VHELPER(KEY_TYPE##KisP$S##KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
    654 //%
    655 //%DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, 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 initWithValues:forKeys:count:
    691 //%  // on to get the type correct.
    692 //%  return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWithValidationFunction: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 [])rawValues
    700 //%                                         forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
    701 //%                                           count:(NSUInteger)count {
    702 //%  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
    703 //%  // on to get the type correct.
    704 //%  return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWithValidationFunction: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##Dictionary *)dictionary {
    711 //%  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
    712 //%  // on to get the type correct.
    713 //%  return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
    714 //%}
    715 //%
    716 //%+ (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
    717 //%                                        capacity:(NSUInteger)numItems {
    718 //%  return [[[self alloc] initWithValidationFunction:func capacity:numItems] autorelease];
    719 //%}
    720 //%
    721 //%- (instancetype)init {
    722 //%  return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0];
    723 //%}
    724 //%
    725 //%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func {
    726 //%  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
    727 //%}
    728 //%
    729 //%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
    730 //%                                 rawValues:(const VALUE_TYPE [])rawValues
    731 //%                                   forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
    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 setObject: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 *)dictionary {
    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 count:0];
    763 //%}
    764 //%
    765 //%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, 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 *)rawValue {
    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_TYPE)##aKey,
    791 //%                                                   ENUM_TYPE##VHELPER(VALUE_TYPE)##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, KHELPER, 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 set 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, VALUE_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] initWithDictionary: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, _dictionary];
    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_TYPE)##aKey,
    857 //%                                                   ENUM_TYPE##VHELPER(VALUE_TYPE)##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)computeSerializedSizeAsField:(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_TYPE)##aKey,
    873 //%                                                   ENUM_TYPE##VHELPER(VALUE_TYPE)##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), GPBDataTypeMessage);
    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), GPBWireFormatLengthDelimited);
    890 //%  [_dictionary enumerateKeysAndObjectsUsingBlock:^(ENUM_TYPE##KHELPER(KEY_TYPE)##aKey,
    891 //%                                                   ENUM_TYPE##VHELPER(VALUE_TYPE)##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), kMapKeyFieldNumber, 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)setGPBGenericValue:(GPBGenericValue *)value
    907 //%     forGPBGenericValueKey:(GPBGenericValue *)key {
    908 //%  [_dictionary setObject:WRAPPED##VHELPER(value->##GPBVALUE_##VHELPER(VALUE_NAME)##) 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, VALUE_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##KisP$S##KisP)key {
    928 //%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME, )##DICTIONARY_VALIDATE_KEY_##KHELPER(key, )  [_dictionary setObject:WRAPPED##VHELPER(VNAME) forKey:WRAPPED##KHELPER(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] autorelease];
    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 *)dictionary {
    983 //%  // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
    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] initWithDictionary: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->_values[0]))) ||
   1021 //%      (BOOL_DICT_W_HAS##HELPER(1, ) && (NEQ_##HELPER(_values[1], other->_values[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)computeSerializedSizeAsField:(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], kMapValueFieldNumber, valueDataType);
   1080 //%      result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   1081 //%    }
   1082 //%  }
   1083 //%  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapValueFieldNumber, valueDataType);
   1099 //%      [outputStream writeInt32NoTag:(int32_t)msgSize];
   1100 //%      // Write the fields.
   1101 //%      WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   1102 //%      WriteDict##VALUE_NAME##Field(outputStream, _values[i], kMapValueFieldNumber, 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, kMapKeyFieldNumber, keyDataType);
   1188 //%  msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
   1189 //%  NSMutableData *data = [NSMutableData dataWithLength:msgSize];
   1190 //%  GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
   1191 //%  WriteDict##KEY_NAME##Field(outputStream, key->value##KEY_NAME, kMapKeyFieldNumber, keyDataType);
   1192 //%  WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum);
   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 *)dictionary {
   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 *)otherDictionary {
   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 Dictionary"];
   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 *)dictionary {
   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 *)otherDictionary {
   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 initWithValues:forKeys:count:
   1525   // on to get the type correct.
   1526   return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithValues:&value
   1527                                                            forKeys:&key
   1528                                                              count:1] autorelease];
   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 initWithValues:forKeys:count:
   1535   // on to get the type correct.
   1536   return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithValues:values
   1537                                                            forKeys:keys
   1538                                                              count:count] autorelease];
   1539 }
   1540 
   1541 + (instancetype)dictionaryWithDictionary:(GPBUInt32UInt32Dictionary *)dictionary {
   1542   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   1543   // on to get the type correct.
   1544   return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   1642     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   1643     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   1644   }];
   1645   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   1663     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   1664     [outputStream writeInt32NoTag:(int32_t)msgSize];
   1665     // Write the fields.
   1666     WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
   1667     WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   1741   // on to get the type correct.
   1742   return [[(GPBUInt32Int32Dictionary*)[self alloc] initWithValues:values
   1743                                                           forKeys:keys
   1744                                                             count:count] autorelease];
   1745 }
   1746 
   1747 + (instancetype)dictionaryWithDictionary:(GPBUInt32Int32Dictionary *)dictionary {
   1748   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   1848     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   1849     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   1850   }];
   1851   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   1869     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   1870     [outputStream writeInt32NoTag:(int32_t)msgSize];
   1871     // Write the fields.
   1872     WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
   1873     WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
   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 *stop) {
   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 initWithValues:forKeys:count:
   1937   // on to get the type correct.
   1938   return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithValues:&value
   1939                                                            forKeys:&key
   1940                                                              count:1] autorelease];
   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 initWithValues:forKeys:count:
   1947   // on to get the type correct.
   1948   return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithValues:values
   1949                                                            forKeys:keys
   1950                                                              count:count] autorelease];
   1951 }
   1952 
   1953 + (instancetype)dictionaryWithDictionary:(GPBUInt32UInt64Dictionary *)dictionary {
   1954   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   1955   // on to get the type correct.
   1956   return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   2054     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   2055     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   2056   }];
   2057   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   2075     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   2076     [outputStream writeInt32NoTag:(int32_t)msgSize];
   2077     // Write the fields.
   2078     WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
   2079     WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   2153   // on to get the type correct.
   2154   return [[(GPBUInt32Int64Dictionary*)[self alloc] initWithValues:values
   2155                                                           forKeys:keys
   2156                                                             count:count] autorelease];
   2157 }
   2158 
   2159 + (instancetype)dictionaryWithDictionary:(GPBUInt32Int64Dictionary *)dictionary {
   2160   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   2260     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   2261     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   2262   }];
   2263   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   2281     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   2282     [outputStream writeInt32NoTag:(int32_t)msgSize];
   2283     // Write the fields.
   2284     WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
   2285     WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   2359   // on to get the type correct.
   2360   return [[(GPBUInt32BoolDictionary*)[self alloc] initWithValues:values
   2361                                                          forKeys:keys
   2362                                                            count:count] autorelease];
   2363 }
   2364 
   2365 + (instancetype)dictionaryWithDictionary:(GPBUInt32BoolDictionary *)dictionary {
   2366   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   2466     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
   2467     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   2468   }];
   2469   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   2487     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
   2488     [outputStream writeInt32NoTag:(int32_t)msgSize];
   2489     // Write the fields.
   2490     WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
   2491     WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   2565   // on to get the type correct.
   2566   return [[(GPBUInt32FloatDictionary*)[self alloc] initWithValues:values
   2567                                                           forKeys:keys
   2568                                                             count:count] autorelease];
   2569 }
   2570 
   2571 + (instancetype)dictionaryWithDictionary:(GPBUInt32FloatDictionary *)dictionary {
   2572   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   2672     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
   2673     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   2674   }];
   2675   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   2693     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
   2694     [outputStream writeInt32NoTag:(int32_t)msgSize];
   2695     // Write the fields.
   2696     WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, 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 initWithValues:forKeys:count:
   2761   // on to get the type correct.
   2762   return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithValues:&value
   2763                                                            forKeys:&key
   2764                                                              count:1] autorelease];
   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 initWithValues:forKeys:count:
   2771   // on to get the type correct.
   2772   return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithValues:values
   2773                                                            forKeys:keys
   2774                                                              count:count] autorelease];
   2775 }
   2776 
   2777 + (instancetype)dictionaryWithDictionary:(GPBUInt32DoubleDictionary *)dictionary {
   2778   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   2779   // on to get the type correct.
   2780   return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   2878     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   2879     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   2880   }];
   2881   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   2899     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   2900     [outputStream writeInt32NoTag:(int32_t)msgSize];
   2901     // Write the fields.
   2902     WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
   2903     WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues:forKeys:count:
   2981   // on to get the type correct.
   2982   return [[(GPBUInt32EnumDictionary*)[self alloc] initWithValidationFunction:func
   2983                                                                    rawValues:&rawValue
   2984                                                                      forKeys:&key
   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 initWithValues:forKeys:count:
   2993   // on to get the type correct.
   2994   return [[(GPBUInt32EnumDictionary*)[self alloc] initWithValidationFunction:func
   2995                                                                    rawValues:rawValues
   2996                                                                      forKeys:keys
   2997                                                                        count:count] autorelease];
   2998 }
   2999 
   3000 + (instancetype)dictionaryWithDictionary:(GPBUInt32EnumDictionary *)dictionary {
   3001   // Cast is needed so the compiler knows what class we are invoking initWithValues: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] autorelease];
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   3112     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   3113     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   3114   }];
   3115   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   3133     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   3134     [outputStream writeInt32NoTag:(int32_t)msgSize];
   3135     // Write the fields.
   3136     WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
   3137     WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
   3138   }];
   3139 }
   3140 
   3141 - (NSData *)serializedDataForUnknownValue:(int32_t)value
   3142                                    forKey:(GPBGenericValue *)key
   3143                               keyDataType:(GPBDataType)keyDataType {
   3144   size_t msgSize = ComputeDictUInt32FieldSize(key->valueUInt32, kMapKeyFieldNumber, keyDataType);
   3145   msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
   3146   NSMutableData *data = [NSMutableData dataWithLength:msgSize];
   3147   GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
   3148   WriteDictUInt32Field(outputStream, key->valueUInt32, kMapKeyFieldNumber, keyDataType);
   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 initWithObjects:forKeys:count:
   3252   // on to get the type correct.
   3253   return [[(GPBUInt32ObjectDictionary*)[self alloc] initWithObjects:&object
   3254                                                             forKeys:&key
   3255                                                               count:1] autorelease];
   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 initWithObjects:forKeys:count:
   3262   // on to get the type correct.
   3263   return [[(GPBUInt32ObjectDictionary*)[self alloc] initWithObjects:objects
   3264                                                            forKeys:keys
   3265                                                              count:count] autorelease];
   3266 }
   3267 
   3268 + (instancetype)dictionaryWithDictionary:(GPBUInt32ObjectDictionary *)dictionary {
   3269   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   3270   // on to get the type correct.
   3271   return [[(GPBUInt32ObjectDictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   3396     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
   3397     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   3398   }];
   3399   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   3417     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
   3418     [outputStream writeInt32NoTag:(int32_t)msgSize];
   3419     // Write the fields.
   3420     WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
   3421     WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   3499   // on to get the type correct.
   3500   return [[(GPBInt32UInt32Dictionary*)[self alloc] initWithValues:values
   3501                                                           forKeys:keys
   3502                                                             count:count] autorelease];
   3503 }
   3504 
   3505 + (instancetype)dictionaryWithDictionary:(GPBInt32UInt32Dictionary *)dictionary {
   3506   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   3606     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   3607     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   3608   }];
   3609   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   3627     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   3628     [outputStream writeInt32NoTag:(int32_t)msgSize];
   3629     // Write the fields.
   3630     WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
   3631     WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   3705   // on to get the type correct.
   3706   return [[(GPBInt32Int32Dictionary*)[self alloc] initWithValues:values
   3707                                                          forKeys:keys
   3708                                                            count:count] autorelease];
   3709 }
   3710 
   3711 + (instancetype)dictionaryWithDictionary:(GPBInt32Int32Dictionary *)dictionary {
   3712   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   3812     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   3813     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   3814   }];
   3815   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   3833     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   3834     [outputStream writeInt32NoTag:(int32_t)msgSize];
   3835     // Write the fields.
   3836     WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
   3837     WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
   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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   3911   // on to get the type correct.
   3912   return [[(GPBInt32UInt64Dictionary*)[self alloc] initWithValues:values
   3913                                                           forKeys:keys
   3914                                                             count:count] autorelease];
   3915 }
   3916 
   3917 + (instancetype)dictionaryWithDictionary:(GPBInt32UInt64Dictionary *)dictionary {
   3918   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   4018     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   4019     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   4020   }];
   4021   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   4039     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   4040     [outputStream writeInt32NoTag:(int32_t)msgSize];
   4041     // Write the fields.
   4042     WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
   4043     WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   4117   // on to get the type correct.
   4118   return [[(GPBInt32Int64Dictionary*)[self alloc] initWithValues:values
   4119                                                          forKeys:keys
   4120                                                            count:count] autorelease];
   4121 }
   4122 
   4123 + (instancetype)dictionaryWithDictionary:(GPBInt32Int64Dictionary *)dictionary {
   4124   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   4224     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   4225     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   4226   }];
   4227   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   4245     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   4246     [outputStream writeInt32NoTag:(int32_t)msgSize];
   4247     // Write the fields.
   4248     WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
   4249     WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   4323   // on to get the type correct.
   4324   return [[(GPBInt32BoolDictionary*)[self alloc] initWithValues:values
   4325                                                         forKeys:keys
   4326                                                           count:count] autorelease];
   4327 }
   4328 
   4329 + (instancetype)dictionaryWithDictionary:(GPBInt32BoolDictionary *)dictionary {
   4330   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   4430     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
   4431     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   4432   }];
   4433   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   4451     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
   4452     [outputStream writeInt32NoTag:(int32_t)msgSize];
   4453     // Write the fields.
   4454     WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
   4455     WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   4529   // on to get the type correct.
   4530   return [[(GPBInt32FloatDictionary*)[self alloc] initWithValues:values
   4531                                                          forKeys:keys
   4532                                                            count:count] autorelease];
   4533 }
   4534 
   4535 + (instancetype)dictionaryWithDictionary:(GPBInt32FloatDictionary *)dictionary {
   4536   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   4636     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
   4637     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   4638   }];
   4639   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   4657     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
   4658     [outputStream writeInt32NoTag:(int32_t)msgSize];
   4659     // Write the fields.
   4660     WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   4735   // on to get the type correct.
   4736   return [[(GPBInt32DoubleDictionary*)[self alloc] initWithValues:values
   4737                                                           forKeys:keys
   4738                                                             count:count] autorelease];
   4739 }
   4740 
   4741 + (instancetype)dictionaryWithDictionary:(GPBInt32DoubleDictionary *)dictionary {
   4742   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   4842     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   4843     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   4844   }];
   4845   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   4863     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   4864     [outputStream writeInt32NoTag:(int32_t)msgSize];
   4865     // Write the fields.
   4866     WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
   4867     WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, 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 initWithValues:forKeys:count:
   4945   // on to get the type correct.
   4946   return [[(GPBInt32EnumDictionary*)[self alloc] initWithValidationFunction:func
   4947                                                                   rawValues:&rawValue
   4948                                                                     forKeys:&key
   4949                                                                       count:1] autorelease];
   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 initWithValues:forKeys:count:
   4957   // on to get the type correct.
   4958   return [[(GPBInt32EnumDictionary*)[self alloc] initWithValidationFunction:func
   4959                                                                   rawValues:rawValues
   4960                                                                     forKeys:keys
   4961                                                                       count:count] autorelease];
   4962 }
   4963 
   4964 + (instancetype)dictionaryWithDictionary:(GPBInt32EnumDictionary *)dictionary {
   4965   // Cast is needed so the compiler knows what class we are invoking initWithValues: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] autorelease];
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   5076     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   5077     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   5078   }];
   5079   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   5097     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   5098     [outputStream writeInt32NoTag:(int32_t)msgSize];
   5099     // Write the fields.
   5100     WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
   5101     WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
   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, GPBDataTypeEnum);
   5110   NSMutableData *data = [NSMutableData dataWithLength:msgSize];
   5111   GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
   5112   WriteDictInt32Field(outputStream, key->valueInt32, kMapKeyFieldNumber, keyDataType);
   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 initWithObjects:forKeys:count:
   5216   // on to get the type correct.
   5217   return [[(GPBInt32ObjectDictionary*)[self alloc] initWithObjects:&object
   5218                                                            forKeys:&key
   5219                                                              count:1] autorelease];
   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 initWithObjects:forKeys:count:
   5226   // on to get the type correct.
   5227   return [[(GPBInt32ObjectDictionary*)[self alloc] initWithObjects:objects
   5228                                                           forKeys:keys
   5229                                                             count:count] autorelease];
   5230 }
   5231 
   5232 + (instancetype)dictionaryWithDictionary:(GPBInt32ObjectDictionary *)dictionary {
   5233   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   5360     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
   5361     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   5362   }];
   5363   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   5381     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
   5382     [outputStream writeInt32NoTag:(int32_t)msgSize];
   5383     // Write the fields.
   5384     WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
   5385     WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataType);
   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 initWithValues:forKeys:count:
   5453   // on to get the type correct.
   5454   return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithValues:&value
   5455                                                            forKeys:&key
   5456                                                              count:1] autorelease];
   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 initWithValues:forKeys:count:
   5463   // on to get the type correct.
   5464   return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithValues:values
   5465                                                            forKeys:keys
   5466                                                              count:count] autorelease];
   5467 }
   5468 
   5469 + (instancetype)dictionaryWithDictionary:(GPBUInt64UInt32Dictionary *)dictionary {
   5470   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   5471   // on to get the type correct.
   5472   return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   5570     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   5571     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   5572   }];
   5573   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   5591     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   5592     [outputStream writeInt32NoTag:(int32_t)msgSize];
   5593     // Write the fields.
   5594     WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
   5595     WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   5669   // on to get the type correct.
   5670   return [[(GPBUInt64Int32Dictionary*)[self alloc] initWithValues:values
   5671                                                           forKeys:keys
   5672                                                             count:count] autorelease];
   5673 }
   5674 
   5675 + (instancetype)dictionaryWithDictionary:(GPBUInt64Int32Dictionary *)dictionary {
   5676   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   5776     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   5777     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   5778   }];
   5779   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   5797     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   5798     [outputStream writeInt32NoTag:(int32_t)msgSize];
   5799     // Write the fields.
   5800     WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
   5801     WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
   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 *stop) {
   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 initWithValues:forKeys:count:
   5865   // on to get the type correct.
   5866   return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithValues:&value
   5867                                                            forKeys:&key
   5868                                                              count:1] autorelease];
   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 initWithValues:forKeys:count:
   5875   // on to get the type correct.
   5876   return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithValues:values
   5877                                                            forKeys:keys
   5878                                                              count:count] autorelease];
   5879 }
   5880 
   5881 + (instancetype)dictionaryWithDictionary:(GPBUInt64UInt64Dictionary *)dictionary {
   5882   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   5883   // on to get the type correct.
   5884   return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   5982     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   5983     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   5984   }];
   5985   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   6003     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   6004     [outputStream writeInt32NoTag:(int32_t)msgSize];
   6005     // Write the fields.
   6006     WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
   6007     WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   6081   // on to get the type correct.
   6082   return [[(GPBUInt64Int64Dictionary*)[self alloc] initWithValues:values
   6083                                                           forKeys:keys
   6084                                                             count:count] autorelease];
   6085 }
   6086 
   6087 + (instancetype)dictionaryWithDictionary:(GPBUInt64Int64Dictionary *)dictionary {
   6088   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   6188     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   6189     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   6190   }];
   6191   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   6209     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   6210     [outputStream writeInt32NoTag:(int32_t)msgSize];
   6211     // Write the fields.
   6212     WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
   6213     WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   6287   // on to get the type correct.
   6288   return [[(GPBUInt64BoolDictionary*)[self alloc] initWithValues:values
   6289                                                          forKeys:keys
   6290                                                            count:count] autorelease];
   6291 }
   6292 
   6293 + (instancetype)dictionaryWithDictionary:(GPBUInt64BoolDictionary *)dictionary {
   6294   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   6394     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
   6395     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   6396   }];
   6397   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   6415     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
   6416     [outputStream writeInt32NoTag:(int32_t)msgSize];
   6417     // Write the fields.
   6418     WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
   6419     WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   6493   // on to get the type correct.
   6494   return [[(GPBUInt64FloatDictionary*)[self alloc] initWithValues:values
   6495                                                           forKeys:keys
   6496                                                             count:count] autorelease];
   6497 }
   6498 
   6499 + (instancetype)dictionaryWithDictionary:(GPBUInt64FloatDictionary *)dictionary {
   6500   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   6600     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
   6601     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   6602   }];
   6603   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   6621     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
   6622     [outputStream writeInt32NoTag:(int32_t)msgSize];
   6623     // Write the fields.
   6624     WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, 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 initWithValues:forKeys:count:
   6689   // on to get the type correct.
   6690   return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithValues:&value
   6691                                                            forKeys:&key
   6692                                                              count:1] autorelease];
   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 initWithValues:forKeys:count:
   6699   // on to get the type correct.
   6700   return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithValues:values
   6701                                                            forKeys:keys
   6702                                                              count:count] autorelease];
   6703 }
   6704 
   6705 + (instancetype)dictionaryWithDictionary:(GPBUInt64DoubleDictionary *)dictionary {
   6706   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   6707   // on to get the type correct.
   6708   return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   6806     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   6807     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   6808   }];
   6809   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   6827     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   6828     [outputStream writeInt32NoTag:(int32_t)msgSize];
   6829     // Write the fields.
   6830     WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
   6831     WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues:forKeys:count:
   6909   // on to get the type correct.
   6910   return [[(GPBUInt64EnumDictionary*)[self alloc] initWithValidationFunction:func
   6911                                                                    rawValues:&rawValue
   6912                                                                      forKeys:&key
   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 initWithValues:forKeys:count:
   6921   // on to get the type correct.
   6922   return [[(GPBUInt64EnumDictionary*)[self alloc] initWithValidationFunction:func
   6923                                                                    rawValues:rawValues
   6924                                                                      forKeys:keys
   6925                                                                        count:count] autorelease];
   6926 }
   6927 
   6928 + (instancetype)dictionaryWithDictionary:(GPBUInt64EnumDictionary *)dictionary {
   6929   // Cast is needed so the compiler knows what class we are invoking initWithValues: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] autorelease];
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   7040     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   7041     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   7042   }];
   7043   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   7061     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   7062     [outputStream writeInt32NoTag:(int32_t)msgSize];
   7063     // Write the fields.
   7064     WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
   7065     WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
   7066   }];
   7067 }
   7068 
   7069 - (NSData *)serializedDataForUnknownValue:(int32_t)value
   7070                                    forKey:(GPBGenericValue *)key
   7071                               keyDataType:(GPBDataType)keyDataType {
   7072   size_t msgSize = ComputeDictUInt64FieldSize(key->valueUInt64, kMapKeyFieldNumber, keyDataType);
   7073   msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
   7074   NSMutableData *data = [NSMutableData dataWithLength:msgSize];
   7075   GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
   7076   WriteDictUInt64Field(outputStream, key->valueUInt64, kMapKeyFieldNumber, keyDataType);
   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 initWithObjects:forKeys:count:
   7180   // on to get the type correct.
   7181   return [[(GPBUInt64ObjectDictionary*)[self alloc] initWithObjects:&object
   7182                                                             forKeys:&key
   7183                                                               count:1] autorelease];
   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 initWithObjects:forKeys:count:
   7190   // on to get the type correct.
   7191   return [[(GPBUInt64ObjectDictionary*)[self alloc] initWithObjects:objects
   7192                                                            forKeys:keys
   7193                                                              count:count] autorelease];
   7194 }
   7195 
   7196 + (instancetype)dictionaryWithDictionary:(GPBUInt64ObjectDictionary *)dictionary {
   7197   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   7198   // on to get the type correct.
   7199   return [[(GPBUInt64ObjectDictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   7324     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
   7325     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   7326   }];
   7327   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   7345     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
   7346     [outputStream writeInt32NoTag:(int32_t)msgSize];
   7347     // Write the fields.
   7348     WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
   7349     WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   7427   // on to get the type correct.
   7428   return [[(GPBInt64UInt32Dictionary*)[self alloc] initWithValues:values
   7429                                                           forKeys:keys
   7430                                                             count:count] autorelease];
   7431 }
   7432 
   7433 + (instancetype)dictionaryWithDictionary:(GPBInt64UInt32Dictionary *)dictionary {
   7434   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   7534     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   7535     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   7536   }];
   7537   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   7555     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   7556     [outputStream writeInt32NoTag:(int32_t)msgSize];
   7557     // Write the fields.
   7558     WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
   7559     WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   7633   // on to get the type correct.
   7634   return [[(GPBInt64Int32Dictionary*)[self alloc] initWithValues:values
   7635                                                          forKeys:keys
   7636                                                            count:count] autorelease];
   7637 }
   7638 
   7639 + (instancetype)dictionaryWithDictionary:(GPBInt64Int32Dictionary *)dictionary {
   7640   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   7740     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   7741     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   7742   }];
   7743   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, 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, valueDataType);
   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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   7839   // on to get the type correct.
   7840   return [[(GPBInt64UInt64Dictionary*)[self alloc] initWithValues:values
   7841                                                           forKeys:keys
   7842                                                             count:count] autorelease];
   7843 }
   7844 
   7845 + (instancetype)dictionaryWithDictionary:(GPBInt64UInt64Dictionary *)dictionary {
   7846   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   7946     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   7947     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   7948   }];
   7949   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   7967     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   7968     [outputStream writeInt32NoTag:(int32_t)msgSize];
   7969     // Write the fields.
   7970     WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
   7971     WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   8045   // on to get the type correct.
   8046   return [[(GPBInt64Int64Dictionary*)[self alloc] initWithValues:values
   8047                                                          forKeys:keys
   8048                                                            count:count] autorelease];
   8049 }
   8050 
   8051 + (instancetype)dictionaryWithDictionary:(GPBInt64Int64Dictionary *)dictionary {
   8052   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   8152     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   8153     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   8154   }];
   8155   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   8173     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   8174     [outputStream writeInt32NoTag:(int32_t)msgSize];
   8175     // Write the fields.
   8176     WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
   8177     WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   8251   // on to get the type correct.
   8252   return [[(GPBInt64BoolDictionary*)[self alloc] initWithValues:values
   8253                                                         forKeys:keys
   8254                                                           count:count] autorelease];
   8255 }
   8256 
   8257 + (instancetype)dictionaryWithDictionary:(GPBInt64BoolDictionary *)dictionary {
   8258   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   8358     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
   8359     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   8360   }];
   8361   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, 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, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   8457   // on to get the type correct.
   8458   return [[(GPBInt64FloatDictionary*)[self alloc] initWithValues:values
   8459                                                          forKeys:keys
   8460                                                            count:count] autorelease];
   8461 }
   8462 
   8463 + (instancetype)dictionaryWithDictionary:(GPBInt64FloatDictionary *)dictionary {
   8464   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   8564     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
   8565     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   8566   }];
   8567   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   8585     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, 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 initWithValues: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 initWithValues:forKeys:count:
   8663   // on to get the type correct.
   8664   return [[(GPBInt64DoubleDictionary*)[self alloc] initWithValues:values
   8665                                                           forKeys:keys
   8666                                                             count:count] autorelease];
   8667 }
   8668 
   8669 + (instancetype)dictionaryWithDictionary:(GPBInt64DoubleDictionary *)dictionary {
   8670   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   8770     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   8771     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   8772   }];
   8773   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   8791     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   8792     [outputStream writeInt32NoTag:(int32_t)msgSize];
   8793     // Write the fields.
   8794     WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
   8795     WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, 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 initWithValues:forKeys:count:
   8873   // on to get the type correct.
   8874   return [[(GPBInt64EnumDictionary*)[self alloc] initWithValidationFunction:func
   8875                                                                   rawValues:&rawValue
   8876                                                                     forKeys:&key
   8877                                                                       count:1] autorelease];
   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 initWithValues:forKeys:count:
   8885   // on to get the type correct.
   8886   return [[(GPBInt64EnumDictionary*)[self alloc] initWithValidationFunction:func
   8887                                                                   rawValues:rawValues
   8888                                                                     forKeys:keys
   8889                                                                       count:count] autorelease];
   8890 }
   8891 
   8892 + (instancetype)dictionaryWithDictionary:(GPBInt64EnumDictionary *)dictionary {
   8893   // Cast is needed so the compiler knows what class we are invoking initWithValues: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] autorelease];
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   9004     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   9005     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   9006   }];
   9007   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, 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, valueDataType);
   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, GPBDataTypeEnum);
   9038   NSMutableData *data = [NSMutableData dataWithLength:msgSize];
   9039   GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
   9040   WriteDictInt64Field(outputStream, key->valueInt64, kMapKeyFieldNumber, keyDataType);
   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 initWithObjects:forKeys:count:
   9144   // on to get the type correct.
   9145   return [[(GPBInt64ObjectDictionary*)[self alloc] initWithObjects:&object
   9146                                                            forKeys:&key
   9147                                                              count:1] autorelease];
   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 initWithObjects:forKeys:count:
   9154   // on to get the type correct.
   9155   return [[(GPBInt64ObjectDictionary*)[self alloc] initWithObjects:objects
   9156                                                           forKeys:keys
   9157                                                             count:count] autorelease];
   9158 }
   9159 
   9160 + (instancetype)dictionaryWithDictionary:(GPBInt64ObjectDictionary *)dictionary {
   9161   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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], kMapKeyFieldNumber, keyDataType);
   9288     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
   9289     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   9290   }];
   9291   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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], kMapKeyFieldNumber, keyDataType);
   9309     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
   9310     [outputStream writeInt32NoTag:(int32_t)msgSize];
   9311     // Write the fields.
   9312     WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
   9313     WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataType);
   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 initWithValues:forKeys:count:
   9381   // on to get the type correct.
   9382   return [[(GPBStringUInt32Dictionary*)[self alloc] initWithValues:&value
   9383                                                            forKeys:&key
   9384                                                              count:1] autorelease];
   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 initWithValues:forKeys:count:
   9391   // on to get the type correct.
   9392   return [[(GPBStringUInt32Dictionary*)[self alloc] initWithValues:values
   9393                                                            forKeys:keys
   9394                                                              count:count] autorelease];
   9395 }
   9396 
   9397 + (instancetype)dictionaryWithDictionary:(GPBStringUInt32Dictionary *)dictionary {
   9398   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   9399   // on to get the type correct.
   9400   return [[(GPBStringUInt32Dictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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, keyDataType);
   9502     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   9503     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   9504   }];
   9505   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, keyDataType);
   9523     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
   9524     [outputStream writeInt32NoTag:(int32_t)msgSize];
   9525     // Write the fields.
   9526     WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
   9527     WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, 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 initWithValues: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 initWithValues:forKeys:count:
   9605   // on to get the type correct.
   9606   return [[(GPBStringInt32Dictionary*)[self alloc] initWithValues:values
   9607                                                           forKeys:keys
   9608                                                             count:count] autorelease];
   9609 }
   9610 
   9611 + (instancetype)dictionaryWithDictionary:(GPBStringInt32Dictionary *)dictionary {
   9612   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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, keyDataType);
   9716     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   9717     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   9718   }];
   9719   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, keyDataType);
   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, valueDataType);
   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 *stop) {
   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 initWithValues:forKeys:count:
   9809   // on to get the type correct.
   9810   return [[(GPBStringUInt64Dictionary*)[self alloc] initWithValues:&value
   9811                                                            forKeys:&key
   9812                                                              count:1] autorelease];
   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 initWithValues:forKeys:count:
   9819   // on to get the type correct.
   9820   return [[(GPBStringUInt64Dictionary*)[self alloc] initWithValues:values
   9821                                                            forKeys:keys
   9822                                                              count:count] autorelease];
   9823 }
   9824 
   9825 + (instancetype)dictionaryWithDictionary:(GPBStringUInt64Dictionary *)dictionary {
   9826   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   9827   // on to get the type correct.
   9828   return [[(GPBStringUInt64Dictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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, keyDataType);
   9930     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   9931     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   9932   }];
   9933   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, keyDataType);
   9951     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
   9952     [outputStream writeInt32NoTag:(int32_t)msgSize];
   9953     // Write the fields.
   9954     WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
   9955     WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, 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 initWithValues: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 initWithValues:forKeys:count:
   10033   // on to get the type correct.
   10034   return [[(GPBStringInt64Dictionary*)[self alloc] initWithValues:values
   10035                                                           forKeys:keys
   10036                                                             count:count] autorelease];
   10037 }
   10038 
   10039 + (instancetype)dictionaryWithDictionary:(GPBStringInt64Dictionary *)dictionary {
   10040   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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, keyDataType);
   10144     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   10145     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   10146   }];
   10147   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, keyDataType);
   10165     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
   10166     [outputStream writeInt32NoTag:(int32_t)msgSize];
   10167     // Write the fields.
   10168     WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
   10169     WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues: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 initWithValues:forKeys:count:
   10247   // on to get the type correct.
   10248   return [[(GPBStringBoolDictionary*)[self alloc] initWithValues:values
   10249                                                          forKeys:keys
   10250                                                            count:count] autorelease];
   10251 }
   10252 
   10253 + (instancetype)dictionaryWithDictionary:(GPBStringBoolDictionary *)dictionary {
   10254   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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, keyDataType);
   10358     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
   10359     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   10360   }];
   10361   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, keyDataType);
   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, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   10461   // on to get the type correct.
   10462   return [[(GPBStringFloatDictionary*)[self alloc] initWithValues:values
   10463                                                           forKeys:keys
   10464                                                             count:count] autorelease];
   10465 }
   10466 
   10467 + (instancetype)dictionaryWithDictionary:(GPBStringFloatDictionary *)dictionary {
   10468   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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, _dictionary];
   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, keyDataType);
   10572     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
   10573     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   10574   }];
   10575   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, keyDataType);
   10593     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues:forKeys:count:
   10665   // on to get the type correct.
   10666   return [[(GPBStringDoubleDictionary*)[self alloc] initWithValues:&value
   10667                                                            forKeys:&key
   10668                                                              count:1] autorelease];
   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 initWithValues:forKeys:count:
   10675   // on to get the type correct.
   10676   return [[(GPBStringDoubleDictionary*)[self alloc] initWithValues:values
   10677                                                            forKeys:keys
   10678                                                              count:count] autorelease];
   10679 }
   10680 
   10681 + (instancetype)dictionaryWithDictionary:(GPBStringDoubleDictionary *)dictionary {
   10682   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   10683   // on to get the type correct.
   10684   return [[(GPBStringDoubleDictionary*)[self alloc] initWithDictionary:dictionary] 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, _dictionary];
   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, keyDataType);
   10786     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   10787     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   10788   }];
   10789   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, keyDataType);
   10807     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
   10808     [outputStream writeInt32NoTag:(int32_t)msgSize];
   10809     // Write the fields.
   10810     WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
   10811     WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, 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 *stop) {
   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 initWithValues:forKeys:count:
   10893   // on to get the type correct.
   10894   return [[(GPBStringEnumDictionary*)[self alloc] initWithValidationFunction:func
   10895                                                                    rawValues:&rawValue
   10896                                                                      forKeys:&key
   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 initWithValues:forKeys:count:
   10905   // on to get the type correct.
   10906   return [[(GPBStringEnumDictionary*)[self alloc] initWithValidationFunction:func
   10907                                                                    rawValues:rawValues
   10908                                                                      forKeys:keys
   10909                                                                        count:count] autorelease];
   10910 }
   10911 
   10912 + (instancetype)dictionaryWithDictionary:(GPBStringEnumDictionary *)dictionary {
   10913   // Cast is needed so the compiler knows what class we are invoking initWithValues: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] autorelease];
   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, _dictionary];
   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, keyDataType);
   11028     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
   11029     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   11030   }];
   11031   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, keyDataType);
   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, valueDataType);
   11054   }];
   11055 }
   11056 
   11057 - (NSData *)serializedDataForUnknownValue:(int32_t)value
   11058                                    forKey:(GPBGenericValue *)key
   11059                               keyDataType:(GPBDataType)keyDataType {
   11060   size_t msgSize = ComputeDictStringFieldSize(key->valueString, kMapKeyFieldNumber, keyDataType);
   11061   msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum);
   11062   NSMutableData *data = [NSMutableData dataWithLength:msgSize];
   11063   GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
   11064   WriteDictStringField(outputStream, key->valueString, kMapKeyFieldNumber, keyDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   11193   // on to get the type correct.
   11194   return [[(GPBBoolUInt32Dictionary*)[self alloc] initWithValues:values
   11195                                                          forKeys:keys
   11196                                                            count:count] autorelease];
   11197 }
   11198 
   11199 + (instancetype)dictionaryWithDictionary:(GPBBoolUInt32Dictionary *)dictionary {
   11200   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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> {", [self 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, GPBDataTypeBool);
   11344       msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   11345       result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   11346     }
   11347   }
   11348   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, GPBDataTypeBool);
   11363       msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   11364       [outputStream writeInt32NoTag:(int32_t)msgSize];
   11365       // Write the fields.
   11366       WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   11367       WriteDictUInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   11434   // on to get the type correct.
   11435   return [[(GPBBoolInt32Dictionary*)[self alloc] initWithValues:values
   11436                                                         forKeys:keys
   11437                                                           count:count] autorelease];
   11438 }
   11439 
   11440 + (instancetype)dictionaryWithDictionary:(GPBBoolInt32Dictionary *)dictionary {
   11441   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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> {", [self 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, GPBDataTypeBool);
   11585       msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   11586       result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   11587     }
   11588   }
   11589   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, GPBDataTypeBool);
   11604       msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   11605       [outputStream writeInt32NoTag:(int32_t)msgSize];
   11606       // Write the fields.
   11607       WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   11608       WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   11675   // on to get the type correct.
   11676   return [[(GPBBoolUInt64Dictionary*)[self alloc] initWithValues:values
   11677                                                          forKeys:keys
   11678                                                            count:count] autorelease];
   11679 }
   11680 
   11681 + (instancetype)dictionaryWithDictionary:(GPBBoolUInt64Dictionary *)dictionary {
   11682   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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> {", [self 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, GPBDataTypeBool);
   11826       msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   11827       result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   11828     }
   11829   }
   11830   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, GPBDataTypeBool);
   11845       msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   11846       [outputStream writeInt32NoTag:(int32_t)msgSize];
   11847       // Write the fields.
   11848       WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   11849       WriteDictUInt64Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   11916   // on to get the type correct.
   11917   return [[(GPBBoolInt64Dictionary*)[self alloc] initWithValues:values
   11918                                                         forKeys:keys
   11919                                                           count:count] autorelease];
   11920 }
   11921 
   11922 + (instancetype)dictionaryWithDictionary:(GPBBoolInt64Dictionary *)dictionary {
   11923   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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> {", [self 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, GPBDataTypeBool);
   12067       msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   12068       result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   12069     }
   12070   }
   12071   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, GPBDataTypeBool);
   12086       msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   12087       [outputStream writeInt32NoTag:(int32_t)msgSize];
   12088       // Write the fields.
   12089       WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   12090       WriteDictInt64Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   12157   // on to get the type correct.
   12158   return [[(GPBBoolBoolDictionary*)[self alloc] initWithValues:values
   12159                                                        forKeys:keys
   12160                                                          count:count] autorelease];
   12161 }
   12162 
   12163 + (instancetype)dictionaryWithDictionary:(GPBBoolBoolDictionary *)dictionary {
   12164   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   12165   // on to get the type correct.
   12166   return [[(GPBBoolBoolDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
   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> {", [self 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, GPBDataTypeBool);
   12308       msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   12309       result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   12310     }
   12311   }
   12312   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, GPBDataTypeBool);
   12327       msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   12328       [outputStream writeInt32NoTag:(int32_t)msgSize];
   12329       // Write the fields.
   12330       WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   12331       WriteDictBoolField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   12398   // on to get the type correct.
   12399   return [[(GPBBoolFloatDictionary*)[self alloc] initWithValues:values
   12400                                                         forKeys:keys
   12401                                                           count:count] autorelease];
   12402 }
   12403 
   12404 + (instancetype)dictionaryWithDictionary:(GPBBoolFloatDictionary *)dictionary {
   12405   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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> {", [self 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, GPBDataTypeBool);
   12549       msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   12550       result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   12551     }
   12552   }
   12553   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, GPBDataTypeBool);
   12568       msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   12569       [outputStream writeInt32NoTag:(int32_t)msgSize];
   12570       // Write the fields.
   12571       WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   12572       WriteDictFloatField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
   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 initWithValues: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 initWithValues:forKeys:count:
   12639   // on to get the type correct.
   12640   return [[(GPBBoolDoubleDictionary*)[self alloc] initWithValues:values
   12641                                                          forKeys:keys
   12642                                                            count:count] autorelease];
   12643 }
   12644 
   12645 + (instancetype)dictionaryWithDictionary:(GPBBoolDoubleDictionary *)dictionary {
   12646   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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> {", [self 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, GPBDataTypeBool);
   12790       msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   12791       result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   12792     }
   12793   }
   12794   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, GPBDataTypeBool);
   12809       msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   12810       [outputStream writeInt32NoTag:(int32_t)msgSize];
   12811       // Write the fields.
   12812       WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   12813       WriteDictDoubleField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
   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 initWithObjects: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 initWithObjects:forKeys:count:
   12879   // on to get the type correct.
   12880   return [[(GPBBoolObjectDictionary*)[self alloc] initWithObjects:objects
   12881                                                           forKeys:keys
   12882                                                             count:count] autorelease];
   12883 }
   12884 
   12885 + (instancetype)dictionaryWithDictionary:(GPBBoolObjectDictionary *)dictionary {
   12886   // Cast is needed so the compiler knows what class we are invoking initWithDictionary:
   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> {", [self 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, GPBDataTypeBool);
   13044       msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   13045       result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   13046     }
   13047   }
   13048   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, GPBDataTypeBool);
   13063       msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   13064       [outputStream writeInt32NoTag:(int32_t)msgSize];
   13065       // Write the fields.
   13066       WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   13067       WriteDictObjectField(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
   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 initWithValues:forKeys:count:
   13145   // on to get the type correct.
   13146   return [[(GPBBoolEnumDictionary*)[self alloc] initWithValidationFunction:func
   13147                                                                  rawValues:&rawValue
   13148                                                                    forKeys:&key
   13149                                                                      count:1] autorelease];
   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 initWithValues:forKeys:count:
   13157   // on to get the type correct.
   13158   return [[(GPBBoolEnumDictionary*)[self alloc] initWithValidationFunction:func
   13159                                                                  rawValues:values
   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 initWithValues:forKeys:count:
   13166   // on to get the type correct.
   13167   return [[(GPBBoolEnumDictionary*)[self alloc] initWithDictionary:dictionary] autorelease];
   13168 }
   13169 
   13170 + (instancetype)dictionaryWithValidationFunction:(GPBEnumValidationFunc)func
   13171                                         capacity:(NSUInteger)numItems {
   13172   return [[[self alloc] initWithValidationFunction:func capacity:numItems] autorelease];
   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> {", [self 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, GPBDataTypeEnum);
   13340   NSMutableData *data = [NSMutableData dataWithLength:msgSize];
   13341   GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data];
   13342   WriteDictBoolField(outputStream, key->valueBool, kMapKeyFieldNumber, keyDataType);
   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, GPBDataTypeBool);
   13358       msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   13359       result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
   13360     }
   13361   }
   13362   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   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), GPBWireFormatLengthDelimited);
   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, GPBDataTypeBool);
   13377       msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType);
   13378       [outputStream writeInt32NoTag:(int32_t)msgSize];
   13379       // Write the fields.
   13380       WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool);
   13381       WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType);
   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 value (%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
   13556