1*6777b538SAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format 2*6777b538SAndroid Build Coastguard Worker// Copyright 2008 Google Inc. All rights reserved. 3*6777b538SAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/ 4*6777b538SAndroid Build Coastguard Worker// 5*6777b538SAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without 6*6777b538SAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are 7*6777b538SAndroid Build Coastguard Worker// met: 8*6777b538SAndroid Build Coastguard Worker// 9*6777b538SAndroid Build Coastguard Worker// * Redistributions of source code must retain the above copyright 10*6777b538SAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer. 11*6777b538SAndroid Build Coastguard Worker// * Redistributions in binary form must reproduce the above 12*6777b538SAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer 13*6777b538SAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the 14*6777b538SAndroid Build Coastguard Worker// distribution. 15*6777b538SAndroid Build Coastguard Worker// * Neither the name of Google Inc. nor the names of its 16*6777b538SAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from 17*6777b538SAndroid Build Coastguard Worker// this software without specific prior written permission. 18*6777b538SAndroid Build Coastguard Worker// 19*6777b538SAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20*6777b538SAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21*6777b538SAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22*6777b538SAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23*6777b538SAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24*6777b538SAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25*6777b538SAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26*6777b538SAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27*6777b538SAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28*6777b538SAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29*6777b538SAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker#import "GPBDictionary_PackagePrivate.h" 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker#import "GPBCodedInputStream_PackagePrivate.h" 34*6777b538SAndroid Build Coastguard Worker#import "GPBCodedOutputStream_PackagePrivate.h" 35*6777b538SAndroid Build Coastguard Worker#import "GPBDescriptor_PackagePrivate.h" 36*6777b538SAndroid Build Coastguard Worker#import "GPBMessage_PackagePrivate.h" 37*6777b538SAndroid Build Coastguard Worker#import "GPBUtilities_PackagePrivate.h" 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker// ------------------------------ NOTE ------------------------------ 40*6777b538SAndroid Build Coastguard Worker// At the moment, this is all using NSNumbers in NSDictionaries under 41*6777b538SAndroid Build Coastguard Worker// the hood, but it is all hidden so we can come back and optimize 42*6777b538SAndroid Build Coastguard Worker// with direct CFDictionary usage later. The reason that wasn't 43*6777b538SAndroid Build Coastguard Worker// done yet is needing to support 32bit iOS builds. Otherwise 44*6777b538SAndroid Build Coastguard Worker// it would be pretty simple to store all this data in CFDictionaries 45*6777b538SAndroid Build Coastguard Worker// directly. 46*6777b538SAndroid Build Coastguard Worker// ------------------------------------------------------------------ 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker// Direct access is use for speed, to avoid even internally declaring things 49*6777b538SAndroid Build Coastguard Worker// read/write, etc. The warning is enabled in the project to ensure code calling 50*6777b538SAndroid Build Coastguard Worker// protos can turn on -Wdirect-ivar-access without issues. 51*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic push 52*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wdirect-ivar-access" 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker// Used to include code only visible to specific versions of the static 55*6777b538SAndroid Build Coastguard Worker// analyzer. Useful for wrapping code that only exists to silence the analyzer. 56*6777b538SAndroid Build Coastguard Worker// Determine the values you want to use for BEGIN_APPLE_BUILD_VERSION, 57*6777b538SAndroid Build Coastguard Worker// END_APPLE_BUILD_VERSION using: 58*6777b538SAndroid Build Coastguard Worker// xcrun clang -dM -E -x c /dev/null | grep __apple_build_version__ 59*6777b538SAndroid Build Coastguard Worker// Example usage: 60*6777b538SAndroid Build Coastguard Worker// #if GPB_STATIC_ANALYZER_ONLY(5621, 5623) ... #endif 61*6777b538SAndroid Build Coastguard Worker#define GPB_STATIC_ANALYZER_ONLY(BEGIN_APPLE_BUILD_VERSION, END_APPLE_BUILD_VERSION) \ 62*6777b538SAndroid Build Coastguard Worker (defined(__clang_analyzer__) && \ 63*6777b538SAndroid Build Coastguard Worker (__apple_build_version__ >= BEGIN_APPLE_BUILD_VERSION && \ 64*6777b538SAndroid Build Coastguard Worker __apple_build_version__ <= END_APPLE_BUILD_VERSION)) 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Workerenum { 67*6777b538SAndroid Build Coastguard Worker kMapKeyFieldNumber = 1, 68*6777b538SAndroid Build Coastguard Worker kMapValueFieldNumber = 2, 69*6777b538SAndroid Build Coastguard Worker}; 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Workerstatic BOOL DictDefault_IsValidValue(int32_t value) { 72*6777b538SAndroid Build Coastguard Worker // Anything but the bad value marker is allowed. 73*6777b538SAndroid Build Coastguard Worker return (value != kGPBUnrecognizedEnumeratorValue); 74*6777b538SAndroid Build Coastguard Worker} 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIALIZE_SUPPORT_2_TYPE(VALUE_NAME, VALUE_TYPE, GPBDATATYPE_NAME1, GPBDATATYPE_NAME2) 77*6777b538SAndroid Build Coastguard Worker//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) { 78*6777b538SAndroid Build Coastguard Worker//% if (dataType == GPBDataType##GPBDATATYPE_NAME1) { 79*6777b538SAndroid Build Coastguard Worker//% return GPBCompute##GPBDATATYPE_NAME1##Size(fieldNum, value); 80*6777b538SAndroid Build Coastguard Worker//% } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) { 81*6777b538SAndroid Build Coastguard Worker//% return GPBCompute##GPBDATATYPE_NAME2##Size(fieldNum, value); 82*6777b538SAndroid Build Coastguard Worker//% } else { 83*6777b538SAndroid Build Coastguard Worker//% NSCAssert(NO, @"Unexpected type %d", dataType); 84*6777b538SAndroid Build Coastguard Worker//% return 0; 85*6777b538SAndroid Build Coastguard Worker//% } 86*6777b538SAndroid Build Coastguard Worker//%} 87*6777b538SAndroid Build Coastguard Worker//% 88*6777b538SAndroid Build Coastguard Worker//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) { 89*6777b538SAndroid Build Coastguard Worker//% if (dataType == GPBDataType##GPBDATATYPE_NAME1) { 90*6777b538SAndroid Build Coastguard Worker//% [stream write##GPBDATATYPE_NAME1##:fieldNum value:value]; 91*6777b538SAndroid Build Coastguard Worker//% } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) { 92*6777b538SAndroid Build Coastguard Worker//% [stream write##GPBDATATYPE_NAME2##:fieldNum value:value]; 93*6777b538SAndroid Build Coastguard Worker//% } else { 94*6777b538SAndroid Build Coastguard Worker//% NSCAssert(NO, @"Unexpected type %d", dataType); 95*6777b538SAndroid Build Coastguard Worker//% } 96*6777b538SAndroid Build Coastguard Worker//%} 97*6777b538SAndroid Build Coastguard Worker//% 98*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIALIZE_SUPPORT_3_TYPE(VALUE_NAME, VALUE_TYPE, GPBDATATYPE_NAME1, GPBDATATYPE_NAME2, GPBDATATYPE_NAME3) 99*6777b538SAndroid Build Coastguard Worker//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) { 100*6777b538SAndroid Build Coastguard Worker//% if (dataType == GPBDataType##GPBDATATYPE_NAME1) { 101*6777b538SAndroid Build Coastguard Worker//% return GPBCompute##GPBDATATYPE_NAME1##Size(fieldNum, value); 102*6777b538SAndroid Build Coastguard Worker//% } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) { 103*6777b538SAndroid Build Coastguard Worker//% return GPBCompute##GPBDATATYPE_NAME2##Size(fieldNum, value); 104*6777b538SAndroid Build Coastguard Worker//% } else if (dataType == GPBDataType##GPBDATATYPE_NAME3) { 105*6777b538SAndroid Build Coastguard Worker//% return GPBCompute##GPBDATATYPE_NAME3##Size(fieldNum, value); 106*6777b538SAndroid Build Coastguard Worker//% } else { 107*6777b538SAndroid Build Coastguard Worker//% NSCAssert(NO, @"Unexpected type %d", dataType); 108*6777b538SAndroid Build Coastguard Worker//% return 0; 109*6777b538SAndroid Build Coastguard Worker//% } 110*6777b538SAndroid Build Coastguard Worker//%} 111*6777b538SAndroid Build Coastguard Worker//% 112*6777b538SAndroid Build Coastguard Worker//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) { 113*6777b538SAndroid Build Coastguard Worker//% if (dataType == GPBDataType##GPBDATATYPE_NAME1) { 114*6777b538SAndroid Build Coastguard Worker//% [stream write##GPBDATATYPE_NAME1##:fieldNum value:value]; 115*6777b538SAndroid Build Coastguard Worker//% } else if (dataType == GPBDataType##GPBDATATYPE_NAME2) { 116*6777b538SAndroid Build Coastguard Worker//% [stream write##GPBDATATYPE_NAME2##:fieldNum value:value]; 117*6777b538SAndroid Build Coastguard Worker//% } else if (dataType == GPBDataType##GPBDATATYPE_NAME3) { 118*6777b538SAndroid Build Coastguard Worker//% [stream write##GPBDATATYPE_NAME3##:fieldNum value:value]; 119*6777b538SAndroid Build Coastguard Worker//% } else { 120*6777b538SAndroid Build Coastguard Worker//% NSCAssert(NO, @"Unexpected type %d", dataType); 121*6777b538SAndroid Build Coastguard Worker//% } 122*6777b538SAndroid Build Coastguard Worker//%} 123*6777b538SAndroid Build Coastguard Worker//% 124*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SIMPLE_SERIALIZE_SUPPORT(VALUE_NAME, VALUE_TYPE, VisP) 125*6777b538SAndroid Build Coastguard Worker//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE VisP##value, uint32_t fieldNum, GPBDataType dataType) { 126*6777b538SAndroid Build Coastguard Worker//% NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType); 127*6777b538SAndroid Build Coastguard Worker//% #pragma unused(dataType) // For when asserts are off in release. 128*6777b538SAndroid Build Coastguard Worker//% return GPBCompute##VALUE_NAME##Size(fieldNum, value); 129*6777b538SAndroid Build Coastguard Worker//%} 130*6777b538SAndroid Build Coastguard Worker//% 131*6777b538SAndroid Build Coastguard Worker//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE VisP##value, uint32_t fieldNum, GPBDataType dataType) { 132*6777b538SAndroid Build Coastguard Worker//% NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType); 133*6777b538SAndroid Build Coastguard Worker//% #pragma unused(dataType) // For when asserts are off in release. 134*6777b538SAndroid Build Coastguard Worker//% [stream write##VALUE_NAME##:fieldNum value:value]; 135*6777b538SAndroid Build Coastguard Worker//%} 136*6777b538SAndroid Build Coastguard Worker//% 137*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIALIZE_SUPPORT_HELPERS() 138*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_3_TYPE(Int32, int32_t, Int32, SInt32, SFixed32) 139*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_2_TYPE(UInt32, uint32_t, UInt32, Fixed32) 140*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_3_TYPE(Int64, int64_t, Int64, SInt64, SFixed64) 141*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_2_TYPE(UInt64, uint64_t, UInt64, Fixed64) 142*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Bool, BOOL, ) 143*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Enum, int32_t, ) 144*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Float, float, ) 145*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(Double, double, ) 146*6777b538SAndroid Build Coastguard Worker//%SIMPLE_SERIALIZE_SUPPORT(String, NSString, *) 147*6777b538SAndroid Build Coastguard Worker//%SERIALIZE_SUPPORT_3_TYPE(Object, id, Message, String, Bytes) 148*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND SERIALIZE_SUPPORT_HELPERS() 149*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 150*6777b538SAndroid Build Coastguard Worker// clang-format off 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictInt32FieldSize(int32_t value, uint32_t fieldNum, GPBDataType dataType) { 153*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeInt32) { 154*6777b538SAndroid Build Coastguard Worker return GPBComputeInt32Size(fieldNum, value); 155*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeSInt32) { 156*6777b538SAndroid Build Coastguard Worker return GPBComputeSInt32Size(fieldNum, value); 157*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeSFixed32) { 158*6777b538SAndroid Build Coastguard Worker return GPBComputeSFixed32Size(fieldNum, value); 159*6777b538SAndroid Build Coastguard Worker } else { 160*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 161*6777b538SAndroid Build Coastguard Worker return 0; 162*6777b538SAndroid Build Coastguard Worker } 163*6777b538SAndroid Build Coastguard Worker} 164*6777b538SAndroid Build Coastguard Worker 165*6777b538SAndroid Build Coastguard Workerstatic void WriteDictInt32Field(GPBCodedOutputStream *stream, int32_t value, uint32_t fieldNum, GPBDataType dataType) { 166*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeInt32) { 167*6777b538SAndroid Build Coastguard Worker [stream writeInt32:fieldNum value:value]; 168*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeSInt32) { 169*6777b538SAndroid Build Coastguard Worker [stream writeSInt32:fieldNum value:value]; 170*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeSFixed32) { 171*6777b538SAndroid Build Coastguard Worker [stream writeSFixed32:fieldNum value:value]; 172*6777b538SAndroid Build Coastguard Worker } else { 173*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 174*6777b538SAndroid Build Coastguard Worker } 175*6777b538SAndroid Build Coastguard Worker} 176*6777b538SAndroid Build Coastguard Worker 177*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictUInt32FieldSize(uint32_t value, uint32_t fieldNum, GPBDataType dataType) { 178*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeUInt32) { 179*6777b538SAndroid Build Coastguard Worker return GPBComputeUInt32Size(fieldNum, value); 180*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeFixed32) { 181*6777b538SAndroid Build Coastguard Worker return GPBComputeFixed32Size(fieldNum, value); 182*6777b538SAndroid Build Coastguard Worker } else { 183*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 184*6777b538SAndroid Build Coastguard Worker return 0; 185*6777b538SAndroid Build Coastguard Worker } 186*6777b538SAndroid Build Coastguard Worker} 187*6777b538SAndroid Build Coastguard Worker 188*6777b538SAndroid Build Coastguard Workerstatic void WriteDictUInt32Field(GPBCodedOutputStream *stream, uint32_t value, uint32_t fieldNum, GPBDataType dataType) { 189*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeUInt32) { 190*6777b538SAndroid Build Coastguard Worker [stream writeUInt32:fieldNum value:value]; 191*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeFixed32) { 192*6777b538SAndroid Build Coastguard Worker [stream writeFixed32:fieldNum value:value]; 193*6777b538SAndroid Build Coastguard Worker } else { 194*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 195*6777b538SAndroid Build Coastguard Worker } 196*6777b538SAndroid Build Coastguard Worker} 197*6777b538SAndroid Build Coastguard Worker 198*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictInt64FieldSize(int64_t value, uint32_t fieldNum, GPBDataType dataType) { 199*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeInt64) { 200*6777b538SAndroid Build Coastguard Worker return GPBComputeInt64Size(fieldNum, value); 201*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeSInt64) { 202*6777b538SAndroid Build Coastguard Worker return GPBComputeSInt64Size(fieldNum, value); 203*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeSFixed64) { 204*6777b538SAndroid Build Coastguard Worker return GPBComputeSFixed64Size(fieldNum, value); 205*6777b538SAndroid Build Coastguard Worker } else { 206*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 207*6777b538SAndroid Build Coastguard Worker return 0; 208*6777b538SAndroid Build Coastguard Worker } 209*6777b538SAndroid Build Coastguard Worker} 210*6777b538SAndroid Build Coastguard Worker 211*6777b538SAndroid Build Coastguard Workerstatic void WriteDictInt64Field(GPBCodedOutputStream *stream, int64_t value, uint32_t fieldNum, GPBDataType dataType) { 212*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeInt64) { 213*6777b538SAndroid Build Coastguard Worker [stream writeInt64:fieldNum value:value]; 214*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeSInt64) { 215*6777b538SAndroid Build Coastguard Worker [stream writeSInt64:fieldNum value:value]; 216*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeSFixed64) { 217*6777b538SAndroid Build Coastguard Worker [stream writeSFixed64:fieldNum value:value]; 218*6777b538SAndroid Build Coastguard Worker } else { 219*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 220*6777b538SAndroid Build Coastguard Worker } 221*6777b538SAndroid Build Coastguard Worker} 222*6777b538SAndroid Build Coastguard Worker 223*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictUInt64FieldSize(uint64_t value, uint32_t fieldNum, GPBDataType dataType) { 224*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeUInt64) { 225*6777b538SAndroid Build Coastguard Worker return GPBComputeUInt64Size(fieldNum, value); 226*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeFixed64) { 227*6777b538SAndroid Build Coastguard Worker return GPBComputeFixed64Size(fieldNum, value); 228*6777b538SAndroid Build Coastguard Worker } else { 229*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 230*6777b538SAndroid Build Coastguard Worker return 0; 231*6777b538SAndroid Build Coastguard Worker } 232*6777b538SAndroid Build Coastguard Worker} 233*6777b538SAndroid Build Coastguard Worker 234*6777b538SAndroid Build Coastguard Workerstatic void WriteDictUInt64Field(GPBCodedOutputStream *stream, uint64_t value, uint32_t fieldNum, GPBDataType dataType) { 235*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeUInt64) { 236*6777b538SAndroid Build Coastguard Worker [stream writeUInt64:fieldNum value:value]; 237*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeFixed64) { 238*6777b538SAndroid Build Coastguard Worker [stream writeFixed64:fieldNum value:value]; 239*6777b538SAndroid Build Coastguard Worker } else { 240*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 241*6777b538SAndroid Build Coastguard Worker } 242*6777b538SAndroid Build Coastguard Worker} 243*6777b538SAndroid Build Coastguard Worker 244*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictBoolFieldSize(BOOL value, uint32_t fieldNum, GPBDataType dataType) { 245*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType); 246*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 247*6777b538SAndroid Build Coastguard Worker return GPBComputeBoolSize(fieldNum, value); 248*6777b538SAndroid Build Coastguard Worker} 249*6777b538SAndroid Build Coastguard Worker 250*6777b538SAndroid Build Coastguard Workerstatic void WriteDictBoolField(GPBCodedOutputStream *stream, BOOL value, uint32_t fieldNum, GPBDataType dataType) { 251*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType); 252*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 253*6777b538SAndroid Build Coastguard Worker [stream writeBool:fieldNum value:value]; 254*6777b538SAndroid Build Coastguard Worker} 255*6777b538SAndroid Build Coastguard Worker 256*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictEnumFieldSize(int32_t value, uint32_t fieldNum, GPBDataType dataType) { 257*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType); 258*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 259*6777b538SAndroid Build Coastguard Worker return GPBComputeEnumSize(fieldNum, value); 260*6777b538SAndroid Build Coastguard Worker} 261*6777b538SAndroid Build Coastguard Worker 262*6777b538SAndroid Build Coastguard Workerstatic void WriteDictEnumField(GPBCodedOutputStream *stream, int32_t value, uint32_t fieldNum, GPBDataType dataType) { 263*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType); 264*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 265*6777b538SAndroid Build Coastguard Worker [stream writeEnum:fieldNum value:value]; 266*6777b538SAndroid Build Coastguard Worker} 267*6777b538SAndroid Build Coastguard Worker 268*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictFloatFieldSize(float value, uint32_t fieldNum, GPBDataType dataType) { 269*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType); 270*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 271*6777b538SAndroid Build Coastguard Worker return GPBComputeFloatSize(fieldNum, value); 272*6777b538SAndroid Build Coastguard Worker} 273*6777b538SAndroid Build Coastguard Worker 274*6777b538SAndroid Build Coastguard Workerstatic void WriteDictFloatField(GPBCodedOutputStream *stream, float value, uint32_t fieldNum, GPBDataType dataType) { 275*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType); 276*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 277*6777b538SAndroid Build Coastguard Worker [stream writeFloat:fieldNum value:value]; 278*6777b538SAndroid Build Coastguard Worker} 279*6777b538SAndroid Build Coastguard Worker 280*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictDoubleFieldSize(double value, uint32_t fieldNum, GPBDataType dataType) { 281*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType); 282*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 283*6777b538SAndroid Build Coastguard Worker return GPBComputeDoubleSize(fieldNum, value); 284*6777b538SAndroid Build Coastguard Worker} 285*6777b538SAndroid Build Coastguard Worker 286*6777b538SAndroid Build Coastguard Workerstatic void WriteDictDoubleField(GPBCodedOutputStream *stream, double value, uint32_t fieldNum, GPBDataType dataType) { 287*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType); 288*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 289*6777b538SAndroid Build Coastguard Worker [stream writeDouble:fieldNum value:value]; 290*6777b538SAndroid Build Coastguard Worker} 291*6777b538SAndroid Build Coastguard Worker 292*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictStringFieldSize(NSString *value, uint32_t fieldNum, GPBDataType dataType) { 293*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType); 294*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 295*6777b538SAndroid Build Coastguard Worker return GPBComputeStringSize(fieldNum, value); 296*6777b538SAndroid Build Coastguard Worker} 297*6777b538SAndroid Build Coastguard Worker 298*6777b538SAndroid Build Coastguard Workerstatic void WriteDictStringField(GPBCodedOutputStream *stream, NSString *value, uint32_t fieldNum, GPBDataType dataType) { 299*6777b538SAndroid Build Coastguard Worker NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType); 300*6777b538SAndroid Build Coastguard Worker #pragma unused(dataType) // For when asserts are off in release. 301*6777b538SAndroid Build Coastguard Worker [stream writeString:fieldNum value:value]; 302*6777b538SAndroid Build Coastguard Worker} 303*6777b538SAndroid Build Coastguard Worker 304*6777b538SAndroid Build Coastguard Workerstatic size_t ComputeDictObjectFieldSize(id value, uint32_t fieldNum, GPBDataType dataType) { 305*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeMessage) { 306*6777b538SAndroid Build Coastguard Worker return GPBComputeMessageSize(fieldNum, value); 307*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeString) { 308*6777b538SAndroid Build Coastguard Worker return GPBComputeStringSize(fieldNum, value); 309*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeBytes) { 310*6777b538SAndroid Build Coastguard Worker return GPBComputeBytesSize(fieldNum, value); 311*6777b538SAndroid Build Coastguard Worker } else { 312*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 313*6777b538SAndroid Build Coastguard Worker return 0; 314*6777b538SAndroid Build Coastguard Worker } 315*6777b538SAndroid Build Coastguard Worker} 316*6777b538SAndroid Build Coastguard Worker 317*6777b538SAndroid Build Coastguard Workerstatic void WriteDictObjectField(GPBCodedOutputStream *stream, id value, uint32_t fieldNum, GPBDataType dataType) { 318*6777b538SAndroid Build Coastguard Worker if (dataType == GPBDataTypeMessage) { 319*6777b538SAndroid Build Coastguard Worker [stream writeMessage:fieldNum value:value]; 320*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeString) { 321*6777b538SAndroid Build Coastguard Worker [stream writeString:fieldNum value:value]; 322*6777b538SAndroid Build Coastguard Worker } else if (dataType == GPBDataTypeBytes) { 323*6777b538SAndroid Build Coastguard Worker [stream writeBytes:fieldNum value:value]; 324*6777b538SAndroid Build Coastguard Worker } else { 325*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Unexpected type %d", dataType); 326*6777b538SAndroid Build Coastguard Worker } 327*6777b538SAndroid Build Coastguard Worker} 328*6777b538SAndroid Build Coastguard Worker 329*6777b538SAndroid Build Coastguard Worker// clang-format on 330*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND-END SERIALIZE_SUPPORT_HELPERS() 331*6777b538SAndroid Build Coastguard Worker 332*6777b538SAndroid Build Coastguard Workersize_t GPBDictionaryComputeSizeInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) { 333*6777b538SAndroid Build Coastguard Worker GPBDataType mapValueType = GPBGetFieldDataType(field); 334*6777b538SAndroid Build Coastguard Worker size_t result = 0; 335*6777b538SAndroid Build Coastguard Worker NSString *key; 336*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [dict keyEnumerator]; 337*6777b538SAndroid Build Coastguard Worker while ((key = [keys nextObject])) { 338*6777b538SAndroid Build Coastguard Worker id obj = dict[key]; 339*6777b538SAndroid Build Coastguard Worker size_t msgSize = GPBComputeStringSize(kMapKeyFieldNumber, key); 340*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(obj, kMapValueFieldNumber, mapValueType); 341*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 342*6777b538SAndroid Build Coastguard Worker } 343*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 344*6777b538SAndroid Build Coastguard Worker result += tagSize * dict.count; 345*6777b538SAndroid Build Coastguard Worker return result; 346*6777b538SAndroid Build Coastguard Worker} 347*6777b538SAndroid Build Coastguard Worker 348*6777b538SAndroid Build Coastguard Workervoid GPBDictionaryWriteToStreamInternalHelper(GPBCodedOutputStream *outputStream, 349*6777b538SAndroid Build Coastguard Worker NSDictionary *dict, 350*6777b538SAndroid Build Coastguard Worker GPBFieldDescriptor *field) { 351*6777b538SAndroid Build Coastguard Worker NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type"); 352*6777b538SAndroid Build Coastguard Worker GPBDataType mapValueType = GPBGetFieldDataType(field); 353*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 354*6777b538SAndroid Build Coastguard Worker NSString *key; 355*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [dict keyEnumerator]; 356*6777b538SAndroid Build Coastguard Worker while ((key = [keys nextObject])) { 357*6777b538SAndroid Build Coastguard Worker id obj = dict[key]; 358*6777b538SAndroid Build Coastguard Worker // Write the tag. 359*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 360*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 361*6777b538SAndroid Build Coastguard Worker size_t msgSize = GPBComputeStringSize(kMapKeyFieldNumber, key); 362*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(obj, kMapValueFieldNumber, mapValueType); 363*6777b538SAndroid Build Coastguard Worker 364*6777b538SAndroid Build Coastguard Worker // Write the size and fields. 365*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 366*6777b538SAndroid Build Coastguard Worker [outputStream writeString:kMapKeyFieldNumber value:key]; 367*6777b538SAndroid Build Coastguard Worker WriteDictObjectField(outputStream, obj, kMapValueFieldNumber, mapValueType); 368*6777b538SAndroid Build Coastguard Worker } 369*6777b538SAndroid Build Coastguard Worker} 370*6777b538SAndroid Build Coastguard Worker 371*6777b538SAndroid Build Coastguard WorkerBOOL GPBDictionaryIsInitializedInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) { 372*6777b538SAndroid Build Coastguard Worker NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type"); 373*6777b538SAndroid Build Coastguard Worker NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeMessage, @"Unexpected value type"); 374*6777b538SAndroid Build Coastguard Worker #pragma unused(field) // For when asserts are off in release. 375*6777b538SAndroid Build Coastguard Worker GPBMessage *msg; 376*6777b538SAndroid Build Coastguard Worker NSEnumerator *objects = [dict objectEnumerator]; 377*6777b538SAndroid Build Coastguard Worker while ((msg = [objects nextObject])) { 378*6777b538SAndroid Build Coastguard Worker if (!msg.initialized) { 379*6777b538SAndroid Build Coastguard Worker return NO; 380*6777b538SAndroid Build Coastguard Worker } 381*6777b538SAndroid Build Coastguard Worker } 382*6777b538SAndroid Build Coastguard Worker return YES; 383*6777b538SAndroid Build Coastguard Worker} 384*6777b538SAndroid Build Coastguard Worker 385*6777b538SAndroid Build Coastguard Worker// Note: if the type is an object, it the retain pass back to the caller. 386*6777b538SAndroid Build Coastguard Workerstatic void ReadValue(GPBCodedInputStream *stream, 387*6777b538SAndroid Build Coastguard Worker GPBGenericValue *valueToFill, 388*6777b538SAndroid Build Coastguard Worker GPBDataType type, 389*6777b538SAndroid Build Coastguard Worker GPBExtensionRegistry *registry, 390*6777b538SAndroid Build Coastguard Worker GPBFieldDescriptor *field) { 391*6777b538SAndroid Build Coastguard Worker switch (type) { 392*6777b538SAndroid Build Coastguard Worker case GPBDataTypeBool: 393*6777b538SAndroid Build Coastguard Worker valueToFill->valueBool = GPBCodedInputStreamReadBool(&stream->state_); 394*6777b538SAndroid Build Coastguard Worker break; 395*6777b538SAndroid Build Coastguard Worker case GPBDataTypeFixed32: 396*6777b538SAndroid Build Coastguard Worker valueToFill->valueUInt32 = GPBCodedInputStreamReadFixed32(&stream->state_); 397*6777b538SAndroid Build Coastguard Worker break; 398*6777b538SAndroid Build Coastguard Worker case GPBDataTypeSFixed32: 399*6777b538SAndroid Build Coastguard Worker valueToFill->valueInt32 = GPBCodedInputStreamReadSFixed32(&stream->state_); 400*6777b538SAndroid Build Coastguard Worker break; 401*6777b538SAndroid Build Coastguard Worker case GPBDataTypeFloat: 402*6777b538SAndroid Build Coastguard Worker valueToFill->valueFloat = GPBCodedInputStreamReadFloat(&stream->state_); 403*6777b538SAndroid Build Coastguard Worker break; 404*6777b538SAndroid Build Coastguard Worker case GPBDataTypeFixed64: 405*6777b538SAndroid Build Coastguard Worker valueToFill->valueUInt64 = GPBCodedInputStreamReadFixed64(&stream->state_); 406*6777b538SAndroid Build Coastguard Worker break; 407*6777b538SAndroid Build Coastguard Worker case GPBDataTypeSFixed64: 408*6777b538SAndroid Build Coastguard Worker valueToFill->valueInt64 = GPBCodedInputStreamReadSFixed64(&stream->state_); 409*6777b538SAndroid Build Coastguard Worker break; 410*6777b538SAndroid Build Coastguard Worker case GPBDataTypeDouble: 411*6777b538SAndroid Build Coastguard Worker valueToFill->valueDouble = GPBCodedInputStreamReadDouble(&stream->state_); 412*6777b538SAndroid Build Coastguard Worker break; 413*6777b538SAndroid Build Coastguard Worker case GPBDataTypeInt32: 414*6777b538SAndroid Build Coastguard Worker valueToFill->valueInt32 = GPBCodedInputStreamReadInt32(&stream->state_); 415*6777b538SAndroid Build Coastguard Worker break; 416*6777b538SAndroid Build Coastguard Worker case GPBDataTypeInt64: 417*6777b538SAndroid Build Coastguard Worker valueToFill->valueInt64 = GPBCodedInputStreamReadInt64(&stream->state_); 418*6777b538SAndroid Build Coastguard Worker break; 419*6777b538SAndroid Build Coastguard Worker case GPBDataTypeSInt32: 420*6777b538SAndroid Build Coastguard Worker valueToFill->valueInt32 = GPBCodedInputStreamReadSInt32(&stream->state_); 421*6777b538SAndroid Build Coastguard Worker break; 422*6777b538SAndroid Build Coastguard Worker case GPBDataTypeSInt64: 423*6777b538SAndroid Build Coastguard Worker valueToFill->valueInt64 = GPBCodedInputStreamReadSInt64(&stream->state_); 424*6777b538SAndroid Build Coastguard Worker break; 425*6777b538SAndroid Build Coastguard Worker case GPBDataTypeUInt32: 426*6777b538SAndroid Build Coastguard Worker valueToFill->valueUInt32 = GPBCodedInputStreamReadUInt32(&stream->state_); 427*6777b538SAndroid Build Coastguard Worker break; 428*6777b538SAndroid Build Coastguard Worker case GPBDataTypeUInt64: 429*6777b538SAndroid Build Coastguard Worker valueToFill->valueUInt64 = GPBCodedInputStreamReadUInt64(&stream->state_); 430*6777b538SAndroid Build Coastguard Worker break; 431*6777b538SAndroid Build Coastguard Worker case GPBDataTypeBytes: 432*6777b538SAndroid Build Coastguard Worker [valueToFill->valueData release]; 433*6777b538SAndroid Build Coastguard Worker valueToFill->valueData = GPBCodedInputStreamReadRetainedBytes(&stream->state_); 434*6777b538SAndroid Build Coastguard Worker break; 435*6777b538SAndroid Build Coastguard Worker case GPBDataTypeString: 436*6777b538SAndroid Build Coastguard Worker [valueToFill->valueString release]; 437*6777b538SAndroid Build Coastguard Worker valueToFill->valueString = GPBCodedInputStreamReadRetainedString(&stream->state_); 438*6777b538SAndroid Build Coastguard Worker break; 439*6777b538SAndroid Build Coastguard Worker case GPBDataTypeMessage: { 440*6777b538SAndroid Build Coastguard Worker GPBMessage *message = [[field.msgClass alloc] init]; 441*6777b538SAndroid Build Coastguard Worker [stream readMessage:message extensionRegistry:registry]; 442*6777b538SAndroid Build Coastguard Worker [valueToFill->valueMessage release]; 443*6777b538SAndroid Build Coastguard Worker valueToFill->valueMessage = message; 444*6777b538SAndroid Build Coastguard Worker break; 445*6777b538SAndroid Build Coastguard Worker } 446*6777b538SAndroid Build Coastguard Worker case GPBDataTypeGroup: 447*6777b538SAndroid Build Coastguard Worker NSCAssert(NO, @"Can't happen"); 448*6777b538SAndroid Build Coastguard Worker break; 449*6777b538SAndroid Build Coastguard Worker case GPBDataTypeEnum: 450*6777b538SAndroid Build Coastguard Worker valueToFill->valueEnum = GPBCodedInputStreamReadEnum(&stream->state_); 451*6777b538SAndroid Build Coastguard Worker break; 452*6777b538SAndroid Build Coastguard Worker } 453*6777b538SAndroid Build Coastguard Worker} 454*6777b538SAndroid Build Coastguard Worker 455*6777b538SAndroid Build Coastguard Workervoid GPBDictionaryReadEntry(id mapDictionary, 456*6777b538SAndroid Build Coastguard Worker GPBCodedInputStream *stream, 457*6777b538SAndroid Build Coastguard Worker GPBExtensionRegistry *registry, 458*6777b538SAndroid Build Coastguard Worker GPBFieldDescriptor *field, 459*6777b538SAndroid Build Coastguard Worker GPBMessage *parentMessage) { 460*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 461*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 462*6777b538SAndroid Build Coastguard Worker 463*6777b538SAndroid Build Coastguard Worker GPBGenericValue key; 464*6777b538SAndroid Build Coastguard Worker GPBGenericValue value; 465*6777b538SAndroid Build Coastguard Worker // Zero them (but pick up any enum default for proto2). 466*6777b538SAndroid Build Coastguard Worker key.valueString = value.valueString = nil; 467*6777b538SAndroid Build Coastguard Worker if (valueDataType == GPBDataTypeEnum) { 468*6777b538SAndroid Build Coastguard Worker value = field.defaultValue; 469*6777b538SAndroid Build Coastguard Worker } 470*6777b538SAndroid Build Coastguard Worker 471*6777b538SAndroid Build Coastguard Worker GPBCodedInputStreamState *state = &stream->state_; 472*6777b538SAndroid Build Coastguard Worker uint32_t keyTag = 473*6777b538SAndroid Build Coastguard Worker GPBWireFormatMakeTag(kMapKeyFieldNumber, GPBWireFormatForType(keyDataType, NO)); 474*6777b538SAndroid Build Coastguard Worker uint32_t valueTag = 475*6777b538SAndroid Build Coastguard Worker GPBWireFormatMakeTag(kMapValueFieldNumber, GPBWireFormatForType(valueDataType, NO)); 476*6777b538SAndroid Build Coastguard Worker 477*6777b538SAndroid Build Coastguard Worker BOOL hitError = NO; 478*6777b538SAndroid Build Coastguard Worker while (YES) { 479*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBCodedInputStreamReadTag(state); 480*6777b538SAndroid Build Coastguard Worker if (tag == keyTag) { 481*6777b538SAndroid Build Coastguard Worker ReadValue(stream, &key, keyDataType, registry, field); 482*6777b538SAndroid Build Coastguard Worker } else if (tag == valueTag) { 483*6777b538SAndroid Build Coastguard Worker ReadValue(stream, &value, valueDataType, registry, field); 484*6777b538SAndroid Build Coastguard Worker } else if (tag == 0) { 485*6777b538SAndroid Build Coastguard Worker // zero signals EOF / limit reached 486*6777b538SAndroid Build Coastguard Worker break; 487*6777b538SAndroid Build Coastguard Worker } else { // Unknown 488*6777b538SAndroid Build Coastguard Worker if (![stream skipField:tag]){ 489*6777b538SAndroid Build Coastguard Worker hitError = YES; 490*6777b538SAndroid Build Coastguard Worker break; 491*6777b538SAndroid Build Coastguard Worker } 492*6777b538SAndroid Build Coastguard Worker } 493*6777b538SAndroid Build Coastguard Worker } 494*6777b538SAndroid Build Coastguard Worker 495*6777b538SAndroid Build Coastguard Worker if (!hitError) { 496*6777b538SAndroid Build Coastguard Worker // Handle the special defaults and/or missing key/value. 497*6777b538SAndroid Build Coastguard Worker if ((keyDataType == GPBDataTypeString) && (key.valueString == nil)) { 498*6777b538SAndroid Build Coastguard Worker key.valueString = [@"" retain]; 499*6777b538SAndroid Build Coastguard Worker } 500*6777b538SAndroid Build Coastguard Worker if (GPBDataTypeIsObject(valueDataType) && value.valueString == nil) { 501*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic push 502*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wswitch-enum" 503*6777b538SAndroid Build Coastguard Worker switch (valueDataType) { 504*6777b538SAndroid Build Coastguard Worker case GPBDataTypeString: 505*6777b538SAndroid Build Coastguard Worker value.valueString = [@"" retain]; 506*6777b538SAndroid Build Coastguard Worker break; 507*6777b538SAndroid Build Coastguard Worker case GPBDataTypeBytes: 508*6777b538SAndroid Build Coastguard Worker value.valueData = [GPBEmptyNSData() retain]; 509*6777b538SAndroid Build Coastguard Worker break; 510*6777b538SAndroid Build Coastguard Worker#if defined(__clang_analyzer__) 511*6777b538SAndroid Build Coastguard Worker case GPBDataTypeGroup: 512*6777b538SAndroid Build Coastguard Worker // Maps can't really have Groups as the value type, but this case is needed 513*6777b538SAndroid Build Coastguard Worker // so the analyzer won't report the possibility of send nil in for the value 514*6777b538SAndroid Build Coastguard Worker // in the NSMutableDictionary case below. 515*6777b538SAndroid Build Coastguard Worker#endif 516*6777b538SAndroid Build Coastguard Worker case GPBDataTypeMessage: { 517*6777b538SAndroid Build Coastguard Worker value.valueMessage = [[field.msgClass alloc] init]; 518*6777b538SAndroid Build Coastguard Worker break; 519*6777b538SAndroid Build Coastguard Worker } 520*6777b538SAndroid Build Coastguard Worker default: 521*6777b538SAndroid Build Coastguard Worker // Nothing 522*6777b538SAndroid Build Coastguard Worker break; 523*6777b538SAndroid Build Coastguard Worker } 524*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic pop 525*6777b538SAndroid Build Coastguard Worker } 526*6777b538SAndroid Build Coastguard Worker 527*6777b538SAndroid Build Coastguard Worker if ((keyDataType == GPBDataTypeString) && GPBDataTypeIsObject(valueDataType)) { 528*6777b538SAndroid Build Coastguard Worker#if GPB_STATIC_ANALYZER_ONLY(6020053, 7000181) 529*6777b538SAndroid Build Coastguard Worker // Limited to Xcode 6.4 - 7.2, are known to fail here. The upper end can 530*6777b538SAndroid Build Coastguard Worker // be raised as needed for new Xcodes. 531*6777b538SAndroid Build Coastguard Worker // 532*6777b538SAndroid Build Coastguard Worker // This is only needed on a "shallow" analyze; on a "deep" analyze, the 533*6777b538SAndroid Build Coastguard Worker // existing code path gets this correct. In shallow, the analyzer decides 534*6777b538SAndroid Build Coastguard Worker // GPBDataTypeIsObject(valueDataType) is both false and true on a single 535*6777b538SAndroid Build Coastguard Worker // path through this function, allowing nil to be used for the 536*6777b538SAndroid Build Coastguard Worker // setObject:forKey:. 537*6777b538SAndroid Build Coastguard Worker if (value.valueString == nil) { 538*6777b538SAndroid Build Coastguard Worker value.valueString = [@"" retain]; 539*6777b538SAndroid Build Coastguard Worker } 540*6777b538SAndroid Build Coastguard Worker#endif 541*6777b538SAndroid Build Coastguard Worker // mapDictionary is an NSMutableDictionary 542*6777b538SAndroid Build Coastguard Worker [(NSMutableDictionary *)mapDictionary setObject:value.valueString 543*6777b538SAndroid Build Coastguard Worker forKey:key.valueString]; 544*6777b538SAndroid Build Coastguard Worker } else { 545*6777b538SAndroid Build Coastguard Worker if (valueDataType == GPBDataTypeEnum) { 546*6777b538SAndroid Build Coastguard Worker if (GPBHasPreservingUnknownEnumSemantics([parentMessage descriptor].file.syntax) || 547*6777b538SAndroid Build Coastguard Worker [field isValidEnumValue:value.valueEnum]) { 548*6777b538SAndroid Build Coastguard Worker [mapDictionary setGPBGenericValue:&value forGPBGenericValueKey:&key]; 549*6777b538SAndroid Build Coastguard Worker } else { 550*6777b538SAndroid Build Coastguard Worker NSData *data = [mapDictionary serializedDataForUnknownValue:value.valueEnum 551*6777b538SAndroid Build Coastguard Worker forKey:&key 552*6777b538SAndroid Build Coastguard Worker keyDataType:keyDataType]; 553*6777b538SAndroid Build Coastguard Worker [parentMessage addUnknownMapEntry:GPBFieldNumber(field) value:data]; 554*6777b538SAndroid Build Coastguard Worker } 555*6777b538SAndroid Build Coastguard Worker } else { 556*6777b538SAndroid Build Coastguard Worker [mapDictionary setGPBGenericValue:&value forGPBGenericValueKey:&key]; 557*6777b538SAndroid Build Coastguard Worker } 558*6777b538SAndroid Build Coastguard Worker } 559*6777b538SAndroid Build Coastguard Worker } 560*6777b538SAndroid Build Coastguard Worker 561*6777b538SAndroid Build Coastguard Worker if (GPBDataTypeIsObject(keyDataType)) { 562*6777b538SAndroid Build Coastguard Worker [key.valueString release]; 563*6777b538SAndroid Build Coastguard Worker } 564*6777b538SAndroid Build Coastguard Worker if (GPBDataTypeIsObject(valueDataType)) { 565*6777b538SAndroid Build Coastguard Worker [value.valueString release]; 566*6777b538SAndroid Build Coastguard Worker } 567*6777b538SAndroid Build Coastguard Worker} 568*6777b538SAndroid Build Coastguard Worker 569*6777b538SAndroid Build Coastguard Worker// 570*6777b538SAndroid Build Coastguard Worker// Macros for the common basic cases. 571*6777b538SAndroid Build Coastguard Worker// 572*6777b538SAndroid Build Coastguard Worker 573*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_IMPL_FOR_POD_KEY(KEY_NAME, KEY_TYPE) 574*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_POD_IMPL_FOR_KEY(KEY_NAME, KEY_TYPE, , POD) 575*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, Object, id) 576*6777b538SAndroid Build Coastguard Worker 577*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_POD_IMPL_FOR_KEY(KEY_NAME, KEY_TYPE, KisP, KHELPER) 578*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, UInt32, uint32_t, KHELPER) 579*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Int32, int32_t, KHELPER) 580*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, UInt64, uint64_t, KHELPER) 581*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Int64, int64_t, KHELPER) 582*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Bool, BOOL, KHELPER) 583*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Float, float, KHELPER) 584*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, Double, double, KHELPER) 585*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_ENUM_IMPL(KEY_NAME, KEY_TYPE, KisP, Enum, int32_t, KHELPER) 586*6777b538SAndroid Build Coastguard Worker 587*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER) 588*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, POD, VALUE_NAME, value) 589*6777b538SAndroid Build Coastguard Worker 590*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, VALUE_NAME, VALUE_TYPE) 591*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, , VALUE_NAME, VALUE_TYPE, POD, OBJECT, Object, object) 592*6777b538SAndroid Build Coastguard Worker 593*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR) 594*6777b538SAndroid Build Coastguard Worker//%#pragma mark - KEY_NAME -> VALUE_NAME 595*6777b538SAndroid Build Coastguard Worker//% 596*6777b538SAndroid Build Coastguard Worker//%@implementation GPB##KEY_NAME##VALUE_NAME##Dictionary { 597*6777b538SAndroid Build Coastguard Worker//% @package 598*6777b538SAndroid Build Coastguard Worker//% NSMutableDictionary *_dictionary; 599*6777b538SAndroid Build Coastguard Worker//%} 600*6777b538SAndroid Build Coastguard Worker//% 601*6777b538SAndroid Build Coastguard Worker//%- (instancetype)init { 602*6777b538SAndroid Build Coastguard Worker//% return [self initWith##VNAME##s:NULL forKeys:NULL count:0]; 603*6777b538SAndroid Build Coastguard Worker//%} 604*6777b538SAndroid Build Coastguard Worker//% 605*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWith##VNAME##s:(const VALUE_TYPE [])##VNAME_VAR##s 606*6777b538SAndroid Build Coastguard Worker//% ##VNAME$S## forKeys:(const KEY_TYPE##KisP$S##KisP [])keys 607*6777b538SAndroid Build Coastguard Worker//% ##VNAME$S## count:(NSUInteger)count { 608*6777b538SAndroid Build Coastguard Worker//% self = [super init]; 609*6777b538SAndroid Build Coastguard Worker//% if (self) { 610*6777b538SAndroid Build Coastguard Worker//% _dictionary = [[NSMutableDictionary alloc] init]; 611*6777b538SAndroid Build Coastguard Worker//% if (count && VNAME_VAR##s && keys) { 612*6777b538SAndroid Build Coastguard Worker//% for (NSUInteger i = 0; i < count; ++i) { 613*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME_VAR##s[i], ______)##DICTIONARY_VALIDATE_KEY_##KHELPER(keys[i], ______) [_dictionary setObject:WRAPPED##VHELPER(VNAME_VAR##s[i]) forKey:WRAPPED##KHELPER(keys[i])]; 614*6777b538SAndroid Build Coastguard Worker//% } 615*6777b538SAndroid Build Coastguard Worker//% } 616*6777b538SAndroid Build Coastguard Worker//% } 617*6777b538SAndroid Build Coastguard Worker//% return self; 618*6777b538SAndroid Build Coastguard Worker//%} 619*6777b538SAndroid Build Coastguard Worker//% 620*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary { 621*6777b538SAndroid Build Coastguard Worker//% self = [self initWith##VNAME##s:NULL forKeys:NULL count:0]; 622*6777b538SAndroid Build Coastguard Worker//% if (self) { 623*6777b538SAndroid Build Coastguard Worker//% if (dictionary) { 624*6777b538SAndroid Build Coastguard Worker//% [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 625*6777b538SAndroid Build Coastguard Worker//% } 626*6777b538SAndroid Build Coastguard Worker//% } 627*6777b538SAndroid Build Coastguard Worker//% return self; 628*6777b538SAndroid Build Coastguard Worker//%} 629*6777b538SAndroid Build Coastguard Worker//% 630*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithCapacity:(NSUInteger)numItems { 631*6777b538SAndroid Build Coastguard Worker//% #pragma unused(numItems) 632*6777b538SAndroid Build Coastguard Worker//% return [self initWith##VNAME##s:NULL forKeys:NULL count:0]; 633*6777b538SAndroid Build Coastguard Worker//%} 634*6777b538SAndroid Build Coastguard Worker//% 635*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, ) 636*6777b538SAndroid Build Coastguard Worker//% 637*6777b538SAndroid Build Coastguard Worker//%VALUE_FOR_KEY_##VHELPER(KEY_TYPE##KisP$S##KisP, VALUE_NAME, VALUE_TYPE, KHELPER) 638*6777b538SAndroid Build Coastguard Worker//% 639*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, ) 640*6777b538SAndroid Build Coastguard Worker//% 641*6777b538SAndroid Build Coastguard Worker//%@end 642*6777b538SAndroid Build Coastguard Worker//% 643*6777b538SAndroid Build Coastguard Worker 644*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_KEY_TO_ENUM_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER) 645*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_KEY_TO_ENUM_IMPL2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, POD) 646*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_KEY_TO_ENUM_IMPL2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER) 647*6777b538SAndroid Build Coastguard Worker//%#pragma mark - KEY_NAME -> VALUE_NAME 648*6777b538SAndroid Build Coastguard Worker//% 649*6777b538SAndroid Build Coastguard Worker//%@implementation GPB##KEY_NAME##VALUE_NAME##Dictionary { 650*6777b538SAndroid Build Coastguard Worker//% @package 651*6777b538SAndroid Build Coastguard Worker//% NSMutableDictionary *_dictionary; 652*6777b538SAndroid Build Coastguard Worker//% GPBEnumValidationFunc _validationFunc; 653*6777b538SAndroid Build Coastguard Worker//%} 654*6777b538SAndroid Build Coastguard Worker//% 655*6777b538SAndroid Build Coastguard Worker//%@synthesize validationFunc = _validationFunc; 656*6777b538SAndroid Build Coastguard Worker//% 657*6777b538SAndroid Build Coastguard Worker//%- (instancetype)init { 658*6777b538SAndroid Build Coastguard Worker//% return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0]; 659*6777b538SAndroid Build Coastguard Worker//%} 660*6777b538SAndroid Build Coastguard Worker//% 661*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func { 662*6777b538SAndroid Build Coastguard Worker//% return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 663*6777b538SAndroid Build Coastguard Worker//%} 664*6777b538SAndroid Build Coastguard Worker//% 665*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 666*6777b538SAndroid Build Coastguard Worker//% rawValues:(const VALUE_TYPE [])rawValues 667*6777b538SAndroid Build Coastguard Worker//% forKeys:(const KEY_TYPE##KisP$S##KisP [])keys 668*6777b538SAndroid Build Coastguard Worker//% count:(NSUInteger)count { 669*6777b538SAndroid Build Coastguard Worker//% self = [super init]; 670*6777b538SAndroid Build Coastguard Worker//% if (self) { 671*6777b538SAndroid Build Coastguard Worker//% _dictionary = [[NSMutableDictionary alloc] init]; 672*6777b538SAndroid Build Coastguard Worker//% _validationFunc = (func != NULL ? func : DictDefault_IsValidValue); 673*6777b538SAndroid Build Coastguard Worker//% if (count && rawValues && keys) { 674*6777b538SAndroid Build Coastguard Worker//% for (NSUInteger i = 0; i < count; ++i) { 675*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_KEY_##KHELPER(keys[i], ______) [_dictionary setObject:WRAPPED##VHELPER(rawValues[i]) forKey:WRAPPED##KHELPER(keys[i])]; 676*6777b538SAndroid Build Coastguard Worker//% } 677*6777b538SAndroid Build Coastguard Worker//% } 678*6777b538SAndroid Build Coastguard Worker//% } 679*6777b538SAndroid Build Coastguard Worker//% return self; 680*6777b538SAndroid Build Coastguard Worker//%} 681*6777b538SAndroid Build Coastguard Worker//% 682*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary { 683*6777b538SAndroid Build Coastguard Worker//% self = [self initWithValidationFunction:dictionary.validationFunc 684*6777b538SAndroid Build Coastguard Worker//% rawValues:NULL 685*6777b538SAndroid Build Coastguard Worker//% forKeys:NULL 686*6777b538SAndroid Build Coastguard Worker//% count:0]; 687*6777b538SAndroid Build Coastguard Worker//% if (self) { 688*6777b538SAndroid Build Coastguard Worker//% if (dictionary) { 689*6777b538SAndroid Build Coastguard Worker//% [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 690*6777b538SAndroid Build Coastguard Worker//% } 691*6777b538SAndroid Build Coastguard Worker//% } 692*6777b538SAndroid Build Coastguard Worker//% return self; 693*6777b538SAndroid Build Coastguard Worker//%} 694*6777b538SAndroid Build Coastguard Worker//% 695*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 696*6777b538SAndroid Build Coastguard Worker//% capacity:(NSUInteger)numItems { 697*6777b538SAndroid Build Coastguard Worker//% #pragma unused(numItems) 698*6777b538SAndroid Build Coastguard Worker//% return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 699*6777b538SAndroid Build Coastguard Worker//%} 700*6777b538SAndroid Build Coastguard Worker//% 701*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, Value, value, Raw) 702*6777b538SAndroid Build Coastguard Worker//% 703*6777b538SAndroid Build Coastguard Worker//%- (BOOL)getEnum:(VALUE_TYPE *)value forKey:(KEY_TYPE##KisP$S##KisP)key { 704*6777b538SAndroid Build Coastguard Worker//% NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)]; 705*6777b538SAndroid Build Coastguard Worker//% if (wrapped && value) { 706*6777b538SAndroid Build Coastguard Worker//% VALUE_TYPE result = UNWRAP##VALUE_NAME(wrapped); 707*6777b538SAndroid Build Coastguard Worker//% if (!_validationFunc(result)) { 708*6777b538SAndroid Build Coastguard Worker//% result = kGPBUnrecognizedEnumeratorValue; 709*6777b538SAndroid Build Coastguard Worker//% } 710*6777b538SAndroid Build Coastguard Worker//% *value = result; 711*6777b538SAndroid Build Coastguard Worker//% } 712*6777b538SAndroid Build Coastguard Worker//% return (wrapped != NULL); 713*6777b538SAndroid Build Coastguard Worker//%} 714*6777b538SAndroid Build Coastguard Worker//% 715*6777b538SAndroid Build Coastguard Worker//%- (BOOL)getRawValue:(VALUE_TYPE *)rawValue forKey:(KEY_TYPE##KisP$S##KisP)key { 716*6777b538SAndroid Build Coastguard Worker//% NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)]; 717*6777b538SAndroid Build Coastguard Worker//% if (wrapped && rawValue) { 718*6777b538SAndroid Build Coastguard Worker//% *rawValue = UNWRAP##VALUE_NAME(wrapped); 719*6777b538SAndroid Build Coastguard Worker//% } 720*6777b538SAndroid Build Coastguard Worker//% return (wrapped != NULL); 721*6777b538SAndroid Build Coastguard Worker//%} 722*6777b538SAndroid Build Coastguard Worker//% 723*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateKeysAndEnumsUsingBlock: 724*6777b538SAndroid Build Coastguard Worker//% (void (NS_NOESCAPE ^)(KEY_TYPE KisP##key, VALUE_TYPE value, BOOL *stop))block { 725*6777b538SAndroid Build Coastguard Worker//% GPBEnumValidationFunc func = _validationFunc; 726*6777b538SAndroid Build Coastguard Worker//% BOOL stop = NO; 727*6777b538SAndroid Build Coastguard Worker//% NSEnumerator *keys = [_dictionary keyEnumerator]; 728*6777b538SAndroid Build Coastguard Worker//% ENUM_TYPE##KHELPER(KEY_TYPE)##aKey; 729*6777b538SAndroid Build Coastguard Worker//% while ((aKey = [keys nextObject])) { 730*6777b538SAndroid Build Coastguard Worker//% ENUM_TYPE##VHELPER(VALUE_TYPE)##aValue = _dictionary[aKey]; 731*6777b538SAndroid Build Coastguard Worker//% VALUE_TYPE unwrapped = UNWRAP##VALUE_NAME(aValue); 732*6777b538SAndroid Build Coastguard Worker//% if (!func(unwrapped)) { 733*6777b538SAndroid Build Coastguard Worker//% unwrapped = kGPBUnrecognizedEnumeratorValue; 734*6777b538SAndroid Build Coastguard Worker//% } 735*6777b538SAndroid Build Coastguard Worker//% block(UNWRAP##KEY_NAME(aKey), unwrapped, &stop); 736*6777b538SAndroid Build Coastguard Worker//% if (stop) { 737*6777b538SAndroid Build Coastguard Worker//% break; 738*6777b538SAndroid Build Coastguard Worker//% } 739*6777b538SAndroid Build Coastguard Worker//% } 740*6777b538SAndroid Build Coastguard Worker//%} 741*6777b538SAndroid Build Coastguard Worker//% 742*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, Value, Enum, value, Raw) 743*6777b538SAndroid Build Coastguard Worker//% 744*6777b538SAndroid Build Coastguard Worker//%- (void)setEnum:(VALUE_TYPE)value forKey:(KEY_TYPE##KisP$S##KisP)key { 745*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_KEY_##KHELPER(key, ) if (!_validationFunc(value)) { 746*6777b538SAndroid Build Coastguard Worker//% [NSException raise:NSInvalidArgumentException 747*6777b538SAndroid Build Coastguard Worker//% format:@"GPB##KEY_NAME##VALUE_NAME##Dictionary: Attempt to set an unknown enum value (%d)", 748*6777b538SAndroid Build Coastguard Worker//% value]; 749*6777b538SAndroid Build Coastguard Worker//% } 750*6777b538SAndroid Build Coastguard Worker//% 751*6777b538SAndroid Build Coastguard Worker//% [_dictionary setObject:WRAPPED##VHELPER(value) forKey:WRAPPED##KHELPER(key)]; 752*6777b538SAndroid Build Coastguard Worker//% if (_autocreator) { 753*6777b538SAndroid Build Coastguard Worker//% GPBAutocreatedDictionaryModified(_autocreator, self); 754*6777b538SAndroid Build Coastguard Worker//% } 755*6777b538SAndroid Build Coastguard Worker//%} 756*6777b538SAndroid Build Coastguard Worker//% 757*6777b538SAndroid Build Coastguard Worker//%@end 758*6777b538SAndroid Build Coastguard Worker//% 759*6777b538SAndroid Build Coastguard Worker 760*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, ACCESSOR_NAME) 761*6777b538SAndroid Build Coastguard Worker//%- (void)dealloc { 762*6777b538SAndroid Build Coastguard Worker//% NSAssert(!_autocreator, 763*6777b538SAndroid Build Coastguard Worker//% @"%@: Autocreator must be cleared before release, autocreator: %@", 764*6777b538SAndroid Build Coastguard Worker//% [self class], _autocreator); 765*6777b538SAndroid Build Coastguard Worker//% [_dictionary release]; 766*6777b538SAndroid Build Coastguard Worker//% [super dealloc]; 767*6777b538SAndroid Build Coastguard Worker//%} 768*6777b538SAndroid Build Coastguard Worker//% 769*6777b538SAndroid Build Coastguard Worker//%- (instancetype)copyWithZone:(NSZone *)zone { 770*6777b538SAndroid Build Coastguard Worker//% return [[GPB##KEY_NAME##VALUE_NAME##Dictionary allocWithZone:zone] initWithDictionary:self]; 771*6777b538SAndroid Build Coastguard Worker//%} 772*6777b538SAndroid Build Coastguard Worker//% 773*6777b538SAndroid Build Coastguard Worker//%- (BOOL)isEqual:(id)other { 774*6777b538SAndroid Build Coastguard Worker//% if (self == other) { 775*6777b538SAndroid Build Coastguard Worker//% return YES; 776*6777b538SAndroid Build Coastguard Worker//% } 777*6777b538SAndroid Build Coastguard Worker//% if (![other isKindOfClass:[GPB##KEY_NAME##VALUE_NAME##Dictionary class]]) { 778*6777b538SAndroid Build Coastguard Worker//% return NO; 779*6777b538SAndroid Build Coastguard Worker//% } 780*6777b538SAndroid Build Coastguard Worker//% GPB##KEY_NAME##VALUE_NAME##Dictionary *otherDictionary = other; 781*6777b538SAndroid Build Coastguard Worker//% return [_dictionary isEqual:otherDictionary->_dictionary]; 782*6777b538SAndroid Build Coastguard Worker//%} 783*6777b538SAndroid Build Coastguard Worker//% 784*6777b538SAndroid Build Coastguard Worker//%- (NSUInteger)hash { 785*6777b538SAndroid Build Coastguard Worker//% return _dictionary.count; 786*6777b538SAndroid Build Coastguard Worker//%} 787*6777b538SAndroid Build Coastguard Worker//% 788*6777b538SAndroid Build Coastguard Worker//%- (NSString *)description { 789*6777b538SAndroid Build Coastguard Worker//% return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 790*6777b538SAndroid Build Coastguard Worker//%} 791*6777b538SAndroid Build Coastguard Worker//% 792*6777b538SAndroid Build Coastguard Worker//%- (NSUInteger)count { 793*6777b538SAndroid Build Coastguard Worker//% return _dictionary.count; 794*6777b538SAndroid Build Coastguard Worker//%} 795*6777b538SAndroid Build Coastguard Worker//% 796*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock: 797*6777b538SAndroid Build Coastguard Worker//% (void (NS_NOESCAPE ^)(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop))block { 798*6777b538SAndroid Build Coastguard Worker//% BOOL stop = NO; 799*6777b538SAndroid Build Coastguard Worker//% NSDictionary *internal = _dictionary; 800*6777b538SAndroid Build Coastguard Worker//% NSEnumerator *keys = [internal keyEnumerator]; 801*6777b538SAndroid Build Coastguard Worker//% ENUM_TYPE##KHELPER(KEY_TYPE)##aKey; 802*6777b538SAndroid Build Coastguard Worker//% while ((aKey = [keys nextObject])) { 803*6777b538SAndroid Build Coastguard Worker//% ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey]; 804*6777b538SAndroid Build Coastguard Worker//% block(UNWRAP##KEY_NAME(aKey), UNWRAP##VALUE_NAME(a##VNAME_VAR$u), &stop); 805*6777b538SAndroid Build Coastguard Worker//% if (stop) { 806*6777b538SAndroid Build Coastguard Worker//% break; 807*6777b538SAndroid Build Coastguard Worker//% } 808*6777b538SAndroid Build Coastguard Worker//% } 809*6777b538SAndroid Build Coastguard Worker//%} 810*6777b538SAndroid Build Coastguard Worker//% 811*6777b538SAndroid Build Coastguard Worker//%EXTRA_METHODS_##VHELPER(KEY_NAME, VALUE_NAME)- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 812*6777b538SAndroid Build Coastguard Worker//% NSDictionary *internal = _dictionary; 813*6777b538SAndroid Build Coastguard Worker//% NSUInteger count = internal.count; 814*6777b538SAndroid Build Coastguard Worker//% if (count == 0) { 815*6777b538SAndroid Build Coastguard Worker//% return 0; 816*6777b538SAndroid Build Coastguard Worker//% } 817*6777b538SAndroid Build Coastguard Worker//% 818*6777b538SAndroid Build Coastguard Worker//% GPBDataType valueDataType = GPBGetFieldDataType(field); 819*6777b538SAndroid Build Coastguard Worker//% GPBDataType keyDataType = field.mapKeyDataType; 820*6777b538SAndroid Build Coastguard Worker//% size_t result = 0; 821*6777b538SAndroid Build Coastguard Worker//% NSEnumerator *keys = [internal keyEnumerator]; 822*6777b538SAndroid Build Coastguard Worker//% ENUM_TYPE##KHELPER(KEY_TYPE)##aKey; 823*6777b538SAndroid Build Coastguard Worker//% while ((aKey = [keys nextObject])) { 824*6777b538SAndroid Build Coastguard Worker//% ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey]; 825*6777b538SAndroid Build Coastguard Worker//% size_t msgSize = ComputeDict##KEY_NAME##FieldSize(UNWRAP##KEY_NAME(aKey), kMapKeyFieldNumber, keyDataType); 826*6777b538SAndroid Build Coastguard Worker//% msgSize += ComputeDict##VALUE_NAME##FieldSize(UNWRAP##VALUE_NAME(a##VNAME_VAR$u), kMapValueFieldNumber, valueDataType); 827*6777b538SAndroid Build Coastguard Worker//% result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 828*6777b538SAndroid Build Coastguard Worker//% } 829*6777b538SAndroid Build Coastguard Worker//% size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 830*6777b538SAndroid Build Coastguard Worker//% result += tagSize * count; 831*6777b538SAndroid Build Coastguard Worker//% return result; 832*6777b538SAndroid Build Coastguard Worker//%} 833*6777b538SAndroid Build Coastguard Worker//% 834*6777b538SAndroid Build Coastguard Worker//%- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 835*6777b538SAndroid Build Coastguard Worker//% asField:(GPBFieldDescriptor *)field { 836*6777b538SAndroid Build Coastguard Worker//% GPBDataType valueDataType = GPBGetFieldDataType(field); 837*6777b538SAndroid Build Coastguard Worker//% GPBDataType keyDataType = field.mapKeyDataType; 838*6777b538SAndroid Build Coastguard Worker//% uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 839*6777b538SAndroid Build Coastguard Worker//% NSDictionary *internal = _dictionary; 840*6777b538SAndroid Build Coastguard Worker//% NSEnumerator *keys = [internal keyEnumerator]; 841*6777b538SAndroid Build Coastguard Worker//% ENUM_TYPE##KHELPER(KEY_TYPE)##aKey; 842*6777b538SAndroid Build Coastguard Worker//% while ((aKey = [keys nextObject])) { 843*6777b538SAndroid Build Coastguard Worker//% ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey]; 844*6777b538SAndroid Build Coastguard Worker//% [outputStream writeInt32NoTag:tag]; 845*6777b538SAndroid Build Coastguard Worker//% // Write the size of the message. 846*6777b538SAndroid Build Coastguard Worker//% KEY_TYPE KisP##unwrappedKey = UNWRAP##KEY_NAME(aKey); 847*6777b538SAndroid Build Coastguard Worker//% VALUE_TYPE unwrappedValue = UNWRAP##VALUE_NAME(a##VNAME_VAR$u); 848*6777b538SAndroid Build Coastguard Worker//% size_t msgSize = ComputeDict##KEY_NAME##FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 849*6777b538SAndroid Build Coastguard Worker//% msgSize += ComputeDict##VALUE_NAME##FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 850*6777b538SAndroid Build Coastguard Worker//% [outputStream writeInt32NoTag:(int32_t)msgSize]; 851*6777b538SAndroid Build Coastguard Worker//% // Write the fields. 852*6777b538SAndroid Build Coastguard Worker//% WriteDict##KEY_NAME##Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 853*6777b538SAndroid Build Coastguard Worker//% WriteDict##VALUE_NAME##Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 854*6777b538SAndroid Build Coastguard Worker//% } 855*6777b538SAndroid Build Coastguard Worker//%} 856*6777b538SAndroid Build Coastguard Worker//% 857*6777b538SAndroid Build Coastguard Worker//%SERIAL_DATA_FOR_ENTRY_##VHELPER(KEY_NAME, VALUE_NAME)- (void)setGPBGenericValue:(GPBGenericValue *)value 858*6777b538SAndroid Build Coastguard Worker//% forGPBGenericValueKey:(GPBGenericValue *)key { 859*6777b538SAndroid Build Coastguard Worker//% [_dictionary setObject:WRAPPED##VHELPER(value->##GPBVALUE_##VHELPER(VALUE_NAME)##) forKey:WRAPPED##KHELPER(key->value##KEY_NAME)]; 860*6777b538SAndroid Build Coastguard Worker//%} 861*6777b538SAndroid Build Coastguard Worker//% 862*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 863*6777b538SAndroid Build Coastguard Worker//% [self enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock:^(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop) { 864*6777b538SAndroid Build Coastguard Worker//% #pragma unused(stop) 865*6777b538SAndroid Build Coastguard Worker//% block(TEXT_FORMAT_OBJ##KEY_NAME(key), TEXT_FORMAT_OBJ##VALUE_NAME(VNAME_VAR)); 866*6777b538SAndroid Build Coastguard Worker//% }]; 867*6777b538SAndroid Build Coastguard Worker//%} 868*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, ACCESSOR_NAME) 869*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME, VNAME_VAR, ACCESSOR_NAME) 870*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_REMOVE, VNAME_VAR, ACCESSOR_NAME) 871*6777b538SAndroid Build Coastguard Worker//%- (void)add##ACCESSOR_NAME##EntriesFromDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)otherDictionary { 872*6777b538SAndroid Build Coastguard Worker//% if (otherDictionary) { 873*6777b538SAndroid Build Coastguard Worker//% [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 874*6777b538SAndroid Build Coastguard Worker//% if (_autocreator) { 875*6777b538SAndroid Build Coastguard Worker//% GPBAutocreatedDictionaryModified(_autocreator, self); 876*6777b538SAndroid Build Coastguard Worker//% } 877*6777b538SAndroid Build Coastguard Worker//% } 878*6777b538SAndroid Build Coastguard Worker//%} 879*6777b538SAndroid Build Coastguard Worker//% 880*6777b538SAndroid Build Coastguard Worker//%- (void)set##ACCESSOR_NAME##VNAME##:(VALUE_TYPE)VNAME_VAR forKey:(KEY_TYPE##KisP$S##KisP)key { 881*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME_VAR, )##DICTIONARY_VALIDATE_KEY_##KHELPER(key, ) [_dictionary setObject:WRAPPED##VHELPER(VNAME_VAR) forKey:WRAPPED##KHELPER(key)]; 882*6777b538SAndroid Build Coastguard Worker//% if (_autocreator) { 883*6777b538SAndroid Build Coastguard Worker//% GPBAutocreatedDictionaryModified(_autocreator, self); 884*6777b538SAndroid Build Coastguard Worker//% } 885*6777b538SAndroid Build Coastguard Worker//%} 886*6777b538SAndroid Build Coastguard Worker//% 887*6777b538SAndroid Build Coastguard Worker//%- (void)remove##VNAME_REMOVE##ForKey:(KEY_TYPE##KisP$S##KisP)aKey { 888*6777b538SAndroid Build Coastguard Worker//% [_dictionary removeObjectForKey:WRAPPED##KHELPER(aKey)]; 889*6777b538SAndroid Build Coastguard Worker//%} 890*6777b538SAndroid Build Coastguard Worker//% 891*6777b538SAndroid Build Coastguard Worker//%- (void)removeAll { 892*6777b538SAndroid Build Coastguard Worker//% [_dictionary removeAllObjects]; 893*6777b538SAndroid Build Coastguard Worker//%} 894*6777b538SAndroid Build Coastguard Worker 895*6777b538SAndroid Build Coastguard Worker// 896*6777b538SAndroid Build Coastguard Worker// Custom Generation for Bool keys 897*6777b538SAndroid Build Coastguard Worker// 898*6777b538SAndroid Build Coastguard Worker 899*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_POD_IMPL(VALUE_NAME, VALUE_TYPE) 900*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, POD, VALUE_NAME, value) 901*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(VALUE_NAME, VALUE_TYPE) 902*6777b538SAndroid Build Coastguard Worker//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, OBJECT, Object, object) 903*6777b538SAndroid Build Coastguard Worker 904*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, HELPER, VNAME, VNAME_VAR) 905*6777b538SAndroid Build Coastguard Worker//%#pragma mark - Bool -> VALUE_NAME 906*6777b538SAndroid Build Coastguard Worker//% 907*6777b538SAndroid Build Coastguard Worker//%@implementation GPBBool##VALUE_NAME##Dictionary { 908*6777b538SAndroid Build Coastguard Worker//% @package 909*6777b538SAndroid Build Coastguard Worker//% VALUE_TYPE _values[2]; 910*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_HAS_STORAGE_##HELPER()} 911*6777b538SAndroid Build Coastguard Worker//% 912*6777b538SAndroid Build Coastguard Worker//%- (instancetype)init { 913*6777b538SAndroid Build Coastguard Worker//% return [self initWith##VNAME##s:NULL forKeys:NULL count:0]; 914*6777b538SAndroid Build Coastguard Worker//%} 915*6777b538SAndroid Build Coastguard Worker//% 916*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_INITS_##HELPER(VALUE_NAME, VALUE_TYPE) 917*6777b538SAndroid Build Coastguard Worker//% 918*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithCapacity:(NSUInteger)numItems { 919*6777b538SAndroid Build Coastguard Worker//% #pragma unused(numItems) 920*6777b538SAndroid Build Coastguard Worker//% return [self initWith##VNAME##s:NULL forKeys:NULL count:0]; 921*6777b538SAndroid Build Coastguard Worker//%} 922*6777b538SAndroid Build Coastguard Worker//% 923*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_DEALLOC##HELPER() 924*6777b538SAndroid Build Coastguard Worker//% 925*6777b538SAndroid Build Coastguard Worker//%- (instancetype)copyWithZone:(NSZone *)zone { 926*6777b538SAndroid Build Coastguard Worker//% return [[GPBBool##VALUE_NAME##Dictionary allocWithZone:zone] initWithDictionary:self]; 927*6777b538SAndroid Build Coastguard Worker//%} 928*6777b538SAndroid Build Coastguard Worker//% 929*6777b538SAndroid Build Coastguard Worker//%- (BOOL)isEqual:(id)other { 930*6777b538SAndroid Build Coastguard Worker//% if (self == other) { 931*6777b538SAndroid Build Coastguard Worker//% return YES; 932*6777b538SAndroid Build Coastguard Worker//% } 933*6777b538SAndroid Build Coastguard Worker//% if (![other isKindOfClass:[GPBBool##VALUE_NAME##Dictionary class]]) { 934*6777b538SAndroid Build Coastguard Worker//% return NO; 935*6777b538SAndroid Build Coastguard Worker//% } 936*6777b538SAndroid Build Coastguard Worker//% GPBBool##VALUE_NAME##Dictionary *otherDictionary = other; 937*6777b538SAndroid Build Coastguard Worker//% if ((BOOL_DICT_W_HAS##HELPER(0, ) != BOOL_DICT_W_HAS##HELPER(0, otherDictionary->)) || 938*6777b538SAndroid Build Coastguard Worker//% (BOOL_DICT_W_HAS##HELPER(1, ) != BOOL_DICT_W_HAS##HELPER(1, otherDictionary->))) { 939*6777b538SAndroid Build Coastguard Worker//% return NO; 940*6777b538SAndroid Build Coastguard Worker//% } 941*6777b538SAndroid Build Coastguard Worker//% if ((BOOL_DICT_W_HAS##HELPER(0, ) && (NEQ_##HELPER(_values[0], otherDictionary->_values[0]))) || 942*6777b538SAndroid Build Coastguard Worker//% (BOOL_DICT_W_HAS##HELPER(1, ) && (NEQ_##HELPER(_values[1], otherDictionary->_values[1])))) { 943*6777b538SAndroid Build Coastguard Worker//% return NO; 944*6777b538SAndroid Build Coastguard Worker//% } 945*6777b538SAndroid Build Coastguard Worker//% return YES; 946*6777b538SAndroid Build Coastguard Worker//%} 947*6777b538SAndroid Build Coastguard Worker//% 948*6777b538SAndroid Build Coastguard Worker//%- (NSUInteger)hash { 949*6777b538SAndroid Build Coastguard Worker//% return (BOOL_DICT_W_HAS##HELPER(0, ) ? 1 : 0) + (BOOL_DICT_W_HAS##HELPER(1, ) ? 1 : 0); 950*6777b538SAndroid Build Coastguard Worker//%} 951*6777b538SAndroid Build Coastguard Worker//% 952*6777b538SAndroid Build Coastguard Worker//%- (NSString *)description { 953*6777b538SAndroid Build Coastguard Worker//% NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 954*6777b538SAndroid Build Coastguard Worker//% if (BOOL_DICT_W_HAS##HELPER(0, )) { 955*6777b538SAndroid Build Coastguard Worker//% [result appendFormat:@"NO: STR_FORMAT_##HELPER(VALUE_NAME)", _values[0]]; 956*6777b538SAndroid Build Coastguard Worker//% } 957*6777b538SAndroid Build Coastguard Worker//% if (BOOL_DICT_W_HAS##HELPER(1, )) { 958*6777b538SAndroid Build Coastguard Worker//% [result appendFormat:@"YES: STR_FORMAT_##HELPER(VALUE_NAME)", _values[1]]; 959*6777b538SAndroid Build Coastguard Worker//% } 960*6777b538SAndroid Build Coastguard Worker//% [result appendString:@" }"]; 961*6777b538SAndroid Build Coastguard Worker//% return result; 962*6777b538SAndroid Build Coastguard Worker//%} 963*6777b538SAndroid Build Coastguard Worker//% 964*6777b538SAndroid Build Coastguard Worker//%- (NSUInteger)count { 965*6777b538SAndroid Build Coastguard Worker//% return (BOOL_DICT_W_HAS##HELPER(0, ) ? 1 : 0) + (BOOL_DICT_W_HAS##HELPER(1, ) ? 1 : 0); 966*6777b538SAndroid Build Coastguard Worker//%} 967*6777b538SAndroid Build Coastguard Worker//% 968*6777b538SAndroid Build Coastguard Worker//%BOOL_VALUE_FOR_KEY_##HELPER(VALUE_NAME, VALUE_TYPE) 969*6777b538SAndroid Build Coastguard Worker//% 970*6777b538SAndroid Build Coastguard Worker//%BOOL_SET_GPBVALUE_FOR_KEY_##HELPER(VALUE_NAME, VALUE_TYPE, VisP) 971*6777b538SAndroid Build Coastguard Worker//% 972*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 973*6777b538SAndroid Build Coastguard Worker//% if (BOOL_DICT_HAS##HELPER(0, )) { 974*6777b538SAndroid Build Coastguard Worker//% block(@"false", TEXT_FORMAT_OBJ##VALUE_NAME(_values[0])); 975*6777b538SAndroid Build Coastguard Worker//% } 976*6777b538SAndroid Build Coastguard Worker//% if (BOOL_DICT_W_HAS##HELPER(1, )) { 977*6777b538SAndroid Build Coastguard Worker//% block(@"true", TEXT_FORMAT_OBJ##VALUE_NAME(_values[1])); 978*6777b538SAndroid Build Coastguard Worker//% } 979*6777b538SAndroid Build Coastguard Worker//%} 980*6777b538SAndroid Build Coastguard Worker//% 981*6777b538SAndroid Build Coastguard Worker//%- (void)enumerateKeysAnd##VNAME##sUsingBlock: 982*6777b538SAndroid Build Coastguard Worker//% (void (NS_NOESCAPE ^)(BOOL key, VALUE_TYPE VNAME_VAR, BOOL *stop))block { 983*6777b538SAndroid Build Coastguard Worker//% BOOL stop = NO; 984*6777b538SAndroid Build Coastguard Worker//% if (BOOL_DICT_HAS##HELPER(0, )) { 985*6777b538SAndroid Build Coastguard Worker//% block(NO, _values[0], &stop); 986*6777b538SAndroid Build Coastguard Worker//% } 987*6777b538SAndroid Build Coastguard Worker//% if (!stop && BOOL_DICT_W_HAS##HELPER(1, )) { 988*6777b538SAndroid Build Coastguard Worker//% block(YES, _values[1], &stop); 989*6777b538SAndroid Build Coastguard Worker//% } 990*6777b538SAndroid Build Coastguard Worker//%} 991*6777b538SAndroid Build Coastguard Worker//% 992*6777b538SAndroid Build Coastguard Worker//%BOOL_EXTRA_METHODS_##HELPER(Bool, VALUE_NAME)- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 993*6777b538SAndroid Build Coastguard Worker//% GPBDataType valueDataType = GPBGetFieldDataType(field); 994*6777b538SAndroid Build Coastguard Worker//% NSUInteger count = 0; 995*6777b538SAndroid Build Coastguard Worker//% size_t result = 0; 996*6777b538SAndroid Build Coastguard Worker//% for (int i = 0; i < 2; ++i) { 997*6777b538SAndroid Build Coastguard Worker//% if (BOOL_DICT_HAS##HELPER(i, )) { 998*6777b538SAndroid Build Coastguard Worker//% ++count; 999*6777b538SAndroid Build Coastguard Worker//% size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 1000*6777b538SAndroid Build Coastguard Worker//% msgSize += ComputeDict##VALUE_NAME##FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 1001*6777b538SAndroid Build Coastguard Worker//% result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 1002*6777b538SAndroid Build Coastguard Worker//% } 1003*6777b538SAndroid Build Coastguard Worker//% } 1004*6777b538SAndroid Build Coastguard Worker//% size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 1005*6777b538SAndroid Build Coastguard Worker//% result += tagSize * count; 1006*6777b538SAndroid Build Coastguard Worker//% return result; 1007*6777b538SAndroid Build Coastguard Worker//%} 1008*6777b538SAndroid Build Coastguard Worker//% 1009*6777b538SAndroid Build Coastguard Worker//%- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 1010*6777b538SAndroid Build Coastguard Worker//% asField:(GPBFieldDescriptor *)field { 1011*6777b538SAndroid Build Coastguard Worker//% GPBDataType valueDataType = GPBGetFieldDataType(field); 1012*6777b538SAndroid Build Coastguard Worker//% uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 1013*6777b538SAndroid Build Coastguard Worker//% for (int i = 0; i < 2; ++i) { 1014*6777b538SAndroid Build Coastguard Worker//% if (BOOL_DICT_HAS##HELPER(i, )) { 1015*6777b538SAndroid Build Coastguard Worker//% // Write the tag. 1016*6777b538SAndroid Build Coastguard Worker//% [outputStream writeInt32NoTag:tag]; 1017*6777b538SAndroid Build Coastguard Worker//% // Write the size of the message. 1018*6777b538SAndroid Build Coastguard Worker//% size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 1019*6777b538SAndroid Build Coastguard Worker//% msgSize += ComputeDict##VALUE_NAME##FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 1020*6777b538SAndroid Build Coastguard Worker//% [outputStream writeInt32NoTag:(int32_t)msgSize]; 1021*6777b538SAndroid Build Coastguard Worker//% // Write the fields. 1022*6777b538SAndroid Build Coastguard Worker//% WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 1023*6777b538SAndroid Build Coastguard Worker//% WriteDict##VALUE_NAME##Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 1024*6777b538SAndroid Build Coastguard Worker//% } 1025*6777b538SAndroid Build Coastguard Worker//% } 1026*6777b538SAndroid Build Coastguard Worker//%} 1027*6777b538SAndroid Build Coastguard Worker//% 1028*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_MUTATIONS_##HELPER(VALUE_NAME, VALUE_TYPE) 1029*6777b538SAndroid Build Coastguard Worker//% 1030*6777b538SAndroid Build Coastguard Worker//%@end 1031*6777b538SAndroid Build Coastguard Worker//% 1032*6777b538SAndroid Build Coastguard Worker 1033*6777b538SAndroid Build Coastguard Worker 1034*6777b538SAndroid Build Coastguard Worker// 1035*6777b538SAndroid Build Coastguard Worker// Helpers for PODs 1036*6777b538SAndroid Build Coastguard Worker// 1037*6777b538SAndroid Build Coastguard Worker 1038*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE VALUE_FOR_KEY_POD(KEY_TYPE, VALUE_NAME, VALUE_TYPE, KHELPER) 1039*6777b538SAndroid Build Coastguard Worker//%- (BOOL)get##VALUE_NAME##:(nullable VALUE_TYPE *)value forKey:(KEY_TYPE)key { 1040*6777b538SAndroid Build Coastguard Worker//% NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)]; 1041*6777b538SAndroid Build Coastguard Worker//% if (wrapped && value) { 1042*6777b538SAndroid Build Coastguard Worker//% *value = UNWRAP##VALUE_NAME(wrapped); 1043*6777b538SAndroid Build Coastguard Worker//% } 1044*6777b538SAndroid Build Coastguard Worker//% return (wrapped != NULL); 1045*6777b538SAndroid Build Coastguard Worker//%} 1046*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE WRAPPEDPOD(VALUE) 1047*6777b538SAndroid Build Coastguard Worker//%@(VALUE) 1048*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPUInt32(VALUE) 1049*6777b538SAndroid Build Coastguard Worker//%[VALUE unsignedIntValue] 1050*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPInt32(VALUE) 1051*6777b538SAndroid Build Coastguard Worker//%[VALUE intValue] 1052*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPUInt64(VALUE) 1053*6777b538SAndroid Build Coastguard Worker//%[VALUE unsignedLongLongValue] 1054*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPInt64(VALUE) 1055*6777b538SAndroid Build Coastguard Worker//%[VALUE longLongValue] 1056*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPBool(VALUE) 1057*6777b538SAndroid Build Coastguard Worker//%[VALUE boolValue] 1058*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPFloat(VALUE) 1059*6777b538SAndroid Build Coastguard Worker//%[VALUE floatValue] 1060*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPDouble(VALUE) 1061*6777b538SAndroid Build Coastguard Worker//%[VALUE doubleValue] 1062*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPEnum(VALUE) 1063*6777b538SAndroid Build Coastguard Worker//%[VALUE intValue] 1064*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJUInt32(VALUE) 1065*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%u", VALUE] 1066*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJInt32(VALUE) 1067*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%d", VALUE] 1068*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJUInt64(VALUE) 1069*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%llu", VALUE] 1070*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJInt64(VALUE) 1071*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%lld", VALUE] 1072*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJBool(VALUE) 1073*6777b538SAndroid Build Coastguard Worker//%(VALUE ? @"true" : @"false") 1074*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJFloat(VALUE) 1075*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%.*g", FLT_DIG, VALUE] 1076*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJDouble(VALUE) 1077*6777b538SAndroid Build Coastguard Worker//%[NSString stringWithFormat:@"%.*lg", DBL_DIG, VALUE] 1078*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJEnum(VALUE) 1079*6777b538SAndroid Build Coastguard Worker//%@(VALUE) 1080*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEPOD(TYPE) 1081*6777b538SAndroid Build Coastguard Worker//%NSNumber * 1082*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE NEQ_POD(VAL1, VAL2) 1083*6777b538SAndroid Build Coastguard Worker//%VAL1 != VAL2 1084*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE EXTRA_METHODS_POD(KEY_NAME, VALUE_NAME) 1085*6777b538SAndroid Build Coastguard Worker// Empty 1086*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_EXTRA_METHODS_POD(KEY_NAME, VALUE_NAME) 1087*6777b538SAndroid Build Coastguard Worker// Empty 1088*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD(KEY_NAME, VALUE_NAME) 1089*6777b538SAndroid Build Coastguard Worker//%SERIAL_DATA_FOR_ENTRY_POD_##VALUE_NAME(KEY_NAME) 1090*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_UInt32(KEY_NAME) 1091*6777b538SAndroid Build Coastguard Worker// Empty 1092*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Int32(KEY_NAME) 1093*6777b538SAndroid Build Coastguard Worker// Empty 1094*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_UInt64(KEY_NAME) 1095*6777b538SAndroid Build Coastguard Worker// Empty 1096*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Int64(KEY_NAME) 1097*6777b538SAndroid Build Coastguard Worker// Empty 1098*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Bool(KEY_NAME) 1099*6777b538SAndroid Build Coastguard Worker// Empty 1100*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Float(KEY_NAME) 1101*6777b538SAndroid Build Coastguard Worker// Empty 1102*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Double(KEY_NAME) 1103*6777b538SAndroid Build Coastguard Worker// Empty 1104*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_POD_Enum(KEY_NAME) 1105*6777b538SAndroid Build Coastguard Worker//%- (NSData *)serializedDataForUnknownValue:(int32_t)value 1106*6777b538SAndroid Build Coastguard Worker//% forKey:(GPBGenericValue *)key 1107*6777b538SAndroid Build Coastguard Worker//% keyDataType:(GPBDataType)keyDataType { 1108*6777b538SAndroid Build Coastguard Worker//% size_t msgSize = ComputeDict##KEY_NAME##FieldSize(key->value##KEY_NAME, kMapKeyFieldNumber, keyDataType); 1109*6777b538SAndroid Build Coastguard Worker//% msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum); 1110*6777b538SAndroid Build Coastguard Worker//% NSMutableData *data = [NSMutableData dataWithLength:msgSize]; 1111*6777b538SAndroid Build Coastguard Worker//% GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data]; 1112*6777b538SAndroid Build Coastguard Worker//% WriteDict##KEY_NAME##Field(outputStream, key->value##KEY_NAME, kMapKeyFieldNumber, keyDataType); 1113*6777b538SAndroid Build Coastguard Worker//% WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum); 1114*6777b538SAndroid Build Coastguard Worker//% [outputStream release]; 1115*6777b538SAndroid Build Coastguard Worker//% return data; 1116*6777b538SAndroid Build Coastguard Worker//%} 1117*6777b538SAndroid Build Coastguard Worker//% 1118*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE GPBVALUE_POD(VALUE_NAME) 1119*6777b538SAndroid Build Coastguard Worker//%value##VALUE_NAME 1120*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_VALUE_POD(VALUE_NAME, EXTRA_INDENT) 1121*6777b538SAndroid Build Coastguard Worker// Empty 1122*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_KEY_POD(KEY_NAME, EXTRA_INDENT) 1123*6777b538SAndroid Build Coastguard Worker// Empty 1124*6777b538SAndroid Build Coastguard Worker 1125*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HAS_STORAGE_POD() 1126*6777b538SAndroid Build Coastguard Worker//% BOOL _valueSet[2]; 1127*6777b538SAndroid Build Coastguard Worker//% 1128*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_INITS_POD(VALUE_NAME, VALUE_TYPE) 1129*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWith##VALUE_NAME##s:(const VALUE_TYPE [])values 1130*6777b538SAndroid Build Coastguard Worker//% ##VALUE_NAME$S## forKeys:(const BOOL [])keys 1131*6777b538SAndroid Build Coastguard Worker//% ##VALUE_NAME$S## count:(NSUInteger)count { 1132*6777b538SAndroid Build Coastguard Worker//% self = [super init]; 1133*6777b538SAndroid Build Coastguard Worker//% if (self) { 1134*6777b538SAndroid Build Coastguard Worker//% for (NSUInteger i = 0; i < count; ++i) { 1135*6777b538SAndroid Build Coastguard Worker//% int idx = keys[i] ? 1 : 0; 1136*6777b538SAndroid Build Coastguard Worker//% _values[idx] = values[i]; 1137*6777b538SAndroid Build Coastguard Worker//% _valueSet[idx] = YES; 1138*6777b538SAndroid Build Coastguard Worker//% } 1139*6777b538SAndroid Build Coastguard Worker//% } 1140*6777b538SAndroid Build Coastguard Worker//% return self; 1141*6777b538SAndroid Build Coastguard Worker//%} 1142*6777b538SAndroid Build Coastguard Worker//% 1143*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)dictionary { 1144*6777b538SAndroid Build Coastguard Worker//% self = [self initWith##VALUE_NAME##s:NULL forKeys:NULL count:0]; 1145*6777b538SAndroid Build Coastguard Worker//% if (self) { 1146*6777b538SAndroid Build Coastguard Worker//% if (dictionary) { 1147*6777b538SAndroid Build Coastguard Worker//% for (int i = 0; i < 2; ++i) { 1148*6777b538SAndroid Build Coastguard Worker//% if (dictionary->_valueSet[i]) { 1149*6777b538SAndroid Build Coastguard Worker//% _values[i] = dictionary->_values[i]; 1150*6777b538SAndroid Build Coastguard Worker//% _valueSet[i] = YES; 1151*6777b538SAndroid Build Coastguard Worker//% } 1152*6777b538SAndroid Build Coastguard Worker//% } 1153*6777b538SAndroid Build Coastguard Worker//% } 1154*6777b538SAndroid Build Coastguard Worker//% } 1155*6777b538SAndroid Build Coastguard Worker//% return self; 1156*6777b538SAndroid Build Coastguard Worker//%} 1157*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_DEALLOCPOD() 1158*6777b538SAndroid Build Coastguard Worker//%#if !defined(NS_BLOCK_ASSERTIONS) 1159*6777b538SAndroid Build Coastguard Worker//%- (void)dealloc { 1160*6777b538SAndroid Build Coastguard Worker//% NSAssert(!_autocreator, 1161*6777b538SAndroid Build Coastguard Worker//% @"%@: Autocreator must be cleared before release, autocreator: %@", 1162*6777b538SAndroid Build Coastguard Worker//% [self class], _autocreator); 1163*6777b538SAndroid Build Coastguard Worker//% [super dealloc]; 1164*6777b538SAndroid Build Coastguard Worker//%} 1165*6777b538SAndroid Build Coastguard Worker//%#endif // !defined(NS_BLOCK_ASSERTIONS) 1166*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_W_HASPOD(IDX, REF) 1167*6777b538SAndroid Build Coastguard Worker//%BOOL_DICT_HASPOD(IDX, REF) 1168*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HASPOD(IDX, REF) 1169*6777b538SAndroid Build Coastguard Worker//%REF##_valueSet[IDX] 1170*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_POD(VALUE_NAME, VALUE_TYPE) 1171*6777b538SAndroid Build Coastguard Worker//%- (BOOL)get##VALUE_NAME##:(VALUE_TYPE *)value forKey:(BOOL)key { 1172*6777b538SAndroid Build Coastguard Worker//% int idx = (key ? 1 : 0); 1173*6777b538SAndroid Build Coastguard Worker//% if (_valueSet[idx]) { 1174*6777b538SAndroid Build Coastguard Worker//% if (value) { 1175*6777b538SAndroid Build Coastguard Worker//% *value = _values[idx]; 1176*6777b538SAndroid Build Coastguard Worker//% } 1177*6777b538SAndroid Build Coastguard Worker//% return YES; 1178*6777b538SAndroid Build Coastguard Worker//% } 1179*6777b538SAndroid Build Coastguard Worker//% return NO; 1180*6777b538SAndroid Build Coastguard Worker//%} 1181*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_SET_GPBVALUE_FOR_KEY_POD(VALUE_NAME, VALUE_TYPE, VisP) 1182*6777b538SAndroid Build Coastguard Worker//%- (void)setGPBGenericValue:(GPBGenericValue *)value 1183*6777b538SAndroid Build Coastguard Worker//% forGPBGenericValueKey:(GPBGenericValue *)key { 1184*6777b538SAndroid Build Coastguard Worker//% int idx = (key->valueBool ? 1 : 0); 1185*6777b538SAndroid Build Coastguard Worker//% _values[idx] = value->value##VALUE_NAME; 1186*6777b538SAndroid Build Coastguard Worker//% _valueSet[idx] = YES; 1187*6777b538SAndroid Build Coastguard Worker//%} 1188*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_MUTATIONS_POD(VALUE_NAME, VALUE_TYPE) 1189*6777b538SAndroid Build Coastguard Worker//%- (void)addEntriesFromDictionary:(GPBBool##VALUE_NAME##Dictionary *)otherDictionary { 1190*6777b538SAndroid Build Coastguard Worker//% if (otherDictionary) { 1191*6777b538SAndroid Build Coastguard Worker//% for (int i = 0; i < 2; ++i) { 1192*6777b538SAndroid Build Coastguard Worker//% if (otherDictionary->_valueSet[i]) { 1193*6777b538SAndroid Build Coastguard Worker//% _valueSet[i] = YES; 1194*6777b538SAndroid Build Coastguard Worker//% _values[i] = otherDictionary->_values[i]; 1195*6777b538SAndroid Build Coastguard Worker//% } 1196*6777b538SAndroid Build Coastguard Worker//% } 1197*6777b538SAndroid Build Coastguard Worker//% if (_autocreator) { 1198*6777b538SAndroid Build Coastguard Worker//% GPBAutocreatedDictionaryModified(_autocreator, self); 1199*6777b538SAndroid Build Coastguard Worker//% } 1200*6777b538SAndroid Build Coastguard Worker//% } 1201*6777b538SAndroid Build Coastguard Worker//%} 1202*6777b538SAndroid Build Coastguard Worker//% 1203*6777b538SAndroid Build Coastguard Worker//%- (void)set##VALUE_NAME:(VALUE_TYPE)value forKey:(BOOL)key { 1204*6777b538SAndroid Build Coastguard Worker//% int idx = (key ? 1 : 0); 1205*6777b538SAndroid Build Coastguard Worker//% _values[idx] = value; 1206*6777b538SAndroid Build Coastguard Worker//% _valueSet[idx] = YES; 1207*6777b538SAndroid Build Coastguard Worker//% if (_autocreator) { 1208*6777b538SAndroid Build Coastguard Worker//% GPBAutocreatedDictionaryModified(_autocreator, self); 1209*6777b538SAndroid Build Coastguard Worker//% } 1210*6777b538SAndroid Build Coastguard Worker//%} 1211*6777b538SAndroid Build Coastguard Worker//% 1212*6777b538SAndroid Build Coastguard Worker//%- (void)remove##VALUE_NAME##ForKey:(BOOL)aKey { 1213*6777b538SAndroid Build Coastguard Worker//% _valueSet[aKey ? 1 : 0] = NO; 1214*6777b538SAndroid Build Coastguard Worker//%} 1215*6777b538SAndroid Build Coastguard Worker//% 1216*6777b538SAndroid Build Coastguard Worker//%- (void)removeAll { 1217*6777b538SAndroid Build Coastguard Worker//% _valueSet[0] = NO; 1218*6777b538SAndroid Build Coastguard Worker//% _valueSet[1] = NO; 1219*6777b538SAndroid Build Coastguard Worker//%} 1220*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_POD(VALUE_NAME) 1221*6777b538SAndroid Build Coastguard Worker//%STR_FORMAT_##VALUE_NAME() 1222*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_UInt32() 1223*6777b538SAndroid Build Coastguard Worker//%%u 1224*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Int32() 1225*6777b538SAndroid Build Coastguard Worker//%%d 1226*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_UInt64() 1227*6777b538SAndroid Build Coastguard Worker//%%llu 1228*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Int64() 1229*6777b538SAndroid Build Coastguard Worker//%%lld 1230*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Bool() 1231*6777b538SAndroid Build Coastguard Worker//%%d 1232*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Float() 1233*6777b538SAndroid Build Coastguard Worker//%%f 1234*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_Double() 1235*6777b538SAndroid Build Coastguard Worker//%%lf 1236*6777b538SAndroid Build Coastguard Worker 1237*6777b538SAndroid Build Coastguard Worker// 1238*6777b538SAndroid Build Coastguard Worker// Helpers for Objects 1239*6777b538SAndroid Build Coastguard Worker// 1240*6777b538SAndroid Build Coastguard Worker 1241*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE VALUE_FOR_KEY_OBJECT(KEY_TYPE, VALUE_NAME, VALUE_TYPE, KHELPER) 1242*6777b538SAndroid Build Coastguard Worker//%- (VALUE_TYPE)objectForKey:(KEY_TYPE)key { 1243*6777b538SAndroid Build Coastguard Worker//% VALUE_TYPE result = [_dictionary objectForKey:WRAPPED##KHELPER(key)]; 1244*6777b538SAndroid Build Coastguard Worker//% return result; 1245*6777b538SAndroid Build Coastguard Worker//%} 1246*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE WRAPPEDOBJECT(VALUE) 1247*6777b538SAndroid Build Coastguard Worker//%VALUE 1248*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPString(VALUE) 1249*6777b538SAndroid Build Coastguard Worker//%VALUE 1250*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE UNWRAPObject(VALUE) 1251*6777b538SAndroid Build Coastguard Worker//%VALUE 1252*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJString(VALUE) 1253*6777b538SAndroid Build Coastguard Worker//%VALUE 1254*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE TEXT_FORMAT_OBJObject(VALUE) 1255*6777b538SAndroid Build Coastguard Worker//%VALUE 1256*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEOBJECT(TYPE) 1257*6777b538SAndroid Build Coastguard Worker//%ENUM_TYPEOBJECT_##TYPE() 1258*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEOBJECT_NSString() 1259*6777b538SAndroid Build Coastguard Worker//%NSString * 1260*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE ENUM_TYPEOBJECT_id() 1261*6777b538SAndroid Build Coastguard Worker//%id ## 1262*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE NEQ_OBJECT(VAL1, VAL2) 1263*6777b538SAndroid Build Coastguard Worker//%![VAL1 isEqual:VAL2] 1264*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE EXTRA_METHODS_OBJECT(KEY_NAME, VALUE_NAME) 1265*6777b538SAndroid Build Coastguard Worker//%- (BOOL)isInitialized { 1266*6777b538SAndroid Build Coastguard Worker//% for (GPBMessage *msg in [_dictionary objectEnumerator]) { 1267*6777b538SAndroid Build Coastguard Worker//% if (!msg.initialized) { 1268*6777b538SAndroid Build Coastguard Worker//% return NO; 1269*6777b538SAndroid Build Coastguard Worker//% } 1270*6777b538SAndroid Build Coastguard Worker//% } 1271*6777b538SAndroid Build Coastguard Worker//% return YES; 1272*6777b538SAndroid Build Coastguard Worker//%} 1273*6777b538SAndroid Build Coastguard Worker//% 1274*6777b538SAndroid Build Coastguard Worker//%- (instancetype)deepCopyWithZone:(NSZone *)zone { 1275*6777b538SAndroid Build Coastguard Worker//% GPB##KEY_NAME##VALUE_NAME##Dictionary *newDict = 1276*6777b538SAndroid Build Coastguard Worker//% [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init]; 1277*6777b538SAndroid Build Coastguard Worker//% NSEnumerator *keys = [_dictionary keyEnumerator]; 1278*6777b538SAndroid Build Coastguard Worker//% id aKey; 1279*6777b538SAndroid Build Coastguard Worker//% NSMutableDictionary *internalDict = newDict->_dictionary; 1280*6777b538SAndroid Build Coastguard Worker//% while ((aKey = [keys nextObject])) { 1281*6777b538SAndroid Build Coastguard Worker//% GPBMessage *msg = _dictionary[aKey]; 1282*6777b538SAndroid Build Coastguard Worker//% GPBMessage *copiedMsg = [msg copyWithZone:zone]; 1283*6777b538SAndroid Build Coastguard Worker//% [internalDict setObject:copiedMsg forKey:aKey]; 1284*6777b538SAndroid Build Coastguard Worker//% [copiedMsg release]; 1285*6777b538SAndroid Build Coastguard Worker//% } 1286*6777b538SAndroid Build Coastguard Worker//% return newDict; 1287*6777b538SAndroid Build Coastguard Worker//%} 1288*6777b538SAndroid Build Coastguard Worker//% 1289*6777b538SAndroid Build Coastguard Worker//% 1290*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_EXTRA_METHODS_OBJECT(KEY_NAME, VALUE_NAME) 1291*6777b538SAndroid Build Coastguard Worker//%- (BOOL)isInitialized { 1292*6777b538SAndroid Build Coastguard Worker//% if (_values[0] && ![_values[0] isInitialized]) { 1293*6777b538SAndroid Build Coastguard Worker//% return NO; 1294*6777b538SAndroid Build Coastguard Worker//% } 1295*6777b538SAndroid Build Coastguard Worker//% if (_values[1] && ![_values[1] isInitialized]) { 1296*6777b538SAndroid Build Coastguard Worker//% return NO; 1297*6777b538SAndroid Build Coastguard Worker//% } 1298*6777b538SAndroid Build Coastguard Worker//% return YES; 1299*6777b538SAndroid Build Coastguard Worker//%} 1300*6777b538SAndroid Build Coastguard Worker//% 1301*6777b538SAndroid Build Coastguard Worker//%- (instancetype)deepCopyWithZone:(NSZone *)zone { 1302*6777b538SAndroid Build Coastguard Worker//% GPB##KEY_NAME##VALUE_NAME##Dictionary *newDict = 1303*6777b538SAndroid Build Coastguard Worker//% [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init]; 1304*6777b538SAndroid Build Coastguard Worker//% for (int i = 0; i < 2; ++i) { 1305*6777b538SAndroid Build Coastguard Worker//% if (_values[i] != nil) { 1306*6777b538SAndroid Build Coastguard Worker//% newDict->_values[i] = [_values[i] copyWithZone:zone]; 1307*6777b538SAndroid Build Coastguard Worker//% } 1308*6777b538SAndroid Build Coastguard Worker//% } 1309*6777b538SAndroid Build Coastguard Worker//% return newDict; 1310*6777b538SAndroid Build Coastguard Worker//%} 1311*6777b538SAndroid Build Coastguard Worker//% 1312*6777b538SAndroid Build Coastguard Worker//% 1313*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE SERIAL_DATA_FOR_ENTRY_OBJECT(KEY_NAME, VALUE_NAME) 1314*6777b538SAndroid Build Coastguard Worker// Empty 1315*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE GPBVALUE_OBJECT(VALUE_NAME) 1316*6777b538SAndroid Build Coastguard Worker//%valueString 1317*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_VALUE_OBJECT(VALUE_NAME, EXTRA_INDENT) 1318*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S## if (!##VALUE_NAME) { 1319*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S## [NSException raise:NSInvalidArgumentException 1320*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S## format:@"Attempting to add nil object to a Dictionary"]; 1321*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S## } 1322*6777b538SAndroid Build Coastguard Worker//% 1323*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE DICTIONARY_VALIDATE_KEY_OBJECT(KEY_NAME, EXTRA_INDENT) 1324*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S## if (!##KEY_NAME) { 1325*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S## [NSException raise:NSInvalidArgumentException 1326*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S## format:@"Attempting to add nil key to a Dictionary"]; 1327*6777b538SAndroid Build Coastguard Worker//%##EXTRA_INDENT$S## } 1328*6777b538SAndroid Build Coastguard Worker//% 1329*6777b538SAndroid Build Coastguard Worker 1330*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HAS_STORAGE_OBJECT() 1331*6777b538SAndroid Build Coastguard Worker// Empty 1332*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_INITS_OBJECT(VALUE_NAME, VALUE_TYPE) 1333*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithObjects:(const VALUE_TYPE [])objects 1334*6777b538SAndroid Build Coastguard Worker//% forKeys:(const BOOL [])keys 1335*6777b538SAndroid Build Coastguard Worker//% count:(NSUInteger)count { 1336*6777b538SAndroid Build Coastguard Worker//% self = [super init]; 1337*6777b538SAndroid Build Coastguard Worker//% if (self) { 1338*6777b538SAndroid Build Coastguard Worker//% for (NSUInteger i = 0; i < count; ++i) { 1339*6777b538SAndroid Build Coastguard Worker//% if (!objects[i]) { 1340*6777b538SAndroid Build Coastguard Worker//% [NSException raise:NSInvalidArgumentException 1341*6777b538SAndroid Build Coastguard Worker//% format:@"Attempting to add nil object to a Dictionary"]; 1342*6777b538SAndroid Build Coastguard Worker//% } 1343*6777b538SAndroid Build Coastguard Worker//% int idx = keys[i] ? 1 : 0; 1344*6777b538SAndroid Build Coastguard Worker//% [_values[idx] release]; 1345*6777b538SAndroid Build Coastguard Worker//% _values[idx] = (VALUE_TYPE)[objects[i] retain]; 1346*6777b538SAndroid Build Coastguard Worker//% } 1347*6777b538SAndroid Build Coastguard Worker//% } 1348*6777b538SAndroid Build Coastguard Worker//% return self; 1349*6777b538SAndroid Build Coastguard Worker//%} 1350*6777b538SAndroid Build Coastguard Worker//% 1351*6777b538SAndroid Build Coastguard Worker//%- (instancetype)initWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)dictionary { 1352*6777b538SAndroid Build Coastguard Worker//% self = [self initWithObjects:NULL forKeys:NULL count:0]; 1353*6777b538SAndroid Build Coastguard Worker//% if (self) { 1354*6777b538SAndroid Build Coastguard Worker//% if (dictionary) { 1355*6777b538SAndroid Build Coastguard Worker//% _values[0] = [dictionary->_values[0] retain]; 1356*6777b538SAndroid Build Coastguard Worker//% _values[1] = [dictionary->_values[1] retain]; 1357*6777b538SAndroid Build Coastguard Worker//% } 1358*6777b538SAndroid Build Coastguard Worker//% } 1359*6777b538SAndroid Build Coastguard Worker//% return self; 1360*6777b538SAndroid Build Coastguard Worker//%} 1361*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_DEALLOCOBJECT() 1362*6777b538SAndroid Build Coastguard Worker//%- (void)dealloc { 1363*6777b538SAndroid Build Coastguard Worker//% NSAssert(!_autocreator, 1364*6777b538SAndroid Build Coastguard Worker//% @"%@: Autocreator must be cleared before release, autocreator: %@", 1365*6777b538SAndroid Build Coastguard Worker//% [self class], _autocreator); 1366*6777b538SAndroid Build Coastguard Worker//% [_values[0] release]; 1367*6777b538SAndroid Build Coastguard Worker//% [_values[1] release]; 1368*6777b538SAndroid Build Coastguard Worker//% [super dealloc]; 1369*6777b538SAndroid Build Coastguard Worker//%} 1370*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_W_HASOBJECT(IDX, REF) 1371*6777b538SAndroid Build Coastguard Worker//%(BOOL_DICT_HASOBJECT(IDX, REF)) 1372*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_HASOBJECT(IDX, REF) 1373*6777b538SAndroid Build Coastguard Worker//%REF##_values[IDX] != nil 1374*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_OBJECT(VALUE_NAME, VALUE_TYPE) 1375*6777b538SAndroid Build Coastguard Worker//%- (VALUE_TYPE)objectForKey:(BOOL)key { 1376*6777b538SAndroid Build Coastguard Worker//% return _values[key ? 1 : 0]; 1377*6777b538SAndroid Build Coastguard Worker//%} 1378*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_SET_GPBVALUE_FOR_KEY_OBJECT(VALUE_NAME, VALUE_TYPE, VisP) 1379*6777b538SAndroid Build Coastguard Worker//%- (void)setGPBGenericValue:(GPBGenericValue *)value 1380*6777b538SAndroid Build Coastguard Worker//% forGPBGenericValueKey:(GPBGenericValue *)key { 1381*6777b538SAndroid Build Coastguard Worker//% int idx = (key->valueBool ? 1 : 0); 1382*6777b538SAndroid Build Coastguard Worker//% [_values[idx] release]; 1383*6777b538SAndroid Build Coastguard Worker//% _values[idx] = [value->valueString retain]; 1384*6777b538SAndroid Build Coastguard Worker//%} 1385*6777b538SAndroid Build Coastguard Worker 1386*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE BOOL_DICT_MUTATIONS_OBJECT(VALUE_NAME, VALUE_TYPE) 1387*6777b538SAndroid Build Coastguard Worker//%- (void)addEntriesFromDictionary:(GPBBool##VALUE_NAME##Dictionary *)otherDictionary { 1388*6777b538SAndroid Build Coastguard Worker//% if (otherDictionary) { 1389*6777b538SAndroid Build Coastguard Worker//% for (int i = 0; i < 2; ++i) { 1390*6777b538SAndroid Build Coastguard Worker//% if (otherDictionary->_values[i] != nil) { 1391*6777b538SAndroid Build Coastguard Worker//% [_values[i] release]; 1392*6777b538SAndroid Build Coastguard Worker//% _values[i] = [otherDictionary->_values[i] retain]; 1393*6777b538SAndroid Build Coastguard Worker//% } 1394*6777b538SAndroid Build Coastguard Worker//% } 1395*6777b538SAndroid Build Coastguard Worker//% if (_autocreator) { 1396*6777b538SAndroid Build Coastguard Worker//% GPBAutocreatedDictionaryModified(_autocreator, self); 1397*6777b538SAndroid Build Coastguard Worker//% } 1398*6777b538SAndroid Build Coastguard Worker//% } 1399*6777b538SAndroid Build Coastguard Worker//%} 1400*6777b538SAndroid Build Coastguard Worker//% 1401*6777b538SAndroid Build Coastguard Worker//%- (void)setObject:(VALUE_TYPE)object forKey:(BOOL)key { 1402*6777b538SAndroid Build Coastguard Worker//% if (!object) { 1403*6777b538SAndroid Build Coastguard Worker//% [NSException raise:NSInvalidArgumentException 1404*6777b538SAndroid Build Coastguard Worker//% format:@"Attempting to add nil object to a Dictionary"]; 1405*6777b538SAndroid Build Coastguard Worker//% } 1406*6777b538SAndroid Build Coastguard Worker//% int idx = (key ? 1 : 0); 1407*6777b538SAndroid Build Coastguard Worker//% [_values[idx] release]; 1408*6777b538SAndroid Build Coastguard Worker//% _values[idx] = [object retain]; 1409*6777b538SAndroid Build Coastguard Worker//% if (_autocreator) { 1410*6777b538SAndroid Build Coastguard Worker//% GPBAutocreatedDictionaryModified(_autocreator, self); 1411*6777b538SAndroid Build Coastguard Worker//% } 1412*6777b538SAndroid Build Coastguard Worker//%} 1413*6777b538SAndroid Build Coastguard Worker//% 1414*6777b538SAndroid Build Coastguard Worker//%- (void)removeObjectForKey:(BOOL)aKey { 1415*6777b538SAndroid Build Coastguard Worker//% int idx = (aKey ? 1 : 0); 1416*6777b538SAndroid Build Coastguard Worker//% [_values[idx] release]; 1417*6777b538SAndroid Build Coastguard Worker//% _values[idx] = nil; 1418*6777b538SAndroid Build Coastguard Worker//%} 1419*6777b538SAndroid Build Coastguard Worker//% 1420*6777b538SAndroid Build Coastguard Worker//%- (void)removeAll { 1421*6777b538SAndroid Build Coastguard Worker//% for (int i = 0; i < 2; ++i) { 1422*6777b538SAndroid Build Coastguard Worker//% [_values[i] release]; 1423*6777b538SAndroid Build Coastguard Worker//% _values[i] = nil; 1424*6777b538SAndroid Build Coastguard Worker//% } 1425*6777b538SAndroid Build Coastguard Worker//%} 1426*6777b538SAndroid Build Coastguard Worker//%PDDM-DEFINE STR_FORMAT_OBJECT(VALUE_NAME) 1427*6777b538SAndroid Build Coastguard Worker//%%@ 1428*6777b538SAndroid Build Coastguard Worker 1429*6777b538SAndroid Build Coastguard Worker 1430*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt32, uint32_t) 1431*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 1432*6777b538SAndroid Build Coastguard Worker// clang-format off 1433*6777b538SAndroid Build Coastguard Worker 1434*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> UInt32 1435*6777b538SAndroid Build Coastguard Worker 1436*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32UInt32Dictionary { 1437*6777b538SAndroid Build Coastguard Worker @package 1438*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 1439*6777b538SAndroid Build Coastguard Worker} 1440*6777b538SAndroid Build Coastguard Worker 1441*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 1442*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 1443*6777b538SAndroid Build Coastguard Worker} 1444*6777b538SAndroid Build Coastguard Worker 1445*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values 1446*6777b538SAndroid Build Coastguard Worker forKeys:(const uint32_t [])keys 1447*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 1448*6777b538SAndroid Build Coastguard Worker self = [super init]; 1449*6777b538SAndroid Build Coastguard Worker if (self) { 1450*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 1451*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 1452*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 1453*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 1454*6777b538SAndroid Build Coastguard Worker } 1455*6777b538SAndroid Build Coastguard Worker } 1456*6777b538SAndroid Build Coastguard Worker } 1457*6777b538SAndroid Build Coastguard Worker return self; 1458*6777b538SAndroid Build Coastguard Worker} 1459*6777b538SAndroid Build Coastguard Worker 1460*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32UInt32Dictionary *)dictionary { 1461*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt32s:NULL forKeys:NULL count:0]; 1462*6777b538SAndroid Build Coastguard Worker if (self) { 1463*6777b538SAndroid Build Coastguard Worker if (dictionary) { 1464*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 1465*6777b538SAndroid Build Coastguard Worker } 1466*6777b538SAndroid Build Coastguard Worker } 1467*6777b538SAndroid Build Coastguard Worker return self; 1468*6777b538SAndroid Build Coastguard Worker} 1469*6777b538SAndroid Build Coastguard Worker 1470*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 1471*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 1472*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 1473*6777b538SAndroid Build Coastguard Worker} 1474*6777b538SAndroid Build Coastguard Worker 1475*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 1476*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 1477*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 1478*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 1479*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 1480*6777b538SAndroid Build Coastguard Worker [super dealloc]; 1481*6777b538SAndroid Build Coastguard Worker} 1482*6777b538SAndroid Build Coastguard Worker 1483*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 1484*6777b538SAndroid Build Coastguard Worker return [[GPBUInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self]; 1485*6777b538SAndroid Build Coastguard Worker} 1486*6777b538SAndroid Build Coastguard Worker 1487*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 1488*6777b538SAndroid Build Coastguard Worker if (self == other) { 1489*6777b538SAndroid Build Coastguard Worker return YES; 1490*6777b538SAndroid Build Coastguard Worker } 1491*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32UInt32Dictionary class]]) { 1492*6777b538SAndroid Build Coastguard Worker return NO; 1493*6777b538SAndroid Build Coastguard Worker } 1494*6777b538SAndroid Build Coastguard Worker GPBUInt32UInt32Dictionary *otherDictionary = other; 1495*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 1496*6777b538SAndroid Build Coastguard Worker} 1497*6777b538SAndroid Build Coastguard Worker 1498*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 1499*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 1500*6777b538SAndroid Build Coastguard Worker} 1501*6777b538SAndroid Build Coastguard Worker 1502*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 1503*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 1504*6777b538SAndroid Build Coastguard Worker} 1505*6777b538SAndroid Build Coastguard Worker 1506*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 1507*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 1508*6777b538SAndroid Build Coastguard Worker} 1509*6777b538SAndroid Build Coastguard Worker 1510*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock: 1511*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, uint32_t value, BOOL *stop))block { 1512*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 1513*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 1514*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 1515*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 1516*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 1517*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 1518*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], [aValue unsignedIntValue], &stop); 1519*6777b538SAndroid Build Coastguard Worker if (stop) { 1520*6777b538SAndroid Build Coastguard Worker break; 1521*6777b538SAndroid Build Coastguard Worker } 1522*6777b538SAndroid Build Coastguard Worker } 1523*6777b538SAndroid Build Coastguard Worker} 1524*6777b538SAndroid Build Coastguard Worker 1525*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 1526*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 1527*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 1528*6777b538SAndroid Build Coastguard Worker if (count == 0) { 1529*6777b538SAndroid Build Coastguard Worker return 0; 1530*6777b538SAndroid Build Coastguard Worker } 1531*6777b538SAndroid Build Coastguard Worker 1532*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 1533*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 1534*6777b538SAndroid Build Coastguard Worker size_t result = 0; 1535*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 1536*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 1537*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 1538*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 1539*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType); 1540*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType); 1541*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 1542*6777b538SAndroid Build Coastguard Worker } 1543*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 1544*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 1545*6777b538SAndroid Build Coastguard Worker return result; 1546*6777b538SAndroid Build Coastguard Worker} 1547*6777b538SAndroid Build Coastguard Worker 1548*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 1549*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 1550*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 1551*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 1552*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 1553*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 1554*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 1555*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 1556*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 1557*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 1558*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 1559*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 1560*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedKey = [aKey unsignedIntValue]; 1561*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedValue = [aValue unsignedIntValue]; 1562*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 1563*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 1564*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 1565*6777b538SAndroid Build Coastguard Worker // Write the fields. 1566*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 1567*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 1568*6777b538SAndroid Build Coastguard Worker } 1569*6777b538SAndroid Build Coastguard Worker} 1570*6777b538SAndroid Build Coastguard Worker 1571*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 1572*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 1573*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueUInt32)]; 1574*6777b538SAndroid Build Coastguard Worker} 1575*6777b538SAndroid Build Coastguard Worker 1576*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 1577*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt32sUsingBlock:^(uint32_t key, uint32_t value, BOOL *stop) { 1578*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 1579*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%u", value]); 1580*6777b538SAndroid Build Coastguard Worker }]; 1581*6777b538SAndroid Build Coastguard Worker} 1582*6777b538SAndroid Build Coastguard Worker 1583*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint32_t)key { 1584*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 1585*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 1586*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedIntValue]; 1587*6777b538SAndroid Build Coastguard Worker } 1588*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 1589*6777b538SAndroid Build Coastguard Worker} 1590*6777b538SAndroid Build Coastguard Worker 1591*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32UInt32Dictionary *)otherDictionary { 1592*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 1593*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 1594*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 1595*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 1596*6777b538SAndroid Build Coastguard Worker } 1597*6777b538SAndroid Build Coastguard Worker } 1598*6777b538SAndroid Build Coastguard Worker} 1599*6777b538SAndroid Build Coastguard Worker 1600*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(uint32_t)key { 1601*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 1602*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 1603*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 1604*6777b538SAndroid Build Coastguard Worker } 1605*6777b538SAndroid Build Coastguard Worker} 1606*6777b538SAndroid Build Coastguard Worker 1607*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(uint32_t)aKey { 1608*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 1609*6777b538SAndroid Build Coastguard Worker} 1610*6777b538SAndroid Build Coastguard Worker 1611*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 1612*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 1613*6777b538SAndroid Build Coastguard Worker} 1614*6777b538SAndroid Build Coastguard Worker 1615*6777b538SAndroid Build Coastguard Worker@end 1616*6777b538SAndroid Build Coastguard Worker 1617*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Int32 1618*6777b538SAndroid Build Coastguard Worker 1619*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32Int32Dictionary { 1620*6777b538SAndroid Build Coastguard Worker @package 1621*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 1622*6777b538SAndroid Build Coastguard Worker} 1623*6777b538SAndroid Build Coastguard Worker 1624*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 1625*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 1626*6777b538SAndroid Build Coastguard Worker} 1627*6777b538SAndroid Build Coastguard Worker 1628*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values 1629*6777b538SAndroid Build Coastguard Worker forKeys:(const uint32_t [])keys 1630*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 1631*6777b538SAndroid Build Coastguard Worker self = [super init]; 1632*6777b538SAndroid Build Coastguard Worker if (self) { 1633*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 1634*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 1635*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 1636*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 1637*6777b538SAndroid Build Coastguard Worker } 1638*6777b538SAndroid Build Coastguard Worker } 1639*6777b538SAndroid Build Coastguard Worker } 1640*6777b538SAndroid Build Coastguard Worker return self; 1641*6777b538SAndroid Build Coastguard Worker} 1642*6777b538SAndroid Build Coastguard Worker 1643*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32Int32Dictionary *)dictionary { 1644*6777b538SAndroid Build Coastguard Worker self = [self initWithInt32s:NULL forKeys:NULL count:0]; 1645*6777b538SAndroid Build Coastguard Worker if (self) { 1646*6777b538SAndroid Build Coastguard Worker if (dictionary) { 1647*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 1648*6777b538SAndroid Build Coastguard Worker } 1649*6777b538SAndroid Build Coastguard Worker } 1650*6777b538SAndroid Build Coastguard Worker return self; 1651*6777b538SAndroid Build Coastguard Worker} 1652*6777b538SAndroid Build Coastguard Worker 1653*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 1654*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 1655*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 1656*6777b538SAndroid Build Coastguard Worker} 1657*6777b538SAndroid Build Coastguard Worker 1658*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 1659*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 1660*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 1661*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 1662*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 1663*6777b538SAndroid Build Coastguard Worker [super dealloc]; 1664*6777b538SAndroid Build Coastguard Worker} 1665*6777b538SAndroid Build Coastguard Worker 1666*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 1667*6777b538SAndroid Build Coastguard Worker return [[GPBUInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self]; 1668*6777b538SAndroid Build Coastguard Worker} 1669*6777b538SAndroid Build Coastguard Worker 1670*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 1671*6777b538SAndroid Build Coastguard Worker if (self == other) { 1672*6777b538SAndroid Build Coastguard Worker return YES; 1673*6777b538SAndroid Build Coastguard Worker } 1674*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32Int32Dictionary class]]) { 1675*6777b538SAndroid Build Coastguard Worker return NO; 1676*6777b538SAndroid Build Coastguard Worker } 1677*6777b538SAndroid Build Coastguard Worker GPBUInt32Int32Dictionary *otherDictionary = other; 1678*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 1679*6777b538SAndroid Build Coastguard Worker} 1680*6777b538SAndroid Build Coastguard Worker 1681*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 1682*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 1683*6777b538SAndroid Build Coastguard Worker} 1684*6777b538SAndroid Build Coastguard Worker 1685*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 1686*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 1687*6777b538SAndroid Build Coastguard Worker} 1688*6777b538SAndroid Build Coastguard Worker 1689*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 1690*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 1691*6777b538SAndroid Build Coastguard Worker} 1692*6777b538SAndroid Build Coastguard Worker 1693*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock: 1694*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, int32_t value, BOOL *stop))block { 1695*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 1696*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 1697*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 1698*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 1699*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 1700*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 1701*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], [aValue intValue], &stop); 1702*6777b538SAndroid Build Coastguard Worker if (stop) { 1703*6777b538SAndroid Build Coastguard Worker break; 1704*6777b538SAndroid Build Coastguard Worker } 1705*6777b538SAndroid Build Coastguard Worker } 1706*6777b538SAndroid Build Coastguard Worker} 1707*6777b538SAndroid Build Coastguard Worker 1708*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 1709*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 1710*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 1711*6777b538SAndroid Build Coastguard Worker if (count == 0) { 1712*6777b538SAndroid Build Coastguard Worker return 0; 1713*6777b538SAndroid Build Coastguard Worker } 1714*6777b538SAndroid Build Coastguard Worker 1715*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 1716*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 1717*6777b538SAndroid Build Coastguard Worker size_t result = 0; 1718*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 1719*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 1720*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 1721*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 1722*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType); 1723*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 1724*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 1725*6777b538SAndroid Build Coastguard Worker } 1726*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 1727*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 1728*6777b538SAndroid Build Coastguard Worker return result; 1729*6777b538SAndroid Build Coastguard Worker} 1730*6777b538SAndroid Build Coastguard Worker 1731*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 1732*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 1733*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 1734*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 1735*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 1736*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 1737*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 1738*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 1739*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 1740*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 1741*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 1742*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 1743*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedKey = [aKey unsignedIntValue]; 1744*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 1745*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 1746*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 1747*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 1748*6777b538SAndroid Build Coastguard Worker // Write the fields. 1749*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 1750*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 1751*6777b538SAndroid Build Coastguard Worker } 1752*6777b538SAndroid Build Coastguard Worker} 1753*6777b538SAndroid Build Coastguard Worker 1754*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 1755*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 1756*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueUInt32)]; 1757*6777b538SAndroid Build Coastguard Worker} 1758*6777b538SAndroid Build Coastguard Worker 1759*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 1760*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt32sUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) { 1761*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 1762*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%d", value]); 1763*6777b538SAndroid Build Coastguard Worker }]; 1764*6777b538SAndroid Build Coastguard Worker} 1765*6777b538SAndroid Build Coastguard Worker 1766*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint32_t)key { 1767*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 1768*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 1769*6777b538SAndroid Build Coastguard Worker *value = [wrapped intValue]; 1770*6777b538SAndroid Build Coastguard Worker } 1771*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 1772*6777b538SAndroid Build Coastguard Worker} 1773*6777b538SAndroid Build Coastguard Worker 1774*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32Int32Dictionary *)otherDictionary { 1775*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 1776*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 1777*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 1778*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 1779*6777b538SAndroid Build Coastguard Worker } 1780*6777b538SAndroid Build Coastguard Worker } 1781*6777b538SAndroid Build Coastguard Worker} 1782*6777b538SAndroid Build Coastguard Worker 1783*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(uint32_t)key { 1784*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 1785*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 1786*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 1787*6777b538SAndroid Build Coastguard Worker } 1788*6777b538SAndroid Build Coastguard Worker} 1789*6777b538SAndroid Build Coastguard Worker 1790*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(uint32_t)aKey { 1791*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 1792*6777b538SAndroid Build Coastguard Worker} 1793*6777b538SAndroid Build Coastguard Worker 1794*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 1795*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 1796*6777b538SAndroid Build Coastguard Worker} 1797*6777b538SAndroid Build Coastguard Worker 1798*6777b538SAndroid Build Coastguard Worker@end 1799*6777b538SAndroid Build Coastguard Worker 1800*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> UInt64 1801*6777b538SAndroid Build Coastguard Worker 1802*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32UInt64Dictionary { 1803*6777b538SAndroid Build Coastguard Worker @package 1804*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 1805*6777b538SAndroid Build Coastguard Worker} 1806*6777b538SAndroid Build Coastguard Worker 1807*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 1808*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 1809*6777b538SAndroid Build Coastguard Worker} 1810*6777b538SAndroid Build Coastguard Worker 1811*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values 1812*6777b538SAndroid Build Coastguard Worker forKeys:(const uint32_t [])keys 1813*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 1814*6777b538SAndroid Build Coastguard Worker self = [super init]; 1815*6777b538SAndroid Build Coastguard Worker if (self) { 1816*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 1817*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 1818*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 1819*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 1820*6777b538SAndroid Build Coastguard Worker } 1821*6777b538SAndroid Build Coastguard Worker } 1822*6777b538SAndroid Build Coastguard Worker } 1823*6777b538SAndroid Build Coastguard Worker return self; 1824*6777b538SAndroid Build Coastguard Worker} 1825*6777b538SAndroid Build Coastguard Worker 1826*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32UInt64Dictionary *)dictionary { 1827*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt64s:NULL forKeys:NULL count:0]; 1828*6777b538SAndroid Build Coastguard Worker if (self) { 1829*6777b538SAndroid Build Coastguard Worker if (dictionary) { 1830*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 1831*6777b538SAndroid Build Coastguard Worker } 1832*6777b538SAndroid Build Coastguard Worker } 1833*6777b538SAndroid Build Coastguard Worker return self; 1834*6777b538SAndroid Build Coastguard Worker} 1835*6777b538SAndroid Build Coastguard Worker 1836*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 1837*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 1838*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 1839*6777b538SAndroid Build Coastguard Worker} 1840*6777b538SAndroid Build Coastguard Worker 1841*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 1842*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 1843*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 1844*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 1845*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 1846*6777b538SAndroid Build Coastguard Worker [super dealloc]; 1847*6777b538SAndroid Build Coastguard Worker} 1848*6777b538SAndroid Build Coastguard Worker 1849*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 1850*6777b538SAndroid Build Coastguard Worker return [[GPBUInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self]; 1851*6777b538SAndroid Build Coastguard Worker} 1852*6777b538SAndroid Build Coastguard Worker 1853*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 1854*6777b538SAndroid Build Coastguard Worker if (self == other) { 1855*6777b538SAndroid Build Coastguard Worker return YES; 1856*6777b538SAndroid Build Coastguard Worker } 1857*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32UInt64Dictionary class]]) { 1858*6777b538SAndroid Build Coastguard Worker return NO; 1859*6777b538SAndroid Build Coastguard Worker } 1860*6777b538SAndroid Build Coastguard Worker GPBUInt32UInt64Dictionary *otherDictionary = other; 1861*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 1862*6777b538SAndroid Build Coastguard Worker} 1863*6777b538SAndroid Build Coastguard Worker 1864*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 1865*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 1866*6777b538SAndroid Build Coastguard Worker} 1867*6777b538SAndroid Build Coastguard Worker 1868*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 1869*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 1870*6777b538SAndroid Build Coastguard Worker} 1871*6777b538SAndroid Build Coastguard Worker 1872*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 1873*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 1874*6777b538SAndroid Build Coastguard Worker} 1875*6777b538SAndroid Build Coastguard Worker 1876*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock: 1877*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, uint64_t value, BOOL *stop))block { 1878*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 1879*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 1880*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 1881*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 1882*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 1883*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 1884*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], [aValue unsignedLongLongValue], &stop); 1885*6777b538SAndroid Build Coastguard Worker if (stop) { 1886*6777b538SAndroid Build Coastguard Worker break; 1887*6777b538SAndroid Build Coastguard Worker } 1888*6777b538SAndroid Build Coastguard Worker } 1889*6777b538SAndroid Build Coastguard Worker} 1890*6777b538SAndroid Build Coastguard Worker 1891*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 1892*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 1893*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 1894*6777b538SAndroid Build Coastguard Worker if (count == 0) { 1895*6777b538SAndroid Build Coastguard Worker return 0; 1896*6777b538SAndroid Build Coastguard Worker } 1897*6777b538SAndroid Build Coastguard Worker 1898*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 1899*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 1900*6777b538SAndroid Build Coastguard Worker size_t result = 0; 1901*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 1902*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 1903*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 1904*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 1905*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType); 1906*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType); 1907*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 1908*6777b538SAndroid Build Coastguard Worker } 1909*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 1910*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 1911*6777b538SAndroid Build Coastguard Worker return result; 1912*6777b538SAndroid Build Coastguard Worker} 1913*6777b538SAndroid Build Coastguard Worker 1914*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 1915*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 1916*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 1917*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 1918*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 1919*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 1920*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 1921*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 1922*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 1923*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 1924*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 1925*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 1926*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedKey = [aKey unsignedIntValue]; 1927*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedValue = [aValue unsignedLongLongValue]; 1928*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 1929*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 1930*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 1931*6777b538SAndroid Build Coastguard Worker // Write the fields. 1932*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 1933*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 1934*6777b538SAndroid Build Coastguard Worker } 1935*6777b538SAndroid Build Coastguard Worker} 1936*6777b538SAndroid Build Coastguard Worker 1937*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 1938*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 1939*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueUInt32)]; 1940*6777b538SAndroid Build Coastguard Worker} 1941*6777b538SAndroid Build Coastguard Worker 1942*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 1943*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt64sUsingBlock:^(uint32_t key, uint64_t value, BOOL *stop) { 1944*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 1945*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%llu", value]); 1946*6777b538SAndroid Build Coastguard Worker }]; 1947*6777b538SAndroid Build Coastguard Worker} 1948*6777b538SAndroid Build Coastguard Worker 1949*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint32_t)key { 1950*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 1951*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 1952*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedLongLongValue]; 1953*6777b538SAndroid Build Coastguard Worker } 1954*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 1955*6777b538SAndroid Build Coastguard Worker} 1956*6777b538SAndroid Build Coastguard Worker 1957*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32UInt64Dictionary *)otherDictionary { 1958*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 1959*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 1960*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 1961*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 1962*6777b538SAndroid Build Coastguard Worker } 1963*6777b538SAndroid Build Coastguard Worker } 1964*6777b538SAndroid Build Coastguard Worker} 1965*6777b538SAndroid Build Coastguard Worker 1966*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(uint32_t)key { 1967*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 1968*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 1969*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 1970*6777b538SAndroid Build Coastguard Worker } 1971*6777b538SAndroid Build Coastguard Worker} 1972*6777b538SAndroid Build Coastguard Worker 1973*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(uint32_t)aKey { 1974*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 1975*6777b538SAndroid Build Coastguard Worker} 1976*6777b538SAndroid Build Coastguard Worker 1977*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 1978*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 1979*6777b538SAndroid Build Coastguard Worker} 1980*6777b538SAndroid Build Coastguard Worker 1981*6777b538SAndroid Build Coastguard Worker@end 1982*6777b538SAndroid Build Coastguard Worker 1983*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Int64 1984*6777b538SAndroid Build Coastguard Worker 1985*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32Int64Dictionary { 1986*6777b538SAndroid Build Coastguard Worker @package 1987*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 1988*6777b538SAndroid Build Coastguard Worker} 1989*6777b538SAndroid Build Coastguard Worker 1990*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 1991*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 1992*6777b538SAndroid Build Coastguard Worker} 1993*6777b538SAndroid Build Coastguard Worker 1994*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values 1995*6777b538SAndroid Build Coastguard Worker forKeys:(const uint32_t [])keys 1996*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 1997*6777b538SAndroid Build Coastguard Worker self = [super init]; 1998*6777b538SAndroid Build Coastguard Worker if (self) { 1999*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 2000*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 2001*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 2002*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 2003*6777b538SAndroid Build Coastguard Worker } 2004*6777b538SAndroid Build Coastguard Worker } 2005*6777b538SAndroid Build Coastguard Worker } 2006*6777b538SAndroid Build Coastguard Worker return self; 2007*6777b538SAndroid Build Coastguard Worker} 2008*6777b538SAndroid Build Coastguard Worker 2009*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32Int64Dictionary *)dictionary { 2010*6777b538SAndroid Build Coastguard Worker self = [self initWithInt64s:NULL forKeys:NULL count:0]; 2011*6777b538SAndroid Build Coastguard Worker if (self) { 2012*6777b538SAndroid Build Coastguard Worker if (dictionary) { 2013*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 2014*6777b538SAndroid Build Coastguard Worker } 2015*6777b538SAndroid Build Coastguard Worker } 2016*6777b538SAndroid Build Coastguard Worker return self; 2017*6777b538SAndroid Build Coastguard Worker} 2018*6777b538SAndroid Build Coastguard Worker 2019*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 2020*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 2021*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 2022*6777b538SAndroid Build Coastguard Worker} 2023*6777b538SAndroid Build Coastguard Worker 2024*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 2025*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 2026*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 2027*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 2028*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 2029*6777b538SAndroid Build Coastguard Worker [super dealloc]; 2030*6777b538SAndroid Build Coastguard Worker} 2031*6777b538SAndroid Build Coastguard Worker 2032*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 2033*6777b538SAndroid Build Coastguard Worker return [[GPBUInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self]; 2034*6777b538SAndroid Build Coastguard Worker} 2035*6777b538SAndroid Build Coastguard Worker 2036*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 2037*6777b538SAndroid Build Coastguard Worker if (self == other) { 2038*6777b538SAndroid Build Coastguard Worker return YES; 2039*6777b538SAndroid Build Coastguard Worker } 2040*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32Int64Dictionary class]]) { 2041*6777b538SAndroid Build Coastguard Worker return NO; 2042*6777b538SAndroid Build Coastguard Worker } 2043*6777b538SAndroid Build Coastguard Worker GPBUInt32Int64Dictionary *otherDictionary = other; 2044*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 2045*6777b538SAndroid Build Coastguard Worker} 2046*6777b538SAndroid Build Coastguard Worker 2047*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 2048*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2049*6777b538SAndroid Build Coastguard Worker} 2050*6777b538SAndroid Build Coastguard Worker 2051*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 2052*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 2053*6777b538SAndroid Build Coastguard Worker} 2054*6777b538SAndroid Build Coastguard Worker 2055*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 2056*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2057*6777b538SAndroid Build Coastguard Worker} 2058*6777b538SAndroid Build Coastguard Worker 2059*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock: 2060*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, int64_t value, BOOL *stop))block { 2061*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 2062*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2063*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2064*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2065*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2066*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2067*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], [aValue longLongValue], &stop); 2068*6777b538SAndroid Build Coastguard Worker if (stop) { 2069*6777b538SAndroid Build Coastguard Worker break; 2070*6777b538SAndroid Build Coastguard Worker } 2071*6777b538SAndroid Build Coastguard Worker } 2072*6777b538SAndroid Build Coastguard Worker} 2073*6777b538SAndroid Build Coastguard Worker 2074*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 2075*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2076*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 2077*6777b538SAndroid Build Coastguard Worker if (count == 0) { 2078*6777b538SAndroid Build Coastguard Worker return 0; 2079*6777b538SAndroid Build Coastguard Worker } 2080*6777b538SAndroid Build Coastguard Worker 2081*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2082*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2083*6777b538SAndroid Build Coastguard Worker size_t result = 0; 2084*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2085*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2086*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2087*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2088*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType); 2089*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType); 2090*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 2091*6777b538SAndroid Build Coastguard Worker } 2092*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 2093*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 2094*6777b538SAndroid Build Coastguard Worker return result; 2095*6777b538SAndroid Build Coastguard Worker} 2096*6777b538SAndroid Build Coastguard Worker 2097*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 2098*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 2099*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2100*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2101*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 2102*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2103*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2104*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2105*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2106*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2107*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 2108*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 2109*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedKey = [aKey unsignedIntValue]; 2110*6777b538SAndroid Build Coastguard Worker int64_t unwrappedValue = [aValue longLongValue]; 2111*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 2112*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 2113*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 2114*6777b538SAndroid Build Coastguard Worker // Write the fields. 2115*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 2116*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 2117*6777b538SAndroid Build Coastguard Worker } 2118*6777b538SAndroid Build Coastguard Worker} 2119*6777b538SAndroid Build Coastguard Worker 2120*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 2121*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 2122*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueUInt32)]; 2123*6777b538SAndroid Build Coastguard Worker} 2124*6777b538SAndroid Build Coastguard Worker 2125*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 2126*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt64sUsingBlock:^(uint32_t key, int64_t value, BOOL *stop) { 2127*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 2128*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%lld", value]); 2129*6777b538SAndroid Build Coastguard Worker }]; 2130*6777b538SAndroid Build Coastguard Worker} 2131*6777b538SAndroid Build Coastguard Worker 2132*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint32_t)key { 2133*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 2134*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 2135*6777b538SAndroid Build Coastguard Worker *value = [wrapped longLongValue]; 2136*6777b538SAndroid Build Coastguard Worker } 2137*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 2138*6777b538SAndroid Build Coastguard Worker} 2139*6777b538SAndroid Build Coastguard Worker 2140*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32Int64Dictionary *)otherDictionary { 2141*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 2142*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 2143*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2144*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2145*6777b538SAndroid Build Coastguard Worker } 2146*6777b538SAndroid Build Coastguard Worker } 2147*6777b538SAndroid Build Coastguard Worker} 2148*6777b538SAndroid Build Coastguard Worker 2149*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(uint32_t)key { 2150*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 2151*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2152*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2153*6777b538SAndroid Build Coastguard Worker } 2154*6777b538SAndroid Build Coastguard Worker} 2155*6777b538SAndroid Build Coastguard Worker 2156*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(uint32_t)aKey { 2157*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 2158*6777b538SAndroid Build Coastguard Worker} 2159*6777b538SAndroid Build Coastguard Worker 2160*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 2161*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 2162*6777b538SAndroid Build Coastguard Worker} 2163*6777b538SAndroid Build Coastguard Worker 2164*6777b538SAndroid Build Coastguard Worker@end 2165*6777b538SAndroid Build Coastguard Worker 2166*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Bool 2167*6777b538SAndroid Build Coastguard Worker 2168*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32BoolDictionary { 2169*6777b538SAndroid Build Coastguard Worker @package 2170*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 2171*6777b538SAndroid Build Coastguard Worker} 2172*6777b538SAndroid Build Coastguard Worker 2173*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 2174*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 2175*6777b538SAndroid Build Coastguard Worker} 2176*6777b538SAndroid Build Coastguard Worker 2177*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values 2178*6777b538SAndroid Build Coastguard Worker forKeys:(const uint32_t [])keys 2179*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 2180*6777b538SAndroid Build Coastguard Worker self = [super init]; 2181*6777b538SAndroid Build Coastguard Worker if (self) { 2182*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 2183*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 2184*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 2185*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 2186*6777b538SAndroid Build Coastguard Worker } 2187*6777b538SAndroid Build Coastguard Worker } 2188*6777b538SAndroid Build Coastguard Worker } 2189*6777b538SAndroid Build Coastguard Worker return self; 2190*6777b538SAndroid Build Coastguard Worker} 2191*6777b538SAndroid Build Coastguard Worker 2192*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32BoolDictionary *)dictionary { 2193*6777b538SAndroid Build Coastguard Worker self = [self initWithBools:NULL forKeys:NULL count:0]; 2194*6777b538SAndroid Build Coastguard Worker if (self) { 2195*6777b538SAndroid Build Coastguard Worker if (dictionary) { 2196*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 2197*6777b538SAndroid Build Coastguard Worker } 2198*6777b538SAndroid Build Coastguard Worker } 2199*6777b538SAndroid Build Coastguard Worker return self; 2200*6777b538SAndroid Build Coastguard Worker} 2201*6777b538SAndroid Build Coastguard Worker 2202*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 2203*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 2204*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 2205*6777b538SAndroid Build Coastguard Worker} 2206*6777b538SAndroid Build Coastguard Worker 2207*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 2208*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 2209*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 2210*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 2211*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 2212*6777b538SAndroid Build Coastguard Worker [super dealloc]; 2213*6777b538SAndroid Build Coastguard Worker} 2214*6777b538SAndroid Build Coastguard Worker 2215*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 2216*6777b538SAndroid Build Coastguard Worker return [[GPBUInt32BoolDictionary allocWithZone:zone] initWithDictionary:self]; 2217*6777b538SAndroid Build Coastguard Worker} 2218*6777b538SAndroid Build Coastguard Worker 2219*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 2220*6777b538SAndroid Build Coastguard Worker if (self == other) { 2221*6777b538SAndroid Build Coastguard Worker return YES; 2222*6777b538SAndroid Build Coastguard Worker } 2223*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32BoolDictionary class]]) { 2224*6777b538SAndroid Build Coastguard Worker return NO; 2225*6777b538SAndroid Build Coastguard Worker } 2226*6777b538SAndroid Build Coastguard Worker GPBUInt32BoolDictionary *otherDictionary = other; 2227*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 2228*6777b538SAndroid Build Coastguard Worker} 2229*6777b538SAndroid Build Coastguard Worker 2230*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 2231*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2232*6777b538SAndroid Build Coastguard Worker} 2233*6777b538SAndroid Build Coastguard Worker 2234*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 2235*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 2236*6777b538SAndroid Build Coastguard Worker} 2237*6777b538SAndroid Build Coastguard Worker 2238*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 2239*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2240*6777b538SAndroid Build Coastguard Worker} 2241*6777b538SAndroid Build Coastguard Worker 2242*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock: 2243*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, BOOL value, BOOL *stop))block { 2244*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 2245*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2246*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2247*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2248*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2249*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2250*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], [aValue boolValue], &stop); 2251*6777b538SAndroid Build Coastguard Worker if (stop) { 2252*6777b538SAndroid Build Coastguard Worker break; 2253*6777b538SAndroid Build Coastguard Worker } 2254*6777b538SAndroid Build Coastguard Worker } 2255*6777b538SAndroid Build Coastguard Worker} 2256*6777b538SAndroid Build Coastguard Worker 2257*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 2258*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2259*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 2260*6777b538SAndroid Build Coastguard Worker if (count == 0) { 2261*6777b538SAndroid Build Coastguard Worker return 0; 2262*6777b538SAndroid Build Coastguard Worker } 2263*6777b538SAndroid Build Coastguard Worker 2264*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2265*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2266*6777b538SAndroid Build Coastguard Worker size_t result = 0; 2267*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2268*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2269*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2270*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2271*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType); 2272*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType); 2273*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 2274*6777b538SAndroid Build Coastguard Worker } 2275*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 2276*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 2277*6777b538SAndroid Build Coastguard Worker return result; 2278*6777b538SAndroid Build Coastguard Worker} 2279*6777b538SAndroid Build Coastguard Worker 2280*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 2281*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 2282*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2283*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2284*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 2285*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2286*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2287*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2288*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2289*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2290*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 2291*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 2292*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedKey = [aKey unsignedIntValue]; 2293*6777b538SAndroid Build Coastguard Worker BOOL unwrappedValue = [aValue boolValue]; 2294*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 2295*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 2296*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 2297*6777b538SAndroid Build Coastguard Worker // Write the fields. 2298*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 2299*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 2300*6777b538SAndroid Build Coastguard Worker } 2301*6777b538SAndroid Build Coastguard Worker} 2302*6777b538SAndroid Build Coastguard Worker 2303*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 2304*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 2305*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueBool) forKey:@(key->valueUInt32)]; 2306*6777b538SAndroid Build Coastguard Worker} 2307*6777b538SAndroid Build Coastguard Worker 2308*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 2309*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndBoolsUsingBlock:^(uint32_t key, BOOL value, BOOL *stop) { 2310*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 2311*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%u", key], (value ? @"true" : @"false")); 2312*6777b538SAndroid Build Coastguard Worker }]; 2313*6777b538SAndroid Build Coastguard Worker} 2314*6777b538SAndroid Build Coastguard Worker 2315*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(uint32_t)key { 2316*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 2317*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 2318*6777b538SAndroid Build Coastguard Worker *value = [wrapped boolValue]; 2319*6777b538SAndroid Build Coastguard Worker } 2320*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 2321*6777b538SAndroid Build Coastguard Worker} 2322*6777b538SAndroid Build Coastguard Worker 2323*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32BoolDictionary *)otherDictionary { 2324*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 2325*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 2326*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2327*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2328*6777b538SAndroid Build Coastguard Worker } 2329*6777b538SAndroid Build Coastguard Worker } 2330*6777b538SAndroid Build Coastguard Worker} 2331*6777b538SAndroid Build Coastguard Worker 2332*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(uint32_t)key { 2333*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 2334*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2335*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2336*6777b538SAndroid Build Coastguard Worker } 2337*6777b538SAndroid Build Coastguard Worker} 2338*6777b538SAndroid Build Coastguard Worker 2339*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(uint32_t)aKey { 2340*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 2341*6777b538SAndroid Build Coastguard Worker} 2342*6777b538SAndroid Build Coastguard Worker 2343*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 2344*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 2345*6777b538SAndroid Build Coastguard Worker} 2346*6777b538SAndroid Build Coastguard Worker 2347*6777b538SAndroid Build Coastguard Worker@end 2348*6777b538SAndroid Build Coastguard Worker 2349*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Float 2350*6777b538SAndroid Build Coastguard Worker 2351*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32FloatDictionary { 2352*6777b538SAndroid Build Coastguard Worker @package 2353*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 2354*6777b538SAndroid Build Coastguard Worker} 2355*6777b538SAndroid Build Coastguard Worker 2356*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 2357*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 2358*6777b538SAndroid Build Coastguard Worker} 2359*6777b538SAndroid Build Coastguard Worker 2360*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values 2361*6777b538SAndroid Build Coastguard Worker forKeys:(const uint32_t [])keys 2362*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 2363*6777b538SAndroid Build Coastguard Worker self = [super init]; 2364*6777b538SAndroid Build Coastguard Worker if (self) { 2365*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 2366*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 2367*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 2368*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 2369*6777b538SAndroid Build Coastguard Worker } 2370*6777b538SAndroid Build Coastguard Worker } 2371*6777b538SAndroid Build Coastguard Worker } 2372*6777b538SAndroid Build Coastguard Worker return self; 2373*6777b538SAndroid Build Coastguard Worker} 2374*6777b538SAndroid Build Coastguard Worker 2375*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32FloatDictionary *)dictionary { 2376*6777b538SAndroid Build Coastguard Worker self = [self initWithFloats:NULL forKeys:NULL count:0]; 2377*6777b538SAndroid Build Coastguard Worker if (self) { 2378*6777b538SAndroid Build Coastguard Worker if (dictionary) { 2379*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 2380*6777b538SAndroid Build Coastguard Worker } 2381*6777b538SAndroid Build Coastguard Worker } 2382*6777b538SAndroid Build Coastguard Worker return self; 2383*6777b538SAndroid Build Coastguard Worker} 2384*6777b538SAndroid Build Coastguard Worker 2385*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 2386*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 2387*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 2388*6777b538SAndroid Build Coastguard Worker} 2389*6777b538SAndroid Build Coastguard Worker 2390*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 2391*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 2392*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 2393*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 2394*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 2395*6777b538SAndroid Build Coastguard Worker [super dealloc]; 2396*6777b538SAndroid Build Coastguard Worker} 2397*6777b538SAndroid Build Coastguard Worker 2398*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 2399*6777b538SAndroid Build Coastguard Worker return [[GPBUInt32FloatDictionary allocWithZone:zone] initWithDictionary:self]; 2400*6777b538SAndroid Build Coastguard Worker} 2401*6777b538SAndroid Build Coastguard Worker 2402*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 2403*6777b538SAndroid Build Coastguard Worker if (self == other) { 2404*6777b538SAndroid Build Coastguard Worker return YES; 2405*6777b538SAndroid Build Coastguard Worker } 2406*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32FloatDictionary class]]) { 2407*6777b538SAndroid Build Coastguard Worker return NO; 2408*6777b538SAndroid Build Coastguard Worker } 2409*6777b538SAndroid Build Coastguard Worker GPBUInt32FloatDictionary *otherDictionary = other; 2410*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 2411*6777b538SAndroid Build Coastguard Worker} 2412*6777b538SAndroid Build Coastguard Worker 2413*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 2414*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2415*6777b538SAndroid Build Coastguard Worker} 2416*6777b538SAndroid Build Coastguard Worker 2417*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 2418*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 2419*6777b538SAndroid Build Coastguard Worker} 2420*6777b538SAndroid Build Coastguard Worker 2421*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 2422*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2423*6777b538SAndroid Build Coastguard Worker} 2424*6777b538SAndroid Build Coastguard Worker 2425*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock: 2426*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, float value, BOOL *stop))block { 2427*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 2428*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2429*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2430*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2431*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2432*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2433*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], [aValue floatValue], &stop); 2434*6777b538SAndroid Build Coastguard Worker if (stop) { 2435*6777b538SAndroid Build Coastguard Worker break; 2436*6777b538SAndroid Build Coastguard Worker } 2437*6777b538SAndroid Build Coastguard Worker } 2438*6777b538SAndroid Build Coastguard Worker} 2439*6777b538SAndroid Build Coastguard Worker 2440*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 2441*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2442*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 2443*6777b538SAndroid Build Coastguard Worker if (count == 0) { 2444*6777b538SAndroid Build Coastguard Worker return 0; 2445*6777b538SAndroid Build Coastguard Worker } 2446*6777b538SAndroid Build Coastguard Worker 2447*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2448*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2449*6777b538SAndroid Build Coastguard Worker size_t result = 0; 2450*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2451*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2452*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2453*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2454*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType); 2455*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType); 2456*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 2457*6777b538SAndroid Build Coastguard Worker } 2458*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 2459*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 2460*6777b538SAndroid Build Coastguard Worker return result; 2461*6777b538SAndroid Build Coastguard Worker} 2462*6777b538SAndroid Build Coastguard Worker 2463*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 2464*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 2465*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2466*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2467*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 2468*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2469*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2470*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2471*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2472*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2473*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 2474*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 2475*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedKey = [aKey unsignedIntValue]; 2476*6777b538SAndroid Build Coastguard Worker float unwrappedValue = [aValue floatValue]; 2477*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 2478*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 2479*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 2480*6777b538SAndroid Build Coastguard Worker // Write the fields. 2481*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 2482*6777b538SAndroid Build Coastguard Worker WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 2483*6777b538SAndroid Build Coastguard Worker } 2484*6777b538SAndroid Build Coastguard Worker} 2485*6777b538SAndroid Build Coastguard Worker 2486*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 2487*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 2488*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueUInt32)]; 2489*6777b538SAndroid Build Coastguard Worker} 2490*6777b538SAndroid Build Coastguard Worker 2491*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 2492*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndFloatsUsingBlock:^(uint32_t key, float value, BOOL *stop) { 2493*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 2494*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]); 2495*6777b538SAndroid Build Coastguard Worker }]; 2496*6777b538SAndroid Build Coastguard Worker} 2497*6777b538SAndroid Build Coastguard Worker 2498*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(uint32_t)key { 2499*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 2500*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 2501*6777b538SAndroid Build Coastguard Worker *value = [wrapped floatValue]; 2502*6777b538SAndroid Build Coastguard Worker } 2503*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 2504*6777b538SAndroid Build Coastguard Worker} 2505*6777b538SAndroid Build Coastguard Worker 2506*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32FloatDictionary *)otherDictionary { 2507*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 2508*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 2509*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2510*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2511*6777b538SAndroid Build Coastguard Worker } 2512*6777b538SAndroid Build Coastguard Worker } 2513*6777b538SAndroid Build Coastguard Worker} 2514*6777b538SAndroid Build Coastguard Worker 2515*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(uint32_t)key { 2516*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 2517*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2518*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2519*6777b538SAndroid Build Coastguard Worker } 2520*6777b538SAndroid Build Coastguard Worker} 2521*6777b538SAndroid Build Coastguard Worker 2522*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(uint32_t)aKey { 2523*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 2524*6777b538SAndroid Build Coastguard Worker} 2525*6777b538SAndroid Build Coastguard Worker 2526*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 2527*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 2528*6777b538SAndroid Build Coastguard Worker} 2529*6777b538SAndroid Build Coastguard Worker 2530*6777b538SAndroid Build Coastguard Worker@end 2531*6777b538SAndroid Build Coastguard Worker 2532*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Double 2533*6777b538SAndroid Build Coastguard Worker 2534*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32DoubleDictionary { 2535*6777b538SAndroid Build Coastguard Worker @package 2536*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 2537*6777b538SAndroid Build Coastguard Worker} 2538*6777b538SAndroid Build Coastguard Worker 2539*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 2540*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 2541*6777b538SAndroid Build Coastguard Worker} 2542*6777b538SAndroid Build Coastguard Worker 2543*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values 2544*6777b538SAndroid Build Coastguard Worker forKeys:(const uint32_t [])keys 2545*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 2546*6777b538SAndroid Build Coastguard Worker self = [super init]; 2547*6777b538SAndroid Build Coastguard Worker if (self) { 2548*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 2549*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 2550*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 2551*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 2552*6777b538SAndroid Build Coastguard Worker } 2553*6777b538SAndroid Build Coastguard Worker } 2554*6777b538SAndroid Build Coastguard Worker } 2555*6777b538SAndroid Build Coastguard Worker return self; 2556*6777b538SAndroid Build Coastguard Worker} 2557*6777b538SAndroid Build Coastguard Worker 2558*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32DoubleDictionary *)dictionary { 2559*6777b538SAndroid Build Coastguard Worker self = [self initWithDoubles:NULL forKeys:NULL count:0]; 2560*6777b538SAndroid Build Coastguard Worker if (self) { 2561*6777b538SAndroid Build Coastguard Worker if (dictionary) { 2562*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 2563*6777b538SAndroid Build Coastguard Worker } 2564*6777b538SAndroid Build Coastguard Worker } 2565*6777b538SAndroid Build Coastguard Worker return self; 2566*6777b538SAndroid Build Coastguard Worker} 2567*6777b538SAndroid Build Coastguard Worker 2568*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 2569*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 2570*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 2571*6777b538SAndroid Build Coastguard Worker} 2572*6777b538SAndroid Build Coastguard Worker 2573*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 2574*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 2575*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 2576*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 2577*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 2578*6777b538SAndroid Build Coastguard Worker [super dealloc]; 2579*6777b538SAndroid Build Coastguard Worker} 2580*6777b538SAndroid Build Coastguard Worker 2581*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 2582*6777b538SAndroid Build Coastguard Worker return [[GPBUInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self]; 2583*6777b538SAndroid Build Coastguard Worker} 2584*6777b538SAndroid Build Coastguard Worker 2585*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 2586*6777b538SAndroid Build Coastguard Worker if (self == other) { 2587*6777b538SAndroid Build Coastguard Worker return YES; 2588*6777b538SAndroid Build Coastguard Worker } 2589*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32DoubleDictionary class]]) { 2590*6777b538SAndroid Build Coastguard Worker return NO; 2591*6777b538SAndroid Build Coastguard Worker } 2592*6777b538SAndroid Build Coastguard Worker GPBUInt32DoubleDictionary *otherDictionary = other; 2593*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 2594*6777b538SAndroid Build Coastguard Worker} 2595*6777b538SAndroid Build Coastguard Worker 2596*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 2597*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2598*6777b538SAndroid Build Coastguard Worker} 2599*6777b538SAndroid Build Coastguard Worker 2600*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 2601*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 2602*6777b538SAndroid Build Coastguard Worker} 2603*6777b538SAndroid Build Coastguard Worker 2604*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 2605*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2606*6777b538SAndroid Build Coastguard Worker} 2607*6777b538SAndroid Build Coastguard Worker 2608*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock: 2609*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, double value, BOOL *stop))block { 2610*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 2611*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2612*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2613*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2614*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2615*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2616*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], [aValue doubleValue], &stop); 2617*6777b538SAndroid Build Coastguard Worker if (stop) { 2618*6777b538SAndroid Build Coastguard Worker break; 2619*6777b538SAndroid Build Coastguard Worker } 2620*6777b538SAndroid Build Coastguard Worker } 2621*6777b538SAndroid Build Coastguard Worker} 2622*6777b538SAndroid Build Coastguard Worker 2623*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 2624*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2625*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 2626*6777b538SAndroid Build Coastguard Worker if (count == 0) { 2627*6777b538SAndroid Build Coastguard Worker return 0; 2628*6777b538SAndroid Build Coastguard Worker } 2629*6777b538SAndroid Build Coastguard Worker 2630*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2631*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2632*6777b538SAndroid Build Coastguard Worker size_t result = 0; 2633*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2634*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2635*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2636*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2637*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType); 2638*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType); 2639*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 2640*6777b538SAndroid Build Coastguard Worker } 2641*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 2642*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 2643*6777b538SAndroid Build Coastguard Worker return result; 2644*6777b538SAndroid Build Coastguard Worker} 2645*6777b538SAndroid Build Coastguard Worker 2646*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 2647*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 2648*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2649*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2650*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 2651*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2652*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2653*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2654*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2655*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2656*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 2657*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 2658*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedKey = [aKey unsignedIntValue]; 2659*6777b538SAndroid Build Coastguard Worker double unwrappedValue = [aValue doubleValue]; 2660*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 2661*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 2662*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 2663*6777b538SAndroid Build Coastguard Worker // Write the fields. 2664*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 2665*6777b538SAndroid Build Coastguard Worker WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 2666*6777b538SAndroid Build Coastguard Worker } 2667*6777b538SAndroid Build Coastguard Worker} 2668*6777b538SAndroid Build Coastguard Worker 2669*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 2670*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 2671*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueUInt32)]; 2672*6777b538SAndroid Build Coastguard Worker} 2673*6777b538SAndroid Build Coastguard Worker 2674*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 2675*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndDoublesUsingBlock:^(uint32_t key, double value, BOOL *stop) { 2676*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 2677*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]); 2678*6777b538SAndroid Build Coastguard Worker }]; 2679*6777b538SAndroid Build Coastguard Worker} 2680*6777b538SAndroid Build Coastguard Worker 2681*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(uint32_t)key { 2682*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 2683*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 2684*6777b538SAndroid Build Coastguard Worker *value = [wrapped doubleValue]; 2685*6777b538SAndroid Build Coastguard Worker } 2686*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 2687*6777b538SAndroid Build Coastguard Worker} 2688*6777b538SAndroid Build Coastguard Worker 2689*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32DoubleDictionary *)otherDictionary { 2690*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 2691*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 2692*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2693*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2694*6777b538SAndroid Build Coastguard Worker } 2695*6777b538SAndroid Build Coastguard Worker } 2696*6777b538SAndroid Build Coastguard Worker} 2697*6777b538SAndroid Build Coastguard Worker 2698*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(uint32_t)key { 2699*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 2700*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2701*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2702*6777b538SAndroid Build Coastguard Worker } 2703*6777b538SAndroid Build Coastguard Worker} 2704*6777b538SAndroid Build Coastguard Worker 2705*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(uint32_t)aKey { 2706*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 2707*6777b538SAndroid Build Coastguard Worker} 2708*6777b538SAndroid Build Coastguard Worker 2709*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 2710*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 2711*6777b538SAndroid Build Coastguard Worker} 2712*6777b538SAndroid Build Coastguard Worker 2713*6777b538SAndroid Build Coastguard Worker@end 2714*6777b538SAndroid Build Coastguard Worker 2715*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Enum 2716*6777b538SAndroid Build Coastguard Worker 2717*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32EnumDictionary { 2718*6777b538SAndroid Build Coastguard Worker @package 2719*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 2720*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc _validationFunc; 2721*6777b538SAndroid Build Coastguard Worker} 2722*6777b538SAndroid Build Coastguard Worker 2723*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc; 2724*6777b538SAndroid Build Coastguard Worker 2725*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 2726*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0]; 2727*6777b538SAndroid Build Coastguard Worker} 2728*6777b538SAndroid Build Coastguard Worker 2729*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func { 2730*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 2731*6777b538SAndroid Build Coastguard Worker} 2732*6777b538SAndroid Build Coastguard Worker 2733*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 2734*6777b538SAndroid Build Coastguard Worker rawValues:(const int32_t [])rawValues 2735*6777b538SAndroid Build Coastguard Worker forKeys:(const uint32_t [])keys 2736*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 2737*6777b538SAndroid Build Coastguard Worker self = [super init]; 2738*6777b538SAndroid Build Coastguard Worker if (self) { 2739*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 2740*6777b538SAndroid Build Coastguard Worker _validationFunc = (func != NULL ? func : DictDefault_IsValidValue); 2741*6777b538SAndroid Build Coastguard Worker if (count && rawValues && keys) { 2742*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 2743*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])]; 2744*6777b538SAndroid Build Coastguard Worker } 2745*6777b538SAndroid Build Coastguard Worker } 2746*6777b538SAndroid Build Coastguard Worker } 2747*6777b538SAndroid Build Coastguard Worker return self; 2748*6777b538SAndroid Build Coastguard Worker} 2749*6777b538SAndroid Build Coastguard Worker 2750*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32EnumDictionary *)dictionary { 2751*6777b538SAndroid Build Coastguard Worker self = [self initWithValidationFunction:dictionary.validationFunc 2752*6777b538SAndroid Build Coastguard Worker rawValues:NULL 2753*6777b538SAndroid Build Coastguard Worker forKeys:NULL 2754*6777b538SAndroid Build Coastguard Worker count:0]; 2755*6777b538SAndroid Build Coastguard Worker if (self) { 2756*6777b538SAndroid Build Coastguard Worker if (dictionary) { 2757*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 2758*6777b538SAndroid Build Coastguard Worker } 2759*6777b538SAndroid Build Coastguard Worker } 2760*6777b538SAndroid Build Coastguard Worker return self; 2761*6777b538SAndroid Build Coastguard Worker} 2762*6777b538SAndroid Build Coastguard Worker 2763*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 2764*6777b538SAndroid Build Coastguard Worker capacity:(NSUInteger)numItems { 2765*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 2766*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 2767*6777b538SAndroid Build Coastguard Worker} 2768*6777b538SAndroid Build Coastguard Worker 2769*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 2770*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 2771*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 2772*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 2773*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 2774*6777b538SAndroid Build Coastguard Worker [super dealloc]; 2775*6777b538SAndroid Build Coastguard Worker} 2776*6777b538SAndroid Build Coastguard Worker 2777*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 2778*6777b538SAndroid Build Coastguard Worker return [[GPBUInt32EnumDictionary allocWithZone:zone] initWithDictionary:self]; 2779*6777b538SAndroid Build Coastguard Worker} 2780*6777b538SAndroid Build Coastguard Worker 2781*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 2782*6777b538SAndroid Build Coastguard Worker if (self == other) { 2783*6777b538SAndroid Build Coastguard Worker return YES; 2784*6777b538SAndroid Build Coastguard Worker } 2785*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32EnumDictionary class]]) { 2786*6777b538SAndroid Build Coastguard Worker return NO; 2787*6777b538SAndroid Build Coastguard Worker } 2788*6777b538SAndroid Build Coastguard Worker GPBUInt32EnumDictionary *otherDictionary = other; 2789*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 2790*6777b538SAndroid Build Coastguard Worker} 2791*6777b538SAndroid Build Coastguard Worker 2792*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 2793*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2794*6777b538SAndroid Build Coastguard Worker} 2795*6777b538SAndroid Build Coastguard Worker 2796*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 2797*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 2798*6777b538SAndroid Build Coastguard Worker} 2799*6777b538SAndroid Build Coastguard Worker 2800*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 2801*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 2802*6777b538SAndroid Build Coastguard Worker} 2803*6777b538SAndroid Build Coastguard Worker 2804*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock: 2805*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, int32_t value, BOOL *stop))block { 2806*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 2807*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2808*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2809*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2810*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2811*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2812*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], [aValue intValue], &stop); 2813*6777b538SAndroid Build Coastguard Worker if (stop) { 2814*6777b538SAndroid Build Coastguard Worker break; 2815*6777b538SAndroid Build Coastguard Worker } 2816*6777b538SAndroid Build Coastguard Worker } 2817*6777b538SAndroid Build Coastguard Worker} 2818*6777b538SAndroid Build Coastguard Worker 2819*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 2820*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2821*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 2822*6777b538SAndroid Build Coastguard Worker if (count == 0) { 2823*6777b538SAndroid Build Coastguard Worker return 0; 2824*6777b538SAndroid Build Coastguard Worker } 2825*6777b538SAndroid Build Coastguard Worker 2826*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2827*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2828*6777b538SAndroid Build Coastguard Worker size_t result = 0; 2829*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2830*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2831*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2832*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2833*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType); 2834*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 2835*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 2836*6777b538SAndroid Build Coastguard Worker } 2837*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 2838*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 2839*6777b538SAndroid Build Coastguard Worker return result; 2840*6777b538SAndroid Build Coastguard Worker} 2841*6777b538SAndroid Build Coastguard Worker 2842*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 2843*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 2844*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 2845*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 2846*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 2847*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 2848*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 2849*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2850*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2851*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 2852*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 2853*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 2854*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedKey = [aKey unsignedIntValue]; 2855*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 2856*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 2857*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 2858*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 2859*6777b538SAndroid Build Coastguard Worker // Write the fields. 2860*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 2861*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 2862*6777b538SAndroid Build Coastguard Worker } 2863*6777b538SAndroid Build Coastguard Worker} 2864*6777b538SAndroid Build Coastguard Worker 2865*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value 2866*6777b538SAndroid Build Coastguard Worker forKey:(GPBGenericValue *)key 2867*6777b538SAndroid Build Coastguard Worker keyDataType:(GPBDataType)keyDataType { 2868*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(key->valueUInt32, kMapKeyFieldNumber, keyDataType); 2869*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum); 2870*6777b538SAndroid Build Coastguard Worker NSMutableData *data = [NSMutableData dataWithLength:msgSize]; 2871*6777b538SAndroid Build Coastguard Worker GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data]; 2872*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, key->valueUInt32, kMapKeyFieldNumber, keyDataType); 2873*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum); 2874*6777b538SAndroid Build Coastguard Worker [outputStream release]; 2875*6777b538SAndroid Build Coastguard Worker return data; 2876*6777b538SAndroid Build Coastguard Worker} 2877*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 2878*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 2879*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueUInt32)]; 2880*6777b538SAndroid Build Coastguard Worker} 2881*6777b538SAndroid Build Coastguard Worker 2882*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 2883*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndRawValuesUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) { 2884*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 2885*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%u", key], @(value)); 2886*6777b538SAndroid Build Coastguard Worker }]; 2887*6777b538SAndroid Build Coastguard Worker} 2888*6777b538SAndroid Build Coastguard Worker 2889*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(uint32_t)key { 2890*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 2891*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 2892*6777b538SAndroid Build Coastguard Worker int32_t result = [wrapped intValue]; 2893*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(result)) { 2894*6777b538SAndroid Build Coastguard Worker result = kGPBUnrecognizedEnumeratorValue; 2895*6777b538SAndroid Build Coastguard Worker } 2896*6777b538SAndroid Build Coastguard Worker *value = result; 2897*6777b538SAndroid Build Coastguard Worker } 2898*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 2899*6777b538SAndroid Build Coastguard Worker} 2900*6777b538SAndroid Build Coastguard Worker 2901*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(uint32_t)key { 2902*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 2903*6777b538SAndroid Build Coastguard Worker if (wrapped && rawValue) { 2904*6777b538SAndroid Build Coastguard Worker *rawValue = [wrapped intValue]; 2905*6777b538SAndroid Build Coastguard Worker } 2906*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 2907*6777b538SAndroid Build Coastguard Worker} 2908*6777b538SAndroid Build Coastguard Worker 2909*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock: 2910*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, int32_t value, BOOL *stop))block { 2911*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc func = _validationFunc; 2912*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 2913*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [_dictionary keyEnumerator]; 2914*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 2915*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 2916*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = _dictionary[aKey]; 2917*6777b538SAndroid Build Coastguard Worker int32_t unwrapped = [aValue intValue]; 2918*6777b538SAndroid Build Coastguard Worker if (!func(unwrapped)) { 2919*6777b538SAndroid Build Coastguard Worker unwrapped = kGPBUnrecognizedEnumeratorValue; 2920*6777b538SAndroid Build Coastguard Worker } 2921*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], unwrapped, &stop); 2922*6777b538SAndroid Build Coastguard Worker if (stop) { 2923*6777b538SAndroid Build Coastguard Worker break; 2924*6777b538SAndroid Build Coastguard Worker } 2925*6777b538SAndroid Build Coastguard Worker } 2926*6777b538SAndroid Build Coastguard Worker} 2927*6777b538SAndroid Build Coastguard Worker 2928*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBUInt32EnumDictionary *)otherDictionary { 2929*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 2930*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 2931*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2932*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2933*6777b538SAndroid Build Coastguard Worker } 2934*6777b538SAndroid Build Coastguard Worker } 2935*6777b538SAndroid Build Coastguard Worker} 2936*6777b538SAndroid Build Coastguard Worker 2937*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(uint32_t)key { 2938*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 2939*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2940*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2941*6777b538SAndroid Build Coastguard Worker } 2942*6777b538SAndroid Build Coastguard Worker} 2943*6777b538SAndroid Build Coastguard Worker 2944*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(uint32_t)aKey { 2945*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 2946*6777b538SAndroid Build Coastguard Worker} 2947*6777b538SAndroid Build Coastguard Worker 2948*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 2949*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 2950*6777b538SAndroid Build Coastguard Worker} 2951*6777b538SAndroid Build Coastguard Worker 2952*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(uint32_t)key { 2953*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(value)) { 2954*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 2955*6777b538SAndroid Build Coastguard Worker format:@"GPBUInt32EnumDictionary: Attempt to set an unknown enum value (%d)", 2956*6777b538SAndroid Build Coastguard Worker value]; 2957*6777b538SAndroid Build Coastguard Worker } 2958*6777b538SAndroid Build Coastguard Worker 2959*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 2960*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 2961*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 2962*6777b538SAndroid Build Coastguard Worker } 2963*6777b538SAndroid Build Coastguard Worker} 2964*6777b538SAndroid Build Coastguard Worker 2965*6777b538SAndroid Build Coastguard Worker@end 2966*6777b538SAndroid Build Coastguard Worker 2967*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt32 -> Object 2968*6777b538SAndroid Build Coastguard Worker 2969*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt32ObjectDictionary { 2970*6777b538SAndroid Build Coastguard Worker @package 2971*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 2972*6777b538SAndroid Build Coastguard Worker} 2973*6777b538SAndroid Build Coastguard Worker 2974*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 2975*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 2976*6777b538SAndroid Build Coastguard Worker} 2977*6777b538SAndroid Build Coastguard Worker 2978*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects 2979*6777b538SAndroid Build Coastguard Worker forKeys:(const uint32_t [])keys 2980*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 2981*6777b538SAndroid Build Coastguard Worker self = [super init]; 2982*6777b538SAndroid Build Coastguard Worker if (self) { 2983*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 2984*6777b538SAndroid Build Coastguard Worker if (count && objects && keys) { 2985*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 2986*6777b538SAndroid Build Coastguard Worker if (!objects[i]) { 2987*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 2988*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 2989*6777b538SAndroid Build Coastguard Worker } 2990*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:objects[i] forKey:@(keys[i])]; 2991*6777b538SAndroid Build Coastguard Worker } 2992*6777b538SAndroid Build Coastguard Worker } 2993*6777b538SAndroid Build Coastguard Worker } 2994*6777b538SAndroid Build Coastguard Worker return self; 2995*6777b538SAndroid Build Coastguard Worker} 2996*6777b538SAndroid Build Coastguard Worker 2997*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt32ObjectDictionary *)dictionary { 2998*6777b538SAndroid Build Coastguard Worker self = [self initWithObjects:NULL forKeys:NULL count:0]; 2999*6777b538SAndroid Build Coastguard Worker if (self) { 3000*6777b538SAndroid Build Coastguard Worker if (dictionary) { 3001*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 3002*6777b538SAndroid Build Coastguard Worker } 3003*6777b538SAndroid Build Coastguard Worker } 3004*6777b538SAndroid Build Coastguard Worker return self; 3005*6777b538SAndroid Build Coastguard Worker} 3006*6777b538SAndroid Build Coastguard Worker 3007*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 3008*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 3009*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 3010*6777b538SAndroid Build Coastguard Worker} 3011*6777b538SAndroid Build Coastguard Worker 3012*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 3013*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 3014*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 3015*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 3016*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 3017*6777b538SAndroid Build Coastguard Worker [super dealloc]; 3018*6777b538SAndroid Build Coastguard Worker} 3019*6777b538SAndroid Build Coastguard Worker 3020*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 3021*6777b538SAndroid Build Coastguard Worker return [[GPBUInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self]; 3022*6777b538SAndroid Build Coastguard Worker} 3023*6777b538SAndroid Build Coastguard Worker 3024*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 3025*6777b538SAndroid Build Coastguard Worker if (self == other) { 3026*6777b538SAndroid Build Coastguard Worker return YES; 3027*6777b538SAndroid Build Coastguard Worker } 3028*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32ObjectDictionary class]]) { 3029*6777b538SAndroid Build Coastguard Worker return NO; 3030*6777b538SAndroid Build Coastguard Worker } 3031*6777b538SAndroid Build Coastguard Worker GPBUInt32ObjectDictionary *otherDictionary = other; 3032*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 3033*6777b538SAndroid Build Coastguard Worker} 3034*6777b538SAndroid Build Coastguard Worker 3035*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 3036*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3037*6777b538SAndroid Build Coastguard Worker} 3038*6777b538SAndroid Build Coastguard Worker 3039*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 3040*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 3041*6777b538SAndroid Build Coastguard Worker} 3042*6777b538SAndroid Build Coastguard Worker 3043*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 3044*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3045*6777b538SAndroid Build Coastguard Worker} 3046*6777b538SAndroid Build Coastguard Worker 3047*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock: 3048*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint32_t key, id object, BOOL *stop))block { 3049*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 3050*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3051*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3052*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3053*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3054*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 3055*6777b538SAndroid Build Coastguard Worker block([aKey unsignedIntValue], aObject, &stop); 3056*6777b538SAndroid Build Coastguard Worker if (stop) { 3057*6777b538SAndroid Build Coastguard Worker break; 3058*6777b538SAndroid Build Coastguard Worker } 3059*6777b538SAndroid Build Coastguard Worker } 3060*6777b538SAndroid Build Coastguard Worker} 3061*6777b538SAndroid Build Coastguard Worker 3062*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized { 3063*6777b538SAndroid Build Coastguard Worker for (GPBMessage *msg in [_dictionary objectEnumerator]) { 3064*6777b538SAndroid Build Coastguard Worker if (!msg.initialized) { 3065*6777b538SAndroid Build Coastguard Worker return NO; 3066*6777b538SAndroid Build Coastguard Worker } 3067*6777b538SAndroid Build Coastguard Worker } 3068*6777b538SAndroid Build Coastguard Worker return YES; 3069*6777b538SAndroid Build Coastguard Worker} 3070*6777b538SAndroid Build Coastguard Worker 3071*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone { 3072*6777b538SAndroid Build Coastguard Worker GPBUInt32ObjectDictionary *newDict = 3073*6777b538SAndroid Build Coastguard Worker [[GPBUInt32ObjectDictionary alloc] init]; 3074*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [_dictionary keyEnumerator]; 3075*6777b538SAndroid Build Coastguard Worker id aKey; 3076*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *internalDict = newDict->_dictionary; 3077*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3078*6777b538SAndroid Build Coastguard Worker GPBMessage *msg = _dictionary[aKey]; 3079*6777b538SAndroid Build Coastguard Worker GPBMessage *copiedMsg = [msg copyWithZone:zone]; 3080*6777b538SAndroid Build Coastguard Worker [internalDict setObject:copiedMsg forKey:aKey]; 3081*6777b538SAndroid Build Coastguard Worker [copiedMsg release]; 3082*6777b538SAndroid Build Coastguard Worker } 3083*6777b538SAndroid Build Coastguard Worker return newDict; 3084*6777b538SAndroid Build Coastguard Worker} 3085*6777b538SAndroid Build Coastguard Worker 3086*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 3087*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3088*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 3089*6777b538SAndroid Build Coastguard Worker if (count == 0) { 3090*6777b538SAndroid Build Coastguard Worker return 0; 3091*6777b538SAndroid Build Coastguard Worker } 3092*6777b538SAndroid Build Coastguard Worker 3093*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3094*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3095*6777b538SAndroid Build Coastguard Worker size_t result = 0; 3096*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3097*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3098*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3099*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 3100*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType); 3101*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType); 3102*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 3103*6777b538SAndroid Build Coastguard Worker } 3104*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 3105*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 3106*6777b538SAndroid Build Coastguard Worker return result; 3107*6777b538SAndroid Build Coastguard Worker} 3108*6777b538SAndroid Build Coastguard Worker 3109*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 3110*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 3111*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3112*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3113*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 3114*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3115*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3116*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3117*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3118*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 3119*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 3120*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 3121*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedKey = [aKey unsignedIntValue]; 3122*6777b538SAndroid Build Coastguard Worker id unwrappedValue = aObject; 3123*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 3124*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 3125*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 3126*6777b538SAndroid Build Coastguard Worker // Write the fields. 3127*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 3128*6777b538SAndroid Build Coastguard Worker WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 3129*6777b538SAndroid Build Coastguard Worker } 3130*6777b538SAndroid Build Coastguard Worker} 3131*6777b538SAndroid Build Coastguard Worker 3132*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 3133*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 3134*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:value->valueString forKey:@(key->valueUInt32)]; 3135*6777b538SAndroid Build Coastguard Worker} 3136*6777b538SAndroid Build Coastguard Worker 3137*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 3138*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndObjectsUsingBlock:^(uint32_t key, id object, BOOL *stop) { 3139*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 3140*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%u", key], object); 3141*6777b538SAndroid Build Coastguard Worker }]; 3142*6777b538SAndroid Build Coastguard Worker} 3143*6777b538SAndroid Build Coastguard Worker 3144*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(uint32_t)key { 3145*6777b538SAndroid Build Coastguard Worker id result = [_dictionary objectForKey:@(key)]; 3146*6777b538SAndroid Build Coastguard Worker return result; 3147*6777b538SAndroid Build Coastguard Worker} 3148*6777b538SAndroid Build Coastguard Worker 3149*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt32ObjectDictionary *)otherDictionary { 3150*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 3151*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 3152*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3153*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3154*6777b538SAndroid Build Coastguard Worker } 3155*6777b538SAndroid Build Coastguard Worker } 3156*6777b538SAndroid Build Coastguard Worker} 3157*6777b538SAndroid Build Coastguard Worker 3158*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(uint32_t)key { 3159*6777b538SAndroid Build Coastguard Worker if (!object) { 3160*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 3161*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 3162*6777b538SAndroid Build Coastguard Worker } 3163*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:object forKey:@(key)]; 3164*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3165*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3166*6777b538SAndroid Build Coastguard Worker } 3167*6777b538SAndroid Build Coastguard Worker} 3168*6777b538SAndroid Build Coastguard Worker 3169*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(uint32_t)aKey { 3170*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 3171*6777b538SAndroid Build Coastguard Worker} 3172*6777b538SAndroid Build Coastguard Worker 3173*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 3174*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 3175*6777b538SAndroid Build Coastguard Worker} 3176*6777b538SAndroid Build Coastguard Worker 3177*6777b538SAndroid Build Coastguard Worker@end 3178*6777b538SAndroid Build Coastguard Worker 3179*6777b538SAndroid Build Coastguard Worker// clang-format on 3180*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int32, int32_t) 3181*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 3182*6777b538SAndroid Build Coastguard Worker// clang-format off 3183*6777b538SAndroid Build Coastguard Worker 3184*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> UInt32 3185*6777b538SAndroid Build Coastguard Worker 3186*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32UInt32Dictionary { 3187*6777b538SAndroid Build Coastguard Worker @package 3188*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 3189*6777b538SAndroid Build Coastguard Worker} 3190*6777b538SAndroid Build Coastguard Worker 3191*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 3192*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 3193*6777b538SAndroid Build Coastguard Worker} 3194*6777b538SAndroid Build Coastguard Worker 3195*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values 3196*6777b538SAndroid Build Coastguard Worker forKeys:(const int32_t [])keys 3197*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 3198*6777b538SAndroid Build Coastguard Worker self = [super init]; 3199*6777b538SAndroid Build Coastguard Worker if (self) { 3200*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 3201*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 3202*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 3203*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 3204*6777b538SAndroid Build Coastguard Worker } 3205*6777b538SAndroid Build Coastguard Worker } 3206*6777b538SAndroid Build Coastguard Worker } 3207*6777b538SAndroid Build Coastguard Worker return self; 3208*6777b538SAndroid Build Coastguard Worker} 3209*6777b538SAndroid Build Coastguard Worker 3210*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32UInt32Dictionary *)dictionary { 3211*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt32s:NULL forKeys:NULL count:0]; 3212*6777b538SAndroid Build Coastguard Worker if (self) { 3213*6777b538SAndroid Build Coastguard Worker if (dictionary) { 3214*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 3215*6777b538SAndroid Build Coastguard Worker } 3216*6777b538SAndroid Build Coastguard Worker } 3217*6777b538SAndroid Build Coastguard Worker return self; 3218*6777b538SAndroid Build Coastguard Worker} 3219*6777b538SAndroid Build Coastguard Worker 3220*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 3221*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 3222*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 3223*6777b538SAndroid Build Coastguard Worker} 3224*6777b538SAndroid Build Coastguard Worker 3225*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 3226*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 3227*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 3228*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 3229*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 3230*6777b538SAndroid Build Coastguard Worker [super dealloc]; 3231*6777b538SAndroid Build Coastguard Worker} 3232*6777b538SAndroid Build Coastguard Worker 3233*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 3234*6777b538SAndroid Build Coastguard Worker return [[GPBInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self]; 3235*6777b538SAndroid Build Coastguard Worker} 3236*6777b538SAndroid Build Coastguard Worker 3237*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 3238*6777b538SAndroid Build Coastguard Worker if (self == other) { 3239*6777b538SAndroid Build Coastguard Worker return YES; 3240*6777b538SAndroid Build Coastguard Worker } 3241*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32UInt32Dictionary class]]) { 3242*6777b538SAndroid Build Coastguard Worker return NO; 3243*6777b538SAndroid Build Coastguard Worker } 3244*6777b538SAndroid Build Coastguard Worker GPBInt32UInt32Dictionary *otherDictionary = other; 3245*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 3246*6777b538SAndroid Build Coastguard Worker} 3247*6777b538SAndroid Build Coastguard Worker 3248*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 3249*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3250*6777b538SAndroid Build Coastguard Worker} 3251*6777b538SAndroid Build Coastguard Worker 3252*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 3253*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 3254*6777b538SAndroid Build Coastguard Worker} 3255*6777b538SAndroid Build Coastguard Worker 3256*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 3257*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3258*6777b538SAndroid Build Coastguard Worker} 3259*6777b538SAndroid Build Coastguard Worker 3260*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock: 3261*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, uint32_t value, BOOL *stop))block { 3262*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 3263*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3264*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3265*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3266*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3267*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3268*6777b538SAndroid Build Coastguard Worker block([aKey intValue], [aValue unsignedIntValue], &stop); 3269*6777b538SAndroid Build Coastguard Worker if (stop) { 3270*6777b538SAndroid Build Coastguard Worker break; 3271*6777b538SAndroid Build Coastguard Worker } 3272*6777b538SAndroid Build Coastguard Worker } 3273*6777b538SAndroid Build Coastguard Worker} 3274*6777b538SAndroid Build Coastguard Worker 3275*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 3276*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3277*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 3278*6777b538SAndroid Build Coastguard Worker if (count == 0) { 3279*6777b538SAndroid Build Coastguard Worker return 0; 3280*6777b538SAndroid Build Coastguard Worker } 3281*6777b538SAndroid Build Coastguard Worker 3282*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3283*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3284*6777b538SAndroid Build Coastguard Worker size_t result = 0; 3285*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3286*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3287*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3288*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3289*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType); 3290*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType); 3291*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 3292*6777b538SAndroid Build Coastguard Worker } 3293*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 3294*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 3295*6777b538SAndroid Build Coastguard Worker return result; 3296*6777b538SAndroid Build Coastguard Worker} 3297*6777b538SAndroid Build Coastguard Worker 3298*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 3299*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 3300*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3301*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3302*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 3303*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3304*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3305*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3306*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3307*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3308*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 3309*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 3310*6777b538SAndroid Build Coastguard Worker int32_t unwrappedKey = [aKey intValue]; 3311*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedValue = [aValue unsignedIntValue]; 3312*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 3313*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 3314*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 3315*6777b538SAndroid Build Coastguard Worker // Write the fields. 3316*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 3317*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 3318*6777b538SAndroid Build Coastguard Worker } 3319*6777b538SAndroid Build Coastguard Worker} 3320*6777b538SAndroid Build Coastguard Worker 3321*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 3322*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 3323*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueInt32)]; 3324*6777b538SAndroid Build Coastguard Worker} 3325*6777b538SAndroid Build Coastguard Worker 3326*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 3327*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt32sUsingBlock:^(int32_t key, uint32_t value, BOOL *stop) { 3328*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 3329*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%u", value]); 3330*6777b538SAndroid Build Coastguard Worker }]; 3331*6777b538SAndroid Build Coastguard Worker} 3332*6777b538SAndroid Build Coastguard Worker 3333*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int32_t)key { 3334*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 3335*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 3336*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedIntValue]; 3337*6777b538SAndroid Build Coastguard Worker } 3338*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 3339*6777b538SAndroid Build Coastguard Worker} 3340*6777b538SAndroid Build Coastguard Worker 3341*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32UInt32Dictionary *)otherDictionary { 3342*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 3343*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 3344*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3345*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3346*6777b538SAndroid Build Coastguard Worker } 3347*6777b538SAndroid Build Coastguard Worker } 3348*6777b538SAndroid Build Coastguard Worker} 3349*6777b538SAndroid Build Coastguard Worker 3350*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(int32_t)key { 3351*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 3352*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3353*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3354*6777b538SAndroid Build Coastguard Worker } 3355*6777b538SAndroid Build Coastguard Worker} 3356*6777b538SAndroid Build Coastguard Worker 3357*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(int32_t)aKey { 3358*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 3359*6777b538SAndroid Build Coastguard Worker} 3360*6777b538SAndroid Build Coastguard Worker 3361*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 3362*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 3363*6777b538SAndroid Build Coastguard Worker} 3364*6777b538SAndroid Build Coastguard Worker 3365*6777b538SAndroid Build Coastguard Worker@end 3366*6777b538SAndroid Build Coastguard Worker 3367*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Int32 3368*6777b538SAndroid Build Coastguard Worker 3369*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32Int32Dictionary { 3370*6777b538SAndroid Build Coastguard Worker @package 3371*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 3372*6777b538SAndroid Build Coastguard Worker} 3373*6777b538SAndroid Build Coastguard Worker 3374*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 3375*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 3376*6777b538SAndroid Build Coastguard Worker} 3377*6777b538SAndroid Build Coastguard Worker 3378*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values 3379*6777b538SAndroid Build Coastguard Worker forKeys:(const int32_t [])keys 3380*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 3381*6777b538SAndroid Build Coastguard Worker self = [super init]; 3382*6777b538SAndroid Build Coastguard Worker if (self) { 3383*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 3384*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 3385*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 3386*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 3387*6777b538SAndroid Build Coastguard Worker } 3388*6777b538SAndroid Build Coastguard Worker } 3389*6777b538SAndroid Build Coastguard Worker } 3390*6777b538SAndroid Build Coastguard Worker return self; 3391*6777b538SAndroid Build Coastguard Worker} 3392*6777b538SAndroid Build Coastguard Worker 3393*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32Int32Dictionary *)dictionary { 3394*6777b538SAndroid Build Coastguard Worker self = [self initWithInt32s:NULL forKeys:NULL count:0]; 3395*6777b538SAndroid Build Coastguard Worker if (self) { 3396*6777b538SAndroid Build Coastguard Worker if (dictionary) { 3397*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 3398*6777b538SAndroid Build Coastguard Worker } 3399*6777b538SAndroid Build Coastguard Worker } 3400*6777b538SAndroid Build Coastguard Worker return self; 3401*6777b538SAndroid Build Coastguard Worker} 3402*6777b538SAndroid Build Coastguard Worker 3403*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 3404*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 3405*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 3406*6777b538SAndroid Build Coastguard Worker} 3407*6777b538SAndroid Build Coastguard Worker 3408*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 3409*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 3410*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 3411*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 3412*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 3413*6777b538SAndroid Build Coastguard Worker [super dealloc]; 3414*6777b538SAndroid Build Coastguard Worker} 3415*6777b538SAndroid Build Coastguard Worker 3416*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 3417*6777b538SAndroid Build Coastguard Worker return [[GPBInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self]; 3418*6777b538SAndroid Build Coastguard Worker} 3419*6777b538SAndroid Build Coastguard Worker 3420*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 3421*6777b538SAndroid Build Coastguard Worker if (self == other) { 3422*6777b538SAndroid Build Coastguard Worker return YES; 3423*6777b538SAndroid Build Coastguard Worker } 3424*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32Int32Dictionary class]]) { 3425*6777b538SAndroid Build Coastguard Worker return NO; 3426*6777b538SAndroid Build Coastguard Worker } 3427*6777b538SAndroid Build Coastguard Worker GPBInt32Int32Dictionary *otherDictionary = other; 3428*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 3429*6777b538SAndroid Build Coastguard Worker} 3430*6777b538SAndroid Build Coastguard Worker 3431*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 3432*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3433*6777b538SAndroid Build Coastguard Worker} 3434*6777b538SAndroid Build Coastguard Worker 3435*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 3436*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 3437*6777b538SAndroid Build Coastguard Worker} 3438*6777b538SAndroid Build Coastguard Worker 3439*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 3440*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3441*6777b538SAndroid Build Coastguard Worker} 3442*6777b538SAndroid Build Coastguard Worker 3443*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock: 3444*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, int32_t value, BOOL *stop))block { 3445*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 3446*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3447*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3448*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3449*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3450*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3451*6777b538SAndroid Build Coastguard Worker block([aKey intValue], [aValue intValue], &stop); 3452*6777b538SAndroid Build Coastguard Worker if (stop) { 3453*6777b538SAndroid Build Coastguard Worker break; 3454*6777b538SAndroid Build Coastguard Worker } 3455*6777b538SAndroid Build Coastguard Worker } 3456*6777b538SAndroid Build Coastguard Worker} 3457*6777b538SAndroid Build Coastguard Worker 3458*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 3459*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3460*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 3461*6777b538SAndroid Build Coastguard Worker if (count == 0) { 3462*6777b538SAndroid Build Coastguard Worker return 0; 3463*6777b538SAndroid Build Coastguard Worker } 3464*6777b538SAndroid Build Coastguard Worker 3465*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3466*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3467*6777b538SAndroid Build Coastguard Worker size_t result = 0; 3468*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3469*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3470*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3471*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3472*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType); 3473*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 3474*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 3475*6777b538SAndroid Build Coastguard Worker } 3476*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 3477*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 3478*6777b538SAndroid Build Coastguard Worker return result; 3479*6777b538SAndroid Build Coastguard Worker} 3480*6777b538SAndroid Build Coastguard Worker 3481*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 3482*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 3483*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3484*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3485*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 3486*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3487*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3488*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3489*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3490*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3491*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 3492*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 3493*6777b538SAndroid Build Coastguard Worker int32_t unwrappedKey = [aKey intValue]; 3494*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 3495*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 3496*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 3497*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 3498*6777b538SAndroid Build Coastguard Worker // Write the fields. 3499*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 3500*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 3501*6777b538SAndroid Build Coastguard Worker } 3502*6777b538SAndroid Build Coastguard Worker} 3503*6777b538SAndroid Build Coastguard Worker 3504*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 3505*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 3506*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueInt32)]; 3507*6777b538SAndroid Build Coastguard Worker} 3508*6777b538SAndroid Build Coastguard Worker 3509*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 3510*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt32sUsingBlock:^(int32_t key, int32_t value, BOOL *stop) { 3511*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 3512*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%d", value]); 3513*6777b538SAndroid Build Coastguard Worker }]; 3514*6777b538SAndroid Build Coastguard Worker} 3515*6777b538SAndroid Build Coastguard Worker 3516*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(int32_t)key { 3517*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 3518*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 3519*6777b538SAndroid Build Coastguard Worker *value = [wrapped intValue]; 3520*6777b538SAndroid Build Coastguard Worker } 3521*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 3522*6777b538SAndroid Build Coastguard Worker} 3523*6777b538SAndroid Build Coastguard Worker 3524*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32Int32Dictionary *)otherDictionary { 3525*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 3526*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 3527*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3528*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3529*6777b538SAndroid Build Coastguard Worker } 3530*6777b538SAndroid Build Coastguard Worker } 3531*6777b538SAndroid Build Coastguard Worker} 3532*6777b538SAndroid Build Coastguard Worker 3533*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(int32_t)key { 3534*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 3535*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3536*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3537*6777b538SAndroid Build Coastguard Worker } 3538*6777b538SAndroid Build Coastguard Worker} 3539*6777b538SAndroid Build Coastguard Worker 3540*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(int32_t)aKey { 3541*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 3542*6777b538SAndroid Build Coastguard Worker} 3543*6777b538SAndroid Build Coastguard Worker 3544*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 3545*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 3546*6777b538SAndroid Build Coastguard Worker} 3547*6777b538SAndroid Build Coastguard Worker 3548*6777b538SAndroid Build Coastguard Worker@end 3549*6777b538SAndroid Build Coastguard Worker 3550*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> UInt64 3551*6777b538SAndroid Build Coastguard Worker 3552*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32UInt64Dictionary { 3553*6777b538SAndroid Build Coastguard Worker @package 3554*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 3555*6777b538SAndroid Build Coastguard Worker} 3556*6777b538SAndroid Build Coastguard Worker 3557*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 3558*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 3559*6777b538SAndroid Build Coastguard Worker} 3560*6777b538SAndroid Build Coastguard Worker 3561*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values 3562*6777b538SAndroid Build Coastguard Worker forKeys:(const int32_t [])keys 3563*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 3564*6777b538SAndroid Build Coastguard Worker self = [super init]; 3565*6777b538SAndroid Build Coastguard Worker if (self) { 3566*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 3567*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 3568*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 3569*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 3570*6777b538SAndroid Build Coastguard Worker } 3571*6777b538SAndroid Build Coastguard Worker } 3572*6777b538SAndroid Build Coastguard Worker } 3573*6777b538SAndroid Build Coastguard Worker return self; 3574*6777b538SAndroid Build Coastguard Worker} 3575*6777b538SAndroid Build Coastguard Worker 3576*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32UInt64Dictionary *)dictionary { 3577*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt64s:NULL forKeys:NULL count:0]; 3578*6777b538SAndroid Build Coastguard Worker if (self) { 3579*6777b538SAndroid Build Coastguard Worker if (dictionary) { 3580*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 3581*6777b538SAndroid Build Coastguard Worker } 3582*6777b538SAndroid Build Coastguard Worker } 3583*6777b538SAndroid Build Coastguard Worker return self; 3584*6777b538SAndroid Build Coastguard Worker} 3585*6777b538SAndroid Build Coastguard Worker 3586*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 3587*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 3588*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 3589*6777b538SAndroid Build Coastguard Worker} 3590*6777b538SAndroid Build Coastguard Worker 3591*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 3592*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 3593*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 3594*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 3595*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 3596*6777b538SAndroid Build Coastguard Worker [super dealloc]; 3597*6777b538SAndroid Build Coastguard Worker} 3598*6777b538SAndroid Build Coastguard Worker 3599*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 3600*6777b538SAndroid Build Coastguard Worker return [[GPBInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self]; 3601*6777b538SAndroid Build Coastguard Worker} 3602*6777b538SAndroid Build Coastguard Worker 3603*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 3604*6777b538SAndroid Build Coastguard Worker if (self == other) { 3605*6777b538SAndroid Build Coastguard Worker return YES; 3606*6777b538SAndroid Build Coastguard Worker } 3607*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32UInt64Dictionary class]]) { 3608*6777b538SAndroid Build Coastguard Worker return NO; 3609*6777b538SAndroid Build Coastguard Worker } 3610*6777b538SAndroid Build Coastguard Worker GPBInt32UInt64Dictionary *otherDictionary = other; 3611*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 3612*6777b538SAndroid Build Coastguard Worker} 3613*6777b538SAndroid Build Coastguard Worker 3614*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 3615*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3616*6777b538SAndroid Build Coastguard Worker} 3617*6777b538SAndroid Build Coastguard Worker 3618*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 3619*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 3620*6777b538SAndroid Build Coastguard Worker} 3621*6777b538SAndroid Build Coastguard Worker 3622*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 3623*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3624*6777b538SAndroid Build Coastguard Worker} 3625*6777b538SAndroid Build Coastguard Worker 3626*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock: 3627*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, uint64_t value, BOOL *stop))block { 3628*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 3629*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3630*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3631*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3632*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3633*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3634*6777b538SAndroid Build Coastguard Worker block([aKey intValue], [aValue unsignedLongLongValue], &stop); 3635*6777b538SAndroid Build Coastguard Worker if (stop) { 3636*6777b538SAndroid Build Coastguard Worker break; 3637*6777b538SAndroid Build Coastguard Worker } 3638*6777b538SAndroid Build Coastguard Worker } 3639*6777b538SAndroid Build Coastguard Worker} 3640*6777b538SAndroid Build Coastguard Worker 3641*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 3642*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3643*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 3644*6777b538SAndroid Build Coastguard Worker if (count == 0) { 3645*6777b538SAndroid Build Coastguard Worker return 0; 3646*6777b538SAndroid Build Coastguard Worker } 3647*6777b538SAndroid Build Coastguard Worker 3648*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3649*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3650*6777b538SAndroid Build Coastguard Worker size_t result = 0; 3651*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3652*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3653*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3654*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3655*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType); 3656*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType); 3657*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 3658*6777b538SAndroid Build Coastguard Worker } 3659*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 3660*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 3661*6777b538SAndroid Build Coastguard Worker return result; 3662*6777b538SAndroid Build Coastguard Worker} 3663*6777b538SAndroid Build Coastguard Worker 3664*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 3665*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 3666*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3667*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3668*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 3669*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3670*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3671*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3672*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3673*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3674*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 3675*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 3676*6777b538SAndroid Build Coastguard Worker int32_t unwrappedKey = [aKey intValue]; 3677*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedValue = [aValue unsignedLongLongValue]; 3678*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 3679*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 3680*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 3681*6777b538SAndroid Build Coastguard Worker // Write the fields. 3682*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 3683*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 3684*6777b538SAndroid Build Coastguard Worker } 3685*6777b538SAndroid Build Coastguard Worker} 3686*6777b538SAndroid Build Coastguard Worker 3687*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 3688*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 3689*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueInt32)]; 3690*6777b538SAndroid Build Coastguard Worker} 3691*6777b538SAndroid Build Coastguard Worker 3692*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 3693*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt64sUsingBlock:^(int32_t key, uint64_t value, BOOL *stop) { 3694*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 3695*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%llu", value]); 3696*6777b538SAndroid Build Coastguard Worker }]; 3697*6777b538SAndroid Build Coastguard Worker} 3698*6777b538SAndroid Build Coastguard Worker 3699*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int32_t)key { 3700*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 3701*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 3702*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedLongLongValue]; 3703*6777b538SAndroid Build Coastguard Worker } 3704*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 3705*6777b538SAndroid Build Coastguard Worker} 3706*6777b538SAndroid Build Coastguard Worker 3707*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32UInt64Dictionary *)otherDictionary { 3708*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 3709*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 3710*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3711*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3712*6777b538SAndroid Build Coastguard Worker } 3713*6777b538SAndroid Build Coastguard Worker } 3714*6777b538SAndroid Build Coastguard Worker} 3715*6777b538SAndroid Build Coastguard Worker 3716*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(int32_t)key { 3717*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 3718*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3719*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3720*6777b538SAndroid Build Coastguard Worker } 3721*6777b538SAndroid Build Coastguard Worker} 3722*6777b538SAndroid Build Coastguard Worker 3723*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(int32_t)aKey { 3724*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 3725*6777b538SAndroid Build Coastguard Worker} 3726*6777b538SAndroid Build Coastguard Worker 3727*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 3728*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 3729*6777b538SAndroid Build Coastguard Worker} 3730*6777b538SAndroid Build Coastguard Worker 3731*6777b538SAndroid Build Coastguard Worker@end 3732*6777b538SAndroid Build Coastguard Worker 3733*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Int64 3734*6777b538SAndroid Build Coastguard Worker 3735*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32Int64Dictionary { 3736*6777b538SAndroid Build Coastguard Worker @package 3737*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 3738*6777b538SAndroid Build Coastguard Worker} 3739*6777b538SAndroid Build Coastguard Worker 3740*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 3741*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 3742*6777b538SAndroid Build Coastguard Worker} 3743*6777b538SAndroid Build Coastguard Worker 3744*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values 3745*6777b538SAndroid Build Coastguard Worker forKeys:(const int32_t [])keys 3746*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 3747*6777b538SAndroid Build Coastguard Worker self = [super init]; 3748*6777b538SAndroid Build Coastguard Worker if (self) { 3749*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 3750*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 3751*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 3752*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 3753*6777b538SAndroid Build Coastguard Worker } 3754*6777b538SAndroid Build Coastguard Worker } 3755*6777b538SAndroid Build Coastguard Worker } 3756*6777b538SAndroid Build Coastguard Worker return self; 3757*6777b538SAndroid Build Coastguard Worker} 3758*6777b538SAndroid Build Coastguard Worker 3759*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32Int64Dictionary *)dictionary { 3760*6777b538SAndroid Build Coastguard Worker self = [self initWithInt64s:NULL forKeys:NULL count:0]; 3761*6777b538SAndroid Build Coastguard Worker if (self) { 3762*6777b538SAndroid Build Coastguard Worker if (dictionary) { 3763*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 3764*6777b538SAndroid Build Coastguard Worker } 3765*6777b538SAndroid Build Coastguard Worker } 3766*6777b538SAndroid Build Coastguard Worker return self; 3767*6777b538SAndroid Build Coastguard Worker} 3768*6777b538SAndroid Build Coastguard Worker 3769*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 3770*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 3771*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 3772*6777b538SAndroid Build Coastguard Worker} 3773*6777b538SAndroid Build Coastguard Worker 3774*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 3775*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 3776*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 3777*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 3778*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 3779*6777b538SAndroid Build Coastguard Worker [super dealloc]; 3780*6777b538SAndroid Build Coastguard Worker} 3781*6777b538SAndroid Build Coastguard Worker 3782*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 3783*6777b538SAndroid Build Coastguard Worker return [[GPBInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self]; 3784*6777b538SAndroid Build Coastguard Worker} 3785*6777b538SAndroid Build Coastguard Worker 3786*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 3787*6777b538SAndroid Build Coastguard Worker if (self == other) { 3788*6777b538SAndroid Build Coastguard Worker return YES; 3789*6777b538SAndroid Build Coastguard Worker } 3790*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32Int64Dictionary class]]) { 3791*6777b538SAndroid Build Coastguard Worker return NO; 3792*6777b538SAndroid Build Coastguard Worker } 3793*6777b538SAndroid Build Coastguard Worker GPBInt32Int64Dictionary *otherDictionary = other; 3794*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 3795*6777b538SAndroid Build Coastguard Worker} 3796*6777b538SAndroid Build Coastguard Worker 3797*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 3798*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3799*6777b538SAndroid Build Coastguard Worker} 3800*6777b538SAndroid Build Coastguard Worker 3801*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 3802*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 3803*6777b538SAndroid Build Coastguard Worker} 3804*6777b538SAndroid Build Coastguard Worker 3805*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 3806*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3807*6777b538SAndroid Build Coastguard Worker} 3808*6777b538SAndroid Build Coastguard Worker 3809*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock: 3810*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, int64_t value, BOOL *stop))block { 3811*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 3812*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3813*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3814*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3815*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3816*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3817*6777b538SAndroid Build Coastguard Worker block([aKey intValue], [aValue longLongValue], &stop); 3818*6777b538SAndroid Build Coastguard Worker if (stop) { 3819*6777b538SAndroid Build Coastguard Worker break; 3820*6777b538SAndroid Build Coastguard Worker } 3821*6777b538SAndroid Build Coastguard Worker } 3822*6777b538SAndroid Build Coastguard Worker} 3823*6777b538SAndroid Build Coastguard Worker 3824*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 3825*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3826*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 3827*6777b538SAndroid Build Coastguard Worker if (count == 0) { 3828*6777b538SAndroid Build Coastguard Worker return 0; 3829*6777b538SAndroid Build Coastguard Worker } 3830*6777b538SAndroid Build Coastguard Worker 3831*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3832*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3833*6777b538SAndroid Build Coastguard Worker size_t result = 0; 3834*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3835*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3836*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3837*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3838*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType); 3839*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType); 3840*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 3841*6777b538SAndroid Build Coastguard Worker } 3842*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 3843*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 3844*6777b538SAndroid Build Coastguard Worker return result; 3845*6777b538SAndroid Build Coastguard Worker} 3846*6777b538SAndroid Build Coastguard Worker 3847*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 3848*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 3849*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 3850*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 3851*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 3852*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3853*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3854*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3855*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3856*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 3857*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 3858*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 3859*6777b538SAndroid Build Coastguard Worker int32_t unwrappedKey = [aKey intValue]; 3860*6777b538SAndroid Build Coastguard Worker int64_t unwrappedValue = [aValue longLongValue]; 3861*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 3862*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 3863*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 3864*6777b538SAndroid Build Coastguard Worker // Write the fields. 3865*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 3866*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 3867*6777b538SAndroid Build Coastguard Worker } 3868*6777b538SAndroid Build Coastguard Worker} 3869*6777b538SAndroid Build Coastguard Worker 3870*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 3871*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 3872*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueInt32)]; 3873*6777b538SAndroid Build Coastguard Worker} 3874*6777b538SAndroid Build Coastguard Worker 3875*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 3876*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt64sUsingBlock:^(int32_t key, int64_t value, BOOL *stop) { 3877*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 3878*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%lld", value]); 3879*6777b538SAndroid Build Coastguard Worker }]; 3880*6777b538SAndroid Build Coastguard Worker} 3881*6777b538SAndroid Build Coastguard Worker 3882*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(int32_t)key { 3883*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 3884*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 3885*6777b538SAndroid Build Coastguard Worker *value = [wrapped longLongValue]; 3886*6777b538SAndroid Build Coastguard Worker } 3887*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 3888*6777b538SAndroid Build Coastguard Worker} 3889*6777b538SAndroid Build Coastguard Worker 3890*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32Int64Dictionary *)otherDictionary { 3891*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 3892*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 3893*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3894*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3895*6777b538SAndroid Build Coastguard Worker } 3896*6777b538SAndroid Build Coastguard Worker } 3897*6777b538SAndroid Build Coastguard Worker} 3898*6777b538SAndroid Build Coastguard Worker 3899*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(int32_t)key { 3900*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 3901*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 3902*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 3903*6777b538SAndroid Build Coastguard Worker } 3904*6777b538SAndroid Build Coastguard Worker} 3905*6777b538SAndroid Build Coastguard Worker 3906*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(int32_t)aKey { 3907*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 3908*6777b538SAndroid Build Coastguard Worker} 3909*6777b538SAndroid Build Coastguard Worker 3910*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 3911*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 3912*6777b538SAndroid Build Coastguard Worker} 3913*6777b538SAndroid Build Coastguard Worker 3914*6777b538SAndroid Build Coastguard Worker@end 3915*6777b538SAndroid Build Coastguard Worker 3916*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Bool 3917*6777b538SAndroid Build Coastguard Worker 3918*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32BoolDictionary { 3919*6777b538SAndroid Build Coastguard Worker @package 3920*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 3921*6777b538SAndroid Build Coastguard Worker} 3922*6777b538SAndroid Build Coastguard Worker 3923*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 3924*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 3925*6777b538SAndroid Build Coastguard Worker} 3926*6777b538SAndroid Build Coastguard Worker 3927*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values 3928*6777b538SAndroid Build Coastguard Worker forKeys:(const int32_t [])keys 3929*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 3930*6777b538SAndroid Build Coastguard Worker self = [super init]; 3931*6777b538SAndroid Build Coastguard Worker if (self) { 3932*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 3933*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 3934*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 3935*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 3936*6777b538SAndroid Build Coastguard Worker } 3937*6777b538SAndroid Build Coastguard Worker } 3938*6777b538SAndroid Build Coastguard Worker } 3939*6777b538SAndroid Build Coastguard Worker return self; 3940*6777b538SAndroid Build Coastguard Worker} 3941*6777b538SAndroid Build Coastguard Worker 3942*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32BoolDictionary *)dictionary { 3943*6777b538SAndroid Build Coastguard Worker self = [self initWithBools:NULL forKeys:NULL count:0]; 3944*6777b538SAndroid Build Coastguard Worker if (self) { 3945*6777b538SAndroid Build Coastguard Worker if (dictionary) { 3946*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 3947*6777b538SAndroid Build Coastguard Worker } 3948*6777b538SAndroid Build Coastguard Worker } 3949*6777b538SAndroid Build Coastguard Worker return self; 3950*6777b538SAndroid Build Coastguard Worker} 3951*6777b538SAndroid Build Coastguard Worker 3952*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 3953*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 3954*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 3955*6777b538SAndroid Build Coastguard Worker} 3956*6777b538SAndroid Build Coastguard Worker 3957*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 3958*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 3959*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 3960*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 3961*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 3962*6777b538SAndroid Build Coastguard Worker [super dealloc]; 3963*6777b538SAndroid Build Coastguard Worker} 3964*6777b538SAndroid Build Coastguard Worker 3965*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 3966*6777b538SAndroid Build Coastguard Worker return [[GPBInt32BoolDictionary allocWithZone:zone] initWithDictionary:self]; 3967*6777b538SAndroid Build Coastguard Worker} 3968*6777b538SAndroid Build Coastguard Worker 3969*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 3970*6777b538SAndroid Build Coastguard Worker if (self == other) { 3971*6777b538SAndroid Build Coastguard Worker return YES; 3972*6777b538SAndroid Build Coastguard Worker } 3973*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32BoolDictionary class]]) { 3974*6777b538SAndroid Build Coastguard Worker return NO; 3975*6777b538SAndroid Build Coastguard Worker } 3976*6777b538SAndroid Build Coastguard Worker GPBInt32BoolDictionary *otherDictionary = other; 3977*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 3978*6777b538SAndroid Build Coastguard Worker} 3979*6777b538SAndroid Build Coastguard Worker 3980*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 3981*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3982*6777b538SAndroid Build Coastguard Worker} 3983*6777b538SAndroid Build Coastguard Worker 3984*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 3985*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 3986*6777b538SAndroid Build Coastguard Worker} 3987*6777b538SAndroid Build Coastguard Worker 3988*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 3989*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 3990*6777b538SAndroid Build Coastguard Worker} 3991*6777b538SAndroid Build Coastguard Worker 3992*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock: 3993*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, BOOL value, BOOL *stop))block { 3994*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 3995*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 3996*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 3997*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 3998*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 3999*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4000*6777b538SAndroid Build Coastguard Worker block([aKey intValue], [aValue boolValue], &stop); 4001*6777b538SAndroid Build Coastguard Worker if (stop) { 4002*6777b538SAndroid Build Coastguard Worker break; 4003*6777b538SAndroid Build Coastguard Worker } 4004*6777b538SAndroid Build Coastguard Worker } 4005*6777b538SAndroid Build Coastguard Worker} 4006*6777b538SAndroid Build Coastguard Worker 4007*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 4008*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4009*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 4010*6777b538SAndroid Build Coastguard Worker if (count == 0) { 4011*6777b538SAndroid Build Coastguard Worker return 0; 4012*6777b538SAndroid Build Coastguard Worker } 4013*6777b538SAndroid Build Coastguard Worker 4014*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4015*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4016*6777b538SAndroid Build Coastguard Worker size_t result = 0; 4017*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4018*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4019*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4020*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4021*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType); 4022*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType); 4023*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 4024*6777b538SAndroid Build Coastguard Worker } 4025*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 4026*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 4027*6777b538SAndroid Build Coastguard Worker return result; 4028*6777b538SAndroid Build Coastguard Worker} 4029*6777b538SAndroid Build Coastguard Worker 4030*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 4031*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 4032*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4033*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4034*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 4035*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4036*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4037*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4038*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4039*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4040*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 4041*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 4042*6777b538SAndroid Build Coastguard Worker int32_t unwrappedKey = [aKey intValue]; 4043*6777b538SAndroid Build Coastguard Worker BOOL unwrappedValue = [aValue boolValue]; 4044*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 4045*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 4046*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 4047*6777b538SAndroid Build Coastguard Worker // Write the fields. 4048*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 4049*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 4050*6777b538SAndroid Build Coastguard Worker } 4051*6777b538SAndroid Build Coastguard Worker} 4052*6777b538SAndroid Build Coastguard Worker 4053*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 4054*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 4055*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueBool) forKey:@(key->valueInt32)]; 4056*6777b538SAndroid Build Coastguard Worker} 4057*6777b538SAndroid Build Coastguard Worker 4058*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 4059*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndBoolsUsingBlock:^(int32_t key, BOOL value, BOOL *stop) { 4060*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 4061*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%d", key], (value ? @"true" : @"false")); 4062*6777b538SAndroid Build Coastguard Worker }]; 4063*6777b538SAndroid Build Coastguard Worker} 4064*6777b538SAndroid Build Coastguard Worker 4065*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(int32_t)key { 4066*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 4067*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 4068*6777b538SAndroid Build Coastguard Worker *value = [wrapped boolValue]; 4069*6777b538SAndroid Build Coastguard Worker } 4070*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 4071*6777b538SAndroid Build Coastguard Worker} 4072*6777b538SAndroid Build Coastguard Worker 4073*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32BoolDictionary *)otherDictionary { 4074*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 4075*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 4076*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4077*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4078*6777b538SAndroid Build Coastguard Worker } 4079*6777b538SAndroid Build Coastguard Worker } 4080*6777b538SAndroid Build Coastguard Worker} 4081*6777b538SAndroid Build Coastguard Worker 4082*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(int32_t)key { 4083*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 4084*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4085*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4086*6777b538SAndroid Build Coastguard Worker } 4087*6777b538SAndroid Build Coastguard Worker} 4088*6777b538SAndroid Build Coastguard Worker 4089*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(int32_t)aKey { 4090*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 4091*6777b538SAndroid Build Coastguard Worker} 4092*6777b538SAndroid Build Coastguard Worker 4093*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 4094*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 4095*6777b538SAndroid Build Coastguard Worker} 4096*6777b538SAndroid Build Coastguard Worker 4097*6777b538SAndroid Build Coastguard Worker@end 4098*6777b538SAndroid Build Coastguard Worker 4099*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Float 4100*6777b538SAndroid Build Coastguard Worker 4101*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32FloatDictionary { 4102*6777b538SAndroid Build Coastguard Worker @package 4103*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 4104*6777b538SAndroid Build Coastguard Worker} 4105*6777b538SAndroid Build Coastguard Worker 4106*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 4107*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 4108*6777b538SAndroid Build Coastguard Worker} 4109*6777b538SAndroid Build Coastguard Worker 4110*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values 4111*6777b538SAndroid Build Coastguard Worker forKeys:(const int32_t [])keys 4112*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 4113*6777b538SAndroid Build Coastguard Worker self = [super init]; 4114*6777b538SAndroid Build Coastguard Worker if (self) { 4115*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 4116*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 4117*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 4118*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 4119*6777b538SAndroid Build Coastguard Worker } 4120*6777b538SAndroid Build Coastguard Worker } 4121*6777b538SAndroid Build Coastguard Worker } 4122*6777b538SAndroid Build Coastguard Worker return self; 4123*6777b538SAndroid Build Coastguard Worker} 4124*6777b538SAndroid Build Coastguard Worker 4125*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32FloatDictionary *)dictionary { 4126*6777b538SAndroid Build Coastguard Worker self = [self initWithFloats:NULL forKeys:NULL count:0]; 4127*6777b538SAndroid Build Coastguard Worker if (self) { 4128*6777b538SAndroid Build Coastguard Worker if (dictionary) { 4129*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 4130*6777b538SAndroid Build Coastguard Worker } 4131*6777b538SAndroid Build Coastguard Worker } 4132*6777b538SAndroid Build Coastguard Worker return self; 4133*6777b538SAndroid Build Coastguard Worker} 4134*6777b538SAndroid Build Coastguard Worker 4135*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 4136*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 4137*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 4138*6777b538SAndroid Build Coastguard Worker} 4139*6777b538SAndroid Build Coastguard Worker 4140*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 4141*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 4142*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 4143*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 4144*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 4145*6777b538SAndroid Build Coastguard Worker [super dealloc]; 4146*6777b538SAndroid Build Coastguard Worker} 4147*6777b538SAndroid Build Coastguard Worker 4148*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 4149*6777b538SAndroid Build Coastguard Worker return [[GPBInt32FloatDictionary allocWithZone:zone] initWithDictionary:self]; 4150*6777b538SAndroid Build Coastguard Worker} 4151*6777b538SAndroid Build Coastguard Worker 4152*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 4153*6777b538SAndroid Build Coastguard Worker if (self == other) { 4154*6777b538SAndroid Build Coastguard Worker return YES; 4155*6777b538SAndroid Build Coastguard Worker } 4156*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32FloatDictionary class]]) { 4157*6777b538SAndroid Build Coastguard Worker return NO; 4158*6777b538SAndroid Build Coastguard Worker } 4159*6777b538SAndroid Build Coastguard Worker GPBInt32FloatDictionary *otherDictionary = other; 4160*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 4161*6777b538SAndroid Build Coastguard Worker} 4162*6777b538SAndroid Build Coastguard Worker 4163*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 4164*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 4165*6777b538SAndroid Build Coastguard Worker} 4166*6777b538SAndroid Build Coastguard Worker 4167*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 4168*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 4169*6777b538SAndroid Build Coastguard Worker} 4170*6777b538SAndroid Build Coastguard Worker 4171*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 4172*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 4173*6777b538SAndroid Build Coastguard Worker} 4174*6777b538SAndroid Build Coastguard Worker 4175*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock: 4176*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, float value, BOOL *stop))block { 4177*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 4178*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4179*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4180*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4181*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4182*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4183*6777b538SAndroid Build Coastguard Worker block([aKey intValue], [aValue floatValue], &stop); 4184*6777b538SAndroid Build Coastguard Worker if (stop) { 4185*6777b538SAndroid Build Coastguard Worker break; 4186*6777b538SAndroid Build Coastguard Worker } 4187*6777b538SAndroid Build Coastguard Worker } 4188*6777b538SAndroid Build Coastguard Worker} 4189*6777b538SAndroid Build Coastguard Worker 4190*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 4191*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4192*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 4193*6777b538SAndroid Build Coastguard Worker if (count == 0) { 4194*6777b538SAndroid Build Coastguard Worker return 0; 4195*6777b538SAndroid Build Coastguard Worker } 4196*6777b538SAndroid Build Coastguard Worker 4197*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4198*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4199*6777b538SAndroid Build Coastguard Worker size_t result = 0; 4200*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4201*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4202*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4203*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4204*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType); 4205*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType); 4206*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 4207*6777b538SAndroid Build Coastguard Worker } 4208*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 4209*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 4210*6777b538SAndroid Build Coastguard Worker return result; 4211*6777b538SAndroid Build Coastguard Worker} 4212*6777b538SAndroid Build Coastguard Worker 4213*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 4214*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 4215*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4216*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4217*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 4218*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4219*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4220*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4221*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4222*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4223*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 4224*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 4225*6777b538SAndroid Build Coastguard Worker int32_t unwrappedKey = [aKey intValue]; 4226*6777b538SAndroid Build Coastguard Worker float unwrappedValue = [aValue floatValue]; 4227*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 4228*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 4229*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 4230*6777b538SAndroid Build Coastguard Worker // Write the fields. 4231*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 4232*6777b538SAndroid Build Coastguard Worker WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 4233*6777b538SAndroid Build Coastguard Worker } 4234*6777b538SAndroid Build Coastguard Worker} 4235*6777b538SAndroid Build Coastguard Worker 4236*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 4237*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 4238*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueInt32)]; 4239*6777b538SAndroid Build Coastguard Worker} 4240*6777b538SAndroid Build Coastguard Worker 4241*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 4242*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndFloatsUsingBlock:^(int32_t key, float value, BOOL *stop) { 4243*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 4244*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]); 4245*6777b538SAndroid Build Coastguard Worker }]; 4246*6777b538SAndroid Build Coastguard Worker} 4247*6777b538SAndroid Build Coastguard Worker 4248*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(int32_t)key { 4249*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 4250*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 4251*6777b538SAndroid Build Coastguard Worker *value = [wrapped floatValue]; 4252*6777b538SAndroid Build Coastguard Worker } 4253*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 4254*6777b538SAndroid Build Coastguard Worker} 4255*6777b538SAndroid Build Coastguard Worker 4256*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32FloatDictionary *)otherDictionary { 4257*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 4258*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 4259*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4260*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4261*6777b538SAndroid Build Coastguard Worker } 4262*6777b538SAndroid Build Coastguard Worker } 4263*6777b538SAndroid Build Coastguard Worker} 4264*6777b538SAndroid Build Coastguard Worker 4265*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(int32_t)key { 4266*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 4267*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4268*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4269*6777b538SAndroid Build Coastguard Worker } 4270*6777b538SAndroid Build Coastguard Worker} 4271*6777b538SAndroid Build Coastguard Worker 4272*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(int32_t)aKey { 4273*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 4274*6777b538SAndroid Build Coastguard Worker} 4275*6777b538SAndroid Build Coastguard Worker 4276*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 4277*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 4278*6777b538SAndroid Build Coastguard Worker} 4279*6777b538SAndroid Build Coastguard Worker 4280*6777b538SAndroid Build Coastguard Worker@end 4281*6777b538SAndroid Build Coastguard Worker 4282*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Double 4283*6777b538SAndroid Build Coastguard Worker 4284*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32DoubleDictionary { 4285*6777b538SAndroid Build Coastguard Worker @package 4286*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 4287*6777b538SAndroid Build Coastguard Worker} 4288*6777b538SAndroid Build Coastguard Worker 4289*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 4290*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 4291*6777b538SAndroid Build Coastguard Worker} 4292*6777b538SAndroid Build Coastguard Worker 4293*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values 4294*6777b538SAndroid Build Coastguard Worker forKeys:(const int32_t [])keys 4295*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 4296*6777b538SAndroid Build Coastguard Worker self = [super init]; 4297*6777b538SAndroid Build Coastguard Worker if (self) { 4298*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 4299*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 4300*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 4301*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 4302*6777b538SAndroid Build Coastguard Worker } 4303*6777b538SAndroid Build Coastguard Worker } 4304*6777b538SAndroid Build Coastguard Worker } 4305*6777b538SAndroid Build Coastguard Worker return self; 4306*6777b538SAndroid Build Coastguard Worker} 4307*6777b538SAndroid Build Coastguard Worker 4308*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32DoubleDictionary *)dictionary { 4309*6777b538SAndroid Build Coastguard Worker self = [self initWithDoubles:NULL forKeys:NULL count:0]; 4310*6777b538SAndroid Build Coastguard Worker if (self) { 4311*6777b538SAndroid Build Coastguard Worker if (dictionary) { 4312*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 4313*6777b538SAndroid Build Coastguard Worker } 4314*6777b538SAndroid Build Coastguard Worker } 4315*6777b538SAndroid Build Coastguard Worker return self; 4316*6777b538SAndroid Build Coastguard Worker} 4317*6777b538SAndroid Build Coastguard Worker 4318*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 4319*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 4320*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 4321*6777b538SAndroid Build Coastguard Worker} 4322*6777b538SAndroid Build Coastguard Worker 4323*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 4324*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 4325*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 4326*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 4327*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 4328*6777b538SAndroid Build Coastguard Worker [super dealloc]; 4329*6777b538SAndroid Build Coastguard Worker} 4330*6777b538SAndroid Build Coastguard Worker 4331*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 4332*6777b538SAndroid Build Coastguard Worker return [[GPBInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self]; 4333*6777b538SAndroid Build Coastguard Worker} 4334*6777b538SAndroid Build Coastguard Worker 4335*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 4336*6777b538SAndroid Build Coastguard Worker if (self == other) { 4337*6777b538SAndroid Build Coastguard Worker return YES; 4338*6777b538SAndroid Build Coastguard Worker } 4339*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32DoubleDictionary class]]) { 4340*6777b538SAndroid Build Coastguard Worker return NO; 4341*6777b538SAndroid Build Coastguard Worker } 4342*6777b538SAndroid Build Coastguard Worker GPBInt32DoubleDictionary *otherDictionary = other; 4343*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 4344*6777b538SAndroid Build Coastguard Worker} 4345*6777b538SAndroid Build Coastguard Worker 4346*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 4347*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 4348*6777b538SAndroid Build Coastguard Worker} 4349*6777b538SAndroid Build Coastguard Worker 4350*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 4351*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 4352*6777b538SAndroid Build Coastguard Worker} 4353*6777b538SAndroid Build Coastguard Worker 4354*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 4355*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 4356*6777b538SAndroid Build Coastguard Worker} 4357*6777b538SAndroid Build Coastguard Worker 4358*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock: 4359*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, double value, BOOL *stop))block { 4360*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 4361*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4362*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4363*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4364*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4365*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4366*6777b538SAndroid Build Coastguard Worker block([aKey intValue], [aValue doubleValue], &stop); 4367*6777b538SAndroid Build Coastguard Worker if (stop) { 4368*6777b538SAndroid Build Coastguard Worker break; 4369*6777b538SAndroid Build Coastguard Worker } 4370*6777b538SAndroid Build Coastguard Worker } 4371*6777b538SAndroid Build Coastguard Worker} 4372*6777b538SAndroid Build Coastguard Worker 4373*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 4374*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4375*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 4376*6777b538SAndroid Build Coastguard Worker if (count == 0) { 4377*6777b538SAndroid Build Coastguard Worker return 0; 4378*6777b538SAndroid Build Coastguard Worker } 4379*6777b538SAndroid Build Coastguard Worker 4380*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4381*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4382*6777b538SAndroid Build Coastguard Worker size_t result = 0; 4383*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4384*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4385*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4386*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4387*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType); 4388*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType); 4389*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 4390*6777b538SAndroid Build Coastguard Worker } 4391*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 4392*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 4393*6777b538SAndroid Build Coastguard Worker return result; 4394*6777b538SAndroid Build Coastguard Worker} 4395*6777b538SAndroid Build Coastguard Worker 4396*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 4397*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 4398*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4399*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4400*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 4401*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4402*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4403*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4404*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4405*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4406*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 4407*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 4408*6777b538SAndroid Build Coastguard Worker int32_t unwrappedKey = [aKey intValue]; 4409*6777b538SAndroid Build Coastguard Worker double unwrappedValue = [aValue doubleValue]; 4410*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 4411*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 4412*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 4413*6777b538SAndroid Build Coastguard Worker // Write the fields. 4414*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 4415*6777b538SAndroid Build Coastguard Worker WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 4416*6777b538SAndroid Build Coastguard Worker } 4417*6777b538SAndroid Build Coastguard Worker} 4418*6777b538SAndroid Build Coastguard Worker 4419*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 4420*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 4421*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueInt32)]; 4422*6777b538SAndroid Build Coastguard Worker} 4423*6777b538SAndroid Build Coastguard Worker 4424*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 4425*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndDoublesUsingBlock:^(int32_t key, double value, BOOL *stop) { 4426*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 4427*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]); 4428*6777b538SAndroid Build Coastguard Worker }]; 4429*6777b538SAndroid Build Coastguard Worker} 4430*6777b538SAndroid Build Coastguard Worker 4431*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(int32_t)key { 4432*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 4433*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 4434*6777b538SAndroid Build Coastguard Worker *value = [wrapped doubleValue]; 4435*6777b538SAndroid Build Coastguard Worker } 4436*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 4437*6777b538SAndroid Build Coastguard Worker} 4438*6777b538SAndroid Build Coastguard Worker 4439*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32DoubleDictionary *)otherDictionary { 4440*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 4441*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 4442*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4443*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4444*6777b538SAndroid Build Coastguard Worker } 4445*6777b538SAndroid Build Coastguard Worker } 4446*6777b538SAndroid Build Coastguard Worker} 4447*6777b538SAndroid Build Coastguard Worker 4448*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(int32_t)key { 4449*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 4450*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4451*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4452*6777b538SAndroid Build Coastguard Worker } 4453*6777b538SAndroid Build Coastguard Worker} 4454*6777b538SAndroid Build Coastguard Worker 4455*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(int32_t)aKey { 4456*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 4457*6777b538SAndroid Build Coastguard Worker} 4458*6777b538SAndroid Build Coastguard Worker 4459*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 4460*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 4461*6777b538SAndroid Build Coastguard Worker} 4462*6777b538SAndroid Build Coastguard Worker 4463*6777b538SAndroid Build Coastguard Worker@end 4464*6777b538SAndroid Build Coastguard Worker 4465*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Enum 4466*6777b538SAndroid Build Coastguard Worker 4467*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32EnumDictionary { 4468*6777b538SAndroid Build Coastguard Worker @package 4469*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 4470*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc _validationFunc; 4471*6777b538SAndroid Build Coastguard Worker} 4472*6777b538SAndroid Build Coastguard Worker 4473*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc; 4474*6777b538SAndroid Build Coastguard Worker 4475*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 4476*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0]; 4477*6777b538SAndroid Build Coastguard Worker} 4478*6777b538SAndroid Build Coastguard Worker 4479*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func { 4480*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 4481*6777b538SAndroid Build Coastguard Worker} 4482*6777b538SAndroid Build Coastguard Worker 4483*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 4484*6777b538SAndroid Build Coastguard Worker rawValues:(const int32_t [])rawValues 4485*6777b538SAndroid Build Coastguard Worker forKeys:(const int32_t [])keys 4486*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 4487*6777b538SAndroid Build Coastguard Worker self = [super init]; 4488*6777b538SAndroid Build Coastguard Worker if (self) { 4489*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 4490*6777b538SAndroid Build Coastguard Worker _validationFunc = (func != NULL ? func : DictDefault_IsValidValue); 4491*6777b538SAndroid Build Coastguard Worker if (count && rawValues && keys) { 4492*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 4493*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])]; 4494*6777b538SAndroid Build Coastguard Worker } 4495*6777b538SAndroid Build Coastguard Worker } 4496*6777b538SAndroid Build Coastguard Worker } 4497*6777b538SAndroid Build Coastguard Worker return self; 4498*6777b538SAndroid Build Coastguard Worker} 4499*6777b538SAndroid Build Coastguard Worker 4500*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32EnumDictionary *)dictionary { 4501*6777b538SAndroid Build Coastguard Worker self = [self initWithValidationFunction:dictionary.validationFunc 4502*6777b538SAndroid Build Coastguard Worker rawValues:NULL 4503*6777b538SAndroid Build Coastguard Worker forKeys:NULL 4504*6777b538SAndroid Build Coastguard Worker count:0]; 4505*6777b538SAndroid Build Coastguard Worker if (self) { 4506*6777b538SAndroid Build Coastguard Worker if (dictionary) { 4507*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 4508*6777b538SAndroid Build Coastguard Worker } 4509*6777b538SAndroid Build Coastguard Worker } 4510*6777b538SAndroid Build Coastguard Worker return self; 4511*6777b538SAndroid Build Coastguard Worker} 4512*6777b538SAndroid Build Coastguard Worker 4513*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 4514*6777b538SAndroid Build Coastguard Worker capacity:(NSUInteger)numItems { 4515*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 4516*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 4517*6777b538SAndroid Build Coastguard Worker} 4518*6777b538SAndroid Build Coastguard Worker 4519*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 4520*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 4521*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 4522*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 4523*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 4524*6777b538SAndroid Build Coastguard Worker [super dealloc]; 4525*6777b538SAndroid Build Coastguard Worker} 4526*6777b538SAndroid Build Coastguard Worker 4527*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 4528*6777b538SAndroid Build Coastguard Worker return [[GPBInt32EnumDictionary allocWithZone:zone] initWithDictionary:self]; 4529*6777b538SAndroid Build Coastguard Worker} 4530*6777b538SAndroid Build Coastguard Worker 4531*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 4532*6777b538SAndroid Build Coastguard Worker if (self == other) { 4533*6777b538SAndroid Build Coastguard Worker return YES; 4534*6777b538SAndroid Build Coastguard Worker } 4535*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32EnumDictionary class]]) { 4536*6777b538SAndroid Build Coastguard Worker return NO; 4537*6777b538SAndroid Build Coastguard Worker } 4538*6777b538SAndroid Build Coastguard Worker GPBInt32EnumDictionary *otherDictionary = other; 4539*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 4540*6777b538SAndroid Build Coastguard Worker} 4541*6777b538SAndroid Build Coastguard Worker 4542*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 4543*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 4544*6777b538SAndroid Build Coastguard Worker} 4545*6777b538SAndroid Build Coastguard Worker 4546*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 4547*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 4548*6777b538SAndroid Build Coastguard Worker} 4549*6777b538SAndroid Build Coastguard Worker 4550*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 4551*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 4552*6777b538SAndroid Build Coastguard Worker} 4553*6777b538SAndroid Build Coastguard Worker 4554*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock: 4555*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, int32_t value, BOOL *stop))block { 4556*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 4557*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4558*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4559*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4560*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4561*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4562*6777b538SAndroid Build Coastguard Worker block([aKey intValue], [aValue intValue], &stop); 4563*6777b538SAndroid Build Coastguard Worker if (stop) { 4564*6777b538SAndroid Build Coastguard Worker break; 4565*6777b538SAndroid Build Coastguard Worker } 4566*6777b538SAndroid Build Coastguard Worker } 4567*6777b538SAndroid Build Coastguard Worker} 4568*6777b538SAndroid Build Coastguard Worker 4569*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 4570*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4571*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 4572*6777b538SAndroid Build Coastguard Worker if (count == 0) { 4573*6777b538SAndroid Build Coastguard Worker return 0; 4574*6777b538SAndroid Build Coastguard Worker } 4575*6777b538SAndroid Build Coastguard Worker 4576*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4577*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4578*6777b538SAndroid Build Coastguard Worker size_t result = 0; 4579*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4580*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4581*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4582*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4583*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType); 4584*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 4585*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 4586*6777b538SAndroid Build Coastguard Worker } 4587*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 4588*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 4589*6777b538SAndroid Build Coastguard Worker return result; 4590*6777b538SAndroid Build Coastguard Worker} 4591*6777b538SAndroid Build Coastguard Worker 4592*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 4593*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 4594*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4595*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4596*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 4597*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4598*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4599*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4600*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4601*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 4602*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 4603*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 4604*6777b538SAndroid Build Coastguard Worker int32_t unwrappedKey = [aKey intValue]; 4605*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 4606*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 4607*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 4608*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 4609*6777b538SAndroid Build Coastguard Worker // Write the fields. 4610*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 4611*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 4612*6777b538SAndroid Build Coastguard Worker } 4613*6777b538SAndroid Build Coastguard Worker} 4614*6777b538SAndroid Build Coastguard Worker 4615*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value 4616*6777b538SAndroid Build Coastguard Worker forKey:(GPBGenericValue *)key 4617*6777b538SAndroid Build Coastguard Worker keyDataType:(GPBDataType)keyDataType { 4618*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(key->valueInt32, kMapKeyFieldNumber, keyDataType); 4619*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum); 4620*6777b538SAndroid Build Coastguard Worker NSMutableData *data = [NSMutableData dataWithLength:msgSize]; 4621*6777b538SAndroid Build Coastguard Worker GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data]; 4622*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, key->valueInt32, kMapKeyFieldNumber, keyDataType); 4623*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum); 4624*6777b538SAndroid Build Coastguard Worker [outputStream release]; 4625*6777b538SAndroid Build Coastguard Worker return data; 4626*6777b538SAndroid Build Coastguard Worker} 4627*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 4628*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 4629*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueInt32)]; 4630*6777b538SAndroid Build Coastguard Worker} 4631*6777b538SAndroid Build Coastguard Worker 4632*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 4633*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndRawValuesUsingBlock:^(int32_t key, int32_t value, BOOL *stop) { 4634*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 4635*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%d", key], @(value)); 4636*6777b538SAndroid Build Coastguard Worker }]; 4637*6777b538SAndroid Build Coastguard Worker} 4638*6777b538SAndroid Build Coastguard Worker 4639*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(int32_t)key { 4640*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 4641*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 4642*6777b538SAndroid Build Coastguard Worker int32_t result = [wrapped intValue]; 4643*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(result)) { 4644*6777b538SAndroid Build Coastguard Worker result = kGPBUnrecognizedEnumeratorValue; 4645*6777b538SAndroid Build Coastguard Worker } 4646*6777b538SAndroid Build Coastguard Worker *value = result; 4647*6777b538SAndroid Build Coastguard Worker } 4648*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 4649*6777b538SAndroid Build Coastguard Worker} 4650*6777b538SAndroid Build Coastguard Worker 4651*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(int32_t)key { 4652*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 4653*6777b538SAndroid Build Coastguard Worker if (wrapped && rawValue) { 4654*6777b538SAndroid Build Coastguard Worker *rawValue = [wrapped intValue]; 4655*6777b538SAndroid Build Coastguard Worker } 4656*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 4657*6777b538SAndroid Build Coastguard Worker} 4658*6777b538SAndroid Build Coastguard Worker 4659*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock: 4660*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, int32_t value, BOOL *stop))block { 4661*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc func = _validationFunc; 4662*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 4663*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [_dictionary keyEnumerator]; 4664*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4665*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4666*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = _dictionary[aKey]; 4667*6777b538SAndroid Build Coastguard Worker int32_t unwrapped = [aValue intValue]; 4668*6777b538SAndroid Build Coastguard Worker if (!func(unwrapped)) { 4669*6777b538SAndroid Build Coastguard Worker unwrapped = kGPBUnrecognizedEnumeratorValue; 4670*6777b538SAndroid Build Coastguard Worker } 4671*6777b538SAndroid Build Coastguard Worker block([aKey intValue], unwrapped, &stop); 4672*6777b538SAndroid Build Coastguard Worker if (stop) { 4673*6777b538SAndroid Build Coastguard Worker break; 4674*6777b538SAndroid Build Coastguard Worker } 4675*6777b538SAndroid Build Coastguard Worker } 4676*6777b538SAndroid Build Coastguard Worker} 4677*6777b538SAndroid Build Coastguard Worker 4678*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBInt32EnumDictionary *)otherDictionary { 4679*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 4680*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 4681*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4682*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4683*6777b538SAndroid Build Coastguard Worker } 4684*6777b538SAndroid Build Coastguard Worker } 4685*6777b538SAndroid Build Coastguard Worker} 4686*6777b538SAndroid Build Coastguard Worker 4687*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(int32_t)key { 4688*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 4689*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4690*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4691*6777b538SAndroid Build Coastguard Worker } 4692*6777b538SAndroid Build Coastguard Worker} 4693*6777b538SAndroid Build Coastguard Worker 4694*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(int32_t)aKey { 4695*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 4696*6777b538SAndroid Build Coastguard Worker} 4697*6777b538SAndroid Build Coastguard Worker 4698*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 4699*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 4700*6777b538SAndroid Build Coastguard Worker} 4701*6777b538SAndroid Build Coastguard Worker 4702*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(int32_t)key { 4703*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(value)) { 4704*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 4705*6777b538SAndroid Build Coastguard Worker format:@"GPBInt32EnumDictionary: Attempt to set an unknown enum value (%d)", 4706*6777b538SAndroid Build Coastguard Worker value]; 4707*6777b538SAndroid Build Coastguard Worker } 4708*6777b538SAndroid Build Coastguard Worker 4709*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 4710*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4711*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4712*6777b538SAndroid Build Coastguard Worker } 4713*6777b538SAndroid Build Coastguard Worker} 4714*6777b538SAndroid Build Coastguard Worker 4715*6777b538SAndroid Build Coastguard Worker@end 4716*6777b538SAndroid Build Coastguard Worker 4717*6777b538SAndroid Build Coastguard Worker#pragma mark - Int32 -> Object 4718*6777b538SAndroid Build Coastguard Worker 4719*6777b538SAndroid Build Coastguard Worker@implementation GPBInt32ObjectDictionary { 4720*6777b538SAndroid Build Coastguard Worker @package 4721*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 4722*6777b538SAndroid Build Coastguard Worker} 4723*6777b538SAndroid Build Coastguard Worker 4724*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 4725*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 4726*6777b538SAndroid Build Coastguard Worker} 4727*6777b538SAndroid Build Coastguard Worker 4728*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects 4729*6777b538SAndroid Build Coastguard Worker forKeys:(const int32_t [])keys 4730*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 4731*6777b538SAndroid Build Coastguard Worker self = [super init]; 4732*6777b538SAndroid Build Coastguard Worker if (self) { 4733*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 4734*6777b538SAndroid Build Coastguard Worker if (count && objects && keys) { 4735*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 4736*6777b538SAndroid Build Coastguard Worker if (!objects[i]) { 4737*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 4738*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 4739*6777b538SAndroid Build Coastguard Worker } 4740*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:objects[i] forKey:@(keys[i])]; 4741*6777b538SAndroid Build Coastguard Worker } 4742*6777b538SAndroid Build Coastguard Worker } 4743*6777b538SAndroid Build Coastguard Worker } 4744*6777b538SAndroid Build Coastguard Worker return self; 4745*6777b538SAndroid Build Coastguard Worker} 4746*6777b538SAndroid Build Coastguard Worker 4747*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt32ObjectDictionary *)dictionary { 4748*6777b538SAndroid Build Coastguard Worker self = [self initWithObjects:NULL forKeys:NULL count:0]; 4749*6777b538SAndroid Build Coastguard Worker if (self) { 4750*6777b538SAndroid Build Coastguard Worker if (dictionary) { 4751*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 4752*6777b538SAndroid Build Coastguard Worker } 4753*6777b538SAndroid Build Coastguard Worker } 4754*6777b538SAndroid Build Coastguard Worker return self; 4755*6777b538SAndroid Build Coastguard Worker} 4756*6777b538SAndroid Build Coastguard Worker 4757*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 4758*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 4759*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 4760*6777b538SAndroid Build Coastguard Worker} 4761*6777b538SAndroid Build Coastguard Worker 4762*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 4763*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 4764*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 4765*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 4766*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 4767*6777b538SAndroid Build Coastguard Worker [super dealloc]; 4768*6777b538SAndroid Build Coastguard Worker} 4769*6777b538SAndroid Build Coastguard Worker 4770*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 4771*6777b538SAndroid Build Coastguard Worker return [[GPBInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self]; 4772*6777b538SAndroid Build Coastguard Worker} 4773*6777b538SAndroid Build Coastguard Worker 4774*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 4775*6777b538SAndroid Build Coastguard Worker if (self == other) { 4776*6777b538SAndroid Build Coastguard Worker return YES; 4777*6777b538SAndroid Build Coastguard Worker } 4778*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32ObjectDictionary class]]) { 4779*6777b538SAndroid Build Coastguard Worker return NO; 4780*6777b538SAndroid Build Coastguard Worker } 4781*6777b538SAndroid Build Coastguard Worker GPBInt32ObjectDictionary *otherDictionary = other; 4782*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 4783*6777b538SAndroid Build Coastguard Worker} 4784*6777b538SAndroid Build Coastguard Worker 4785*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 4786*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 4787*6777b538SAndroid Build Coastguard Worker} 4788*6777b538SAndroid Build Coastguard Worker 4789*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 4790*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 4791*6777b538SAndroid Build Coastguard Worker} 4792*6777b538SAndroid Build Coastguard Worker 4793*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 4794*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 4795*6777b538SAndroid Build Coastguard Worker} 4796*6777b538SAndroid Build Coastguard Worker 4797*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock: 4798*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int32_t key, id object, BOOL *stop))block { 4799*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 4800*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4801*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4802*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4803*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4804*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 4805*6777b538SAndroid Build Coastguard Worker block([aKey intValue], aObject, &stop); 4806*6777b538SAndroid Build Coastguard Worker if (stop) { 4807*6777b538SAndroid Build Coastguard Worker break; 4808*6777b538SAndroid Build Coastguard Worker } 4809*6777b538SAndroid Build Coastguard Worker } 4810*6777b538SAndroid Build Coastguard Worker} 4811*6777b538SAndroid Build Coastguard Worker 4812*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized { 4813*6777b538SAndroid Build Coastguard Worker for (GPBMessage *msg in [_dictionary objectEnumerator]) { 4814*6777b538SAndroid Build Coastguard Worker if (!msg.initialized) { 4815*6777b538SAndroid Build Coastguard Worker return NO; 4816*6777b538SAndroid Build Coastguard Worker } 4817*6777b538SAndroid Build Coastguard Worker } 4818*6777b538SAndroid Build Coastguard Worker return YES; 4819*6777b538SAndroid Build Coastguard Worker} 4820*6777b538SAndroid Build Coastguard Worker 4821*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone { 4822*6777b538SAndroid Build Coastguard Worker GPBInt32ObjectDictionary *newDict = 4823*6777b538SAndroid Build Coastguard Worker [[GPBInt32ObjectDictionary alloc] init]; 4824*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [_dictionary keyEnumerator]; 4825*6777b538SAndroid Build Coastguard Worker id aKey; 4826*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *internalDict = newDict->_dictionary; 4827*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4828*6777b538SAndroid Build Coastguard Worker GPBMessage *msg = _dictionary[aKey]; 4829*6777b538SAndroid Build Coastguard Worker GPBMessage *copiedMsg = [msg copyWithZone:zone]; 4830*6777b538SAndroid Build Coastguard Worker [internalDict setObject:copiedMsg forKey:aKey]; 4831*6777b538SAndroid Build Coastguard Worker [copiedMsg release]; 4832*6777b538SAndroid Build Coastguard Worker } 4833*6777b538SAndroid Build Coastguard Worker return newDict; 4834*6777b538SAndroid Build Coastguard Worker} 4835*6777b538SAndroid Build Coastguard Worker 4836*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 4837*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4838*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 4839*6777b538SAndroid Build Coastguard Worker if (count == 0) { 4840*6777b538SAndroid Build Coastguard Worker return 0; 4841*6777b538SAndroid Build Coastguard Worker } 4842*6777b538SAndroid Build Coastguard Worker 4843*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4844*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4845*6777b538SAndroid Build Coastguard Worker size_t result = 0; 4846*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4847*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4848*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4849*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 4850*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType); 4851*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType); 4852*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 4853*6777b538SAndroid Build Coastguard Worker } 4854*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 4855*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 4856*6777b538SAndroid Build Coastguard Worker return result; 4857*6777b538SAndroid Build Coastguard Worker} 4858*6777b538SAndroid Build Coastguard Worker 4859*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 4860*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 4861*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 4862*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 4863*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 4864*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 4865*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 4866*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 4867*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 4868*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 4869*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 4870*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 4871*6777b538SAndroid Build Coastguard Worker int32_t unwrappedKey = [aKey intValue]; 4872*6777b538SAndroid Build Coastguard Worker id unwrappedValue = aObject; 4873*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 4874*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 4875*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 4876*6777b538SAndroid Build Coastguard Worker // Write the fields. 4877*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 4878*6777b538SAndroid Build Coastguard Worker WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 4879*6777b538SAndroid Build Coastguard Worker } 4880*6777b538SAndroid Build Coastguard Worker} 4881*6777b538SAndroid Build Coastguard Worker 4882*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 4883*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 4884*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:value->valueString forKey:@(key->valueInt32)]; 4885*6777b538SAndroid Build Coastguard Worker} 4886*6777b538SAndroid Build Coastguard Worker 4887*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 4888*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndObjectsUsingBlock:^(int32_t key, id object, BOOL *stop) { 4889*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 4890*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%d", key], object); 4891*6777b538SAndroid Build Coastguard Worker }]; 4892*6777b538SAndroid Build Coastguard Worker} 4893*6777b538SAndroid Build Coastguard Worker 4894*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(int32_t)key { 4895*6777b538SAndroid Build Coastguard Worker id result = [_dictionary objectForKey:@(key)]; 4896*6777b538SAndroid Build Coastguard Worker return result; 4897*6777b538SAndroid Build Coastguard Worker} 4898*6777b538SAndroid Build Coastguard Worker 4899*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt32ObjectDictionary *)otherDictionary { 4900*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 4901*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 4902*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4903*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4904*6777b538SAndroid Build Coastguard Worker } 4905*6777b538SAndroid Build Coastguard Worker } 4906*6777b538SAndroid Build Coastguard Worker} 4907*6777b538SAndroid Build Coastguard Worker 4908*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(int32_t)key { 4909*6777b538SAndroid Build Coastguard Worker if (!object) { 4910*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 4911*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 4912*6777b538SAndroid Build Coastguard Worker } 4913*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:object forKey:@(key)]; 4914*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 4915*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 4916*6777b538SAndroid Build Coastguard Worker } 4917*6777b538SAndroid Build Coastguard Worker} 4918*6777b538SAndroid Build Coastguard Worker 4919*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(int32_t)aKey { 4920*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 4921*6777b538SAndroid Build Coastguard Worker} 4922*6777b538SAndroid Build Coastguard Worker 4923*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 4924*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 4925*6777b538SAndroid Build Coastguard Worker} 4926*6777b538SAndroid Build Coastguard Worker 4927*6777b538SAndroid Build Coastguard Worker@end 4928*6777b538SAndroid Build Coastguard Worker 4929*6777b538SAndroid Build Coastguard Worker// clang-format on 4930*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt64, uint64_t) 4931*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 4932*6777b538SAndroid Build Coastguard Worker// clang-format off 4933*6777b538SAndroid Build Coastguard Worker 4934*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> UInt32 4935*6777b538SAndroid Build Coastguard Worker 4936*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64UInt32Dictionary { 4937*6777b538SAndroid Build Coastguard Worker @package 4938*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 4939*6777b538SAndroid Build Coastguard Worker} 4940*6777b538SAndroid Build Coastguard Worker 4941*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 4942*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 4943*6777b538SAndroid Build Coastguard Worker} 4944*6777b538SAndroid Build Coastguard Worker 4945*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values 4946*6777b538SAndroid Build Coastguard Worker forKeys:(const uint64_t [])keys 4947*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 4948*6777b538SAndroid Build Coastguard Worker self = [super init]; 4949*6777b538SAndroid Build Coastguard Worker if (self) { 4950*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 4951*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 4952*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 4953*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 4954*6777b538SAndroid Build Coastguard Worker } 4955*6777b538SAndroid Build Coastguard Worker } 4956*6777b538SAndroid Build Coastguard Worker } 4957*6777b538SAndroid Build Coastguard Worker return self; 4958*6777b538SAndroid Build Coastguard Worker} 4959*6777b538SAndroid Build Coastguard Worker 4960*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64UInt32Dictionary *)dictionary { 4961*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt32s:NULL forKeys:NULL count:0]; 4962*6777b538SAndroid Build Coastguard Worker if (self) { 4963*6777b538SAndroid Build Coastguard Worker if (dictionary) { 4964*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 4965*6777b538SAndroid Build Coastguard Worker } 4966*6777b538SAndroid Build Coastguard Worker } 4967*6777b538SAndroid Build Coastguard Worker return self; 4968*6777b538SAndroid Build Coastguard Worker} 4969*6777b538SAndroid Build Coastguard Worker 4970*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 4971*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 4972*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 4973*6777b538SAndroid Build Coastguard Worker} 4974*6777b538SAndroid Build Coastguard Worker 4975*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 4976*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 4977*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 4978*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 4979*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 4980*6777b538SAndroid Build Coastguard Worker [super dealloc]; 4981*6777b538SAndroid Build Coastguard Worker} 4982*6777b538SAndroid Build Coastguard Worker 4983*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 4984*6777b538SAndroid Build Coastguard Worker return [[GPBUInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self]; 4985*6777b538SAndroid Build Coastguard Worker} 4986*6777b538SAndroid Build Coastguard Worker 4987*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 4988*6777b538SAndroid Build Coastguard Worker if (self == other) { 4989*6777b538SAndroid Build Coastguard Worker return YES; 4990*6777b538SAndroid Build Coastguard Worker } 4991*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64UInt32Dictionary class]]) { 4992*6777b538SAndroid Build Coastguard Worker return NO; 4993*6777b538SAndroid Build Coastguard Worker } 4994*6777b538SAndroid Build Coastguard Worker GPBUInt64UInt32Dictionary *otherDictionary = other; 4995*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 4996*6777b538SAndroid Build Coastguard Worker} 4997*6777b538SAndroid Build Coastguard Worker 4998*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 4999*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5000*6777b538SAndroid Build Coastguard Worker} 5001*6777b538SAndroid Build Coastguard Worker 5002*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 5003*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 5004*6777b538SAndroid Build Coastguard Worker} 5005*6777b538SAndroid Build Coastguard Worker 5006*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 5007*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5008*6777b538SAndroid Build Coastguard Worker} 5009*6777b538SAndroid Build Coastguard Worker 5010*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock: 5011*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, uint32_t value, BOOL *stop))block { 5012*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 5013*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5014*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5015*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5016*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5017*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5018*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], [aValue unsignedIntValue], &stop); 5019*6777b538SAndroid Build Coastguard Worker if (stop) { 5020*6777b538SAndroid Build Coastguard Worker break; 5021*6777b538SAndroid Build Coastguard Worker } 5022*6777b538SAndroid Build Coastguard Worker } 5023*6777b538SAndroid Build Coastguard Worker} 5024*6777b538SAndroid Build Coastguard Worker 5025*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 5026*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5027*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 5028*6777b538SAndroid Build Coastguard Worker if (count == 0) { 5029*6777b538SAndroid Build Coastguard Worker return 0; 5030*6777b538SAndroid Build Coastguard Worker } 5031*6777b538SAndroid Build Coastguard Worker 5032*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5033*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5034*6777b538SAndroid Build Coastguard Worker size_t result = 0; 5035*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5036*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5037*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5038*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5039*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType); 5040*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType); 5041*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 5042*6777b538SAndroid Build Coastguard Worker } 5043*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 5044*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 5045*6777b538SAndroid Build Coastguard Worker return result; 5046*6777b538SAndroid Build Coastguard Worker} 5047*6777b538SAndroid Build Coastguard Worker 5048*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 5049*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 5050*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5051*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5052*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 5053*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5054*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5055*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5056*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5057*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5058*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 5059*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 5060*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedKey = [aKey unsignedLongLongValue]; 5061*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedValue = [aValue unsignedIntValue]; 5062*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 5063*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 5064*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 5065*6777b538SAndroid Build Coastguard Worker // Write the fields. 5066*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 5067*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 5068*6777b538SAndroid Build Coastguard Worker } 5069*6777b538SAndroid Build Coastguard Worker} 5070*6777b538SAndroid Build Coastguard Worker 5071*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 5072*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 5073*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueUInt64)]; 5074*6777b538SAndroid Build Coastguard Worker} 5075*6777b538SAndroid Build Coastguard Worker 5076*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 5077*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt32sUsingBlock:^(uint64_t key, uint32_t value, BOOL *stop) { 5078*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 5079*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%u", value]); 5080*6777b538SAndroid Build Coastguard Worker }]; 5081*6777b538SAndroid Build Coastguard Worker} 5082*6777b538SAndroid Build Coastguard Worker 5083*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint64_t)key { 5084*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 5085*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 5086*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedIntValue]; 5087*6777b538SAndroid Build Coastguard Worker } 5088*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 5089*6777b538SAndroid Build Coastguard Worker} 5090*6777b538SAndroid Build Coastguard Worker 5091*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64UInt32Dictionary *)otherDictionary { 5092*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 5093*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 5094*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5095*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5096*6777b538SAndroid Build Coastguard Worker } 5097*6777b538SAndroid Build Coastguard Worker } 5098*6777b538SAndroid Build Coastguard Worker} 5099*6777b538SAndroid Build Coastguard Worker 5100*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(uint64_t)key { 5101*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 5102*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5103*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5104*6777b538SAndroid Build Coastguard Worker } 5105*6777b538SAndroid Build Coastguard Worker} 5106*6777b538SAndroid Build Coastguard Worker 5107*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(uint64_t)aKey { 5108*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 5109*6777b538SAndroid Build Coastguard Worker} 5110*6777b538SAndroid Build Coastguard Worker 5111*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 5112*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 5113*6777b538SAndroid Build Coastguard Worker} 5114*6777b538SAndroid Build Coastguard Worker 5115*6777b538SAndroid Build Coastguard Worker@end 5116*6777b538SAndroid Build Coastguard Worker 5117*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Int32 5118*6777b538SAndroid Build Coastguard Worker 5119*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64Int32Dictionary { 5120*6777b538SAndroid Build Coastguard Worker @package 5121*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 5122*6777b538SAndroid Build Coastguard Worker} 5123*6777b538SAndroid Build Coastguard Worker 5124*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 5125*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 5126*6777b538SAndroid Build Coastguard Worker} 5127*6777b538SAndroid Build Coastguard Worker 5128*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values 5129*6777b538SAndroid Build Coastguard Worker forKeys:(const uint64_t [])keys 5130*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 5131*6777b538SAndroid Build Coastguard Worker self = [super init]; 5132*6777b538SAndroid Build Coastguard Worker if (self) { 5133*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 5134*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 5135*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 5136*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 5137*6777b538SAndroid Build Coastguard Worker } 5138*6777b538SAndroid Build Coastguard Worker } 5139*6777b538SAndroid Build Coastguard Worker } 5140*6777b538SAndroid Build Coastguard Worker return self; 5141*6777b538SAndroid Build Coastguard Worker} 5142*6777b538SAndroid Build Coastguard Worker 5143*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64Int32Dictionary *)dictionary { 5144*6777b538SAndroid Build Coastguard Worker self = [self initWithInt32s:NULL forKeys:NULL count:0]; 5145*6777b538SAndroid Build Coastguard Worker if (self) { 5146*6777b538SAndroid Build Coastguard Worker if (dictionary) { 5147*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 5148*6777b538SAndroid Build Coastguard Worker } 5149*6777b538SAndroid Build Coastguard Worker } 5150*6777b538SAndroid Build Coastguard Worker return self; 5151*6777b538SAndroid Build Coastguard Worker} 5152*6777b538SAndroid Build Coastguard Worker 5153*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 5154*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 5155*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 5156*6777b538SAndroid Build Coastguard Worker} 5157*6777b538SAndroid Build Coastguard Worker 5158*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 5159*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 5160*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 5161*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 5162*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 5163*6777b538SAndroid Build Coastguard Worker [super dealloc]; 5164*6777b538SAndroid Build Coastguard Worker} 5165*6777b538SAndroid Build Coastguard Worker 5166*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 5167*6777b538SAndroid Build Coastguard Worker return [[GPBUInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self]; 5168*6777b538SAndroid Build Coastguard Worker} 5169*6777b538SAndroid Build Coastguard Worker 5170*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 5171*6777b538SAndroid Build Coastguard Worker if (self == other) { 5172*6777b538SAndroid Build Coastguard Worker return YES; 5173*6777b538SAndroid Build Coastguard Worker } 5174*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64Int32Dictionary class]]) { 5175*6777b538SAndroid Build Coastguard Worker return NO; 5176*6777b538SAndroid Build Coastguard Worker } 5177*6777b538SAndroid Build Coastguard Worker GPBUInt64Int32Dictionary *otherDictionary = other; 5178*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 5179*6777b538SAndroid Build Coastguard Worker} 5180*6777b538SAndroid Build Coastguard Worker 5181*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 5182*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5183*6777b538SAndroid Build Coastguard Worker} 5184*6777b538SAndroid Build Coastguard Worker 5185*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 5186*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 5187*6777b538SAndroid Build Coastguard Worker} 5188*6777b538SAndroid Build Coastguard Worker 5189*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 5190*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5191*6777b538SAndroid Build Coastguard Worker} 5192*6777b538SAndroid Build Coastguard Worker 5193*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock: 5194*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, int32_t value, BOOL *stop))block { 5195*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 5196*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5197*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5198*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5199*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5200*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5201*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], [aValue intValue], &stop); 5202*6777b538SAndroid Build Coastguard Worker if (stop) { 5203*6777b538SAndroid Build Coastguard Worker break; 5204*6777b538SAndroid Build Coastguard Worker } 5205*6777b538SAndroid Build Coastguard Worker } 5206*6777b538SAndroid Build Coastguard Worker} 5207*6777b538SAndroid Build Coastguard Worker 5208*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 5209*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5210*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 5211*6777b538SAndroid Build Coastguard Worker if (count == 0) { 5212*6777b538SAndroid Build Coastguard Worker return 0; 5213*6777b538SAndroid Build Coastguard Worker } 5214*6777b538SAndroid Build Coastguard Worker 5215*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5216*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5217*6777b538SAndroid Build Coastguard Worker size_t result = 0; 5218*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5219*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5220*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5221*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5222*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType); 5223*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 5224*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 5225*6777b538SAndroid Build Coastguard Worker } 5226*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 5227*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 5228*6777b538SAndroid Build Coastguard Worker return result; 5229*6777b538SAndroid Build Coastguard Worker} 5230*6777b538SAndroid Build Coastguard Worker 5231*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 5232*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 5233*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5234*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5235*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 5236*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5237*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5238*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5239*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5240*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5241*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 5242*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 5243*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedKey = [aKey unsignedLongLongValue]; 5244*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 5245*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 5246*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 5247*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 5248*6777b538SAndroid Build Coastguard Worker // Write the fields. 5249*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 5250*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 5251*6777b538SAndroid Build Coastguard Worker } 5252*6777b538SAndroid Build Coastguard Worker} 5253*6777b538SAndroid Build Coastguard Worker 5254*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 5255*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 5256*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueUInt64)]; 5257*6777b538SAndroid Build Coastguard Worker} 5258*6777b538SAndroid Build Coastguard Worker 5259*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 5260*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt32sUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) { 5261*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 5262*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%d", value]); 5263*6777b538SAndroid Build Coastguard Worker }]; 5264*6777b538SAndroid Build Coastguard Worker} 5265*6777b538SAndroid Build Coastguard Worker 5266*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint64_t)key { 5267*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 5268*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 5269*6777b538SAndroid Build Coastguard Worker *value = [wrapped intValue]; 5270*6777b538SAndroid Build Coastguard Worker } 5271*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 5272*6777b538SAndroid Build Coastguard Worker} 5273*6777b538SAndroid Build Coastguard Worker 5274*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64Int32Dictionary *)otherDictionary { 5275*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 5276*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 5277*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5278*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5279*6777b538SAndroid Build Coastguard Worker } 5280*6777b538SAndroid Build Coastguard Worker } 5281*6777b538SAndroid Build Coastguard Worker} 5282*6777b538SAndroid Build Coastguard Worker 5283*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(uint64_t)key { 5284*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 5285*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5286*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5287*6777b538SAndroid Build Coastguard Worker } 5288*6777b538SAndroid Build Coastguard Worker} 5289*6777b538SAndroid Build Coastguard Worker 5290*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(uint64_t)aKey { 5291*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 5292*6777b538SAndroid Build Coastguard Worker} 5293*6777b538SAndroid Build Coastguard Worker 5294*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 5295*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 5296*6777b538SAndroid Build Coastguard Worker} 5297*6777b538SAndroid Build Coastguard Worker 5298*6777b538SAndroid Build Coastguard Worker@end 5299*6777b538SAndroid Build Coastguard Worker 5300*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> UInt64 5301*6777b538SAndroid Build Coastguard Worker 5302*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64UInt64Dictionary { 5303*6777b538SAndroid Build Coastguard Worker @package 5304*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 5305*6777b538SAndroid Build Coastguard Worker} 5306*6777b538SAndroid Build Coastguard Worker 5307*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 5308*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 5309*6777b538SAndroid Build Coastguard Worker} 5310*6777b538SAndroid Build Coastguard Worker 5311*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values 5312*6777b538SAndroid Build Coastguard Worker forKeys:(const uint64_t [])keys 5313*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 5314*6777b538SAndroid Build Coastguard Worker self = [super init]; 5315*6777b538SAndroid Build Coastguard Worker if (self) { 5316*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 5317*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 5318*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 5319*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 5320*6777b538SAndroid Build Coastguard Worker } 5321*6777b538SAndroid Build Coastguard Worker } 5322*6777b538SAndroid Build Coastguard Worker } 5323*6777b538SAndroid Build Coastguard Worker return self; 5324*6777b538SAndroid Build Coastguard Worker} 5325*6777b538SAndroid Build Coastguard Worker 5326*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64UInt64Dictionary *)dictionary { 5327*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt64s:NULL forKeys:NULL count:0]; 5328*6777b538SAndroid Build Coastguard Worker if (self) { 5329*6777b538SAndroid Build Coastguard Worker if (dictionary) { 5330*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 5331*6777b538SAndroid Build Coastguard Worker } 5332*6777b538SAndroid Build Coastguard Worker } 5333*6777b538SAndroid Build Coastguard Worker return self; 5334*6777b538SAndroid Build Coastguard Worker} 5335*6777b538SAndroid Build Coastguard Worker 5336*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 5337*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 5338*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 5339*6777b538SAndroid Build Coastguard Worker} 5340*6777b538SAndroid Build Coastguard Worker 5341*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 5342*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 5343*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 5344*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 5345*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 5346*6777b538SAndroid Build Coastguard Worker [super dealloc]; 5347*6777b538SAndroid Build Coastguard Worker} 5348*6777b538SAndroid Build Coastguard Worker 5349*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 5350*6777b538SAndroid Build Coastguard Worker return [[GPBUInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self]; 5351*6777b538SAndroid Build Coastguard Worker} 5352*6777b538SAndroid Build Coastguard Worker 5353*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 5354*6777b538SAndroid Build Coastguard Worker if (self == other) { 5355*6777b538SAndroid Build Coastguard Worker return YES; 5356*6777b538SAndroid Build Coastguard Worker } 5357*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64UInt64Dictionary class]]) { 5358*6777b538SAndroid Build Coastguard Worker return NO; 5359*6777b538SAndroid Build Coastguard Worker } 5360*6777b538SAndroid Build Coastguard Worker GPBUInt64UInt64Dictionary *otherDictionary = other; 5361*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 5362*6777b538SAndroid Build Coastguard Worker} 5363*6777b538SAndroid Build Coastguard Worker 5364*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 5365*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5366*6777b538SAndroid Build Coastguard Worker} 5367*6777b538SAndroid Build Coastguard Worker 5368*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 5369*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 5370*6777b538SAndroid Build Coastguard Worker} 5371*6777b538SAndroid Build Coastguard Worker 5372*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 5373*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5374*6777b538SAndroid Build Coastguard Worker} 5375*6777b538SAndroid Build Coastguard Worker 5376*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock: 5377*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, uint64_t value, BOOL *stop))block { 5378*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 5379*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5380*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5381*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5382*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5383*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5384*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], [aValue unsignedLongLongValue], &stop); 5385*6777b538SAndroid Build Coastguard Worker if (stop) { 5386*6777b538SAndroid Build Coastguard Worker break; 5387*6777b538SAndroid Build Coastguard Worker } 5388*6777b538SAndroid Build Coastguard Worker } 5389*6777b538SAndroid Build Coastguard Worker} 5390*6777b538SAndroid Build Coastguard Worker 5391*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 5392*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5393*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 5394*6777b538SAndroid Build Coastguard Worker if (count == 0) { 5395*6777b538SAndroid Build Coastguard Worker return 0; 5396*6777b538SAndroid Build Coastguard Worker } 5397*6777b538SAndroid Build Coastguard Worker 5398*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5399*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5400*6777b538SAndroid Build Coastguard Worker size_t result = 0; 5401*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5402*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5403*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5404*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5405*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType); 5406*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType); 5407*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 5408*6777b538SAndroid Build Coastguard Worker } 5409*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 5410*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 5411*6777b538SAndroid Build Coastguard Worker return result; 5412*6777b538SAndroid Build Coastguard Worker} 5413*6777b538SAndroid Build Coastguard Worker 5414*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 5415*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 5416*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5417*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5418*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 5419*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5420*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5421*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5422*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5423*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5424*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 5425*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 5426*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedKey = [aKey unsignedLongLongValue]; 5427*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedValue = [aValue unsignedLongLongValue]; 5428*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 5429*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 5430*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 5431*6777b538SAndroid Build Coastguard Worker // Write the fields. 5432*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 5433*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 5434*6777b538SAndroid Build Coastguard Worker } 5435*6777b538SAndroid Build Coastguard Worker} 5436*6777b538SAndroid Build Coastguard Worker 5437*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 5438*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 5439*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueUInt64)]; 5440*6777b538SAndroid Build Coastguard Worker} 5441*6777b538SAndroid Build Coastguard Worker 5442*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 5443*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt64sUsingBlock:^(uint64_t key, uint64_t value, BOOL *stop) { 5444*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 5445*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%llu", value]); 5446*6777b538SAndroid Build Coastguard Worker }]; 5447*6777b538SAndroid Build Coastguard Worker} 5448*6777b538SAndroid Build Coastguard Worker 5449*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint64_t)key { 5450*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 5451*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 5452*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedLongLongValue]; 5453*6777b538SAndroid Build Coastguard Worker } 5454*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 5455*6777b538SAndroid Build Coastguard Worker} 5456*6777b538SAndroid Build Coastguard Worker 5457*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64UInt64Dictionary *)otherDictionary { 5458*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 5459*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 5460*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5461*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5462*6777b538SAndroid Build Coastguard Worker } 5463*6777b538SAndroid Build Coastguard Worker } 5464*6777b538SAndroid Build Coastguard Worker} 5465*6777b538SAndroid Build Coastguard Worker 5466*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(uint64_t)key { 5467*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 5468*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5469*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5470*6777b538SAndroid Build Coastguard Worker } 5471*6777b538SAndroid Build Coastguard Worker} 5472*6777b538SAndroid Build Coastguard Worker 5473*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(uint64_t)aKey { 5474*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 5475*6777b538SAndroid Build Coastguard Worker} 5476*6777b538SAndroid Build Coastguard Worker 5477*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 5478*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 5479*6777b538SAndroid Build Coastguard Worker} 5480*6777b538SAndroid Build Coastguard Worker 5481*6777b538SAndroid Build Coastguard Worker@end 5482*6777b538SAndroid Build Coastguard Worker 5483*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Int64 5484*6777b538SAndroid Build Coastguard Worker 5485*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64Int64Dictionary { 5486*6777b538SAndroid Build Coastguard Worker @package 5487*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 5488*6777b538SAndroid Build Coastguard Worker} 5489*6777b538SAndroid Build Coastguard Worker 5490*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 5491*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 5492*6777b538SAndroid Build Coastguard Worker} 5493*6777b538SAndroid Build Coastguard Worker 5494*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values 5495*6777b538SAndroid Build Coastguard Worker forKeys:(const uint64_t [])keys 5496*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 5497*6777b538SAndroid Build Coastguard Worker self = [super init]; 5498*6777b538SAndroid Build Coastguard Worker if (self) { 5499*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 5500*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 5501*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 5502*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 5503*6777b538SAndroid Build Coastguard Worker } 5504*6777b538SAndroid Build Coastguard Worker } 5505*6777b538SAndroid Build Coastguard Worker } 5506*6777b538SAndroid Build Coastguard Worker return self; 5507*6777b538SAndroid Build Coastguard Worker} 5508*6777b538SAndroid Build Coastguard Worker 5509*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64Int64Dictionary *)dictionary { 5510*6777b538SAndroid Build Coastguard Worker self = [self initWithInt64s:NULL forKeys:NULL count:0]; 5511*6777b538SAndroid Build Coastguard Worker if (self) { 5512*6777b538SAndroid Build Coastguard Worker if (dictionary) { 5513*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 5514*6777b538SAndroid Build Coastguard Worker } 5515*6777b538SAndroid Build Coastguard Worker } 5516*6777b538SAndroid Build Coastguard Worker return self; 5517*6777b538SAndroid Build Coastguard Worker} 5518*6777b538SAndroid Build Coastguard Worker 5519*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 5520*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 5521*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 5522*6777b538SAndroid Build Coastguard Worker} 5523*6777b538SAndroid Build Coastguard Worker 5524*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 5525*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 5526*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 5527*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 5528*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 5529*6777b538SAndroid Build Coastguard Worker [super dealloc]; 5530*6777b538SAndroid Build Coastguard Worker} 5531*6777b538SAndroid Build Coastguard Worker 5532*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 5533*6777b538SAndroid Build Coastguard Worker return [[GPBUInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self]; 5534*6777b538SAndroid Build Coastguard Worker} 5535*6777b538SAndroid Build Coastguard Worker 5536*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 5537*6777b538SAndroid Build Coastguard Worker if (self == other) { 5538*6777b538SAndroid Build Coastguard Worker return YES; 5539*6777b538SAndroid Build Coastguard Worker } 5540*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64Int64Dictionary class]]) { 5541*6777b538SAndroid Build Coastguard Worker return NO; 5542*6777b538SAndroid Build Coastguard Worker } 5543*6777b538SAndroid Build Coastguard Worker GPBUInt64Int64Dictionary *otherDictionary = other; 5544*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 5545*6777b538SAndroid Build Coastguard Worker} 5546*6777b538SAndroid Build Coastguard Worker 5547*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 5548*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5549*6777b538SAndroid Build Coastguard Worker} 5550*6777b538SAndroid Build Coastguard Worker 5551*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 5552*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 5553*6777b538SAndroid Build Coastguard Worker} 5554*6777b538SAndroid Build Coastguard Worker 5555*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 5556*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5557*6777b538SAndroid Build Coastguard Worker} 5558*6777b538SAndroid Build Coastguard Worker 5559*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock: 5560*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, int64_t value, BOOL *stop))block { 5561*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 5562*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5563*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5564*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5565*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5566*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5567*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], [aValue longLongValue], &stop); 5568*6777b538SAndroid Build Coastguard Worker if (stop) { 5569*6777b538SAndroid Build Coastguard Worker break; 5570*6777b538SAndroid Build Coastguard Worker } 5571*6777b538SAndroid Build Coastguard Worker } 5572*6777b538SAndroid Build Coastguard Worker} 5573*6777b538SAndroid Build Coastguard Worker 5574*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 5575*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5576*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 5577*6777b538SAndroid Build Coastguard Worker if (count == 0) { 5578*6777b538SAndroid Build Coastguard Worker return 0; 5579*6777b538SAndroid Build Coastguard Worker } 5580*6777b538SAndroid Build Coastguard Worker 5581*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5582*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5583*6777b538SAndroid Build Coastguard Worker size_t result = 0; 5584*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5585*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5586*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5587*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5588*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType); 5589*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType); 5590*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 5591*6777b538SAndroid Build Coastguard Worker } 5592*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 5593*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 5594*6777b538SAndroid Build Coastguard Worker return result; 5595*6777b538SAndroid Build Coastguard Worker} 5596*6777b538SAndroid Build Coastguard Worker 5597*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 5598*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 5599*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5600*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5601*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 5602*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5603*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5604*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5605*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5606*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5607*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 5608*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 5609*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedKey = [aKey unsignedLongLongValue]; 5610*6777b538SAndroid Build Coastguard Worker int64_t unwrappedValue = [aValue longLongValue]; 5611*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 5612*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 5613*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 5614*6777b538SAndroid Build Coastguard Worker // Write the fields. 5615*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 5616*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 5617*6777b538SAndroid Build Coastguard Worker } 5618*6777b538SAndroid Build Coastguard Worker} 5619*6777b538SAndroid Build Coastguard Worker 5620*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 5621*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 5622*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueUInt64)]; 5623*6777b538SAndroid Build Coastguard Worker} 5624*6777b538SAndroid Build Coastguard Worker 5625*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 5626*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt64sUsingBlock:^(uint64_t key, int64_t value, BOOL *stop) { 5627*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 5628*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%lld", value]); 5629*6777b538SAndroid Build Coastguard Worker }]; 5630*6777b538SAndroid Build Coastguard Worker} 5631*6777b538SAndroid Build Coastguard Worker 5632*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint64_t)key { 5633*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 5634*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 5635*6777b538SAndroid Build Coastguard Worker *value = [wrapped longLongValue]; 5636*6777b538SAndroid Build Coastguard Worker } 5637*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 5638*6777b538SAndroid Build Coastguard Worker} 5639*6777b538SAndroid Build Coastguard Worker 5640*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64Int64Dictionary *)otherDictionary { 5641*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 5642*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 5643*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5644*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5645*6777b538SAndroid Build Coastguard Worker } 5646*6777b538SAndroid Build Coastguard Worker } 5647*6777b538SAndroid Build Coastguard Worker} 5648*6777b538SAndroid Build Coastguard Worker 5649*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(uint64_t)key { 5650*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 5651*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5652*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5653*6777b538SAndroid Build Coastguard Worker } 5654*6777b538SAndroid Build Coastguard Worker} 5655*6777b538SAndroid Build Coastguard Worker 5656*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(uint64_t)aKey { 5657*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 5658*6777b538SAndroid Build Coastguard Worker} 5659*6777b538SAndroid Build Coastguard Worker 5660*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 5661*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 5662*6777b538SAndroid Build Coastguard Worker} 5663*6777b538SAndroid Build Coastguard Worker 5664*6777b538SAndroid Build Coastguard Worker@end 5665*6777b538SAndroid Build Coastguard Worker 5666*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Bool 5667*6777b538SAndroid Build Coastguard Worker 5668*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64BoolDictionary { 5669*6777b538SAndroid Build Coastguard Worker @package 5670*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 5671*6777b538SAndroid Build Coastguard Worker} 5672*6777b538SAndroid Build Coastguard Worker 5673*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 5674*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 5675*6777b538SAndroid Build Coastguard Worker} 5676*6777b538SAndroid Build Coastguard Worker 5677*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values 5678*6777b538SAndroid Build Coastguard Worker forKeys:(const uint64_t [])keys 5679*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 5680*6777b538SAndroid Build Coastguard Worker self = [super init]; 5681*6777b538SAndroid Build Coastguard Worker if (self) { 5682*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 5683*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 5684*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 5685*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 5686*6777b538SAndroid Build Coastguard Worker } 5687*6777b538SAndroid Build Coastguard Worker } 5688*6777b538SAndroid Build Coastguard Worker } 5689*6777b538SAndroid Build Coastguard Worker return self; 5690*6777b538SAndroid Build Coastguard Worker} 5691*6777b538SAndroid Build Coastguard Worker 5692*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64BoolDictionary *)dictionary { 5693*6777b538SAndroid Build Coastguard Worker self = [self initWithBools:NULL forKeys:NULL count:0]; 5694*6777b538SAndroid Build Coastguard Worker if (self) { 5695*6777b538SAndroid Build Coastguard Worker if (dictionary) { 5696*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 5697*6777b538SAndroid Build Coastguard Worker } 5698*6777b538SAndroid Build Coastguard Worker } 5699*6777b538SAndroid Build Coastguard Worker return self; 5700*6777b538SAndroid Build Coastguard Worker} 5701*6777b538SAndroid Build Coastguard Worker 5702*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 5703*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 5704*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 5705*6777b538SAndroid Build Coastguard Worker} 5706*6777b538SAndroid Build Coastguard Worker 5707*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 5708*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 5709*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 5710*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 5711*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 5712*6777b538SAndroid Build Coastguard Worker [super dealloc]; 5713*6777b538SAndroid Build Coastguard Worker} 5714*6777b538SAndroid Build Coastguard Worker 5715*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 5716*6777b538SAndroid Build Coastguard Worker return [[GPBUInt64BoolDictionary allocWithZone:zone] initWithDictionary:self]; 5717*6777b538SAndroid Build Coastguard Worker} 5718*6777b538SAndroid Build Coastguard Worker 5719*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 5720*6777b538SAndroid Build Coastguard Worker if (self == other) { 5721*6777b538SAndroid Build Coastguard Worker return YES; 5722*6777b538SAndroid Build Coastguard Worker } 5723*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64BoolDictionary class]]) { 5724*6777b538SAndroid Build Coastguard Worker return NO; 5725*6777b538SAndroid Build Coastguard Worker } 5726*6777b538SAndroid Build Coastguard Worker GPBUInt64BoolDictionary *otherDictionary = other; 5727*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 5728*6777b538SAndroid Build Coastguard Worker} 5729*6777b538SAndroid Build Coastguard Worker 5730*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 5731*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5732*6777b538SAndroid Build Coastguard Worker} 5733*6777b538SAndroid Build Coastguard Worker 5734*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 5735*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 5736*6777b538SAndroid Build Coastguard Worker} 5737*6777b538SAndroid Build Coastguard Worker 5738*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 5739*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5740*6777b538SAndroid Build Coastguard Worker} 5741*6777b538SAndroid Build Coastguard Worker 5742*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock: 5743*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, BOOL value, BOOL *stop))block { 5744*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 5745*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5746*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5747*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5748*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5749*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5750*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], [aValue boolValue], &stop); 5751*6777b538SAndroid Build Coastguard Worker if (stop) { 5752*6777b538SAndroid Build Coastguard Worker break; 5753*6777b538SAndroid Build Coastguard Worker } 5754*6777b538SAndroid Build Coastguard Worker } 5755*6777b538SAndroid Build Coastguard Worker} 5756*6777b538SAndroid Build Coastguard Worker 5757*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 5758*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5759*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 5760*6777b538SAndroid Build Coastguard Worker if (count == 0) { 5761*6777b538SAndroid Build Coastguard Worker return 0; 5762*6777b538SAndroid Build Coastguard Worker } 5763*6777b538SAndroid Build Coastguard Worker 5764*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5765*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5766*6777b538SAndroid Build Coastguard Worker size_t result = 0; 5767*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5768*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5769*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5770*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5771*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType); 5772*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType); 5773*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 5774*6777b538SAndroid Build Coastguard Worker } 5775*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 5776*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 5777*6777b538SAndroid Build Coastguard Worker return result; 5778*6777b538SAndroid Build Coastguard Worker} 5779*6777b538SAndroid Build Coastguard Worker 5780*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 5781*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 5782*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5783*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5784*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 5785*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5786*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5787*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5788*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5789*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5790*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 5791*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 5792*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedKey = [aKey unsignedLongLongValue]; 5793*6777b538SAndroid Build Coastguard Worker BOOL unwrappedValue = [aValue boolValue]; 5794*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 5795*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 5796*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 5797*6777b538SAndroid Build Coastguard Worker // Write the fields. 5798*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 5799*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 5800*6777b538SAndroid Build Coastguard Worker } 5801*6777b538SAndroid Build Coastguard Worker} 5802*6777b538SAndroid Build Coastguard Worker 5803*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 5804*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 5805*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueBool) forKey:@(key->valueUInt64)]; 5806*6777b538SAndroid Build Coastguard Worker} 5807*6777b538SAndroid Build Coastguard Worker 5808*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 5809*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndBoolsUsingBlock:^(uint64_t key, BOOL value, BOOL *stop) { 5810*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 5811*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%llu", key], (value ? @"true" : @"false")); 5812*6777b538SAndroid Build Coastguard Worker }]; 5813*6777b538SAndroid Build Coastguard Worker} 5814*6777b538SAndroid Build Coastguard Worker 5815*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(uint64_t)key { 5816*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 5817*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 5818*6777b538SAndroid Build Coastguard Worker *value = [wrapped boolValue]; 5819*6777b538SAndroid Build Coastguard Worker } 5820*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 5821*6777b538SAndroid Build Coastguard Worker} 5822*6777b538SAndroid Build Coastguard Worker 5823*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64BoolDictionary *)otherDictionary { 5824*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 5825*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 5826*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5827*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5828*6777b538SAndroid Build Coastguard Worker } 5829*6777b538SAndroid Build Coastguard Worker } 5830*6777b538SAndroid Build Coastguard Worker} 5831*6777b538SAndroid Build Coastguard Worker 5832*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(uint64_t)key { 5833*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 5834*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 5835*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 5836*6777b538SAndroid Build Coastguard Worker } 5837*6777b538SAndroid Build Coastguard Worker} 5838*6777b538SAndroid Build Coastguard Worker 5839*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(uint64_t)aKey { 5840*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 5841*6777b538SAndroid Build Coastguard Worker} 5842*6777b538SAndroid Build Coastguard Worker 5843*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 5844*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 5845*6777b538SAndroid Build Coastguard Worker} 5846*6777b538SAndroid Build Coastguard Worker 5847*6777b538SAndroid Build Coastguard Worker@end 5848*6777b538SAndroid Build Coastguard Worker 5849*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Float 5850*6777b538SAndroid Build Coastguard Worker 5851*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64FloatDictionary { 5852*6777b538SAndroid Build Coastguard Worker @package 5853*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 5854*6777b538SAndroid Build Coastguard Worker} 5855*6777b538SAndroid Build Coastguard Worker 5856*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 5857*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 5858*6777b538SAndroid Build Coastguard Worker} 5859*6777b538SAndroid Build Coastguard Worker 5860*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values 5861*6777b538SAndroid Build Coastguard Worker forKeys:(const uint64_t [])keys 5862*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 5863*6777b538SAndroid Build Coastguard Worker self = [super init]; 5864*6777b538SAndroid Build Coastguard Worker if (self) { 5865*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 5866*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 5867*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 5868*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 5869*6777b538SAndroid Build Coastguard Worker } 5870*6777b538SAndroid Build Coastguard Worker } 5871*6777b538SAndroid Build Coastguard Worker } 5872*6777b538SAndroid Build Coastguard Worker return self; 5873*6777b538SAndroid Build Coastguard Worker} 5874*6777b538SAndroid Build Coastguard Worker 5875*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64FloatDictionary *)dictionary { 5876*6777b538SAndroid Build Coastguard Worker self = [self initWithFloats:NULL forKeys:NULL count:0]; 5877*6777b538SAndroid Build Coastguard Worker if (self) { 5878*6777b538SAndroid Build Coastguard Worker if (dictionary) { 5879*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 5880*6777b538SAndroid Build Coastguard Worker } 5881*6777b538SAndroid Build Coastguard Worker } 5882*6777b538SAndroid Build Coastguard Worker return self; 5883*6777b538SAndroid Build Coastguard Worker} 5884*6777b538SAndroid Build Coastguard Worker 5885*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 5886*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 5887*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 5888*6777b538SAndroid Build Coastguard Worker} 5889*6777b538SAndroid Build Coastguard Worker 5890*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 5891*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 5892*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 5893*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 5894*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 5895*6777b538SAndroid Build Coastguard Worker [super dealloc]; 5896*6777b538SAndroid Build Coastguard Worker} 5897*6777b538SAndroid Build Coastguard Worker 5898*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 5899*6777b538SAndroid Build Coastguard Worker return [[GPBUInt64FloatDictionary allocWithZone:zone] initWithDictionary:self]; 5900*6777b538SAndroid Build Coastguard Worker} 5901*6777b538SAndroid Build Coastguard Worker 5902*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 5903*6777b538SAndroid Build Coastguard Worker if (self == other) { 5904*6777b538SAndroid Build Coastguard Worker return YES; 5905*6777b538SAndroid Build Coastguard Worker } 5906*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64FloatDictionary class]]) { 5907*6777b538SAndroid Build Coastguard Worker return NO; 5908*6777b538SAndroid Build Coastguard Worker } 5909*6777b538SAndroid Build Coastguard Worker GPBUInt64FloatDictionary *otherDictionary = other; 5910*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 5911*6777b538SAndroid Build Coastguard Worker} 5912*6777b538SAndroid Build Coastguard Worker 5913*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 5914*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5915*6777b538SAndroid Build Coastguard Worker} 5916*6777b538SAndroid Build Coastguard Worker 5917*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 5918*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 5919*6777b538SAndroid Build Coastguard Worker} 5920*6777b538SAndroid Build Coastguard Worker 5921*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 5922*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 5923*6777b538SAndroid Build Coastguard Worker} 5924*6777b538SAndroid Build Coastguard Worker 5925*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock: 5926*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, float value, BOOL *stop))block { 5927*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 5928*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5929*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5930*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5931*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5932*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5933*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], [aValue floatValue], &stop); 5934*6777b538SAndroid Build Coastguard Worker if (stop) { 5935*6777b538SAndroid Build Coastguard Worker break; 5936*6777b538SAndroid Build Coastguard Worker } 5937*6777b538SAndroid Build Coastguard Worker } 5938*6777b538SAndroid Build Coastguard Worker} 5939*6777b538SAndroid Build Coastguard Worker 5940*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 5941*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5942*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 5943*6777b538SAndroid Build Coastguard Worker if (count == 0) { 5944*6777b538SAndroid Build Coastguard Worker return 0; 5945*6777b538SAndroid Build Coastguard Worker } 5946*6777b538SAndroid Build Coastguard Worker 5947*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5948*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5949*6777b538SAndroid Build Coastguard Worker size_t result = 0; 5950*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5951*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5952*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5953*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5954*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType); 5955*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType); 5956*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 5957*6777b538SAndroid Build Coastguard Worker } 5958*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 5959*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 5960*6777b538SAndroid Build Coastguard Worker return result; 5961*6777b538SAndroid Build Coastguard Worker} 5962*6777b538SAndroid Build Coastguard Worker 5963*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 5964*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 5965*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 5966*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 5967*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 5968*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 5969*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 5970*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 5971*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 5972*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 5973*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 5974*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 5975*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedKey = [aKey unsignedLongLongValue]; 5976*6777b538SAndroid Build Coastguard Worker float unwrappedValue = [aValue floatValue]; 5977*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 5978*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 5979*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 5980*6777b538SAndroid Build Coastguard Worker // Write the fields. 5981*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 5982*6777b538SAndroid Build Coastguard Worker WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 5983*6777b538SAndroid Build Coastguard Worker } 5984*6777b538SAndroid Build Coastguard Worker} 5985*6777b538SAndroid Build Coastguard Worker 5986*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 5987*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 5988*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueUInt64)]; 5989*6777b538SAndroid Build Coastguard Worker} 5990*6777b538SAndroid Build Coastguard Worker 5991*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 5992*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndFloatsUsingBlock:^(uint64_t key, float value, BOOL *stop) { 5993*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 5994*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]); 5995*6777b538SAndroid Build Coastguard Worker }]; 5996*6777b538SAndroid Build Coastguard Worker} 5997*6777b538SAndroid Build Coastguard Worker 5998*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(uint64_t)key { 5999*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 6000*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 6001*6777b538SAndroid Build Coastguard Worker *value = [wrapped floatValue]; 6002*6777b538SAndroid Build Coastguard Worker } 6003*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 6004*6777b538SAndroid Build Coastguard Worker} 6005*6777b538SAndroid Build Coastguard Worker 6006*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64FloatDictionary *)otherDictionary { 6007*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 6008*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 6009*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6010*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6011*6777b538SAndroid Build Coastguard Worker } 6012*6777b538SAndroid Build Coastguard Worker } 6013*6777b538SAndroid Build Coastguard Worker} 6014*6777b538SAndroid Build Coastguard Worker 6015*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(uint64_t)key { 6016*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 6017*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6018*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6019*6777b538SAndroid Build Coastguard Worker } 6020*6777b538SAndroid Build Coastguard Worker} 6021*6777b538SAndroid Build Coastguard Worker 6022*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(uint64_t)aKey { 6023*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 6024*6777b538SAndroid Build Coastguard Worker} 6025*6777b538SAndroid Build Coastguard Worker 6026*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 6027*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 6028*6777b538SAndroid Build Coastguard Worker} 6029*6777b538SAndroid Build Coastguard Worker 6030*6777b538SAndroid Build Coastguard Worker@end 6031*6777b538SAndroid Build Coastguard Worker 6032*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Double 6033*6777b538SAndroid Build Coastguard Worker 6034*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64DoubleDictionary { 6035*6777b538SAndroid Build Coastguard Worker @package 6036*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 6037*6777b538SAndroid Build Coastguard Worker} 6038*6777b538SAndroid Build Coastguard Worker 6039*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 6040*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 6041*6777b538SAndroid Build Coastguard Worker} 6042*6777b538SAndroid Build Coastguard Worker 6043*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values 6044*6777b538SAndroid Build Coastguard Worker forKeys:(const uint64_t [])keys 6045*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 6046*6777b538SAndroid Build Coastguard Worker self = [super init]; 6047*6777b538SAndroid Build Coastguard Worker if (self) { 6048*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 6049*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 6050*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 6051*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 6052*6777b538SAndroid Build Coastguard Worker } 6053*6777b538SAndroid Build Coastguard Worker } 6054*6777b538SAndroid Build Coastguard Worker } 6055*6777b538SAndroid Build Coastguard Worker return self; 6056*6777b538SAndroid Build Coastguard Worker} 6057*6777b538SAndroid Build Coastguard Worker 6058*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64DoubleDictionary *)dictionary { 6059*6777b538SAndroid Build Coastguard Worker self = [self initWithDoubles:NULL forKeys:NULL count:0]; 6060*6777b538SAndroid Build Coastguard Worker if (self) { 6061*6777b538SAndroid Build Coastguard Worker if (dictionary) { 6062*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 6063*6777b538SAndroid Build Coastguard Worker } 6064*6777b538SAndroid Build Coastguard Worker } 6065*6777b538SAndroid Build Coastguard Worker return self; 6066*6777b538SAndroid Build Coastguard Worker} 6067*6777b538SAndroid Build Coastguard Worker 6068*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 6069*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 6070*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 6071*6777b538SAndroid Build Coastguard Worker} 6072*6777b538SAndroid Build Coastguard Worker 6073*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 6074*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 6075*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 6076*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 6077*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 6078*6777b538SAndroid Build Coastguard Worker [super dealloc]; 6079*6777b538SAndroid Build Coastguard Worker} 6080*6777b538SAndroid Build Coastguard Worker 6081*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 6082*6777b538SAndroid Build Coastguard Worker return [[GPBUInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self]; 6083*6777b538SAndroid Build Coastguard Worker} 6084*6777b538SAndroid Build Coastguard Worker 6085*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 6086*6777b538SAndroid Build Coastguard Worker if (self == other) { 6087*6777b538SAndroid Build Coastguard Worker return YES; 6088*6777b538SAndroid Build Coastguard Worker } 6089*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64DoubleDictionary class]]) { 6090*6777b538SAndroid Build Coastguard Worker return NO; 6091*6777b538SAndroid Build Coastguard Worker } 6092*6777b538SAndroid Build Coastguard Worker GPBUInt64DoubleDictionary *otherDictionary = other; 6093*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 6094*6777b538SAndroid Build Coastguard Worker} 6095*6777b538SAndroid Build Coastguard Worker 6096*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 6097*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6098*6777b538SAndroid Build Coastguard Worker} 6099*6777b538SAndroid Build Coastguard Worker 6100*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 6101*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 6102*6777b538SAndroid Build Coastguard Worker} 6103*6777b538SAndroid Build Coastguard Worker 6104*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 6105*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6106*6777b538SAndroid Build Coastguard Worker} 6107*6777b538SAndroid Build Coastguard Worker 6108*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock: 6109*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, double value, BOOL *stop))block { 6110*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 6111*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6112*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6113*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6114*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6115*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6116*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], [aValue doubleValue], &stop); 6117*6777b538SAndroid Build Coastguard Worker if (stop) { 6118*6777b538SAndroid Build Coastguard Worker break; 6119*6777b538SAndroid Build Coastguard Worker } 6120*6777b538SAndroid Build Coastguard Worker } 6121*6777b538SAndroid Build Coastguard Worker} 6122*6777b538SAndroid Build Coastguard Worker 6123*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 6124*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6125*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 6126*6777b538SAndroid Build Coastguard Worker if (count == 0) { 6127*6777b538SAndroid Build Coastguard Worker return 0; 6128*6777b538SAndroid Build Coastguard Worker } 6129*6777b538SAndroid Build Coastguard Worker 6130*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6131*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6132*6777b538SAndroid Build Coastguard Worker size_t result = 0; 6133*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6134*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6135*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6136*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6137*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType); 6138*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType); 6139*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 6140*6777b538SAndroid Build Coastguard Worker } 6141*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 6142*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 6143*6777b538SAndroid Build Coastguard Worker return result; 6144*6777b538SAndroid Build Coastguard Worker} 6145*6777b538SAndroid Build Coastguard Worker 6146*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 6147*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 6148*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6149*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6150*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 6151*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6152*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6153*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6154*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6155*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6156*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 6157*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 6158*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedKey = [aKey unsignedLongLongValue]; 6159*6777b538SAndroid Build Coastguard Worker double unwrappedValue = [aValue doubleValue]; 6160*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 6161*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 6162*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 6163*6777b538SAndroid Build Coastguard Worker // Write the fields. 6164*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 6165*6777b538SAndroid Build Coastguard Worker WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 6166*6777b538SAndroid Build Coastguard Worker } 6167*6777b538SAndroid Build Coastguard Worker} 6168*6777b538SAndroid Build Coastguard Worker 6169*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 6170*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 6171*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueUInt64)]; 6172*6777b538SAndroid Build Coastguard Worker} 6173*6777b538SAndroid Build Coastguard Worker 6174*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 6175*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndDoublesUsingBlock:^(uint64_t key, double value, BOOL *stop) { 6176*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 6177*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]); 6178*6777b538SAndroid Build Coastguard Worker }]; 6179*6777b538SAndroid Build Coastguard Worker} 6180*6777b538SAndroid Build Coastguard Worker 6181*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(uint64_t)key { 6182*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 6183*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 6184*6777b538SAndroid Build Coastguard Worker *value = [wrapped doubleValue]; 6185*6777b538SAndroid Build Coastguard Worker } 6186*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 6187*6777b538SAndroid Build Coastguard Worker} 6188*6777b538SAndroid Build Coastguard Worker 6189*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64DoubleDictionary *)otherDictionary { 6190*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 6191*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 6192*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6193*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6194*6777b538SAndroid Build Coastguard Worker } 6195*6777b538SAndroid Build Coastguard Worker } 6196*6777b538SAndroid Build Coastguard Worker} 6197*6777b538SAndroid Build Coastguard Worker 6198*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(uint64_t)key { 6199*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 6200*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6201*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6202*6777b538SAndroid Build Coastguard Worker } 6203*6777b538SAndroid Build Coastguard Worker} 6204*6777b538SAndroid Build Coastguard Worker 6205*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(uint64_t)aKey { 6206*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 6207*6777b538SAndroid Build Coastguard Worker} 6208*6777b538SAndroid Build Coastguard Worker 6209*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 6210*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 6211*6777b538SAndroid Build Coastguard Worker} 6212*6777b538SAndroid Build Coastguard Worker 6213*6777b538SAndroid Build Coastguard Worker@end 6214*6777b538SAndroid Build Coastguard Worker 6215*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Enum 6216*6777b538SAndroid Build Coastguard Worker 6217*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64EnumDictionary { 6218*6777b538SAndroid Build Coastguard Worker @package 6219*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 6220*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc _validationFunc; 6221*6777b538SAndroid Build Coastguard Worker} 6222*6777b538SAndroid Build Coastguard Worker 6223*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc; 6224*6777b538SAndroid Build Coastguard Worker 6225*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 6226*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0]; 6227*6777b538SAndroid Build Coastguard Worker} 6228*6777b538SAndroid Build Coastguard Worker 6229*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func { 6230*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 6231*6777b538SAndroid Build Coastguard Worker} 6232*6777b538SAndroid Build Coastguard Worker 6233*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 6234*6777b538SAndroid Build Coastguard Worker rawValues:(const int32_t [])rawValues 6235*6777b538SAndroid Build Coastguard Worker forKeys:(const uint64_t [])keys 6236*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 6237*6777b538SAndroid Build Coastguard Worker self = [super init]; 6238*6777b538SAndroid Build Coastguard Worker if (self) { 6239*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 6240*6777b538SAndroid Build Coastguard Worker _validationFunc = (func != NULL ? func : DictDefault_IsValidValue); 6241*6777b538SAndroid Build Coastguard Worker if (count && rawValues && keys) { 6242*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 6243*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])]; 6244*6777b538SAndroid Build Coastguard Worker } 6245*6777b538SAndroid Build Coastguard Worker } 6246*6777b538SAndroid Build Coastguard Worker } 6247*6777b538SAndroid Build Coastguard Worker return self; 6248*6777b538SAndroid Build Coastguard Worker} 6249*6777b538SAndroid Build Coastguard Worker 6250*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64EnumDictionary *)dictionary { 6251*6777b538SAndroid Build Coastguard Worker self = [self initWithValidationFunction:dictionary.validationFunc 6252*6777b538SAndroid Build Coastguard Worker rawValues:NULL 6253*6777b538SAndroid Build Coastguard Worker forKeys:NULL 6254*6777b538SAndroid Build Coastguard Worker count:0]; 6255*6777b538SAndroid Build Coastguard Worker if (self) { 6256*6777b538SAndroid Build Coastguard Worker if (dictionary) { 6257*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 6258*6777b538SAndroid Build Coastguard Worker } 6259*6777b538SAndroid Build Coastguard Worker } 6260*6777b538SAndroid Build Coastguard Worker return self; 6261*6777b538SAndroid Build Coastguard Worker} 6262*6777b538SAndroid Build Coastguard Worker 6263*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 6264*6777b538SAndroid Build Coastguard Worker capacity:(NSUInteger)numItems { 6265*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 6266*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 6267*6777b538SAndroid Build Coastguard Worker} 6268*6777b538SAndroid Build Coastguard Worker 6269*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 6270*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 6271*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 6272*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 6273*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 6274*6777b538SAndroid Build Coastguard Worker [super dealloc]; 6275*6777b538SAndroid Build Coastguard Worker} 6276*6777b538SAndroid Build Coastguard Worker 6277*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 6278*6777b538SAndroid Build Coastguard Worker return [[GPBUInt64EnumDictionary allocWithZone:zone] initWithDictionary:self]; 6279*6777b538SAndroid Build Coastguard Worker} 6280*6777b538SAndroid Build Coastguard Worker 6281*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 6282*6777b538SAndroid Build Coastguard Worker if (self == other) { 6283*6777b538SAndroid Build Coastguard Worker return YES; 6284*6777b538SAndroid Build Coastguard Worker } 6285*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64EnumDictionary class]]) { 6286*6777b538SAndroid Build Coastguard Worker return NO; 6287*6777b538SAndroid Build Coastguard Worker } 6288*6777b538SAndroid Build Coastguard Worker GPBUInt64EnumDictionary *otherDictionary = other; 6289*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 6290*6777b538SAndroid Build Coastguard Worker} 6291*6777b538SAndroid Build Coastguard Worker 6292*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 6293*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6294*6777b538SAndroid Build Coastguard Worker} 6295*6777b538SAndroid Build Coastguard Worker 6296*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 6297*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 6298*6777b538SAndroid Build Coastguard Worker} 6299*6777b538SAndroid Build Coastguard Worker 6300*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 6301*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6302*6777b538SAndroid Build Coastguard Worker} 6303*6777b538SAndroid Build Coastguard Worker 6304*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock: 6305*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, int32_t value, BOOL *stop))block { 6306*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 6307*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6308*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6309*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6310*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6311*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6312*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], [aValue intValue], &stop); 6313*6777b538SAndroid Build Coastguard Worker if (stop) { 6314*6777b538SAndroid Build Coastguard Worker break; 6315*6777b538SAndroid Build Coastguard Worker } 6316*6777b538SAndroid Build Coastguard Worker } 6317*6777b538SAndroid Build Coastguard Worker} 6318*6777b538SAndroid Build Coastguard Worker 6319*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 6320*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6321*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 6322*6777b538SAndroid Build Coastguard Worker if (count == 0) { 6323*6777b538SAndroid Build Coastguard Worker return 0; 6324*6777b538SAndroid Build Coastguard Worker } 6325*6777b538SAndroid Build Coastguard Worker 6326*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6327*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6328*6777b538SAndroid Build Coastguard Worker size_t result = 0; 6329*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6330*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6331*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6332*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6333*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType); 6334*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 6335*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 6336*6777b538SAndroid Build Coastguard Worker } 6337*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 6338*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 6339*6777b538SAndroid Build Coastguard Worker return result; 6340*6777b538SAndroid Build Coastguard Worker} 6341*6777b538SAndroid Build Coastguard Worker 6342*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 6343*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 6344*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6345*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6346*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 6347*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6348*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6349*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6350*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6351*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6352*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 6353*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 6354*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedKey = [aKey unsignedLongLongValue]; 6355*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 6356*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 6357*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 6358*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 6359*6777b538SAndroid Build Coastguard Worker // Write the fields. 6360*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 6361*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 6362*6777b538SAndroid Build Coastguard Worker } 6363*6777b538SAndroid Build Coastguard Worker} 6364*6777b538SAndroid Build Coastguard Worker 6365*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value 6366*6777b538SAndroid Build Coastguard Worker forKey:(GPBGenericValue *)key 6367*6777b538SAndroid Build Coastguard Worker keyDataType:(GPBDataType)keyDataType { 6368*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(key->valueUInt64, kMapKeyFieldNumber, keyDataType); 6369*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum); 6370*6777b538SAndroid Build Coastguard Worker NSMutableData *data = [NSMutableData dataWithLength:msgSize]; 6371*6777b538SAndroid Build Coastguard Worker GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data]; 6372*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, key->valueUInt64, kMapKeyFieldNumber, keyDataType); 6373*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum); 6374*6777b538SAndroid Build Coastguard Worker [outputStream release]; 6375*6777b538SAndroid Build Coastguard Worker return data; 6376*6777b538SAndroid Build Coastguard Worker} 6377*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 6378*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 6379*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueUInt64)]; 6380*6777b538SAndroid Build Coastguard Worker} 6381*6777b538SAndroid Build Coastguard Worker 6382*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 6383*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndRawValuesUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) { 6384*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 6385*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%llu", key], @(value)); 6386*6777b538SAndroid Build Coastguard Worker }]; 6387*6777b538SAndroid Build Coastguard Worker} 6388*6777b538SAndroid Build Coastguard Worker 6389*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(uint64_t)key { 6390*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 6391*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 6392*6777b538SAndroid Build Coastguard Worker int32_t result = [wrapped intValue]; 6393*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(result)) { 6394*6777b538SAndroid Build Coastguard Worker result = kGPBUnrecognizedEnumeratorValue; 6395*6777b538SAndroid Build Coastguard Worker } 6396*6777b538SAndroid Build Coastguard Worker *value = result; 6397*6777b538SAndroid Build Coastguard Worker } 6398*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 6399*6777b538SAndroid Build Coastguard Worker} 6400*6777b538SAndroid Build Coastguard Worker 6401*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(uint64_t)key { 6402*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 6403*6777b538SAndroid Build Coastguard Worker if (wrapped && rawValue) { 6404*6777b538SAndroid Build Coastguard Worker *rawValue = [wrapped intValue]; 6405*6777b538SAndroid Build Coastguard Worker } 6406*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 6407*6777b538SAndroid Build Coastguard Worker} 6408*6777b538SAndroid Build Coastguard Worker 6409*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock: 6410*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, int32_t value, BOOL *stop))block { 6411*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc func = _validationFunc; 6412*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 6413*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [_dictionary keyEnumerator]; 6414*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6415*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6416*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = _dictionary[aKey]; 6417*6777b538SAndroid Build Coastguard Worker int32_t unwrapped = [aValue intValue]; 6418*6777b538SAndroid Build Coastguard Worker if (!func(unwrapped)) { 6419*6777b538SAndroid Build Coastguard Worker unwrapped = kGPBUnrecognizedEnumeratorValue; 6420*6777b538SAndroid Build Coastguard Worker } 6421*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], unwrapped, &stop); 6422*6777b538SAndroid Build Coastguard Worker if (stop) { 6423*6777b538SAndroid Build Coastguard Worker break; 6424*6777b538SAndroid Build Coastguard Worker } 6425*6777b538SAndroid Build Coastguard Worker } 6426*6777b538SAndroid Build Coastguard Worker} 6427*6777b538SAndroid Build Coastguard Worker 6428*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBUInt64EnumDictionary *)otherDictionary { 6429*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 6430*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 6431*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6432*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6433*6777b538SAndroid Build Coastguard Worker } 6434*6777b538SAndroid Build Coastguard Worker } 6435*6777b538SAndroid Build Coastguard Worker} 6436*6777b538SAndroid Build Coastguard Worker 6437*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(uint64_t)key { 6438*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 6439*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6440*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6441*6777b538SAndroid Build Coastguard Worker } 6442*6777b538SAndroid Build Coastguard Worker} 6443*6777b538SAndroid Build Coastguard Worker 6444*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(uint64_t)aKey { 6445*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 6446*6777b538SAndroid Build Coastguard Worker} 6447*6777b538SAndroid Build Coastguard Worker 6448*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 6449*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 6450*6777b538SAndroid Build Coastguard Worker} 6451*6777b538SAndroid Build Coastguard Worker 6452*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(uint64_t)key { 6453*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(value)) { 6454*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 6455*6777b538SAndroid Build Coastguard Worker format:@"GPBUInt64EnumDictionary: Attempt to set an unknown enum value (%d)", 6456*6777b538SAndroid Build Coastguard Worker value]; 6457*6777b538SAndroid Build Coastguard Worker } 6458*6777b538SAndroid Build Coastguard Worker 6459*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 6460*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6461*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6462*6777b538SAndroid Build Coastguard Worker } 6463*6777b538SAndroid Build Coastguard Worker} 6464*6777b538SAndroid Build Coastguard Worker 6465*6777b538SAndroid Build Coastguard Worker@end 6466*6777b538SAndroid Build Coastguard Worker 6467*6777b538SAndroid Build Coastguard Worker#pragma mark - UInt64 -> Object 6468*6777b538SAndroid Build Coastguard Worker 6469*6777b538SAndroid Build Coastguard Worker@implementation GPBUInt64ObjectDictionary { 6470*6777b538SAndroid Build Coastguard Worker @package 6471*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 6472*6777b538SAndroid Build Coastguard Worker} 6473*6777b538SAndroid Build Coastguard Worker 6474*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 6475*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 6476*6777b538SAndroid Build Coastguard Worker} 6477*6777b538SAndroid Build Coastguard Worker 6478*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects 6479*6777b538SAndroid Build Coastguard Worker forKeys:(const uint64_t [])keys 6480*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 6481*6777b538SAndroid Build Coastguard Worker self = [super init]; 6482*6777b538SAndroid Build Coastguard Worker if (self) { 6483*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 6484*6777b538SAndroid Build Coastguard Worker if (count && objects && keys) { 6485*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 6486*6777b538SAndroid Build Coastguard Worker if (!objects[i]) { 6487*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 6488*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 6489*6777b538SAndroid Build Coastguard Worker } 6490*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:objects[i] forKey:@(keys[i])]; 6491*6777b538SAndroid Build Coastguard Worker } 6492*6777b538SAndroid Build Coastguard Worker } 6493*6777b538SAndroid Build Coastguard Worker } 6494*6777b538SAndroid Build Coastguard Worker return self; 6495*6777b538SAndroid Build Coastguard Worker} 6496*6777b538SAndroid Build Coastguard Worker 6497*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBUInt64ObjectDictionary *)dictionary { 6498*6777b538SAndroid Build Coastguard Worker self = [self initWithObjects:NULL forKeys:NULL count:0]; 6499*6777b538SAndroid Build Coastguard Worker if (self) { 6500*6777b538SAndroid Build Coastguard Worker if (dictionary) { 6501*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 6502*6777b538SAndroid Build Coastguard Worker } 6503*6777b538SAndroid Build Coastguard Worker } 6504*6777b538SAndroid Build Coastguard Worker return self; 6505*6777b538SAndroid Build Coastguard Worker} 6506*6777b538SAndroid Build Coastguard Worker 6507*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 6508*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 6509*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 6510*6777b538SAndroid Build Coastguard Worker} 6511*6777b538SAndroid Build Coastguard Worker 6512*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 6513*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 6514*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 6515*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 6516*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 6517*6777b538SAndroid Build Coastguard Worker [super dealloc]; 6518*6777b538SAndroid Build Coastguard Worker} 6519*6777b538SAndroid Build Coastguard Worker 6520*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 6521*6777b538SAndroid Build Coastguard Worker return [[GPBUInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self]; 6522*6777b538SAndroid Build Coastguard Worker} 6523*6777b538SAndroid Build Coastguard Worker 6524*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 6525*6777b538SAndroid Build Coastguard Worker if (self == other) { 6526*6777b538SAndroid Build Coastguard Worker return YES; 6527*6777b538SAndroid Build Coastguard Worker } 6528*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64ObjectDictionary class]]) { 6529*6777b538SAndroid Build Coastguard Worker return NO; 6530*6777b538SAndroid Build Coastguard Worker } 6531*6777b538SAndroid Build Coastguard Worker GPBUInt64ObjectDictionary *otherDictionary = other; 6532*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 6533*6777b538SAndroid Build Coastguard Worker} 6534*6777b538SAndroid Build Coastguard Worker 6535*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 6536*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6537*6777b538SAndroid Build Coastguard Worker} 6538*6777b538SAndroid Build Coastguard Worker 6539*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 6540*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 6541*6777b538SAndroid Build Coastguard Worker} 6542*6777b538SAndroid Build Coastguard Worker 6543*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 6544*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6545*6777b538SAndroid Build Coastguard Worker} 6546*6777b538SAndroid Build Coastguard Worker 6547*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock: 6548*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(uint64_t key, id object, BOOL *stop))block { 6549*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 6550*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6551*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6552*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6553*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6554*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 6555*6777b538SAndroid Build Coastguard Worker block([aKey unsignedLongLongValue], aObject, &stop); 6556*6777b538SAndroid Build Coastguard Worker if (stop) { 6557*6777b538SAndroid Build Coastguard Worker break; 6558*6777b538SAndroid Build Coastguard Worker } 6559*6777b538SAndroid Build Coastguard Worker } 6560*6777b538SAndroid Build Coastguard Worker} 6561*6777b538SAndroid Build Coastguard Worker 6562*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized { 6563*6777b538SAndroid Build Coastguard Worker for (GPBMessage *msg in [_dictionary objectEnumerator]) { 6564*6777b538SAndroid Build Coastguard Worker if (!msg.initialized) { 6565*6777b538SAndroid Build Coastguard Worker return NO; 6566*6777b538SAndroid Build Coastguard Worker } 6567*6777b538SAndroid Build Coastguard Worker } 6568*6777b538SAndroid Build Coastguard Worker return YES; 6569*6777b538SAndroid Build Coastguard Worker} 6570*6777b538SAndroid Build Coastguard Worker 6571*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone { 6572*6777b538SAndroid Build Coastguard Worker GPBUInt64ObjectDictionary *newDict = 6573*6777b538SAndroid Build Coastguard Worker [[GPBUInt64ObjectDictionary alloc] init]; 6574*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [_dictionary keyEnumerator]; 6575*6777b538SAndroid Build Coastguard Worker id aKey; 6576*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *internalDict = newDict->_dictionary; 6577*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6578*6777b538SAndroid Build Coastguard Worker GPBMessage *msg = _dictionary[aKey]; 6579*6777b538SAndroid Build Coastguard Worker GPBMessage *copiedMsg = [msg copyWithZone:zone]; 6580*6777b538SAndroid Build Coastguard Worker [internalDict setObject:copiedMsg forKey:aKey]; 6581*6777b538SAndroid Build Coastguard Worker [copiedMsg release]; 6582*6777b538SAndroid Build Coastguard Worker } 6583*6777b538SAndroid Build Coastguard Worker return newDict; 6584*6777b538SAndroid Build Coastguard Worker} 6585*6777b538SAndroid Build Coastguard Worker 6586*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 6587*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6588*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 6589*6777b538SAndroid Build Coastguard Worker if (count == 0) { 6590*6777b538SAndroid Build Coastguard Worker return 0; 6591*6777b538SAndroid Build Coastguard Worker } 6592*6777b538SAndroid Build Coastguard Worker 6593*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6594*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6595*6777b538SAndroid Build Coastguard Worker size_t result = 0; 6596*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6597*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6598*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6599*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 6600*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType); 6601*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType); 6602*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 6603*6777b538SAndroid Build Coastguard Worker } 6604*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 6605*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 6606*6777b538SAndroid Build Coastguard Worker return result; 6607*6777b538SAndroid Build Coastguard Worker} 6608*6777b538SAndroid Build Coastguard Worker 6609*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 6610*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 6611*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6612*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6613*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 6614*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6615*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6616*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6617*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6618*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 6619*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 6620*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 6621*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedKey = [aKey unsignedLongLongValue]; 6622*6777b538SAndroid Build Coastguard Worker id unwrappedValue = aObject; 6623*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 6624*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 6625*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 6626*6777b538SAndroid Build Coastguard Worker // Write the fields. 6627*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 6628*6777b538SAndroid Build Coastguard Worker WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 6629*6777b538SAndroid Build Coastguard Worker } 6630*6777b538SAndroid Build Coastguard Worker} 6631*6777b538SAndroid Build Coastguard Worker 6632*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 6633*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 6634*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:value->valueString forKey:@(key->valueUInt64)]; 6635*6777b538SAndroid Build Coastguard Worker} 6636*6777b538SAndroid Build Coastguard Worker 6637*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 6638*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndObjectsUsingBlock:^(uint64_t key, id object, BOOL *stop) { 6639*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 6640*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%llu", key], object); 6641*6777b538SAndroid Build Coastguard Worker }]; 6642*6777b538SAndroid Build Coastguard Worker} 6643*6777b538SAndroid Build Coastguard Worker 6644*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(uint64_t)key { 6645*6777b538SAndroid Build Coastguard Worker id result = [_dictionary objectForKey:@(key)]; 6646*6777b538SAndroid Build Coastguard Worker return result; 6647*6777b538SAndroid Build Coastguard Worker} 6648*6777b538SAndroid Build Coastguard Worker 6649*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBUInt64ObjectDictionary *)otherDictionary { 6650*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 6651*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 6652*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6653*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6654*6777b538SAndroid Build Coastguard Worker } 6655*6777b538SAndroid Build Coastguard Worker } 6656*6777b538SAndroid Build Coastguard Worker} 6657*6777b538SAndroid Build Coastguard Worker 6658*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(uint64_t)key { 6659*6777b538SAndroid Build Coastguard Worker if (!object) { 6660*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 6661*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 6662*6777b538SAndroid Build Coastguard Worker } 6663*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:object forKey:@(key)]; 6664*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6665*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6666*6777b538SAndroid Build Coastguard Worker } 6667*6777b538SAndroid Build Coastguard Worker} 6668*6777b538SAndroid Build Coastguard Worker 6669*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(uint64_t)aKey { 6670*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 6671*6777b538SAndroid Build Coastguard Worker} 6672*6777b538SAndroid Build Coastguard Worker 6673*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 6674*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 6675*6777b538SAndroid Build Coastguard Worker} 6676*6777b538SAndroid Build Coastguard Worker 6677*6777b538SAndroid Build Coastguard Worker@end 6678*6777b538SAndroid Build Coastguard Worker 6679*6777b538SAndroid Build Coastguard Worker// clang-format on 6680*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int64, int64_t) 6681*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 6682*6777b538SAndroid Build Coastguard Worker// clang-format off 6683*6777b538SAndroid Build Coastguard Worker 6684*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> UInt32 6685*6777b538SAndroid Build Coastguard Worker 6686*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64UInt32Dictionary { 6687*6777b538SAndroid Build Coastguard Worker @package 6688*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 6689*6777b538SAndroid Build Coastguard Worker} 6690*6777b538SAndroid Build Coastguard Worker 6691*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 6692*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 6693*6777b538SAndroid Build Coastguard Worker} 6694*6777b538SAndroid Build Coastguard Worker 6695*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values 6696*6777b538SAndroid Build Coastguard Worker forKeys:(const int64_t [])keys 6697*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 6698*6777b538SAndroid Build Coastguard Worker self = [super init]; 6699*6777b538SAndroid Build Coastguard Worker if (self) { 6700*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 6701*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 6702*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 6703*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 6704*6777b538SAndroid Build Coastguard Worker } 6705*6777b538SAndroid Build Coastguard Worker } 6706*6777b538SAndroid Build Coastguard Worker } 6707*6777b538SAndroid Build Coastguard Worker return self; 6708*6777b538SAndroid Build Coastguard Worker} 6709*6777b538SAndroid Build Coastguard Worker 6710*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64UInt32Dictionary *)dictionary { 6711*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt32s:NULL forKeys:NULL count:0]; 6712*6777b538SAndroid Build Coastguard Worker if (self) { 6713*6777b538SAndroid Build Coastguard Worker if (dictionary) { 6714*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 6715*6777b538SAndroid Build Coastguard Worker } 6716*6777b538SAndroid Build Coastguard Worker } 6717*6777b538SAndroid Build Coastguard Worker return self; 6718*6777b538SAndroid Build Coastguard Worker} 6719*6777b538SAndroid Build Coastguard Worker 6720*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 6721*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 6722*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 6723*6777b538SAndroid Build Coastguard Worker} 6724*6777b538SAndroid Build Coastguard Worker 6725*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 6726*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 6727*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 6728*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 6729*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 6730*6777b538SAndroid Build Coastguard Worker [super dealloc]; 6731*6777b538SAndroid Build Coastguard Worker} 6732*6777b538SAndroid Build Coastguard Worker 6733*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 6734*6777b538SAndroid Build Coastguard Worker return [[GPBInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self]; 6735*6777b538SAndroid Build Coastguard Worker} 6736*6777b538SAndroid Build Coastguard Worker 6737*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 6738*6777b538SAndroid Build Coastguard Worker if (self == other) { 6739*6777b538SAndroid Build Coastguard Worker return YES; 6740*6777b538SAndroid Build Coastguard Worker } 6741*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64UInt32Dictionary class]]) { 6742*6777b538SAndroid Build Coastguard Worker return NO; 6743*6777b538SAndroid Build Coastguard Worker } 6744*6777b538SAndroid Build Coastguard Worker GPBInt64UInt32Dictionary *otherDictionary = other; 6745*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 6746*6777b538SAndroid Build Coastguard Worker} 6747*6777b538SAndroid Build Coastguard Worker 6748*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 6749*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6750*6777b538SAndroid Build Coastguard Worker} 6751*6777b538SAndroid Build Coastguard Worker 6752*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 6753*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 6754*6777b538SAndroid Build Coastguard Worker} 6755*6777b538SAndroid Build Coastguard Worker 6756*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 6757*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6758*6777b538SAndroid Build Coastguard Worker} 6759*6777b538SAndroid Build Coastguard Worker 6760*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock: 6761*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, uint32_t value, BOOL *stop))block { 6762*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 6763*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6764*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6765*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6766*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6767*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6768*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], [aValue unsignedIntValue], &stop); 6769*6777b538SAndroid Build Coastguard Worker if (stop) { 6770*6777b538SAndroid Build Coastguard Worker break; 6771*6777b538SAndroid Build Coastguard Worker } 6772*6777b538SAndroid Build Coastguard Worker } 6773*6777b538SAndroid Build Coastguard Worker} 6774*6777b538SAndroid Build Coastguard Worker 6775*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 6776*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6777*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 6778*6777b538SAndroid Build Coastguard Worker if (count == 0) { 6779*6777b538SAndroid Build Coastguard Worker return 0; 6780*6777b538SAndroid Build Coastguard Worker } 6781*6777b538SAndroid Build Coastguard Worker 6782*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6783*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6784*6777b538SAndroid Build Coastguard Worker size_t result = 0; 6785*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6786*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6787*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6788*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6789*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType); 6790*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType); 6791*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 6792*6777b538SAndroid Build Coastguard Worker } 6793*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 6794*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 6795*6777b538SAndroid Build Coastguard Worker return result; 6796*6777b538SAndroid Build Coastguard Worker} 6797*6777b538SAndroid Build Coastguard Worker 6798*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 6799*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 6800*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6801*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6802*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 6803*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6804*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6805*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6806*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6807*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6808*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 6809*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 6810*6777b538SAndroid Build Coastguard Worker int64_t unwrappedKey = [aKey longLongValue]; 6811*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedValue = [aValue unsignedIntValue]; 6812*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 6813*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 6814*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 6815*6777b538SAndroid Build Coastguard Worker // Write the fields. 6816*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 6817*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 6818*6777b538SAndroid Build Coastguard Worker } 6819*6777b538SAndroid Build Coastguard Worker} 6820*6777b538SAndroid Build Coastguard Worker 6821*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 6822*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 6823*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt32) forKey:@(key->valueInt64)]; 6824*6777b538SAndroid Build Coastguard Worker} 6825*6777b538SAndroid Build Coastguard Worker 6826*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 6827*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt32sUsingBlock:^(int64_t key, uint32_t value, BOOL *stop) { 6828*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 6829*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%u", value]); 6830*6777b538SAndroid Build Coastguard Worker }]; 6831*6777b538SAndroid Build Coastguard Worker} 6832*6777b538SAndroid Build Coastguard Worker 6833*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int64_t)key { 6834*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 6835*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 6836*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedIntValue]; 6837*6777b538SAndroid Build Coastguard Worker } 6838*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 6839*6777b538SAndroid Build Coastguard Worker} 6840*6777b538SAndroid Build Coastguard Worker 6841*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64UInt32Dictionary *)otherDictionary { 6842*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 6843*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 6844*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6845*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6846*6777b538SAndroid Build Coastguard Worker } 6847*6777b538SAndroid Build Coastguard Worker } 6848*6777b538SAndroid Build Coastguard Worker} 6849*6777b538SAndroid Build Coastguard Worker 6850*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(int64_t)key { 6851*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 6852*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 6853*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 6854*6777b538SAndroid Build Coastguard Worker } 6855*6777b538SAndroid Build Coastguard Worker} 6856*6777b538SAndroid Build Coastguard Worker 6857*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(int64_t)aKey { 6858*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 6859*6777b538SAndroid Build Coastguard Worker} 6860*6777b538SAndroid Build Coastguard Worker 6861*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 6862*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 6863*6777b538SAndroid Build Coastguard Worker} 6864*6777b538SAndroid Build Coastguard Worker 6865*6777b538SAndroid Build Coastguard Worker@end 6866*6777b538SAndroid Build Coastguard Worker 6867*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Int32 6868*6777b538SAndroid Build Coastguard Worker 6869*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64Int32Dictionary { 6870*6777b538SAndroid Build Coastguard Worker @package 6871*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 6872*6777b538SAndroid Build Coastguard Worker} 6873*6777b538SAndroid Build Coastguard Worker 6874*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 6875*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 6876*6777b538SAndroid Build Coastguard Worker} 6877*6777b538SAndroid Build Coastguard Worker 6878*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values 6879*6777b538SAndroid Build Coastguard Worker forKeys:(const int64_t [])keys 6880*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 6881*6777b538SAndroid Build Coastguard Worker self = [super init]; 6882*6777b538SAndroid Build Coastguard Worker if (self) { 6883*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 6884*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 6885*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 6886*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 6887*6777b538SAndroid Build Coastguard Worker } 6888*6777b538SAndroid Build Coastguard Worker } 6889*6777b538SAndroid Build Coastguard Worker } 6890*6777b538SAndroid Build Coastguard Worker return self; 6891*6777b538SAndroid Build Coastguard Worker} 6892*6777b538SAndroid Build Coastguard Worker 6893*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64Int32Dictionary *)dictionary { 6894*6777b538SAndroid Build Coastguard Worker self = [self initWithInt32s:NULL forKeys:NULL count:0]; 6895*6777b538SAndroid Build Coastguard Worker if (self) { 6896*6777b538SAndroid Build Coastguard Worker if (dictionary) { 6897*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 6898*6777b538SAndroid Build Coastguard Worker } 6899*6777b538SAndroid Build Coastguard Worker } 6900*6777b538SAndroid Build Coastguard Worker return self; 6901*6777b538SAndroid Build Coastguard Worker} 6902*6777b538SAndroid Build Coastguard Worker 6903*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 6904*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 6905*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 6906*6777b538SAndroid Build Coastguard Worker} 6907*6777b538SAndroid Build Coastguard Worker 6908*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 6909*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 6910*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 6911*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 6912*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 6913*6777b538SAndroid Build Coastguard Worker [super dealloc]; 6914*6777b538SAndroid Build Coastguard Worker} 6915*6777b538SAndroid Build Coastguard Worker 6916*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 6917*6777b538SAndroid Build Coastguard Worker return [[GPBInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self]; 6918*6777b538SAndroid Build Coastguard Worker} 6919*6777b538SAndroid Build Coastguard Worker 6920*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 6921*6777b538SAndroid Build Coastguard Worker if (self == other) { 6922*6777b538SAndroid Build Coastguard Worker return YES; 6923*6777b538SAndroid Build Coastguard Worker } 6924*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64Int32Dictionary class]]) { 6925*6777b538SAndroid Build Coastguard Worker return NO; 6926*6777b538SAndroid Build Coastguard Worker } 6927*6777b538SAndroid Build Coastguard Worker GPBInt64Int32Dictionary *otherDictionary = other; 6928*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 6929*6777b538SAndroid Build Coastguard Worker} 6930*6777b538SAndroid Build Coastguard Worker 6931*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 6932*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6933*6777b538SAndroid Build Coastguard Worker} 6934*6777b538SAndroid Build Coastguard Worker 6935*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 6936*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 6937*6777b538SAndroid Build Coastguard Worker} 6938*6777b538SAndroid Build Coastguard Worker 6939*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 6940*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 6941*6777b538SAndroid Build Coastguard Worker} 6942*6777b538SAndroid Build Coastguard Worker 6943*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock: 6944*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, int32_t value, BOOL *stop))block { 6945*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 6946*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6947*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6948*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6949*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6950*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6951*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], [aValue intValue], &stop); 6952*6777b538SAndroid Build Coastguard Worker if (stop) { 6953*6777b538SAndroid Build Coastguard Worker break; 6954*6777b538SAndroid Build Coastguard Worker } 6955*6777b538SAndroid Build Coastguard Worker } 6956*6777b538SAndroid Build Coastguard Worker} 6957*6777b538SAndroid Build Coastguard Worker 6958*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 6959*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6960*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 6961*6777b538SAndroid Build Coastguard Worker if (count == 0) { 6962*6777b538SAndroid Build Coastguard Worker return 0; 6963*6777b538SAndroid Build Coastguard Worker } 6964*6777b538SAndroid Build Coastguard Worker 6965*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6966*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6967*6777b538SAndroid Build Coastguard Worker size_t result = 0; 6968*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6969*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6970*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6971*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6972*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType); 6973*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 6974*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 6975*6777b538SAndroid Build Coastguard Worker } 6976*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 6977*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 6978*6777b538SAndroid Build Coastguard Worker return result; 6979*6777b538SAndroid Build Coastguard Worker} 6980*6777b538SAndroid Build Coastguard Worker 6981*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 6982*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 6983*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 6984*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 6985*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 6986*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 6987*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 6988*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 6989*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 6990*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 6991*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 6992*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 6993*6777b538SAndroid Build Coastguard Worker int64_t unwrappedKey = [aKey longLongValue]; 6994*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 6995*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 6996*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 6997*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 6998*6777b538SAndroid Build Coastguard Worker // Write the fields. 6999*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 7000*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 7001*6777b538SAndroid Build Coastguard Worker } 7002*6777b538SAndroid Build Coastguard Worker} 7003*6777b538SAndroid Build Coastguard Worker 7004*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 7005*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 7006*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt32) forKey:@(key->valueInt64)]; 7007*6777b538SAndroid Build Coastguard Worker} 7008*6777b538SAndroid Build Coastguard Worker 7009*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 7010*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt32sUsingBlock:^(int64_t key, int32_t value, BOOL *stop) { 7011*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 7012*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%d", value]); 7013*6777b538SAndroid Build Coastguard Worker }]; 7014*6777b538SAndroid Build Coastguard Worker} 7015*6777b538SAndroid Build Coastguard Worker 7016*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(int64_t)key { 7017*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 7018*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 7019*6777b538SAndroid Build Coastguard Worker *value = [wrapped intValue]; 7020*6777b538SAndroid Build Coastguard Worker } 7021*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 7022*6777b538SAndroid Build Coastguard Worker} 7023*6777b538SAndroid Build Coastguard Worker 7024*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64Int32Dictionary *)otherDictionary { 7025*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 7026*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 7027*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7028*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7029*6777b538SAndroid Build Coastguard Worker } 7030*6777b538SAndroid Build Coastguard Worker } 7031*6777b538SAndroid Build Coastguard Worker} 7032*6777b538SAndroid Build Coastguard Worker 7033*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(int64_t)key { 7034*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 7035*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7036*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7037*6777b538SAndroid Build Coastguard Worker } 7038*6777b538SAndroid Build Coastguard Worker} 7039*6777b538SAndroid Build Coastguard Worker 7040*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(int64_t)aKey { 7041*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 7042*6777b538SAndroid Build Coastguard Worker} 7043*6777b538SAndroid Build Coastguard Worker 7044*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 7045*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 7046*6777b538SAndroid Build Coastguard Worker} 7047*6777b538SAndroid Build Coastguard Worker 7048*6777b538SAndroid Build Coastguard Worker@end 7049*6777b538SAndroid Build Coastguard Worker 7050*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> UInt64 7051*6777b538SAndroid Build Coastguard Worker 7052*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64UInt64Dictionary { 7053*6777b538SAndroid Build Coastguard Worker @package 7054*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 7055*6777b538SAndroid Build Coastguard Worker} 7056*6777b538SAndroid Build Coastguard Worker 7057*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 7058*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 7059*6777b538SAndroid Build Coastguard Worker} 7060*6777b538SAndroid Build Coastguard Worker 7061*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values 7062*6777b538SAndroid Build Coastguard Worker forKeys:(const int64_t [])keys 7063*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 7064*6777b538SAndroid Build Coastguard Worker self = [super init]; 7065*6777b538SAndroid Build Coastguard Worker if (self) { 7066*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 7067*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 7068*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 7069*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 7070*6777b538SAndroid Build Coastguard Worker } 7071*6777b538SAndroid Build Coastguard Worker } 7072*6777b538SAndroid Build Coastguard Worker } 7073*6777b538SAndroid Build Coastguard Worker return self; 7074*6777b538SAndroid Build Coastguard Worker} 7075*6777b538SAndroid Build Coastguard Worker 7076*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64UInt64Dictionary *)dictionary { 7077*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt64s:NULL forKeys:NULL count:0]; 7078*6777b538SAndroid Build Coastguard Worker if (self) { 7079*6777b538SAndroid Build Coastguard Worker if (dictionary) { 7080*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 7081*6777b538SAndroid Build Coastguard Worker } 7082*6777b538SAndroid Build Coastguard Worker } 7083*6777b538SAndroid Build Coastguard Worker return self; 7084*6777b538SAndroid Build Coastguard Worker} 7085*6777b538SAndroid Build Coastguard Worker 7086*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 7087*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 7088*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 7089*6777b538SAndroid Build Coastguard Worker} 7090*6777b538SAndroid Build Coastguard Worker 7091*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 7092*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 7093*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 7094*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 7095*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 7096*6777b538SAndroid Build Coastguard Worker [super dealloc]; 7097*6777b538SAndroid Build Coastguard Worker} 7098*6777b538SAndroid Build Coastguard Worker 7099*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 7100*6777b538SAndroid Build Coastguard Worker return [[GPBInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self]; 7101*6777b538SAndroid Build Coastguard Worker} 7102*6777b538SAndroid Build Coastguard Worker 7103*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 7104*6777b538SAndroid Build Coastguard Worker if (self == other) { 7105*6777b538SAndroid Build Coastguard Worker return YES; 7106*6777b538SAndroid Build Coastguard Worker } 7107*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64UInt64Dictionary class]]) { 7108*6777b538SAndroid Build Coastguard Worker return NO; 7109*6777b538SAndroid Build Coastguard Worker } 7110*6777b538SAndroid Build Coastguard Worker GPBInt64UInt64Dictionary *otherDictionary = other; 7111*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 7112*6777b538SAndroid Build Coastguard Worker} 7113*6777b538SAndroid Build Coastguard Worker 7114*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 7115*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7116*6777b538SAndroid Build Coastguard Worker} 7117*6777b538SAndroid Build Coastguard Worker 7118*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 7119*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 7120*6777b538SAndroid Build Coastguard Worker} 7121*6777b538SAndroid Build Coastguard Worker 7122*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 7123*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7124*6777b538SAndroid Build Coastguard Worker} 7125*6777b538SAndroid Build Coastguard Worker 7126*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock: 7127*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, uint64_t value, BOOL *stop))block { 7128*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 7129*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7130*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7131*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7132*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7133*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7134*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], [aValue unsignedLongLongValue], &stop); 7135*6777b538SAndroid Build Coastguard Worker if (stop) { 7136*6777b538SAndroid Build Coastguard Worker break; 7137*6777b538SAndroid Build Coastguard Worker } 7138*6777b538SAndroid Build Coastguard Worker } 7139*6777b538SAndroid Build Coastguard Worker} 7140*6777b538SAndroid Build Coastguard Worker 7141*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 7142*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7143*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 7144*6777b538SAndroid Build Coastguard Worker if (count == 0) { 7145*6777b538SAndroid Build Coastguard Worker return 0; 7146*6777b538SAndroid Build Coastguard Worker } 7147*6777b538SAndroid Build Coastguard Worker 7148*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7149*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7150*6777b538SAndroid Build Coastguard Worker size_t result = 0; 7151*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7152*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7153*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7154*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7155*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType); 7156*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType); 7157*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 7158*6777b538SAndroid Build Coastguard Worker } 7159*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 7160*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 7161*6777b538SAndroid Build Coastguard Worker return result; 7162*6777b538SAndroid Build Coastguard Worker} 7163*6777b538SAndroid Build Coastguard Worker 7164*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 7165*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 7166*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7167*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7168*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 7169*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7170*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7171*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7172*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7173*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7174*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 7175*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 7176*6777b538SAndroid Build Coastguard Worker int64_t unwrappedKey = [aKey longLongValue]; 7177*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedValue = [aValue unsignedLongLongValue]; 7178*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 7179*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 7180*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 7181*6777b538SAndroid Build Coastguard Worker // Write the fields. 7182*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 7183*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 7184*6777b538SAndroid Build Coastguard Worker } 7185*6777b538SAndroid Build Coastguard Worker} 7186*6777b538SAndroid Build Coastguard Worker 7187*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 7188*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 7189*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt64) forKey:@(key->valueInt64)]; 7190*6777b538SAndroid Build Coastguard Worker} 7191*6777b538SAndroid Build Coastguard Worker 7192*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 7193*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt64sUsingBlock:^(int64_t key, uint64_t value, BOOL *stop) { 7194*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 7195*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%llu", value]); 7196*6777b538SAndroid Build Coastguard Worker }]; 7197*6777b538SAndroid Build Coastguard Worker} 7198*6777b538SAndroid Build Coastguard Worker 7199*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int64_t)key { 7200*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 7201*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 7202*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedLongLongValue]; 7203*6777b538SAndroid Build Coastguard Worker } 7204*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 7205*6777b538SAndroid Build Coastguard Worker} 7206*6777b538SAndroid Build Coastguard Worker 7207*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64UInt64Dictionary *)otherDictionary { 7208*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 7209*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 7210*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7211*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7212*6777b538SAndroid Build Coastguard Worker } 7213*6777b538SAndroid Build Coastguard Worker } 7214*6777b538SAndroid Build Coastguard Worker} 7215*6777b538SAndroid Build Coastguard Worker 7216*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(int64_t)key { 7217*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 7218*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7219*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7220*6777b538SAndroid Build Coastguard Worker } 7221*6777b538SAndroid Build Coastguard Worker} 7222*6777b538SAndroid Build Coastguard Worker 7223*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(int64_t)aKey { 7224*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 7225*6777b538SAndroid Build Coastguard Worker} 7226*6777b538SAndroid Build Coastguard Worker 7227*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 7228*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 7229*6777b538SAndroid Build Coastguard Worker} 7230*6777b538SAndroid Build Coastguard Worker 7231*6777b538SAndroid Build Coastguard Worker@end 7232*6777b538SAndroid Build Coastguard Worker 7233*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Int64 7234*6777b538SAndroid Build Coastguard Worker 7235*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64Int64Dictionary { 7236*6777b538SAndroid Build Coastguard Worker @package 7237*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 7238*6777b538SAndroid Build Coastguard Worker} 7239*6777b538SAndroid Build Coastguard Worker 7240*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 7241*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 7242*6777b538SAndroid Build Coastguard Worker} 7243*6777b538SAndroid Build Coastguard Worker 7244*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values 7245*6777b538SAndroid Build Coastguard Worker forKeys:(const int64_t [])keys 7246*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 7247*6777b538SAndroid Build Coastguard Worker self = [super init]; 7248*6777b538SAndroid Build Coastguard Worker if (self) { 7249*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 7250*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 7251*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 7252*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 7253*6777b538SAndroid Build Coastguard Worker } 7254*6777b538SAndroid Build Coastguard Worker } 7255*6777b538SAndroid Build Coastguard Worker } 7256*6777b538SAndroid Build Coastguard Worker return self; 7257*6777b538SAndroid Build Coastguard Worker} 7258*6777b538SAndroid Build Coastguard Worker 7259*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64Int64Dictionary *)dictionary { 7260*6777b538SAndroid Build Coastguard Worker self = [self initWithInt64s:NULL forKeys:NULL count:0]; 7261*6777b538SAndroid Build Coastguard Worker if (self) { 7262*6777b538SAndroid Build Coastguard Worker if (dictionary) { 7263*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 7264*6777b538SAndroid Build Coastguard Worker } 7265*6777b538SAndroid Build Coastguard Worker } 7266*6777b538SAndroid Build Coastguard Worker return self; 7267*6777b538SAndroid Build Coastguard Worker} 7268*6777b538SAndroid Build Coastguard Worker 7269*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 7270*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 7271*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 7272*6777b538SAndroid Build Coastguard Worker} 7273*6777b538SAndroid Build Coastguard Worker 7274*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 7275*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 7276*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 7277*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 7278*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 7279*6777b538SAndroid Build Coastguard Worker [super dealloc]; 7280*6777b538SAndroid Build Coastguard Worker} 7281*6777b538SAndroid Build Coastguard Worker 7282*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 7283*6777b538SAndroid Build Coastguard Worker return [[GPBInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self]; 7284*6777b538SAndroid Build Coastguard Worker} 7285*6777b538SAndroid Build Coastguard Worker 7286*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 7287*6777b538SAndroid Build Coastguard Worker if (self == other) { 7288*6777b538SAndroid Build Coastguard Worker return YES; 7289*6777b538SAndroid Build Coastguard Worker } 7290*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64Int64Dictionary class]]) { 7291*6777b538SAndroid Build Coastguard Worker return NO; 7292*6777b538SAndroid Build Coastguard Worker } 7293*6777b538SAndroid Build Coastguard Worker GPBInt64Int64Dictionary *otherDictionary = other; 7294*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 7295*6777b538SAndroid Build Coastguard Worker} 7296*6777b538SAndroid Build Coastguard Worker 7297*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 7298*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7299*6777b538SAndroid Build Coastguard Worker} 7300*6777b538SAndroid Build Coastguard Worker 7301*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 7302*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 7303*6777b538SAndroid Build Coastguard Worker} 7304*6777b538SAndroid Build Coastguard Worker 7305*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 7306*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7307*6777b538SAndroid Build Coastguard Worker} 7308*6777b538SAndroid Build Coastguard Worker 7309*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock: 7310*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, int64_t value, BOOL *stop))block { 7311*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 7312*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7313*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7314*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7315*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7316*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7317*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], [aValue longLongValue], &stop); 7318*6777b538SAndroid Build Coastguard Worker if (stop) { 7319*6777b538SAndroid Build Coastguard Worker break; 7320*6777b538SAndroid Build Coastguard Worker } 7321*6777b538SAndroid Build Coastguard Worker } 7322*6777b538SAndroid Build Coastguard Worker} 7323*6777b538SAndroid Build Coastguard Worker 7324*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 7325*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7326*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 7327*6777b538SAndroid Build Coastguard Worker if (count == 0) { 7328*6777b538SAndroid Build Coastguard Worker return 0; 7329*6777b538SAndroid Build Coastguard Worker } 7330*6777b538SAndroid Build Coastguard Worker 7331*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7332*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7333*6777b538SAndroid Build Coastguard Worker size_t result = 0; 7334*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7335*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7336*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7337*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7338*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType); 7339*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType); 7340*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 7341*6777b538SAndroid Build Coastguard Worker } 7342*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 7343*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 7344*6777b538SAndroid Build Coastguard Worker return result; 7345*6777b538SAndroid Build Coastguard Worker} 7346*6777b538SAndroid Build Coastguard Worker 7347*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 7348*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 7349*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7350*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7351*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 7352*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7353*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7354*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7355*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7356*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7357*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 7358*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 7359*6777b538SAndroid Build Coastguard Worker int64_t unwrappedKey = [aKey longLongValue]; 7360*6777b538SAndroid Build Coastguard Worker int64_t unwrappedValue = [aValue longLongValue]; 7361*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 7362*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 7363*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 7364*6777b538SAndroid Build Coastguard Worker // Write the fields. 7365*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 7366*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 7367*6777b538SAndroid Build Coastguard Worker } 7368*6777b538SAndroid Build Coastguard Worker} 7369*6777b538SAndroid Build Coastguard Worker 7370*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 7371*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 7372*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt64) forKey:@(key->valueInt64)]; 7373*6777b538SAndroid Build Coastguard Worker} 7374*6777b538SAndroid Build Coastguard Worker 7375*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 7376*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt64sUsingBlock:^(int64_t key, int64_t value, BOOL *stop) { 7377*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 7378*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%lld", value]); 7379*6777b538SAndroid Build Coastguard Worker }]; 7380*6777b538SAndroid Build Coastguard Worker} 7381*6777b538SAndroid Build Coastguard Worker 7382*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(int64_t)key { 7383*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 7384*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 7385*6777b538SAndroid Build Coastguard Worker *value = [wrapped longLongValue]; 7386*6777b538SAndroid Build Coastguard Worker } 7387*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 7388*6777b538SAndroid Build Coastguard Worker} 7389*6777b538SAndroid Build Coastguard Worker 7390*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64Int64Dictionary *)otherDictionary { 7391*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 7392*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 7393*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7394*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7395*6777b538SAndroid Build Coastguard Worker } 7396*6777b538SAndroid Build Coastguard Worker } 7397*6777b538SAndroid Build Coastguard Worker} 7398*6777b538SAndroid Build Coastguard Worker 7399*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(int64_t)key { 7400*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 7401*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7402*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7403*6777b538SAndroid Build Coastguard Worker } 7404*6777b538SAndroid Build Coastguard Worker} 7405*6777b538SAndroid Build Coastguard Worker 7406*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(int64_t)aKey { 7407*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 7408*6777b538SAndroid Build Coastguard Worker} 7409*6777b538SAndroid Build Coastguard Worker 7410*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 7411*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 7412*6777b538SAndroid Build Coastguard Worker} 7413*6777b538SAndroid Build Coastguard Worker 7414*6777b538SAndroid Build Coastguard Worker@end 7415*6777b538SAndroid Build Coastguard Worker 7416*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Bool 7417*6777b538SAndroid Build Coastguard Worker 7418*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64BoolDictionary { 7419*6777b538SAndroid Build Coastguard Worker @package 7420*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 7421*6777b538SAndroid Build Coastguard Worker} 7422*6777b538SAndroid Build Coastguard Worker 7423*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 7424*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 7425*6777b538SAndroid Build Coastguard Worker} 7426*6777b538SAndroid Build Coastguard Worker 7427*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values 7428*6777b538SAndroid Build Coastguard Worker forKeys:(const int64_t [])keys 7429*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 7430*6777b538SAndroid Build Coastguard Worker self = [super init]; 7431*6777b538SAndroid Build Coastguard Worker if (self) { 7432*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 7433*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 7434*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 7435*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 7436*6777b538SAndroid Build Coastguard Worker } 7437*6777b538SAndroid Build Coastguard Worker } 7438*6777b538SAndroid Build Coastguard Worker } 7439*6777b538SAndroid Build Coastguard Worker return self; 7440*6777b538SAndroid Build Coastguard Worker} 7441*6777b538SAndroid Build Coastguard Worker 7442*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64BoolDictionary *)dictionary { 7443*6777b538SAndroid Build Coastguard Worker self = [self initWithBools:NULL forKeys:NULL count:0]; 7444*6777b538SAndroid Build Coastguard Worker if (self) { 7445*6777b538SAndroid Build Coastguard Worker if (dictionary) { 7446*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 7447*6777b538SAndroid Build Coastguard Worker } 7448*6777b538SAndroid Build Coastguard Worker } 7449*6777b538SAndroid Build Coastguard Worker return self; 7450*6777b538SAndroid Build Coastguard Worker} 7451*6777b538SAndroid Build Coastguard Worker 7452*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 7453*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 7454*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 7455*6777b538SAndroid Build Coastguard Worker} 7456*6777b538SAndroid Build Coastguard Worker 7457*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 7458*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 7459*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 7460*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 7461*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 7462*6777b538SAndroid Build Coastguard Worker [super dealloc]; 7463*6777b538SAndroid Build Coastguard Worker} 7464*6777b538SAndroid Build Coastguard Worker 7465*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 7466*6777b538SAndroid Build Coastguard Worker return [[GPBInt64BoolDictionary allocWithZone:zone] initWithDictionary:self]; 7467*6777b538SAndroid Build Coastguard Worker} 7468*6777b538SAndroid Build Coastguard Worker 7469*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 7470*6777b538SAndroid Build Coastguard Worker if (self == other) { 7471*6777b538SAndroid Build Coastguard Worker return YES; 7472*6777b538SAndroid Build Coastguard Worker } 7473*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64BoolDictionary class]]) { 7474*6777b538SAndroid Build Coastguard Worker return NO; 7475*6777b538SAndroid Build Coastguard Worker } 7476*6777b538SAndroid Build Coastguard Worker GPBInt64BoolDictionary *otherDictionary = other; 7477*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 7478*6777b538SAndroid Build Coastguard Worker} 7479*6777b538SAndroid Build Coastguard Worker 7480*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 7481*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7482*6777b538SAndroid Build Coastguard Worker} 7483*6777b538SAndroid Build Coastguard Worker 7484*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 7485*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 7486*6777b538SAndroid Build Coastguard Worker} 7487*6777b538SAndroid Build Coastguard Worker 7488*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 7489*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7490*6777b538SAndroid Build Coastguard Worker} 7491*6777b538SAndroid Build Coastguard Worker 7492*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock: 7493*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, BOOL value, BOOL *stop))block { 7494*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 7495*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7496*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7497*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7498*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7499*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7500*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], [aValue boolValue], &stop); 7501*6777b538SAndroid Build Coastguard Worker if (stop) { 7502*6777b538SAndroid Build Coastguard Worker break; 7503*6777b538SAndroid Build Coastguard Worker } 7504*6777b538SAndroid Build Coastguard Worker } 7505*6777b538SAndroid Build Coastguard Worker} 7506*6777b538SAndroid Build Coastguard Worker 7507*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 7508*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7509*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 7510*6777b538SAndroid Build Coastguard Worker if (count == 0) { 7511*6777b538SAndroid Build Coastguard Worker return 0; 7512*6777b538SAndroid Build Coastguard Worker } 7513*6777b538SAndroid Build Coastguard Worker 7514*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7515*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7516*6777b538SAndroid Build Coastguard Worker size_t result = 0; 7517*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7518*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7519*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7520*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7521*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType); 7522*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType); 7523*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 7524*6777b538SAndroid Build Coastguard Worker } 7525*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 7526*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 7527*6777b538SAndroid Build Coastguard Worker return result; 7528*6777b538SAndroid Build Coastguard Worker} 7529*6777b538SAndroid Build Coastguard Worker 7530*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 7531*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 7532*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7533*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7534*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 7535*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7536*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7537*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7538*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7539*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7540*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 7541*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 7542*6777b538SAndroid Build Coastguard Worker int64_t unwrappedKey = [aKey longLongValue]; 7543*6777b538SAndroid Build Coastguard Worker BOOL unwrappedValue = [aValue boolValue]; 7544*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 7545*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 7546*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 7547*6777b538SAndroid Build Coastguard Worker // Write the fields. 7548*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 7549*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 7550*6777b538SAndroid Build Coastguard Worker } 7551*6777b538SAndroid Build Coastguard Worker} 7552*6777b538SAndroid Build Coastguard Worker 7553*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 7554*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 7555*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueBool) forKey:@(key->valueInt64)]; 7556*6777b538SAndroid Build Coastguard Worker} 7557*6777b538SAndroid Build Coastguard Worker 7558*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 7559*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndBoolsUsingBlock:^(int64_t key, BOOL value, BOOL *stop) { 7560*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 7561*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%lld", key], (value ? @"true" : @"false")); 7562*6777b538SAndroid Build Coastguard Worker }]; 7563*6777b538SAndroid Build Coastguard Worker} 7564*6777b538SAndroid Build Coastguard Worker 7565*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(int64_t)key { 7566*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 7567*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 7568*6777b538SAndroid Build Coastguard Worker *value = [wrapped boolValue]; 7569*6777b538SAndroid Build Coastguard Worker } 7570*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 7571*6777b538SAndroid Build Coastguard Worker} 7572*6777b538SAndroid Build Coastguard Worker 7573*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64BoolDictionary *)otherDictionary { 7574*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 7575*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 7576*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7577*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7578*6777b538SAndroid Build Coastguard Worker } 7579*6777b538SAndroid Build Coastguard Worker } 7580*6777b538SAndroid Build Coastguard Worker} 7581*6777b538SAndroid Build Coastguard Worker 7582*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(int64_t)key { 7583*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 7584*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7585*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7586*6777b538SAndroid Build Coastguard Worker } 7587*6777b538SAndroid Build Coastguard Worker} 7588*6777b538SAndroid Build Coastguard Worker 7589*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(int64_t)aKey { 7590*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 7591*6777b538SAndroid Build Coastguard Worker} 7592*6777b538SAndroid Build Coastguard Worker 7593*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 7594*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 7595*6777b538SAndroid Build Coastguard Worker} 7596*6777b538SAndroid Build Coastguard Worker 7597*6777b538SAndroid Build Coastguard Worker@end 7598*6777b538SAndroid Build Coastguard Worker 7599*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Float 7600*6777b538SAndroid Build Coastguard Worker 7601*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64FloatDictionary { 7602*6777b538SAndroid Build Coastguard Worker @package 7603*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 7604*6777b538SAndroid Build Coastguard Worker} 7605*6777b538SAndroid Build Coastguard Worker 7606*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 7607*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 7608*6777b538SAndroid Build Coastguard Worker} 7609*6777b538SAndroid Build Coastguard Worker 7610*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values 7611*6777b538SAndroid Build Coastguard Worker forKeys:(const int64_t [])keys 7612*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 7613*6777b538SAndroid Build Coastguard Worker self = [super init]; 7614*6777b538SAndroid Build Coastguard Worker if (self) { 7615*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 7616*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 7617*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 7618*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 7619*6777b538SAndroid Build Coastguard Worker } 7620*6777b538SAndroid Build Coastguard Worker } 7621*6777b538SAndroid Build Coastguard Worker } 7622*6777b538SAndroid Build Coastguard Worker return self; 7623*6777b538SAndroid Build Coastguard Worker} 7624*6777b538SAndroid Build Coastguard Worker 7625*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64FloatDictionary *)dictionary { 7626*6777b538SAndroid Build Coastguard Worker self = [self initWithFloats:NULL forKeys:NULL count:0]; 7627*6777b538SAndroid Build Coastguard Worker if (self) { 7628*6777b538SAndroid Build Coastguard Worker if (dictionary) { 7629*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 7630*6777b538SAndroid Build Coastguard Worker } 7631*6777b538SAndroid Build Coastguard Worker } 7632*6777b538SAndroid Build Coastguard Worker return self; 7633*6777b538SAndroid Build Coastguard Worker} 7634*6777b538SAndroid Build Coastguard Worker 7635*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 7636*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 7637*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 7638*6777b538SAndroid Build Coastguard Worker} 7639*6777b538SAndroid Build Coastguard Worker 7640*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 7641*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 7642*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 7643*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 7644*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 7645*6777b538SAndroid Build Coastguard Worker [super dealloc]; 7646*6777b538SAndroid Build Coastguard Worker} 7647*6777b538SAndroid Build Coastguard Worker 7648*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 7649*6777b538SAndroid Build Coastguard Worker return [[GPBInt64FloatDictionary allocWithZone:zone] initWithDictionary:self]; 7650*6777b538SAndroid Build Coastguard Worker} 7651*6777b538SAndroid Build Coastguard Worker 7652*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 7653*6777b538SAndroid Build Coastguard Worker if (self == other) { 7654*6777b538SAndroid Build Coastguard Worker return YES; 7655*6777b538SAndroid Build Coastguard Worker } 7656*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64FloatDictionary class]]) { 7657*6777b538SAndroid Build Coastguard Worker return NO; 7658*6777b538SAndroid Build Coastguard Worker } 7659*6777b538SAndroid Build Coastguard Worker GPBInt64FloatDictionary *otherDictionary = other; 7660*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 7661*6777b538SAndroid Build Coastguard Worker} 7662*6777b538SAndroid Build Coastguard Worker 7663*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 7664*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7665*6777b538SAndroid Build Coastguard Worker} 7666*6777b538SAndroid Build Coastguard Worker 7667*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 7668*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 7669*6777b538SAndroid Build Coastguard Worker} 7670*6777b538SAndroid Build Coastguard Worker 7671*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 7672*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7673*6777b538SAndroid Build Coastguard Worker} 7674*6777b538SAndroid Build Coastguard Worker 7675*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock: 7676*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, float value, BOOL *stop))block { 7677*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 7678*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7679*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7680*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7681*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7682*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7683*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], [aValue floatValue], &stop); 7684*6777b538SAndroid Build Coastguard Worker if (stop) { 7685*6777b538SAndroid Build Coastguard Worker break; 7686*6777b538SAndroid Build Coastguard Worker } 7687*6777b538SAndroid Build Coastguard Worker } 7688*6777b538SAndroid Build Coastguard Worker} 7689*6777b538SAndroid Build Coastguard Worker 7690*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 7691*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7692*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 7693*6777b538SAndroid Build Coastguard Worker if (count == 0) { 7694*6777b538SAndroid Build Coastguard Worker return 0; 7695*6777b538SAndroid Build Coastguard Worker } 7696*6777b538SAndroid Build Coastguard Worker 7697*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7698*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7699*6777b538SAndroid Build Coastguard Worker size_t result = 0; 7700*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7701*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7702*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7703*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7704*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType); 7705*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType); 7706*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 7707*6777b538SAndroid Build Coastguard Worker } 7708*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 7709*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 7710*6777b538SAndroid Build Coastguard Worker return result; 7711*6777b538SAndroid Build Coastguard Worker} 7712*6777b538SAndroid Build Coastguard Worker 7713*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 7714*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 7715*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7716*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7717*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 7718*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7719*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7720*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7721*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7722*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7723*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 7724*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 7725*6777b538SAndroid Build Coastguard Worker int64_t unwrappedKey = [aKey longLongValue]; 7726*6777b538SAndroid Build Coastguard Worker float unwrappedValue = [aValue floatValue]; 7727*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 7728*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 7729*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 7730*6777b538SAndroid Build Coastguard Worker // Write the fields. 7731*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 7732*6777b538SAndroid Build Coastguard Worker WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 7733*6777b538SAndroid Build Coastguard Worker } 7734*6777b538SAndroid Build Coastguard Worker} 7735*6777b538SAndroid Build Coastguard Worker 7736*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 7737*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 7738*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueFloat) forKey:@(key->valueInt64)]; 7739*6777b538SAndroid Build Coastguard Worker} 7740*6777b538SAndroid Build Coastguard Worker 7741*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 7742*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndFloatsUsingBlock:^(int64_t key, float value, BOOL *stop) { 7743*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 7744*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]); 7745*6777b538SAndroid Build Coastguard Worker }]; 7746*6777b538SAndroid Build Coastguard Worker} 7747*6777b538SAndroid Build Coastguard Worker 7748*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(int64_t)key { 7749*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 7750*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 7751*6777b538SAndroid Build Coastguard Worker *value = [wrapped floatValue]; 7752*6777b538SAndroid Build Coastguard Worker } 7753*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 7754*6777b538SAndroid Build Coastguard Worker} 7755*6777b538SAndroid Build Coastguard Worker 7756*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64FloatDictionary *)otherDictionary { 7757*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 7758*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 7759*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7760*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7761*6777b538SAndroid Build Coastguard Worker } 7762*6777b538SAndroid Build Coastguard Worker } 7763*6777b538SAndroid Build Coastguard Worker} 7764*6777b538SAndroid Build Coastguard Worker 7765*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(int64_t)key { 7766*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 7767*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7768*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7769*6777b538SAndroid Build Coastguard Worker } 7770*6777b538SAndroid Build Coastguard Worker} 7771*6777b538SAndroid Build Coastguard Worker 7772*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(int64_t)aKey { 7773*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 7774*6777b538SAndroid Build Coastguard Worker} 7775*6777b538SAndroid Build Coastguard Worker 7776*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 7777*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 7778*6777b538SAndroid Build Coastguard Worker} 7779*6777b538SAndroid Build Coastguard Worker 7780*6777b538SAndroid Build Coastguard Worker@end 7781*6777b538SAndroid Build Coastguard Worker 7782*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Double 7783*6777b538SAndroid Build Coastguard Worker 7784*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64DoubleDictionary { 7785*6777b538SAndroid Build Coastguard Worker @package 7786*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 7787*6777b538SAndroid Build Coastguard Worker} 7788*6777b538SAndroid Build Coastguard Worker 7789*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 7790*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 7791*6777b538SAndroid Build Coastguard Worker} 7792*6777b538SAndroid Build Coastguard Worker 7793*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values 7794*6777b538SAndroid Build Coastguard Worker forKeys:(const int64_t [])keys 7795*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 7796*6777b538SAndroid Build Coastguard Worker self = [super init]; 7797*6777b538SAndroid Build Coastguard Worker if (self) { 7798*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 7799*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 7800*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 7801*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:@(keys[i])]; 7802*6777b538SAndroid Build Coastguard Worker } 7803*6777b538SAndroid Build Coastguard Worker } 7804*6777b538SAndroid Build Coastguard Worker } 7805*6777b538SAndroid Build Coastguard Worker return self; 7806*6777b538SAndroid Build Coastguard Worker} 7807*6777b538SAndroid Build Coastguard Worker 7808*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64DoubleDictionary *)dictionary { 7809*6777b538SAndroid Build Coastguard Worker self = [self initWithDoubles:NULL forKeys:NULL count:0]; 7810*6777b538SAndroid Build Coastguard Worker if (self) { 7811*6777b538SAndroid Build Coastguard Worker if (dictionary) { 7812*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 7813*6777b538SAndroid Build Coastguard Worker } 7814*6777b538SAndroid Build Coastguard Worker } 7815*6777b538SAndroid Build Coastguard Worker return self; 7816*6777b538SAndroid Build Coastguard Worker} 7817*6777b538SAndroid Build Coastguard Worker 7818*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 7819*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 7820*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 7821*6777b538SAndroid Build Coastguard Worker} 7822*6777b538SAndroid Build Coastguard Worker 7823*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 7824*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 7825*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 7826*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 7827*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 7828*6777b538SAndroid Build Coastguard Worker [super dealloc]; 7829*6777b538SAndroid Build Coastguard Worker} 7830*6777b538SAndroid Build Coastguard Worker 7831*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 7832*6777b538SAndroid Build Coastguard Worker return [[GPBInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self]; 7833*6777b538SAndroid Build Coastguard Worker} 7834*6777b538SAndroid Build Coastguard Worker 7835*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 7836*6777b538SAndroid Build Coastguard Worker if (self == other) { 7837*6777b538SAndroid Build Coastguard Worker return YES; 7838*6777b538SAndroid Build Coastguard Worker } 7839*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64DoubleDictionary class]]) { 7840*6777b538SAndroid Build Coastguard Worker return NO; 7841*6777b538SAndroid Build Coastguard Worker } 7842*6777b538SAndroid Build Coastguard Worker GPBInt64DoubleDictionary *otherDictionary = other; 7843*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 7844*6777b538SAndroid Build Coastguard Worker} 7845*6777b538SAndroid Build Coastguard Worker 7846*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 7847*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7848*6777b538SAndroid Build Coastguard Worker} 7849*6777b538SAndroid Build Coastguard Worker 7850*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 7851*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 7852*6777b538SAndroid Build Coastguard Worker} 7853*6777b538SAndroid Build Coastguard Worker 7854*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 7855*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 7856*6777b538SAndroid Build Coastguard Worker} 7857*6777b538SAndroid Build Coastguard Worker 7858*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock: 7859*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, double value, BOOL *stop))block { 7860*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 7861*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7862*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7863*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7864*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7865*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7866*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], [aValue doubleValue], &stop); 7867*6777b538SAndroid Build Coastguard Worker if (stop) { 7868*6777b538SAndroid Build Coastguard Worker break; 7869*6777b538SAndroid Build Coastguard Worker } 7870*6777b538SAndroid Build Coastguard Worker } 7871*6777b538SAndroid Build Coastguard Worker} 7872*6777b538SAndroid Build Coastguard Worker 7873*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 7874*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7875*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 7876*6777b538SAndroid Build Coastguard Worker if (count == 0) { 7877*6777b538SAndroid Build Coastguard Worker return 0; 7878*6777b538SAndroid Build Coastguard Worker } 7879*6777b538SAndroid Build Coastguard Worker 7880*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7881*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7882*6777b538SAndroid Build Coastguard Worker size_t result = 0; 7883*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7884*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7885*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7886*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7887*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType); 7888*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType); 7889*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 7890*6777b538SAndroid Build Coastguard Worker } 7891*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 7892*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 7893*6777b538SAndroid Build Coastguard Worker return result; 7894*6777b538SAndroid Build Coastguard Worker} 7895*6777b538SAndroid Build Coastguard Worker 7896*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 7897*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 7898*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 7899*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 7900*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 7901*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 7902*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 7903*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 7904*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 7905*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 7906*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 7907*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 7908*6777b538SAndroid Build Coastguard Worker int64_t unwrappedKey = [aKey longLongValue]; 7909*6777b538SAndroid Build Coastguard Worker double unwrappedValue = [aValue doubleValue]; 7910*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 7911*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 7912*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 7913*6777b538SAndroid Build Coastguard Worker // Write the fields. 7914*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 7915*6777b538SAndroid Build Coastguard Worker WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 7916*6777b538SAndroid Build Coastguard Worker } 7917*6777b538SAndroid Build Coastguard Worker} 7918*6777b538SAndroid Build Coastguard Worker 7919*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 7920*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 7921*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueDouble) forKey:@(key->valueInt64)]; 7922*6777b538SAndroid Build Coastguard Worker} 7923*6777b538SAndroid Build Coastguard Worker 7924*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 7925*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndDoublesUsingBlock:^(int64_t key, double value, BOOL *stop) { 7926*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 7927*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]); 7928*6777b538SAndroid Build Coastguard Worker }]; 7929*6777b538SAndroid Build Coastguard Worker} 7930*6777b538SAndroid Build Coastguard Worker 7931*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(int64_t)key { 7932*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 7933*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 7934*6777b538SAndroid Build Coastguard Worker *value = [wrapped doubleValue]; 7935*6777b538SAndroid Build Coastguard Worker } 7936*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 7937*6777b538SAndroid Build Coastguard Worker} 7938*6777b538SAndroid Build Coastguard Worker 7939*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64DoubleDictionary *)otherDictionary { 7940*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 7941*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 7942*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7943*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7944*6777b538SAndroid Build Coastguard Worker } 7945*6777b538SAndroid Build Coastguard Worker } 7946*6777b538SAndroid Build Coastguard Worker} 7947*6777b538SAndroid Build Coastguard Worker 7948*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(int64_t)key { 7949*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 7950*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 7951*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 7952*6777b538SAndroid Build Coastguard Worker } 7953*6777b538SAndroid Build Coastguard Worker} 7954*6777b538SAndroid Build Coastguard Worker 7955*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(int64_t)aKey { 7956*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 7957*6777b538SAndroid Build Coastguard Worker} 7958*6777b538SAndroid Build Coastguard Worker 7959*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 7960*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 7961*6777b538SAndroid Build Coastguard Worker} 7962*6777b538SAndroid Build Coastguard Worker 7963*6777b538SAndroid Build Coastguard Worker@end 7964*6777b538SAndroid Build Coastguard Worker 7965*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Enum 7966*6777b538SAndroid Build Coastguard Worker 7967*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64EnumDictionary { 7968*6777b538SAndroid Build Coastguard Worker @package 7969*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 7970*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc _validationFunc; 7971*6777b538SAndroid Build Coastguard Worker} 7972*6777b538SAndroid Build Coastguard Worker 7973*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc; 7974*6777b538SAndroid Build Coastguard Worker 7975*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 7976*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0]; 7977*6777b538SAndroid Build Coastguard Worker} 7978*6777b538SAndroid Build Coastguard Worker 7979*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func { 7980*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 7981*6777b538SAndroid Build Coastguard Worker} 7982*6777b538SAndroid Build Coastguard Worker 7983*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 7984*6777b538SAndroid Build Coastguard Worker rawValues:(const int32_t [])rawValues 7985*6777b538SAndroid Build Coastguard Worker forKeys:(const int64_t [])keys 7986*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 7987*6777b538SAndroid Build Coastguard Worker self = [super init]; 7988*6777b538SAndroid Build Coastguard Worker if (self) { 7989*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 7990*6777b538SAndroid Build Coastguard Worker _validationFunc = (func != NULL ? func : DictDefault_IsValidValue); 7991*6777b538SAndroid Build Coastguard Worker if (count && rawValues && keys) { 7992*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 7993*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(rawValues[i]) forKey:@(keys[i])]; 7994*6777b538SAndroid Build Coastguard Worker } 7995*6777b538SAndroid Build Coastguard Worker } 7996*6777b538SAndroid Build Coastguard Worker } 7997*6777b538SAndroid Build Coastguard Worker return self; 7998*6777b538SAndroid Build Coastguard Worker} 7999*6777b538SAndroid Build Coastguard Worker 8000*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64EnumDictionary *)dictionary { 8001*6777b538SAndroid Build Coastguard Worker self = [self initWithValidationFunction:dictionary.validationFunc 8002*6777b538SAndroid Build Coastguard Worker rawValues:NULL 8003*6777b538SAndroid Build Coastguard Worker forKeys:NULL 8004*6777b538SAndroid Build Coastguard Worker count:0]; 8005*6777b538SAndroid Build Coastguard Worker if (self) { 8006*6777b538SAndroid Build Coastguard Worker if (dictionary) { 8007*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 8008*6777b538SAndroid Build Coastguard Worker } 8009*6777b538SAndroid Build Coastguard Worker } 8010*6777b538SAndroid Build Coastguard Worker return self; 8011*6777b538SAndroid Build Coastguard Worker} 8012*6777b538SAndroid Build Coastguard Worker 8013*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 8014*6777b538SAndroid Build Coastguard Worker capacity:(NSUInteger)numItems { 8015*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 8016*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 8017*6777b538SAndroid Build Coastguard Worker} 8018*6777b538SAndroid Build Coastguard Worker 8019*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 8020*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 8021*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 8022*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 8023*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 8024*6777b538SAndroid Build Coastguard Worker [super dealloc]; 8025*6777b538SAndroid Build Coastguard Worker} 8026*6777b538SAndroid Build Coastguard Worker 8027*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 8028*6777b538SAndroid Build Coastguard Worker return [[GPBInt64EnumDictionary allocWithZone:zone] initWithDictionary:self]; 8029*6777b538SAndroid Build Coastguard Worker} 8030*6777b538SAndroid Build Coastguard Worker 8031*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 8032*6777b538SAndroid Build Coastguard Worker if (self == other) { 8033*6777b538SAndroid Build Coastguard Worker return YES; 8034*6777b538SAndroid Build Coastguard Worker } 8035*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64EnumDictionary class]]) { 8036*6777b538SAndroid Build Coastguard Worker return NO; 8037*6777b538SAndroid Build Coastguard Worker } 8038*6777b538SAndroid Build Coastguard Worker GPBInt64EnumDictionary *otherDictionary = other; 8039*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 8040*6777b538SAndroid Build Coastguard Worker} 8041*6777b538SAndroid Build Coastguard Worker 8042*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 8043*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8044*6777b538SAndroid Build Coastguard Worker} 8045*6777b538SAndroid Build Coastguard Worker 8046*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 8047*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 8048*6777b538SAndroid Build Coastguard Worker} 8049*6777b538SAndroid Build Coastguard Worker 8050*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 8051*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8052*6777b538SAndroid Build Coastguard Worker} 8053*6777b538SAndroid Build Coastguard Worker 8054*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock: 8055*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, int32_t value, BOOL *stop))block { 8056*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 8057*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8058*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8059*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 8060*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8061*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8062*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], [aValue intValue], &stop); 8063*6777b538SAndroid Build Coastguard Worker if (stop) { 8064*6777b538SAndroid Build Coastguard Worker break; 8065*6777b538SAndroid Build Coastguard Worker } 8066*6777b538SAndroid Build Coastguard Worker } 8067*6777b538SAndroid Build Coastguard Worker} 8068*6777b538SAndroid Build Coastguard Worker 8069*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 8070*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8071*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 8072*6777b538SAndroid Build Coastguard Worker if (count == 0) { 8073*6777b538SAndroid Build Coastguard Worker return 0; 8074*6777b538SAndroid Build Coastguard Worker } 8075*6777b538SAndroid Build Coastguard Worker 8076*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8077*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8078*6777b538SAndroid Build Coastguard Worker size_t result = 0; 8079*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8080*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 8081*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8082*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8083*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType); 8084*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 8085*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 8086*6777b538SAndroid Build Coastguard Worker } 8087*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 8088*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 8089*6777b538SAndroid Build Coastguard Worker return result; 8090*6777b538SAndroid Build Coastguard Worker} 8091*6777b538SAndroid Build Coastguard Worker 8092*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 8093*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 8094*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8095*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8096*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 8097*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8098*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8099*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 8100*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8101*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8102*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 8103*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 8104*6777b538SAndroid Build Coastguard Worker int64_t unwrappedKey = [aKey longLongValue]; 8105*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 8106*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 8107*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 8108*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 8109*6777b538SAndroid Build Coastguard Worker // Write the fields. 8110*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 8111*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 8112*6777b538SAndroid Build Coastguard Worker } 8113*6777b538SAndroid Build Coastguard Worker} 8114*6777b538SAndroid Build Coastguard Worker 8115*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value 8116*6777b538SAndroid Build Coastguard Worker forKey:(GPBGenericValue *)key 8117*6777b538SAndroid Build Coastguard Worker keyDataType:(GPBDataType)keyDataType { 8118*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(key->valueInt64, kMapKeyFieldNumber, keyDataType); 8119*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum); 8120*6777b538SAndroid Build Coastguard Worker NSMutableData *data = [NSMutableData dataWithLength:msgSize]; 8121*6777b538SAndroid Build Coastguard Worker GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data]; 8122*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, key->valueInt64, kMapKeyFieldNumber, keyDataType); 8123*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum); 8124*6777b538SAndroid Build Coastguard Worker [outputStream release]; 8125*6777b538SAndroid Build Coastguard Worker return data; 8126*6777b538SAndroid Build Coastguard Worker} 8127*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 8128*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 8129*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueEnum) forKey:@(key->valueInt64)]; 8130*6777b538SAndroid Build Coastguard Worker} 8131*6777b538SAndroid Build Coastguard Worker 8132*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 8133*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndRawValuesUsingBlock:^(int64_t key, int32_t value, BOOL *stop) { 8134*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 8135*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%lld", key], @(value)); 8136*6777b538SAndroid Build Coastguard Worker }]; 8137*6777b538SAndroid Build Coastguard Worker} 8138*6777b538SAndroid Build Coastguard Worker 8139*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(int64_t)key { 8140*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 8141*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 8142*6777b538SAndroid Build Coastguard Worker int32_t result = [wrapped intValue]; 8143*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(result)) { 8144*6777b538SAndroid Build Coastguard Worker result = kGPBUnrecognizedEnumeratorValue; 8145*6777b538SAndroid Build Coastguard Worker } 8146*6777b538SAndroid Build Coastguard Worker *value = result; 8147*6777b538SAndroid Build Coastguard Worker } 8148*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 8149*6777b538SAndroid Build Coastguard Worker} 8150*6777b538SAndroid Build Coastguard Worker 8151*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(int64_t)key { 8152*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:@(key)]; 8153*6777b538SAndroid Build Coastguard Worker if (wrapped && rawValue) { 8154*6777b538SAndroid Build Coastguard Worker *rawValue = [wrapped intValue]; 8155*6777b538SAndroid Build Coastguard Worker } 8156*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 8157*6777b538SAndroid Build Coastguard Worker} 8158*6777b538SAndroid Build Coastguard Worker 8159*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock: 8160*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, int32_t value, BOOL *stop))block { 8161*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc func = _validationFunc; 8162*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 8163*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [_dictionary keyEnumerator]; 8164*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 8165*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8166*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = _dictionary[aKey]; 8167*6777b538SAndroid Build Coastguard Worker int32_t unwrapped = [aValue intValue]; 8168*6777b538SAndroid Build Coastguard Worker if (!func(unwrapped)) { 8169*6777b538SAndroid Build Coastguard Worker unwrapped = kGPBUnrecognizedEnumeratorValue; 8170*6777b538SAndroid Build Coastguard Worker } 8171*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], unwrapped, &stop); 8172*6777b538SAndroid Build Coastguard Worker if (stop) { 8173*6777b538SAndroid Build Coastguard Worker break; 8174*6777b538SAndroid Build Coastguard Worker } 8175*6777b538SAndroid Build Coastguard Worker } 8176*6777b538SAndroid Build Coastguard Worker} 8177*6777b538SAndroid Build Coastguard Worker 8178*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBInt64EnumDictionary *)otherDictionary { 8179*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 8180*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 8181*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8182*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8183*6777b538SAndroid Build Coastguard Worker } 8184*6777b538SAndroid Build Coastguard Worker } 8185*6777b538SAndroid Build Coastguard Worker} 8186*6777b538SAndroid Build Coastguard Worker 8187*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(int64_t)key { 8188*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 8189*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8190*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8191*6777b538SAndroid Build Coastguard Worker } 8192*6777b538SAndroid Build Coastguard Worker} 8193*6777b538SAndroid Build Coastguard Worker 8194*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(int64_t)aKey { 8195*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 8196*6777b538SAndroid Build Coastguard Worker} 8197*6777b538SAndroid Build Coastguard Worker 8198*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 8199*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 8200*6777b538SAndroid Build Coastguard Worker} 8201*6777b538SAndroid Build Coastguard Worker 8202*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(int64_t)key { 8203*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(value)) { 8204*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 8205*6777b538SAndroid Build Coastguard Worker format:@"GPBInt64EnumDictionary: Attempt to set an unknown enum value (%d)", 8206*6777b538SAndroid Build Coastguard Worker value]; 8207*6777b538SAndroid Build Coastguard Worker } 8208*6777b538SAndroid Build Coastguard Worker 8209*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:@(key)]; 8210*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8211*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8212*6777b538SAndroid Build Coastguard Worker } 8213*6777b538SAndroid Build Coastguard Worker} 8214*6777b538SAndroid Build Coastguard Worker 8215*6777b538SAndroid Build Coastguard Worker@end 8216*6777b538SAndroid Build Coastguard Worker 8217*6777b538SAndroid Build Coastguard Worker#pragma mark - Int64 -> Object 8218*6777b538SAndroid Build Coastguard Worker 8219*6777b538SAndroid Build Coastguard Worker@implementation GPBInt64ObjectDictionary { 8220*6777b538SAndroid Build Coastguard Worker @package 8221*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 8222*6777b538SAndroid Build Coastguard Worker} 8223*6777b538SAndroid Build Coastguard Worker 8224*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 8225*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 8226*6777b538SAndroid Build Coastguard Worker} 8227*6777b538SAndroid Build Coastguard Worker 8228*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects 8229*6777b538SAndroid Build Coastguard Worker forKeys:(const int64_t [])keys 8230*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 8231*6777b538SAndroid Build Coastguard Worker self = [super init]; 8232*6777b538SAndroid Build Coastguard Worker if (self) { 8233*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 8234*6777b538SAndroid Build Coastguard Worker if (count && objects && keys) { 8235*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 8236*6777b538SAndroid Build Coastguard Worker if (!objects[i]) { 8237*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 8238*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 8239*6777b538SAndroid Build Coastguard Worker } 8240*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:objects[i] forKey:@(keys[i])]; 8241*6777b538SAndroid Build Coastguard Worker } 8242*6777b538SAndroid Build Coastguard Worker } 8243*6777b538SAndroid Build Coastguard Worker } 8244*6777b538SAndroid Build Coastguard Worker return self; 8245*6777b538SAndroid Build Coastguard Worker} 8246*6777b538SAndroid Build Coastguard Worker 8247*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBInt64ObjectDictionary *)dictionary { 8248*6777b538SAndroid Build Coastguard Worker self = [self initWithObjects:NULL forKeys:NULL count:0]; 8249*6777b538SAndroid Build Coastguard Worker if (self) { 8250*6777b538SAndroid Build Coastguard Worker if (dictionary) { 8251*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 8252*6777b538SAndroid Build Coastguard Worker } 8253*6777b538SAndroid Build Coastguard Worker } 8254*6777b538SAndroid Build Coastguard Worker return self; 8255*6777b538SAndroid Build Coastguard Worker} 8256*6777b538SAndroid Build Coastguard Worker 8257*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 8258*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 8259*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 8260*6777b538SAndroid Build Coastguard Worker} 8261*6777b538SAndroid Build Coastguard Worker 8262*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 8263*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 8264*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 8265*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 8266*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 8267*6777b538SAndroid Build Coastguard Worker [super dealloc]; 8268*6777b538SAndroid Build Coastguard Worker} 8269*6777b538SAndroid Build Coastguard Worker 8270*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 8271*6777b538SAndroid Build Coastguard Worker return [[GPBInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self]; 8272*6777b538SAndroid Build Coastguard Worker} 8273*6777b538SAndroid Build Coastguard Worker 8274*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 8275*6777b538SAndroid Build Coastguard Worker if (self == other) { 8276*6777b538SAndroid Build Coastguard Worker return YES; 8277*6777b538SAndroid Build Coastguard Worker } 8278*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64ObjectDictionary class]]) { 8279*6777b538SAndroid Build Coastguard Worker return NO; 8280*6777b538SAndroid Build Coastguard Worker } 8281*6777b538SAndroid Build Coastguard Worker GPBInt64ObjectDictionary *otherDictionary = other; 8282*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 8283*6777b538SAndroid Build Coastguard Worker} 8284*6777b538SAndroid Build Coastguard Worker 8285*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 8286*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8287*6777b538SAndroid Build Coastguard Worker} 8288*6777b538SAndroid Build Coastguard Worker 8289*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 8290*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 8291*6777b538SAndroid Build Coastguard Worker} 8292*6777b538SAndroid Build Coastguard Worker 8293*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 8294*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8295*6777b538SAndroid Build Coastguard Worker} 8296*6777b538SAndroid Build Coastguard Worker 8297*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock: 8298*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(int64_t key, id object, BOOL *stop))block { 8299*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 8300*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8301*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8302*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 8303*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8304*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 8305*6777b538SAndroid Build Coastguard Worker block([aKey longLongValue], aObject, &stop); 8306*6777b538SAndroid Build Coastguard Worker if (stop) { 8307*6777b538SAndroid Build Coastguard Worker break; 8308*6777b538SAndroid Build Coastguard Worker } 8309*6777b538SAndroid Build Coastguard Worker } 8310*6777b538SAndroid Build Coastguard Worker} 8311*6777b538SAndroid Build Coastguard Worker 8312*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized { 8313*6777b538SAndroid Build Coastguard Worker for (GPBMessage *msg in [_dictionary objectEnumerator]) { 8314*6777b538SAndroid Build Coastguard Worker if (!msg.initialized) { 8315*6777b538SAndroid Build Coastguard Worker return NO; 8316*6777b538SAndroid Build Coastguard Worker } 8317*6777b538SAndroid Build Coastguard Worker } 8318*6777b538SAndroid Build Coastguard Worker return YES; 8319*6777b538SAndroid Build Coastguard Worker} 8320*6777b538SAndroid Build Coastguard Worker 8321*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone { 8322*6777b538SAndroid Build Coastguard Worker GPBInt64ObjectDictionary *newDict = 8323*6777b538SAndroid Build Coastguard Worker [[GPBInt64ObjectDictionary alloc] init]; 8324*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [_dictionary keyEnumerator]; 8325*6777b538SAndroid Build Coastguard Worker id aKey; 8326*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *internalDict = newDict->_dictionary; 8327*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8328*6777b538SAndroid Build Coastguard Worker GPBMessage *msg = _dictionary[aKey]; 8329*6777b538SAndroid Build Coastguard Worker GPBMessage *copiedMsg = [msg copyWithZone:zone]; 8330*6777b538SAndroid Build Coastguard Worker [internalDict setObject:copiedMsg forKey:aKey]; 8331*6777b538SAndroid Build Coastguard Worker [copiedMsg release]; 8332*6777b538SAndroid Build Coastguard Worker } 8333*6777b538SAndroid Build Coastguard Worker return newDict; 8334*6777b538SAndroid Build Coastguard Worker} 8335*6777b538SAndroid Build Coastguard Worker 8336*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 8337*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8338*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 8339*6777b538SAndroid Build Coastguard Worker if (count == 0) { 8340*6777b538SAndroid Build Coastguard Worker return 0; 8341*6777b538SAndroid Build Coastguard Worker } 8342*6777b538SAndroid Build Coastguard Worker 8343*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8344*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8345*6777b538SAndroid Build Coastguard Worker size_t result = 0; 8346*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8347*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 8348*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8349*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 8350*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType); 8351*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType); 8352*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 8353*6777b538SAndroid Build Coastguard Worker } 8354*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 8355*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 8356*6777b538SAndroid Build Coastguard Worker return result; 8357*6777b538SAndroid Build Coastguard Worker} 8358*6777b538SAndroid Build Coastguard Worker 8359*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 8360*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 8361*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8362*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8363*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 8364*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8365*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8366*6777b538SAndroid Build Coastguard Worker NSNumber *aKey; 8367*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8368*6777b538SAndroid Build Coastguard Worker id aObject = internal[aKey]; 8369*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 8370*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 8371*6777b538SAndroid Build Coastguard Worker int64_t unwrappedKey = [aKey longLongValue]; 8372*6777b538SAndroid Build Coastguard Worker id unwrappedValue = aObject; 8373*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 8374*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 8375*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 8376*6777b538SAndroid Build Coastguard Worker // Write the fields. 8377*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 8378*6777b538SAndroid Build Coastguard Worker WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 8379*6777b538SAndroid Build Coastguard Worker } 8380*6777b538SAndroid Build Coastguard Worker} 8381*6777b538SAndroid Build Coastguard Worker 8382*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 8383*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 8384*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:value->valueString forKey:@(key->valueInt64)]; 8385*6777b538SAndroid Build Coastguard Worker} 8386*6777b538SAndroid Build Coastguard Worker 8387*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 8388*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndObjectsUsingBlock:^(int64_t key, id object, BOOL *stop) { 8389*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 8390*6777b538SAndroid Build Coastguard Worker block([NSString stringWithFormat:@"%lld", key], object); 8391*6777b538SAndroid Build Coastguard Worker }]; 8392*6777b538SAndroid Build Coastguard Worker} 8393*6777b538SAndroid Build Coastguard Worker 8394*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(int64_t)key { 8395*6777b538SAndroid Build Coastguard Worker id result = [_dictionary objectForKey:@(key)]; 8396*6777b538SAndroid Build Coastguard Worker return result; 8397*6777b538SAndroid Build Coastguard Worker} 8398*6777b538SAndroid Build Coastguard Worker 8399*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBInt64ObjectDictionary *)otherDictionary { 8400*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 8401*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 8402*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8403*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8404*6777b538SAndroid Build Coastguard Worker } 8405*6777b538SAndroid Build Coastguard Worker } 8406*6777b538SAndroid Build Coastguard Worker} 8407*6777b538SAndroid Build Coastguard Worker 8408*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(int64_t)key { 8409*6777b538SAndroid Build Coastguard Worker if (!object) { 8410*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 8411*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 8412*6777b538SAndroid Build Coastguard Worker } 8413*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:object forKey:@(key)]; 8414*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8415*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8416*6777b538SAndroid Build Coastguard Worker } 8417*6777b538SAndroid Build Coastguard Worker} 8418*6777b538SAndroid Build Coastguard Worker 8419*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(int64_t)aKey { 8420*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:@(aKey)]; 8421*6777b538SAndroid Build Coastguard Worker} 8422*6777b538SAndroid Build Coastguard Worker 8423*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 8424*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 8425*6777b538SAndroid Build Coastguard Worker} 8426*6777b538SAndroid Build Coastguard Worker 8427*6777b538SAndroid Build Coastguard Worker@end 8428*6777b538SAndroid Build Coastguard Worker 8429*6777b538SAndroid Build Coastguard Worker// clang-format on 8430*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_POD_IMPL_FOR_KEY(String, NSString, *, OBJECT) 8431*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 8432*6777b538SAndroid Build Coastguard Worker// clang-format off 8433*6777b538SAndroid Build Coastguard Worker 8434*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> UInt32 8435*6777b538SAndroid Build Coastguard Worker 8436*6777b538SAndroid Build Coastguard Worker@implementation GPBStringUInt32Dictionary { 8437*6777b538SAndroid Build Coastguard Worker @package 8438*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 8439*6777b538SAndroid Build Coastguard Worker} 8440*6777b538SAndroid Build Coastguard Worker 8441*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 8442*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 8443*6777b538SAndroid Build Coastguard Worker} 8444*6777b538SAndroid Build Coastguard Worker 8445*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values 8446*6777b538SAndroid Build Coastguard Worker forKeys:(const NSString * [])keys 8447*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 8448*6777b538SAndroid Build Coastguard Worker self = [super init]; 8449*6777b538SAndroid Build Coastguard Worker if (self) { 8450*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 8451*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 8452*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 8453*6777b538SAndroid Build Coastguard Worker if (!keys[i]) { 8454*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 8455*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 8456*6777b538SAndroid Build Coastguard Worker } 8457*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:keys[i]]; 8458*6777b538SAndroid Build Coastguard Worker } 8459*6777b538SAndroid Build Coastguard Worker } 8460*6777b538SAndroid Build Coastguard Worker } 8461*6777b538SAndroid Build Coastguard Worker return self; 8462*6777b538SAndroid Build Coastguard Worker} 8463*6777b538SAndroid Build Coastguard Worker 8464*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringUInt32Dictionary *)dictionary { 8465*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt32s:NULL forKeys:NULL count:0]; 8466*6777b538SAndroid Build Coastguard Worker if (self) { 8467*6777b538SAndroid Build Coastguard Worker if (dictionary) { 8468*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 8469*6777b538SAndroid Build Coastguard Worker } 8470*6777b538SAndroid Build Coastguard Worker } 8471*6777b538SAndroid Build Coastguard Worker return self; 8472*6777b538SAndroid Build Coastguard Worker} 8473*6777b538SAndroid Build Coastguard Worker 8474*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 8475*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 8476*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 8477*6777b538SAndroid Build Coastguard Worker} 8478*6777b538SAndroid Build Coastguard Worker 8479*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 8480*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 8481*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 8482*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 8483*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 8484*6777b538SAndroid Build Coastguard Worker [super dealloc]; 8485*6777b538SAndroid Build Coastguard Worker} 8486*6777b538SAndroid Build Coastguard Worker 8487*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 8488*6777b538SAndroid Build Coastguard Worker return [[GPBStringUInt32Dictionary allocWithZone:zone] initWithDictionary:self]; 8489*6777b538SAndroid Build Coastguard Worker} 8490*6777b538SAndroid Build Coastguard Worker 8491*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 8492*6777b538SAndroid Build Coastguard Worker if (self == other) { 8493*6777b538SAndroid Build Coastguard Worker return YES; 8494*6777b538SAndroid Build Coastguard Worker } 8495*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBStringUInt32Dictionary class]]) { 8496*6777b538SAndroid Build Coastguard Worker return NO; 8497*6777b538SAndroid Build Coastguard Worker } 8498*6777b538SAndroid Build Coastguard Worker GPBStringUInt32Dictionary *otherDictionary = other; 8499*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 8500*6777b538SAndroid Build Coastguard Worker} 8501*6777b538SAndroid Build Coastguard Worker 8502*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 8503*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8504*6777b538SAndroid Build Coastguard Worker} 8505*6777b538SAndroid Build Coastguard Worker 8506*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 8507*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 8508*6777b538SAndroid Build Coastguard Worker} 8509*6777b538SAndroid Build Coastguard Worker 8510*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 8511*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8512*6777b538SAndroid Build Coastguard Worker} 8513*6777b538SAndroid Build Coastguard Worker 8514*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock: 8515*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(NSString *key, uint32_t value, BOOL *stop))block { 8516*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 8517*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8518*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8519*6777b538SAndroid Build Coastguard Worker NSString *aKey; 8520*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8521*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8522*6777b538SAndroid Build Coastguard Worker block(aKey, [aValue unsignedIntValue], &stop); 8523*6777b538SAndroid Build Coastguard Worker if (stop) { 8524*6777b538SAndroid Build Coastguard Worker break; 8525*6777b538SAndroid Build Coastguard Worker } 8526*6777b538SAndroid Build Coastguard Worker } 8527*6777b538SAndroid Build Coastguard Worker} 8528*6777b538SAndroid Build Coastguard Worker 8529*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 8530*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8531*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 8532*6777b538SAndroid Build Coastguard Worker if (count == 0) { 8533*6777b538SAndroid Build Coastguard Worker return 0; 8534*6777b538SAndroid Build Coastguard Worker } 8535*6777b538SAndroid Build Coastguard Worker 8536*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8537*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8538*6777b538SAndroid Build Coastguard Worker size_t result = 0; 8539*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8540*6777b538SAndroid Build Coastguard Worker NSString *aKey; 8541*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8542*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8543*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType); 8544*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType); 8545*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 8546*6777b538SAndroid Build Coastguard Worker } 8547*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 8548*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 8549*6777b538SAndroid Build Coastguard Worker return result; 8550*6777b538SAndroid Build Coastguard Worker} 8551*6777b538SAndroid Build Coastguard Worker 8552*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 8553*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 8554*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8555*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8556*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 8557*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8558*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8559*6777b538SAndroid Build Coastguard Worker NSString *aKey; 8560*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8561*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8562*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 8563*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 8564*6777b538SAndroid Build Coastguard Worker NSString *unwrappedKey = aKey; 8565*6777b538SAndroid Build Coastguard Worker uint32_t unwrappedValue = [aValue unsignedIntValue]; 8566*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 8567*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 8568*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 8569*6777b538SAndroid Build Coastguard Worker // Write the fields. 8570*6777b538SAndroid Build Coastguard Worker WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 8571*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 8572*6777b538SAndroid Build Coastguard Worker } 8573*6777b538SAndroid Build Coastguard Worker} 8574*6777b538SAndroid Build Coastguard Worker 8575*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 8576*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 8577*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt32) forKey:key->valueString]; 8578*6777b538SAndroid Build Coastguard Worker} 8579*6777b538SAndroid Build Coastguard Worker 8580*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 8581*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt32sUsingBlock:^(NSString *key, uint32_t value, BOOL *stop) { 8582*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 8583*6777b538SAndroid Build Coastguard Worker block(key, [NSString stringWithFormat:@"%u", value]); 8584*6777b538SAndroid Build Coastguard Worker }]; 8585*6777b538SAndroid Build Coastguard Worker} 8586*6777b538SAndroid Build Coastguard Worker 8587*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(NSString *)key { 8588*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:key]; 8589*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 8590*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedIntValue]; 8591*6777b538SAndroid Build Coastguard Worker } 8592*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 8593*6777b538SAndroid Build Coastguard Worker} 8594*6777b538SAndroid Build Coastguard Worker 8595*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringUInt32Dictionary *)otherDictionary { 8596*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 8597*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 8598*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8599*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8600*6777b538SAndroid Build Coastguard Worker } 8601*6777b538SAndroid Build Coastguard Worker } 8602*6777b538SAndroid Build Coastguard Worker} 8603*6777b538SAndroid Build Coastguard Worker 8604*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(NSString *)key { 8605*6777b538SAndroid Build Coastguard Worker if (!key) { 8606*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 8607*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 8608*6777b538SAndroid Build Coastguard Worker } 8609*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:key]; 8610*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8611*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8612*6777b538SAndroid Build Coastguard Worker } 8613*6777b538SAndroid Build Coastguard Worker} 8614*6777b538SAndroid Build Coastguard Worker 8615*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(NSString *)aKey { 8616*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:aKey]; 8617*6777b538SAndroid Build Coastguard Worker} 8618*6777b538SAndroid Build Coastguard Worker 8619*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 8620*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 8621*6777b538SAndroid Build Coastguard Worker} 8622*6777b538SAndroid Build Coastguard Worker 8623*6777b538SAndroid Build Coastguard Worker@end 8624*6777b538SAndroid Build Coastguard Worker 8625*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Int32 8626*6777b538SAndroid Build Coastguard Worker 8627*6777b538SAndroid Build Coastguard Worker@implementation GPBStringInt32Dictionary { 8628*6777b538SAndroid Build Coastguard Worker @package 8629*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 8630*6777b538SAndroid Build Coastguard Worker} 8631*6777b538SAndroid Build Coastguard Worker 8632*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 8633*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 8634*6777b538SAndroid Build Coastguard Worker} 8635*6777b538SAndroid Build Coastguard Worker 8636*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values 8637*6777b538SAndroid Build Coastguard Worker forKeys:(const NSString * [])keys 8638*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 8639*6777b538SAndroid Build Coastguard Worker self = [super init]; 8640*6777b538SAndroid Build Coastguard Worker if (self) { 8641*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 8642*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 8643*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 8644*6777b538SAndroid Build Coastguard Worker if (!keys[i]) { 8645*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 8646*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 8647*6777b538SAndroid Build Coastguard Worker } 8648*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:keys[i]]; 8649*6777b538SAndroid Build Coastguard Worker } 8650*6777b538SAndroid Build Coastguard Worker } 8651*6777b538SAndroid Build Coastguard Worker } 8652*6777b538SAndroid Build Coastguard Worker return self; 8653*6777b538SAndroid Build Coastguard Worker} 8654*6777b538SAndroid Build Coastguard Worker 8655*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringInt32Dictionary *)dictionary { 8656*6777b538SAndroid Build Coastguard Worker self = [self initWithInt32s:NULL forKeys:NULL count:0]; 8657*6777b538SAndroid Build Coastguard Worker if (self) { 8658*6777b538SAndroid Build Coastguard Worker if (dictionary) { 8659*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 8660*6777b538SAndroid Build Coastguard Worker } 8661*6777b538SAndroid Build Coastguard Worker } 8662*6777b538SAndroid Build Coastguard Worker return self; 8663*6777b538SAndroid Build Coastguard Worker} 8664*6777b538SAndroid Build Coastguard Worker 8665*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 8666*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 8667*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 8668*6777b538SAndroid Build Coastguard Worker} 8669*6777b538SAndroid Build Coastguard Worker 8670*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 8671*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 8672*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 8673*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 8674*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 8675*6777b538SAndroid Build Coastguard Worker [super dealloc]; 8676*6777b538SAndroid Build Coastguard Worker} 8677*6777b538SAndroid Build Coastguard Worker 8678*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 8679*6777b538SAndroid Build Coastguard Worker return [[GPBStringInt32Dictionary allocWithZone:zone] initWithDictionary:self]; 8680*6777b538SAndroid Build Coastguard Worker} 8681*6777b538SAndroid Build Coastguard Worker 8682*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 8683*6777b538SAndroid Build Coastguard Worker if (self == other) { 8684*6777b538SAndroid Build Coastguard Worker return YES; 8685*6777b538SAndroid Build Coastguard Worker } 8686*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBStringInt32Dictionary class]]) { 8687*6777b538SAndroid Build Coastguard Worker return NO; 8688*6777b538SAndroid Build Coastguard Worker } 8689*6777b538SAndroid Build Coastguard Worker GPBStringInt32Dictionary *otherDictionary = other; 8690*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 8691*6777b538SAndroid Build Coastguard Worker} 8692*6777b538SAndroid Build Coastguard Worker 8693*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 8694*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8695*6777b538SAndroid Build Coastguard Worker} 8696*6777b538SAndroid Build Coastguard Worker 8697*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 8698*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 8699*6777b538SAndroid Build Coastguard Worker} 8700*6777b538SAndroid Build Coastguard Worker 8701*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 8702*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8703*6777b538SAndroid Build Coastguard Worker} 8704*6777b538SAndroid Build Coastguard Worker 8705*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock: 8706*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(NSString *key, int32_t value, BOOL *stop))block { 8707*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 8708*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8709*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8710*6777b538SAndroid Build Coastguard Worker NSString *aKey; 8711*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8712*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8713*6777b538SAndroid Build Coastguard Worker block(aKey, [aValue intValue], &stop); 8714*6777b538SAndroid Build Coastguard Worker if (stop) { 8715*6777b538SAndroid Build Coastguard Worker break; 8716*6777b538SAndroid Build Coastguard Worker } 8717*6777b538SAndroid Build Coastguard Worker } 8718*6777b538SAndroid Build Coastguard Worker} 8719*6777b538SAndroid Build Coastguard Worker 8720*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 8721*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8722*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 8723*6777b538SAndroid Build Coastguard Worker if (count == 0) { 8724*6777b538SAndroid Build Coastguard Worker return 0; 8725*6777b538SAndroid Build Coastguard Worker } 8726*6777b538SAndroid Build Coastguard Worker 8727*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8728*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8729*6777b538SAndroid Build Coastguard Worker size_t result = 0; 8730*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8731*6777b538SAndroid Build Coastguard Worker NSString *aKey; 8732*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8733*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8734*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType); 8735*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 8736*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 8737*6777b538SAndroid Build Coastguard Worker } 8738*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 8739*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 8740*6777b538SAndroid Build Coastguard Worker return result; 8741*6777b538SAndroid Build Coastguard Worker} 8742*6777b538SAndroid Build Coastguard Worker 8743*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 8744*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 8745*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8746*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8747*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 8748*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8749*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8750*6777b538SAndroid Build Coastguard Worker NSString *aKey; 8751*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8752*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8753*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 8754*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 8755*6777b538SAndroid Build Coastguard Worker NSString *unwrappedKey = aKey; 8756*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 8757*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 8758*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 8759*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 8760*6777b538SAndroid Build Coastguard Worker // Write the fields. 8761*6777b538SAndroid Build Coastguard Worker WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 8762*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 8763*6777b538SAndroid Build Coastguard Worker } 8764*6777b538SAndroid Build Coastguard Worker} 8765*6777b538SAndroid Build Coastguard Worker 8766*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 8767*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 8768*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt32) forKey:key->valueString]; 8769*6777b538SAndroid Build Coastguard Worker} 8770*6777b538SAndroid Build Coastguard Worker 8771*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 8772*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt32sUsingBlock:^(NSString *key, int32_t value, BOOL *stop) { 8773*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 8774*6777b538SAndroid Build Coastguard Worker block(key, [NSString stringWithFormat:@"%d", value]); 8775*6777b538SAndroid Build Coastguard Worker }]; 8776*6777b538SAndroid Build Coastguard Worker} 8777*6777b538SAndroid Build Coastguard Worker 8778*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(nullable int32_t *)value forKey:(NSString *)key { 8779*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:key]; 8780*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 8781*6777b538SAndroid Build Coastguard Worker *value = [wrapped intValue]; 8782*6777b538SAndroid Build Coastguard Worker } 8783*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 8784*6777b538SAndroid Build Coastguard Worker} 8785*6777b538SAndroid Build Coastguard Worker 8786*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringInt32Dictionary *)otherDictionary { 8787*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 8788*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 8789*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8790*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8791*6777b538SAndroid Build Coastguard Worker } 8792*6777b538SAndroid Build Coastguard Worker } 8793*6777b538SAndroid Build Coastguard Worker} 8794*6777b538SAndroid Build Coastguard Worker 8795*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(NSString *)key { 8796*6777b538SAndroid Build Coastguard Worker if (!key) { 8797*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 8798*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 8799*6777b538SAndroid Build Coastguard Worker } 8800*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:key]; 8801*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8802*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8803*6777b538SAndroid Build Coastguard Worker } 8804*6777b538SAndroid Build Coastguard Worker} 8805*6777b538SAndroid Build Coastguard Worker 8806*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(NSString *)aKey { 8807*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:aKey]; 8808*6777b538SAndroid Build Coastguard Worker} 8809*6777b538SAndroid Build Coastguard Worker 8810*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 8811*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 8812*6777b538SAndroid Build Coastguard Worker} 8813*6777b538SAndroid Build Coastguard Worker 8814*6777b538SAndroid Build Coastguard Worker@end 8815*6777b538SAndroid Build Coastguard Worker 8816*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> UInt64 8817*6777b538SAndroid Build Coastguard Worker 8818*6777b538SAndroid Build Coastguard Worker@implementation GPBStringUInt64Dictionary { 8819*6777b538SAndroid Build Coastguard Worker @package 8820*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 8821*6777b538SAndroid Build Coastguard Worker} 8822*6777b538SAndroid Build Coastguard Worker 8823*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 8824*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 8825*6777b538SAndroid Build Coastguard Worker} 8826*6777b538SAndroid Build Coastguard Worker 8827*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values 8828*6777b538SAndroid Build Coastguard Worker forKeys:(const NSString * [])keys 8829*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 8830*6777b538SAndroid Build Coastguard Worker self = [super init]; 8831*6777b538SAndroid Build Coastguard Worker if (self) { 8832*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 8833*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 8834*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 8835*6777b538SAndroid Build Coastguard Worker if (!keys[i]) { 8836*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 8837*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 8838*6777b538SAndroid Build Coastguard Worker } 8839*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:keys[i]]; 8840*6777b538SAndroid Build Coastguard Worker } 8841*6777b538SAndroid Build Coastguard Worker } 8842*6777b538SAndroid Build Coastguard Worker } 8843*6777b538SAndroid Build Coastguard Worker return self; 8844*6777b538SAndroid Build Coastguard Worker} 8845*6777b538SAndroid Build Coastguard Worker 8846*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringUInt64Dictionary *)dictionary { 8847*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt64s:NULL forKeys:NULL count:0]; 8848*6777b538SAndroid Build Coastguard Worker if (self) { 8849*6777b538SAndroid Build Coastguard Worker if (dictionary) { 8850*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 8851*6777b538SAndroid Build Coastguard Worker } 8852*6777b538SAndroid Build Coastguard Worker } 8853*6777b538SAndroid Build Coastguard Worker return self; 8854*6777b538SAndroid Build Coastguard Worker} 8855*6777b538SAndroid Build Coastguard Worker 8856*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 8857*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 8858*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 8859*6777b538SAndroid Build Coastguard Worker} 8860*6777b538SAndroid Build Coastguard Worker 8861*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 8862*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 8863*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 8864*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 8865*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 8866*6777b538SAndroid Build Coastguard Worker [super dealloc]; 8867*6777b538SAndroid Build Coastguard Worker} 8868*6777b538SAndroid Build Coastguard Worker 8869*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 8870*6777b538SAndroid Build Coastguard Worker return [[GPBStringUInt64Dictionary allocWithZone:zone] initWithDictionary:self]; 8871*6777b538SAndroid Build Coastguard Worker} 8872*6777b538SAndroid Build Coastguard Worker 8873*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 8874*6777b538SAndroid Build Coastguard Worker if (self == other) { 8875*6777b538SAndroid Build Coastguard Worker return YES; 8876*6777b538SAndroid Build Coastguard Worker } 8877*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBStringUInt64Dictionary class]]) { 8878*6777b538SAndroid Build Coastguard Worker return NO; 8879*6777b538SAndroid Build Coastguard Worker } 8880*6777b538SAndroid Build Coastguard Worker GPBStringUInt64Dictionary *otherDictionary = other; 8881*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 8882*6777b538SAndroid Build Coastguard Worker} 8883*6777b538SAndroid Build Coastguard Worker 8884*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 8885*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8886*6777b538SAndroid Build Coastguard Worker} 8887*6777b538SAndroid Build Coastguard Worker 8888*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 8889*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 8890*6777b538SAndroid Build Coastguard Worker} 8891*6777b538SAndroid Build Coastguard Worker 8892*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 8893*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 8894*6777b538SAndroid Build Coastguard Worker} 8895*6777b538SAndroid Build Coastguard Worker 8896*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock: 8897*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(NSString *key, uint64_t value, BOOL *stop))block { 8898*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 8899*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8900*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8901*6777b538SAndroid Build Coastguard Worker NSString *aKey; 8902*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8903*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8904*6777b538SAndroid Build Coastguard Worker block(aKey, [aValue unsignedLongLongValue], &stop); 8905*6777b538SAndroid Build Coastguard Worker if (stop) { 8906*6777b538SAndroid Build Coastguard Worker break; 8907*6777b538SAndroid Build Coastguard Worker } 8908*6777b538SAndroid Build Coastguard Worker } 8909*6777b538SAndroid Build Coastguard Worker} 8910*6777b538SAndroid Build Coastguard Worker 8911*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 8912*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8913*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 8914*6777b538SAndroid Build Coastguard Worker if (count == 0) { 8915*6777b538SAndroid Build Coastguard Worker return 0; 8916*6777b538SAndroid Build Coastguard Worker } 8917*6777b538SAndroid Build Coastguard Worker 8918*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8919*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8920*6777b538SAndroid Build Coastguard Worker size_t result = 0; 8921*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8922*6777b538SAndroid Build Coastguard Worker NSString *aKey; 8923*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8924*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8925*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType); 8926*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType); 8927*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 8928*6777b538SAndroid Build Coastguard Worker } 8929*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 8930*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 8931*6777b538SAndroid Build Coastguard Worker return result; 8932*6777b538SAndroid Build Coastguard Worker} 8933*6777b538SAndroid Build Coastguard Worker 8934*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 8935*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 8936*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 8937*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 8938*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 8939*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 8940*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 8941*6777b538SAndroid Build Coastguard Worker NSString *aKey; 8942*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 8943*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 8944*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 8945*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 8946*6777b538SAndroid Build Coastguard Worker NSString *unwrappedKey = aKey; 8947*6777b538SAndroid Build Coastguard Worker uint64_t unwrappedValue = [aValue unsignedLongLongValue]; 8948*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 8949*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 8950*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 8951*6777b538SAndroid Build Coastguard Worker // Write the fields. 8952*6777b538SAndroid Build Coastguard Worker WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 8953*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 8954*6777b538SAndroid Build Coastguard Worker } 8955*6777b538SAndroid Build Coastguard Worker} 8956*6777b538SAndroid Build Coastguard Worker 8957*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 8958*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 8959*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueUInt64) forKey:key->valueString]; 8960*6777b538SAndroid Build Coastguard Worker} 8961*6777b538SAndroid Build Coastguard Worker 8962*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 8963*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndUInt64sUsingBlock:^(NSString *key, uint64_t value, BOOL *stop) { 8964*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 8965*6777b538SAndroid Build Coastguard Worker block(key, [NSString stringWithFormat:@"%llu", value]); 8966*6777b538SAndroid Build Coastguard Worker }]; 8967*6777b538SAndroid Build Coastguard Worker} 8968*6777b538SAndroid Build Coastguard Worker 8969*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(NSString *)key { 8970*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:key]; 8971*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 8972*6777b538SAndroid Build Coastguard Worker *value = [wrapped unsignedLongLongValue]; 8973*6777b538SAndroid Build Coastguard Worker } 8974*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 8975*6777b538SAndroid Build Coastguard Worker} 8976*6777b538SAndroid Build Coastguard Worker 8977*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringUInt64Dictionary *)otherDictionary { 8978*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 8979*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 8980*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8981*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8982*6777b538SAndroid Build Coastguard Worker } 8983*6777b538SAndroid Build Coastguard Worker } 8984*6777b538SAndroid Build Coastguard Worker} 8985*6777b538SAndroid Build Coastguard Worker 8986*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(NSString *)key { 8987*6777b538SAndroid Build Coastguard Worker if (!key) { 8988*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 8989*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 8990*6777b538SAndroid Build Coastguard Worker } 8991*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:key]; 8992*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 8993*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 8994*6777b538SAndroid Build Coastguard Worker } 8995*6777b538SAndroid Build Coastguard Worker} 8996*6777b538SAndroid Build Coastguard Worker 8997*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(NSString *)aKey { 8998*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:aKey]; 8999*6777b538SAndroid Build Coastguard Worker} 9000*6777b538SAndroid Build Coastguard Worker 9001*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 9002*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 9003*6777b538SAndroid Build Coastguard Worker} 9004*6777b538SAndroid Build Coastguard Worker 9005*6777b538SAndroid Build Coastguard Worker@end 9006*6777b538SAndroid Build Coastguard Worker 9007*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Int64 9008*6777b538SAndroid Build Coastguard Worker 9009*6777b538SAndroid Build Coastguard Worker@implementation GPBStringInt64Dictionary { 9010*6777b538SAndroid Build Coastguard Worker @package 9011*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 9012*6777b538SAndroid Build Coastguard Worker} 9013*6777b538SAndroid Build Coastguard Worker 9014*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 9015*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 9016*6777b538SAndroid Build Coastguard Worker} 9017*6777b538SAndroid Build Coastguard Worker 9018*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values 9019*6777b538SAndroid Build Coastguard Worker forKeys:(const NSString * [])keys 9020*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 9021*6777b538SAndroid Build Coastguard Worker self = [super init]; 9022*6777b538SAndroid Build Coastguard Worker if (self) { 9023*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 9024*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 9025*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 9026*6777b538SAndroid Build Coastguard Worker if (!keys[i]) { 9027*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 9028*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 9029*6777b538SAndroid Build Coastguard Worker } 9030*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:keys[i]]; 9031*6777b538SAndroid Build Coastguard Worker } 9032*6777b538SAndroid Build Coastguard Worker } 9033*6777b538SAndroid Build Coastguard Worker } 9034*6777b538SAndroid Build Coastguard Worker return self; 9035*6777b538SAndroid Build Coastguard Worker} 9036*6777b538SAndroid Build Coastguard Worker 9037*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringInt64Dictionary *)dictionary { 9038*6777b538SAndroid Build Coastguard Worker self = [self initWithInt64s:NULL forKeys:NULL count:0]; 9039*6777b538SAndroid Build Coastguard Worker if (self) { 9040*6777b538SAndroid Build Coastguard Worker if (dictionary) { 9041*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 9042*6777b538SAndroid Build Coastguard Worker } 9043*6777b538SAndroid Build Coastguard Worker } 9044*6777b538SAndroid Build Coastguard Worker return self; 9045*6777b538SAndroid Build Coastguard Worker} 9046*6777b538SAndroid Build Coastguard Worker 9047*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 9048*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 9049*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 9050*6777b538SAndroid Build Coastguard Worker} 9051*6777b538SAndroid Build Coastguard Worker 9052*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 9053*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 9054*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 9055*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 9056*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 9057*6777b538SAndroid Build Coastguard Worker [super dealloc]; 9058*6777b538SAndroid Build Coastguard Worker} 9059*6777b538SAndroid Build Coastguard Worker 9060*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 9061*6777b538SAndroid Build Coastguard Worker return [[GPBStringInt64Dictionary allocWithZone:zone] initWithDictionary:self]; 9062*6777b538SAndroid Build Coastguard Worker} 9063*6777b538SAndroid Build Coastguard Worker 9064*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 9065*6777b538SAndroid Build Coastguard Worker if (self == other) { 9066*6777b538SAndroid Build Coastguard Worker return YES; 9067*6777b538SAndroid Build Coastguard Worker } 9068*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBStringInt64Dictionary class]]) { 9069*6777b538SAndroid Build Coastguard Worker return NO; 9070*6777b538SAndroid Build Coastguard Worker } 9071*6777b538SAndroid Build Coastguard Worker GPBStringInt64Dictionary *otherDictionary = other; 9072*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 9073*6777b538SAndroid Build Coastguard Worker} 9074*6777b538SAndroid Build Coastguard Worker 9075*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 9076*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9077*6777b538SAndroid Build Coastguard Worker} 9078*6777b538SAndroid Build Coastguard Worker 9079*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 9080*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 9081*6777b538SAndroid Build Coastguard Worker} 9082*6777b538SAndroid Build Coastguard Worker 9083*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 9084*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9085*6777b538SAndroid Build Coastguard Worker} 9086*6777b538SAndroid Build Coastguard Worker 9087*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock: 9088*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(NSString *key, int64_t value, BOOL *stop))block { 9089*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 9090*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9091*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9092*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9093*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9094*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9095*6777b538SAndroid Build Coastguard Worker block(aKey, [aValue longLongValue], &stop); 9096*6777b538SAndroid Build Coastguard Worker if (stop) { 9097*6777b538SAndroid Build Coastguard Worker break; 9098*6777b538SAndroid Build Coastguard Worker } 9099*6777b538SAndroid Build Coastguard Worker } 9100*6777b538SAndroid Build Coastguard Worker} 9101*6777b538SAndroid Build Coastguard Worker 9102*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 9103*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9104*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 9105*6777b538SAndroid Build Coastguard Worker if (count == 0) { 9106*6777b538SAndroid Build Coastguard Worker return 0; 9107*6777b538SAndroid Build Coastguard Worker } 9108*6777b538SAndroid Build Coastguard Worker 9109*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9110*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9111*6777b538SAndroid Build Coastguard Worker size_t result = 0; 9112*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9113*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9114*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9115*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9116*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType); 9117*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType); 9118*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 9119*6777b538SAndroid Build Coastguard Worker } 9120*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 9121*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 9122*6777b538SAndroid Build Coastguard Worker return result; 9123*6777b538SAndroid Build Coastguard Worker} 9124*6777b538SAndroid Build Coastguard Worker 9125*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 9126*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 9127*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9128*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9129*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 9130*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9131*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9132*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9133*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9134*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9135*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 9136*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 9137*6777b538SAndroid Build Coastguard Worker NSString *unwrappedKey = aKey; 9138*6777b538SAndroid Build Coastguard Worker int64_t unwrappedValue = [aValue longLongValue]; 9139*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 9140*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 9141*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 9142*6777b538SAndroid Build Coastguard Worker // Write the fields. 9143*6777b538SAndroid Build Coastguard Worker WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 9144*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 9145*6777b538SAndroid Build Coastguard Worker } 9146*6777b538SAndroid Build Coastguard Worker} 9147*6777b538SAndroid Build Coastguard Worker 9148*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 9149*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 9150*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueInt64) forKey:key->valueString]; 9151*6777b538SAndroid Build Coastguard Worker} 9152*6777b538SAndroid Build Coastguard Worker 9153*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 9154*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndInt64sUsingBlock:^(NSString *key, int64_t value, BOOL *stop) { 9155*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 9156*6777b538SAndroid Build Coastguard Worker block(key, [NSString stringWithFormat:@"%lld", value]); 9157*6777b538SAndroid Build Coastguard Worker }]; 9158*6777b538SAndroid Build Coastguard Worker} 9159*6777b538SAndroid Build Coastguard Worker 9160*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(nullable int64_t *)value forKey:(NSString *)key { 9161*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:key]; 9162*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 9163*6777b538SAndroid Build Coastguard Worker *value = [wrapped longLongValue]; 9164*6777b538SAndroid Build Coastguard Worker } 9165*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 9166*6777b538SAndroid Build Coastguard Worker} 9167*6777b538SAndroid Build Coastguard Worker 9168*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringInt64Dictionary *)otherDictionary { 9169*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 9170*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 9171*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 9172*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 9173*6777b538SAndroid Build Coastguard Worker } 9174*6777b538SAndroid Build Coastguard Worker } 9175*6777b538SAndroid Build Coastguard Worker} 9176*6777b538SAndroid Build Coastguard Worker 9177*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(NSString *)key { 9178*6777b538SAndroid Build Coastguard Worker if (!key) { 9179*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 9180*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 9181*6777b538SAndroid Build Coastguard Worker } 9182*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:key]; 9183*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 9184*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 9185*6777b538SAndroid Build Coastguard Worker } 9186*6777b538SAndroid Build Coastguard Worker} 9187*6777b538SAndroid Build Coastguard Worker 9188*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(NSString *)aKey { 9189*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:aKey]; 9190*6777b538SAndroid Build Coastguard Worker} 9191*6777b538SAndroid Build Coastguard Worker 9192*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 9193*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 9194*6777b538SAndroid Build Coastguard Worker} 9195*6777b538SAndroid Build Coastguard Worker 9196*6777b538SAndroid Build Coastguard Worker@end 9197*6777b538SAndroid Build Coastguard Worker 9198*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Bool 9199*6777b538SAndroid Build Coastguard Worker 9200*6777b538SAndroid Build Coastguard Worker@implementation GPBStringBoolDictionary { 9201*6777b538SAndroid Build Coastguard Worker @package 9202*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 9203*6777b538SAndroid Build Coastguard Worker} 9204*6777b538SAndroid Build Coastguard Worker 9205*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 9206*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 9207*6777b538SAndroid Build Coastguard Worker} 9208*6777b538SAndroid Build Coastguard Worker 9209*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values 9210*6777b538SAndroid Build Coastguard Worker forKeys:(const NSString * [])keys 9211*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 9212*6777b538SAndroid Build Coastguard Worker self = [super init]; 9213*6777b538SAndroid Build Coastguard Worker if (self) { 9214*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 9215*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 9216*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 9217*6777b538SAndroid Build Coastguard Worker if (!keys[i]) { 9218*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 9219*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 9220*6777b538SAndroid Build Coastguard Worker } 9221*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:keys[i]]; 9222*6777b538SAndroid Build Coastguard Worker } 9223*6777b538SAndroid Build Coastguard Worker } 9224*6777b538SAndroid Build Coastguard Worker } 9225*6777b538SAndroid Build Coastguard Worker return self; 9226*6777b538SAndroid Build Coastguard Worker} 9227*6777b538SAndroid Build Coastguard Worker 9228*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringBoolDictionary *)dictionary { 9229*6777b538SAndroid Build Coastguard Worker self = [self initWithBools:NULL forKeys:NULL count:0]; 9230*6777b538SAndroid Build Coastguard Worker if (self) { 9231*6777b538SAndroid Build Coastguard Worker if (dictionary) { 9232*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 9233*6777b538SAndroid Build Coastguard Worker } 9234*6777b538SAndroid Build Coastguard Worker } 9235*6777b538SAndroid Build Coastguard Worker return self; 9236*6777b538SAndroid Build Coastguard Worker} 9237*6777b538SAndroid Build Coastguard Worker 9238*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 9239*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 9240*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 9241*6777b538SAndroid Build Coastguard Worker} 9242*6777b538SAndroid Build Coastguard Worker 9243*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 9244*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 9245*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 9246*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 9247*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 9248*6777b538SAndroid Build Coastguard Worker [super dealloc]; 9249*6777b538SAndroid Build Coastguard Worker} 9250*6777b538SAndroid Build Coastguard Worker 9251*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 9252*6777b538SAndroid Build Coastguard Worker return [[GPBStringBoolDictionary allocWithZone:zone] initWithDictionary:self]; 9253*6777b538SAndroid Build Coastguard Worker} 9254*6777b538SAndroid Build Coastguard Worker 9255*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 9256*6777b538SAndroid Build Coastguard Worker if (self == other) { 9257*6777b538SAndroid Build Coastguard Worker return YES; 9258*6777b538SAndroid Build Coastguard Worker } 9259*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBStringBoolDictionary class]]) { 9260*6777b538SAndroid Build Coastguard Worker return NO; 9261*6777b538SAndroid Build Coastguard Worker } 9262*6777b538SAndroid Build Coastguard Worker GPBStringBoolDictionary *otherDictionary = other; 9263*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 9264*6777b538SAndroid Build Coastguard Worker} 9265*6777b538SAndroid Build Coastguard Worker 9266*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 9267*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9268*6777b538SAndroid Build Coastguard Worker} 9269*6777b538SAndroid Build Coastguard Worker 9270*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 9271*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 9272*6777b538SAndroid Build Coastguard Worker} 9273*6777b538SAndroid Build Coastguard Worker 9274*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 9275*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9276*6777b538SAndroid Build Coastguard Worker} 9277*6777b538SAndroid Build Coastguard Worker 9278*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock: 9279*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(NSString *key, BOOL value, BOOL *stop))block { 9280*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 9281*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9282*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9283*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9284*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9285*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9286*6777b538SAndroid Build Coastguard Worker block(aKey, [aValue boolValue], &stop); 9287*6777b538SAndroid Build Coastguard Worker if (stop) { 9288*6777b538SAndroid Build Coastguard Worker break; 9289*6777b538SAndroid Build Coastguard Worker } 9290*6777b538SAndroid Build Coastguard Worker } 9291*6777b538SAndroid Build Coastguard Worker} 9292*6777b538SAndroid Build Coastguard Worker 9293*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 9294*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9295*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 9296*6777b538SAndroid Build Coastguard Worker if (count == 0) { 9297*6777b538SAndroid Build Coastguard Worker return 0; 9298*6777b538SAndroid Build Coastguard Worker } 9299*6777b538SAndroid Build Coastguard Worker 9300*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9301*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9302*6777b538SAndroid Build Coastguard Worker size_t result = 0; 9303*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9304*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9305*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9306*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9307*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType); 9308*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType); 9309*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 9310*6777b538SAndroid Build Coastguard Worker } 9311*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 9312*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 9313*6777b538SAndroid Build Coastguard Worker return result; 9314*6777b538SAndroid Build Coastguard Worker} 9315*6777b538SAndroid Build Coastguard Worker 9316*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 9317*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 9318*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9319*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9320*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 9321*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9322*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9323*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9324*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9325*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9326*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 9327*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 9328*6777b538SAndroid Build Coastguard Worker NSString *unwrappedKey = aKey; 9329*6777b538SAndroid Build Coastguard Worker BOOL unwrappedValue = [aValue boolValue]; 9330*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 9331*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 9332*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 9333*6777b538SAndroid Build Coastguard Worker // Write the fields. 9334*6777b538SAndroid Build Coastguard Worker WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 9335*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 9336*6777b538SAndroid Build Coastguard Worker } 9337*6777b538SAndroid Build Coastguard Worker} 9338*6777b538SAndroid Build Coastguard Worker 9339*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 9340*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 9341*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueBool) forKey:key->valueString]; 9342*6777b538SAndroid Build Coastguard Worker} 9343*6777b538SAndroid Build Coastguard Worker 9344*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 9345*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndBoolsUsingBlock:^(NSString *key, BOOL value, BOOL *stop) { 9346*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 9347*6777b538SAndroid Build Coastguard Worker block(key, (value ? @"true" : @"false")); 9348*6777b538SAndroid Build Coastguard Worker }]; 9349*6777b538SAndroid Build Coastguard Worker} 9350*6777b538SAndroid Build Coastguard Worker 9351*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(nullable BOOL *)value forKey:(NSString *)key { 9352*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:key]; 9353*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 9354*6777b538SAndroid Build Coastguard Worker *value = [wrapped boolValue]; 9355*6777b538SAndroid Build Coastguard Worker } 9356*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 9357*6777b538SAndroid Build Coastguard Worker} 9358*6777b538SAndroid Build Coastguard Worker 9359*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringBoolDictionary *)otherDictionary { 9360*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 9361*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 9362*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 9363*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 9364*6777b538SAndroid Build Coastguard Worker } 9365*6777b538SAndroid Build Coastguard Worker } 9366*6777b538SAndroid Build Coastguard Worker} 9367*6777b538SAndroid Build Coastguard Worker 9368*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(NSString *)key { 9369*6777b538SAndroid Build Coastguard Worker if (!key) { 9370*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 9371*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 9372*6777b538SAndroid Build Coastguard Worker } 9373*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:key]; 9374*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 9375*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 9376*6777b538SAndroid Build Coastguard Worker } 9377*6777b538SAndroid Build Coastguard Worker} 9378*6777b538SAndroid Build Coastguard Worker 9379*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(NSString *)aKey { 9380*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:aKey]; 9381*6777b538SAndroid Build Coastguard Worker} 9382*6777b538SAndroid Build Coastguard Worker 9383*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 9384*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 9385*6777b538SAndroid Build Coastguard Worker} 9386*6777b538SAndroid Build Coastguard Worker 9387*6777b538SAndroid Build Coastguard Worker@end 9388*6777b538SAndroid Build Coastguard Worker 9389*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Float 9390*6777b538SAndroid Build Coastguard Worker 9391*6777b538SAndroid Build Coastguard Worker@implementation GPBStringFloatDictionary { 9392*6777b538SAndroid Build Coastguard Worker @package 9393*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 9394*6777b538SAndroid Build Coastguard Worker} 9395*6777b538SAndroid Build Coastguard Worker 9396*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 9397*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 9398*6777b538SAndroid Build Coastguard Worker} 9399*6777b538SAndroid Build Coastguard Worker 9400*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values 9401*6777b538SAndroid Build Coastguard Worker forKeys:(const NSString * [])keys 9402*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 9403*6777b538SAndroid Build Coastguard Worker self = [super init]; 9404*6777b538SAndroid Build Coastguard Worker if (self) { 9405*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 9406*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 9407*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 9408*6777b538SAndroid Build Coastguard Worker if (!keys[i]) { 9409*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 9410*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 9411*6777b538SAndroid Build Coastguard Worker } 9412*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:keys[i]]; 9413*6777b538SAndroid Build Coastguard Worker } 9414*6777b538SAndroid Build Coastguard Worker } 9415*6777b538SAndroid Build Coastguard Worker } 9416*6777b538SAndroid Build Coastguard Worker return self; 9417*6777b538SAndroid Build Coastguard Worker} 9418*6777b538SAndroid Build Coastguard Worker 9419*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringFloatDictionary *)dictionary { 9420*6777b538SAndroid Build Coastguard Worker self = [self initWithFloats:NULL forKeys:NULL count:0]; 9421*6777b538SAndroid Build Coastguard Worker if (self) { 9422*6777b538SAndroid Build Coastguard Worker if (dictionary) { 9423*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 9424*6777b538SAndroid Build Coastguard Worker } 9425*6777b538SAndroid Build Coastguard Worker } 9426*6777b538SAndroid Build Coastguard Worker return self; 9427*6777b538SAndroid Build Coastguard Worker} 9428*6777b538SAndroid Build Coastguard Worker 9429*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 9430*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 9431*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 9432*6777b538SAndroid Build Coastguard Worker} 9433*6777b538SAndroid Build Coastguard Worker 9434*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 9435*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 9436*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 9437*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 9438*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 9439*6777b538SAndroid Build Coastguard Worker [super dealloc]; 9440*6777b538SAndroid Build Coastguard Worker} 9441*6777b538SAndroid Build Coastguard Worker 9442*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 9443*6777b538SAndroid Build Coastguard Worker return [[GPBStringFloatDictionary allocWithZone:zone] initWithDictionary:self]; 9444*6777b538SAndroid Build Coastguard Worker} 9445*6777b538SAndroid Build Coastguard Worker 9446*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 9447*6777b538SAndroid Build Coastguard Worker if (self == other) { 9448*6777b538SAndroid Build Coastguard Worker return YES; 9449*6777b538SAndroid Build Coastguard Worker } 9450*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBStringFloatDictionary class]]) { 9451*6777b538SAndroid Build Coastguard Worker return NO; 9452*6777b538SAndroid Build Coastguard Worker } 9453*6777b538SAndroid Build Coastguard Worker GPBStringFloatDictionary *otherDictionary = other; 9454*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 9455*6777b538SAndroid Build Coastguard Worker} 9456*6777b538SAndroid Build Coastguard Worker 9457*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 9458*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9459*6777b538SAndroid Build Coastguard Worker} 9460*6777b538SAndroid Build Coastguard Worker 9461*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 9462*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 9463*6777b538SAndroid Build Coastguard Worker} 9464*6777b538SAndroid Build Coastguard Worker 9465*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 9466*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9467*6777b538SAndroid Build Coastguard Worker} 9468*6777b538SAndroid Build Coastguard Worker 9469*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock: 9470*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(NSString *key, float value, BOOL *stop))block { 9471*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 9472*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9473*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9474*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9475*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9476*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9477*6777b538SAndroid Build Coastguard Worker block(aKey, [aValue floatValue], &stop); 9478*6777b538SAndroid Build Coastguard Worker if (stop) { 9479*6777b538SAndroid Build Coastguard Worker break; 9480*6777b538SAndroid Build Coastguard Worker } 9481*6777b538SAndroid Build Coastguard Worker } 9482*6777b538SAndroid Build Coastguard Worker} 9483*6777b538SAndroid Build Coastguard Worker 9484*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 9485*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9486*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 9487*6777b538SAndroid Build Coastguard Worker if (count == 0) { 9488*6777b538SAndroid Build Coastguard Worker return 0; 9489*6777b538SAndroid Build Coastguard Worker } 9490*6777b538SAndroid Build Coastguard Worker 9491*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9492*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9493*6777b538SAndroid Build Coastguard Worker size_t result = 0; 9494*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9495*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9496*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9497*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9498*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType); 9499*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType); 9500*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 9501*6777b538SAndroid Build Coastguard Worker } 9502*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 9503*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 9504*6777b538SAndroid Build Coastguard Worker return result; 9505*6777b538SAndroid Build Coastguard Worker} 9506*6777b538SAndroid Build Coastguard Worker 9507*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 9508*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 9509*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9510*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9511*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 9512*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9513*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9514*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9515*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9516*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9517*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 9518*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 9519*6777b538SAndroid Build Coastguard Worker NSString *unwrappedKey = aKey; 9520*6777b538SAndroid Build Coastguard Worker float unwrappedValue = [aValue floatValue]; 9521*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 9522*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 9523*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 9524*6777b538SAndroid Build Coastguard Worker // Write the fields. 9525*6777b538SAndroid Build Coastguard Worker WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 9526*6777b538SAndroid Build Coastguard Worker WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 9527*6777b538SAndroid Build Coastguard Worker } 9528*6777b538SAndroid Build Coastguard Worker} 9529*6777b538SAndroid Build Coastguard Worker 9530*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 9531*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 9532*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueFloat) forKey:key->valueString]; 9533*6777b538SAndroid Build Coastguard Worker} 9534*6777b538SAndroid Build Coastguard Worker 9535*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 9536*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndFloatsUsingBlock:^(NSString *key, float value, BOOL *stop) { 9537*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 9538*6777b538SAndroid Build Coastguard Worker block(key, [NSString stringWithFormat:@"%.*g", FLT_DIG, value]); 9539*6777b538SAndroid Build Coastguard Worker }]; 9540*6777b538SAndroid Build Coastguard Worker} 9541*6777b538SAndroid Build Coastguard Worker 9542*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(nullable float *)value forKey:(NSString *)key { 9543*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:key]; 9544*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 9545*6777b538SAndroid Build Coastguard Worker *value = [wrapped floatValue]; 9546*6777b538SAndroid Build Coastguard Worker } 9547*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 9548*6777b538SAndroid Build Coastguard Worker} 9549*6777b538SAndroid Build Coastguard Worker 9550*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringFloatDictionary *)otherDictionary { 9551*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 9552*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 9553*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 9554*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 9555*6777b538SAndroid Build Coastguard Worker } 9556*6777b538SAndroid Build Coastguard Worker } 9557*6777b538SAndroid Build Coastguard Worker} 9558*6777b538SAndroid Build Coastguard Worker 9559*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(NSString *)key { 9560*6777b538SAndroid Build Coastguard Worker if (!key) { 9561*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 9562*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 9563*6777b538SAndroid Build Coastguard Worker } 9564*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:key]; 9565*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 9566*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 9567*6777b538SAndroid Build Coastguard Worker } 9568*6777b538SAndroid Build Coastguard Worker} 9569*6777b538SAndroid Build Coastguard Worker 9570*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(NSString *)aKey { 9571*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:aKey]; 9572*6777b538SAndroid Build Coastguard Worker} 9573*6777b538SAndroid Build Coastguard Worker 9574*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 9575*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 9576*6777b538SAndroid Build Coastguard Worker} 9577*6777b538SAndroid Build Coastguard Worker 9578*6777b538SAndroid Build Coastguard Worker@end 9579*6777b538SAndroid Build Coastguard Worker 9580*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Double 9581*6777b538SAndroid Build Coastguard Worker 9582*6777b538SAndroid Build Coastguard Worker@implementation GPBStringDoubleDictionary { 9583*6777b538SAndroid Build Coastguard Worker @package 9584*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 9585*6777b538SAndroid Build Coastguard Worker} 9586*6777b538SAndroid Build Coastguard Worker 9587*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 9588*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 9589*6777b538SAndroid Build Coastguard Worker} 9590*6777b538SAndroid Build Coastguard Worker 9591*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values 9592*6777b538SAndroid Build Coastguard Worker forKeys:(const NSString * [])keys 9593*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 9594*6777b538SAndroid Build Coastguard Worker self = [super init]; 9595*6777b538SAndroid Build Coastguard Worker if (self) { 9596*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 9597*6777b538SAndroid Build Coastguard Worker if (count && values && keys) { 9598*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 9599*6777b538SAndroid Build Coastguard Worker if (!keys[i]) { 9600*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 9601*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 9602*6777b538SAndroid Build Coastguard Worker } 9603*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(values[i]) forKey:keys[i]]; 9604*6777b538SAndroid Build Coastguard Worker } 9605*6777b538SAndroid Build Coastguard Worker } 9606*6777b538SAndroid Build Coastguard Worker } 9607*6777b538SAndroid Build Coastguard Worker return self; 9608*6777b538SAndroid Build Coastguard Worker} 9609*6777b538SAndroid Build Coastguard Worker 9610*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringDoubleDictionary *)dictionary { 9611*6777b538SAndroid Build Coastguard Worker self = [self initWithDoubles:NULL forKeys:NULL count:0]; 9612*6777b538SAndroid Build Coastguard Worker if (self) { 9613*6777b538SAndroid Build Coastguard Worker if (dictionary) { 9614*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 9615*6777b538SAndroid Build Coastguard Worker } 9616*6777b538SAndroid Build Coastguard Worker } 9617*6777b538SAndroid Build Coastguard Worker return self; 9618*6777b538SAndroid Build Coastguard Worker} 9619*6777b538SAndroid Build Coastguard Worker 9620*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 9621*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 9622*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 9623*6777b538SAndroid Build Coastguard Worker} 9624*6777b538SAndroid Build Coastguard Worker 9625*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 9626*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 9627*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 9628*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 9629*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 9630*6777b538SAndroid Build Coastguard Worker [super dealloc]; 9631*6777b538SAndroid Build Coastguard Worker} 9632*6777b538SAndroid Build Coastguard Worker 9633*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 9634*6777b538SAndroid Build Coastguard Worker return [[GPBStringDoubleDictionary allocWithZone:zone] initWithDictionary:self]; 9635*6777b538SAndroid Build Coastguard Worker} 9636*6777b538SAndroid Build Coastguard Worker 9637*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 9638*6777b538SAndroid Build Coastguard Worker if (self == other) { 9639*6777b538SAndroid Build Coastguard Worker return YES; 9640*6777b538SAndroid Build Coastguard Worker } 9641*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBStringDoubleDictionary class]]) { 9642*6777b538SAndroid Build Coastguard Worker return NO; 9643*6777b538SAndroid Build Coastguard Worker } 9644*6777b538SAndroid Build Coastguard Worker GPBStringDoubleDictionary *otherDictionary = other; 9645*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 9646*6777b538SAndroid Build Coastguard Worker} 9647*6777b538SAndroid Build Coastguard Worker 9648*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 9649*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9650*6777b538SAndroid Build Coastguard Worker} 9651*6777b538SAndroid Build Coastguard Worker 9652*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 9653*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 9654*6777b538SAndroid Build Coastguard Worker} 9655*6777b538SAndroid Build Coastguard Worker 9656*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 9657*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9658*6777b538SAndroid Build Coastguard Worker} 9659*6777b538SAndroid Build Coastguard Worker 9660*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock: 9661*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(NSString *key, double value, BOOL *stop))block { 9662*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 9663*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9664*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9665*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9666*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9667*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9668*6777b538SAndroid Build Coastguard Worker block(aKey, [aValue doubleValue], &stop); 9669*6777b538SAndroid Build Coastguard Worker if (stop) { 9670*6777b538SAndroid Build Coastguard Worker break; 9671*6777b538SAndroid Build Coastguard Worker } 9672*6777b538SAndroid Build Coastguard Worker } 9673*6777b538SAndroid Build Coastguard Worker} 9674*6777b538SAndroid Build Coastguard Worker 9675*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 9676*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9677*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 9678*6777b538SAndroid Build Coastguard Worker if (count == 0) { 9679*6777b538SAndroid Build Coastguard Worker return 0; 9680*6777b538SAndroid Build Coastguard Worker } 9681*6777b538SAndroid Build Coastguard Worker 9682*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9683*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9684*6777b538SAndroid Build Coastguard Worker size_t result = 0; 9685*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9686*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9687*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9688*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9689*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType); 9690*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType); 9691*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 9692*6777b538SAndroid Build Coastguard Worker } 9693*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 9694*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 9695*6777b538SAndroid Build Coastguard Worker return result; 9696*6777b538SAndroid Build Coastguard Worker} 9697*6777b538SAndroid Build Coastguard Worker 9698*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 9699*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 9700*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9701*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9702*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 9703*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9704*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9705*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9706*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9707*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9708*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 9709*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 9710*6777b538SAndroid Build Coastguard Worker NSString *unwrappedKey = aKey; 9711*6777b538SAndroid Build Coastguard Worker double unwrappedValue = [aValue doubleValue]; 9712*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 9713*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 9714*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 9715*6777b538SAndroid Build Coastguard Worker // Write the fields. 9716*6777b538SAndroid Build Coastguard Worker WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 9717*6777b538SAndroid Build Coastguard Worker WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 9718*6777b538SAndroid Build Coastguard Worker } 9719*6777b538SAndroid Build Coastguard Worker} 9720*6777b538SAndroid Build Coastguard Worker 9721*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 9722*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 9723*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueDouble) forKey:key->valueString]; 9724*6777b538SAndroid Build Coastguard Worker} 9725*6777b538SAndroid Build Coastguard Worker 9726*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 9727*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndDoublesUsingBlock:^(NSString *key, double value, BOOL *stop) { 9728*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 9729*6777b538SAndroid Build Coastguard Worker block(key, [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]); 9730*6777b538SAndroid Build Coastguard Worker }]; 9731*6777b538SAndroid Build Coastguard Worker} 9732*6777b538SAndroid Build Coastguard Worker 9733*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(nullable double *)value forKey:(NSString *)key { 9734*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:key]; 9735*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 9736*6777b538SAndroid Build Coastguard Worker *value = [wrapped doubleValue]; 9737*6777b538SAndroid Build Coastguard Worker } 9738*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 9739*6777b538SAndroid Build Coastguard Worker} 9740*6777b538SAndroid Build Coastguard Worker 9741*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBStringDoubleDictionary *)otherDictionary { 9742*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 9743*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 9744*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 9745*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 9746*6777b538SAndroid Build Coastguard Worker } 9747*6777b538SAndroid Build Coastguard Worker } 9748*6777b538SAndroid Build Coastguard Worker} 9749*6777b538SAndroid Build Coastguard Worker 9750*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(NSString *)key { 9751*6777b538SAndroid Build Coastguard Worker if (!key) { 9752*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 9753*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 9754*6777b538SAndroid Build Coastguard Worker } 9755*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:key]; 9756*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 9757*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 9758*6777b538SAndroid Build Coastguard Worker } 9759*6777b538SAndroid Build Coastguard Worker} 9760*6777b538SAndroid Build Coastguard Worker 9761*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(NSString *)aKey { 9762*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:aKey]; 9763*6777b538SAndroid Build Coastguard Worker} 9764*6777b538SAndroid Build Coastguard Worker 9765*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 9766*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 9767*6777b538SAndroid Build Coastguard Worker} 9768*6777b538SAndroid Build Coastguard Worker 9769*6777b538SAndroid Build Coastguard Worker@end 9770*6777b538SAndroid Build Coastguard Worker 9771*6777b538SAndroid Build Coastguard Worker#pragma mark - String -> Enum 9772*6777b538SAndroid Build Coastguard Worker 9773*6777b538SAndroid Build Coastguard Worker@implementation GPBStringEnumDictionary { 9774*6777b538SAndroid Build Coastguard Worker @package 9775*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 9776*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc _validationFunc; 9777*6777b538SAndroid Build Coastguard Worker} 9778*6777b538SAndroid Build Coastguard Worker 9779*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc; 9780*6777b538SAndroid Build Coastguard Worker 9781*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 9782*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0]; 9783*6777b538SAndroid Build Coastguard Worker} 9784*6777b538SAndroid Build Coastguard Worker 9785*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func { 9786*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 9787*6777b538SAndroid Build Coastguard Worker} 9788*6777b538SAndroid Build Coastguard Worker 9789*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 9790*6777b538SAndroid Build Coastguard Worker rawValues:(const int32_t [])rawValues 9791*6777b538SAndroid Build Coastguard Worker forKeys:(const NSString * [])keys 9792*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 9793*6777b538SAndroid Build Coastguard Worker self = [super init]; 9794*6777b538SAndroid Build Coastguard Worker if (self) { 9795*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 9796*6777b538SAndroid Build Coastguard Worker _validationFunc = (func != NULL ? func : DictDefault_IsValidValue); 9797*6777b538SAndroid Build Coastguard Worker if (count && rawValues && keys) { 9798*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 9799*6777b538SAndroid Build Coastguard Worker if (!keys[i]) { 9800*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 9801*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 9802*6777b538SAndroid Build Coastguard Worker } 9803*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(rawValues[i]) forKey:keys[i]]; 9804*6777b538SAndroid Build Coastguard Worker } 9805*6777b538SAndroid Build Coastguard Worker } 9806*6777b538SAndroid Build Coastguard Worker } 9807*6777b538SAndroid Build Coastguard Worker return self; 9808*6777b538SAndroid Build Coastguard Worker} 9809*6777b538SAndroid Build Coastguard Worker 9810*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBStringEnumDictionary *)dictionary { 9811*6777b538SAndroid Build Coastguard Worker self = [self initWithValidationFunction:dictionary.validationFunc 9812*6777b538SAndroid Build Coastguard Worker rawValues:NULL 9813*6777b538SAndroid Build Coastguard Worker forKeys:NULL 9814*6777b538SAndroid Build Coastguard Worker count:0]; 9815*6777b538SAndroid Build Coastguard Worker if (self) { 9816*6777b538SAndroid Build Coastguard Worker if (dictionary) { 9817*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:dictionary->_dictionary]; 9818*6777b538SAndroid Build Coastguard Worker } 9819*6777b538SAndroid Build Coastguard Worker } 9820*6777b538SAndroid Build Coastguard Worker return self; 9821*6777b538SAndroid Build Coastguard Worker} 9822*6777b538SAndroid Build Coastguard Worker 9823*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 9824*6777b538SAndroid Build Coastguard Worker capacity:(NSUInteger)numItems { 9825*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 9826*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 9827*6777b538SAndroid Build Coastguard Worker} 9828*6777b538SAndroid Build Coastguard Worker 9829*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 9830*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 9831*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 9832*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 9833*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 9834*6777b538SAndroid Build Coastguard Worker [super dealloc]; 9835*6777b538SAndroid Build Coastguard Worker} 9836*6777b538SAndroid Build Coastguard Worker 9837*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 9838*6777b538SAndroid Build Coastguard Worker return [[GPBStringEnumDictionary allocWithZone:zone] initWithDictionary:self]; 9839*6777b538SAndroid Build Coastguard Worker} 9840*6777b538SAndroid Build Coastguard Worker 9841*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 9842*6777b538SAndroid Build Coastguard Worker if (self == other) { 9843*6777b538SAndroid Build Coastguard Worker return YES; 9844*6777b538SAndroid Build Coastguard Worker } 9845*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBStringEnumDictionary class]]) { 9846*6777b538SAndroid Build Coastguard Worker return NO; 9847*6777b538SAndroid Build Coastguard Worker } 9848*6777b538SAndroid Build Coastguard Worker GPBStringEnumDictionary *otherDictionary = other; 9849*6777b538SAndroid Build Coastguard Worker return [_dictionary isEqual:otherDictionary->_dictionary]; 9850*6777b538SAndroid Build Coastguard Worker} 9851*6777b538SAndroid Build Coastguard Worker 9852*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 9853*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9854*6777b538SAndroid Build Coastguard Worker} 9855*6777b538SAndroid Build Coastguard Worker 9856*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 9857*6777b538SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"<%@ %p> { %@ }", [self class], self, _dictionary]; 9858*6777b538SAndroid Build Coastguard Worker} 9859*6777b538SAndroid Build Coastguard Worker 9860*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 9861*6777b538SAndroid Build Coastguard Worker return _dictionary.count; 9862*6777b538SAndroid Build Coastguard Worker} 9863*6777b538SAndroid Build Coastguard Worker 9864*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock: 9865*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(NSString *key, int32_t value, BOOL *stop))block { 9866*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 9867*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9868*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9869*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9870*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9871*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9872*6777b538SAndroid Build Coastguard Worker block(aKey, [aValue intValue], &stop); 9873*6777b538SAndroid Build Coastguard Worker if (stop) { 9874*6777b538SAndroid Build Coastguard Worker break; 9875*6777b538SAndroid Build Coastguard Worker } 9876*6777b538SAndroid Build Coastguard Worker } 9877*6777b538SAndroid Build Coastguard Worker} 9878*6777b538SAndroid Build Coastguard Worker 9879*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 9880*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9881*6777b538SAndroid Build Coastguard Worker NSUInteger count = internal.count; 9882*6777b538SAndroid Build Coastguard Worker if (count == 0) { 9883*6777b538SAndroid Build Coastguard Worker return 0; 9884*6777b538SAndroid Build Coastguard Worker } 9885*6777b538SAndroid Build Coastguard Worker 9886*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9887*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9888*6777b538SAndroid Build Coastguard Worker size_t result = 0; 9889*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9890*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9891*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9892*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9893*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType); 9894*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType); 9895*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 9896*6777b538SAndroid Build Coastguard Worker } 9897*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 9898*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 9899*6777b538SAndroid Build Coastguard Worker return result; 9900*6777b538SAndroid Build Coastguard Worker} 9901*6777b538SAndroid Build Coastguard Worker 9902*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 9903*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 9904*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 9905*6777b538SAndroid Build Coastguard Worker GPBDataType keyDataType = field.mapKeyDataType; 9906*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 9907*6777b538SAndroid Build Coastguard Worker NSDictionary *internal = _dictionary; 9908*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [internal keyEnumerator]; 9909*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9910*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9911*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = internal[aKey]; 9912*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 9913*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 9914*6777b538SAndroid Build Coastguard Worker NSString *unwrappedKey = aKey; 9915*6777b538SAndroid Build Coastguard Worker int32_t unwrappedValue = [aValue intValue]; 9916*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType); 9917*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType); 9918*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 9919*6777b538SAndroid Build Coastguard Worker // Write the fields. 9920*6777b538SAndroid Build Coastguard Worker WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType); 9921*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType); 9922*6777b538SAndroid Build Coastguard Worker } 9923*6777b538SAndroid Build Coastguard Worker} 9924*6777b538SAndroid Build Coastguard Worker 9925*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value 9926*6777b538SAndroid Build Coastguard Worker forKey:(GPBGenericValue *)key 9927*6777b538SAndroid Build Coastguard Worker keyDataType:(GPBDataType)keyDataType { 9928*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictStringFieldSize(key->valueString, kMapKeyFieldNumber, keyDataType); 9929*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum); 9930*6777b538SAndroid Build Coastguard Worker NSMutableData *data = [NSMutableData dataWithLength:msgSize]; 9931*6777b538SAndroid Build Coastguard Worker GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data]; 9932*6777b538SAndroid Build Coastguard Worker WriteDictStringField(outputStream, key->valueString, kMapKeyFieldNumber, keyDataType); 9933*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum); 9934*6777b538SAndroid Build Coastguard Worker [outputStream release]; 9935*6777b538SAndroid Build Coastguard Worker return data; 9936*6777b538SAndroid Build Coastguard Worker} 9937*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 9938*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 9939*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value->valueEnum) forKey:key->valueString]; 9940*6777b538SAndroid Build Coastguard Worker} 9941*6777b538SAndroid Build Coastguard Worker 9942*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 9943*6777b538SAndroid Build Coastguard Worker [self enumerateKeysAndRawValuesUsingBlock:^(NSString *key, int32_t value, BOOL *stop) { 9944*6777b538SAndroid Build Coastguard Worker #pragma unused(stop) 9945*6777b538SAndroid Build Coastguard Worker block(key, @(value)); 9946*6777b538SAndroid Build Coastguard Worker }]; 9947*6777b538SAndroid Build Coastguard Worker} 9948*6777b538SAndroid Build Coastguard Worker 9949*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t *)value forKey:(NSString *)key { 9950*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:key]; 9951*6777b538SAndroid Build Coastguard Worker if (wrapped && value) { 9952*6777b538SAndroid Build Coastguard Worker int32_t result = [wrapped intValue]; 9953*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(result)) { 9954*6777b538SAndroid Build Coastguard Worker result = kGPBUnrecognizedEnumeratorValue; 9955*6777b538SAndroid Build Coastguard Worker } 9956*6777b538SAndroid Build Coastguard Worker *value = result; 9957*6777b538SAndroid Build Coastguard Worker } 9958*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 9959*6777b538SAndroid Build Coastguard Worker} 9960*6777b538SAndroid Build Coastguard Worker 9961*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t *)rawValue forKey:(NSString *)key { 9962*6777b538SAndroid Build Coastguard Worker NSNumber *wrapped = [_dictionary objectForKey:key]; 9963*6777b538SAndroid Build Coastguard Worker if (wrapped && rawValue) { 9964*6777b538SAndroid Build Coastguard Worker *rawValue = [wrapped intValue]; 9965*6777b538SAndroid Build Coastguard Worker } 9966*6777b538SAndroid Build Coastguard Worker return (wrapped != NULL); 9967*6777b538SAndroid Build Coastguard Worker} 9968*6777b538SAndroid Build Coastguard Worker 9969*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock: 9970*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(NSString *key, int32_t value, BOOL *stop))block { 9971*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc func = _validationFunc; 9972*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 9973*6777b538SAndroid Build Coastguard Worker NSEnumerator *keys = [_dictionary keyEnumerator]; 9974*6777b538SAndroid Build Coastguard Worker NSString *aKey; 9975*6777b538SAndroid Build Coastguard Worker while ((aKey = [keys nextObject])) { 9976*6777b538SAndroid Build Coastguard Worker NSNumber *aValue = _dictionary[aKey]; 9977*6777b538SAndroid Build Coastguard Worker int32_t unwrapped = [aValue intValue]; 9978*6777b538SAndroid Build Coastguard Worker if (!func(unwrapped)) { 9979*6777b538SAndroid Build Coastguard Worker unwrapped = kGPBUnrecognizedEnumeratorValue; 9980*6777b538SAndroid Build Coastguard Worker } 9981*6777b538SAndroid Build Coastguard Worker block(aKey, unwrapped, &stop); 9982*6777b538SAndroid Build Coastguard Worker if (stop) { 9983*6777b538SAndroid Build Coastguard Worker break; 9984*6777b538SAndroid Build Coastguard Worker } 9985*6777b538SAndroid Build Coastguard Worker } 9986*6777b538SAndroid Build Coastguard Worker} 9987*6777b538SAndroid Build Coastguard Worker 9988*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBStringEnumDictionary *)otherDictionary { 9989*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 9990*6777b538SAndroid Build Coastguard Worker [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary]; 9991*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 9992*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 9993*6777b538SAndroid Build Coastguard Worker } 9994*6777b538SAndroid Build Coastguard Worker } 9995*6777b538SAndroid Build Coastguard Worker} 9996*6777b538SAndroid Build Coastguard Worker 9997*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)value forKey:(NSString *)key { 9998*6777b538SAndroid Build Coastguard Worker if (!key) { 9999*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 10000*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 10001*6777b538SAndroid Build Coastguard Worker } 10002*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:key]; 10003*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10004*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10005*6777b538SAndroid Build Coastguard Worker } 10006*6777b538SAndroid Build Coastguard Worker} 10007*6777b538SAndroid Build Coastguard Worker 10008*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(NSString *)aKey { 10009*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:aKey]; 10010*6777b538SAndroid Build Coastguard Worker} 10011*6777b538SAndroid Build Coastguard Worker 10012*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 10013*6777b538SAndroid Build Coastguard Worker [_dictionary removeAllObjects]; 10014*6777b538SAndroid Build Coastguard Worker} 10015*6777b538SAndroid Build Coastguard Worker 10016*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(NSString *)key { 10017*6777b538SAndroid Build Coastguard Worker if (!key) { 10018*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 10019*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil key to a Dictionary"]; 10020*6777b538SAndroid Build Coastguard Worker } 10021*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(value)) { 10022*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 10023*6777b538SAndroid Build Coastguard Worker format:@"GPBStringEnumDictionary: Attempt to set an unknown enum value (%d)", 10024*6777b538SAndroid Build Coastguard Worker value]; 10025*6777b538SAndroid Build Coastguard Worker } 10026*6777b538SAndroid Build Coastguard Worker 10027*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:@(value) forKey:key]; 10028*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10029*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10030*6777b538SAndroid Build Coastguard Worker } 10031*6777b538SAndroid Build Coastguard Worker} 10032*6777b538SAndroid Build Coastguard Worker 10033*6777b538SAndroid Build Coastguard Worker@end 10034*6777b538SAndroid Build Coastguard Worker 10035*6777b538SAndroid Build Coastguard Worker// clang-format on 10036*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND-END (5 expansions) 10037*6777b538SAndroid Build Coastguard Worker 10038*6777b538SAndroid Build Coastguard Worker 10039*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt32, uint32_t) 10040*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 10041*6777b538SAndroid Build Coastguard Worker// clang-format off 10042*6777b538SAndroid Build Coastguard Worker 10043*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> UInt32 10044*6777b538SAndroid Build Coastguard Worker 10045*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolUInt32Dictionary { 10046*6777b538SAndroid Build Coastguard Worker @package 10047*6777b538SAndroid Build Coastguard Worker uint32_t _values[2]; 10048*6777b538SAndroid Build Coastguard Worker BOOL _valueSet[2]; 10049*6777b538SAndroid Build Coastguard Worker} 10050*6777b538SAndroid Build Coastguard Worker 10051*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 10052*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 10053*6777b538SAndroid Build Coastguard Worker} 10054*6777b538SAndroid Build Coastguard Worker 10055*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt32s:(const uint32_t [])values 10056*6777b538SAndroid Build Coastguard Worker forKeys:(const BOOL [])keys 10057*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 10058*6777b538SAndroid Build Coastguard Worker self = [super init]; 10059*6777b538SAndroid Build Coastguard Worker if (self) { 10060*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 10061*6777b538SAndroid Build Coastguard Worker int idx = keys[i] ? 1 : 0; 10062*6777b538SAndroid Build Coastguard Worker _values[idx] = values[i]; 10063*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10064*6777b538SAndroid Build Coastguard Worker } 10065*6777b538SAndroid Build Coastguard Worker } 10066*6777b538SAndroid Build Coastguard Worker return self; 10067*6777b538SAndroid Build Coastguard Worker} 10068*6777b538SAndroid Build Coastguard Worker 10069*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolUInt32Dictionary *)dictionary { 10070*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt32s:NULL forKeys:NULL count:0]; 10071*6777b538SAndroid Build Coastguard Worker if (self) { 10072*6777b538SAndroid Build Coastguard Worker if (dictionary) { 10073*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10074*6777b538SAndroid Build Coastguard Worker if (dictionary->_valueSet[i]) { 10075*6777b538SAndroid Build Coastguard Worker _values[i] = dictionary->_values[i]; 10076*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 10077*6777b538SAndroid Build Coastguard Worker } 10078*6777b538SAndroid Build Coastguard Worker } 10079*6777b538SAndroid Build Coastguard Worker } 10080*6777b538SAndroid Build Coastguard Worker } 10081*6777b538SAndroid Build Coastguard Worker return self; 10082*6777b538SAndroid Build Coastguard Worker} 10083*6777b538SAndroid Build Coastguard Worker 10084*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 10085*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 10086*6777b538SAndroid Build Coastguard Worker return [self initWithUInt32s:NULL forKeys:NULL count:0]; 10087*6777b538SAndroid Build Coastguard Worker} 10088*6777b538SAndroid Build Coastguard Worker 10089*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS) 10090*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 10091*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 10092*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 10093*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 10094*6777b538SAndroid Build Coastguard Worker [super dealloc]; 10095*6777b538SAndroid Build Coastguard Worker} 10096*6777b538SAndroid Build Coastguard Worker#endif // !defined(NS_BLOCK_ASSERTIONS) 10097*6777b538SAndroid Build Coastguard Worker 10098*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 10099*6777b538SAndroid Build Coastguard Worker return [[GPBBoolUInt32Dictionary allocWithZone:zone] initWithDictionary:self]; 10100*6777b538SAndroid Build Coastguard Worker} 10101*6777b538SAndroid Build Coastguard Worker 10102*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 10103*6777b538SAndroid Build Coastguard Worker if (self == other) { 10104*6777b538SAndroid Build Coastguard Worker return YES; 10105*6777b538SAndroid Build Coastguard Worker } 10106*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolUInt32Dictionary class]]) { 10107*6777b538SAndroid Build Coastguard Worker return NO; 10108*6777b538SAndroid Build Coastguard Worker } 10109*6777b538SAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *otherDictionary = other; 10110*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] != otherDictionary->_valueSet[0]) || 10111*6777b538SAndroid Build Coastguard Worker (_valueSet[1] != otherDictionary->_valueSet[1])) { 10112*6777b538SAndroid Build Coastguard Worker return NO; 10113*6777b538SAndroid Build Coastguard Worker } 10114*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) || 10115*6777b538SAndroid Build Coastguard Worker (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) { 10116*6777b538SAndroid Build Coastguard Worker return NO; 10117*6777b538SAndroid Build Coastguard Worker } 10118*6777b538SAndroid Build Coastguard Worker return YES; 10119*6777b538SAndroid Build Coastguard Worker} 10120*6777b538SAndroid Build Coastguard Worker 10121*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 10122*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10123*6777b538SAndroid Build Coastguard Worker} 10124*6777b538SAndroid Build Coastguard Worker 10125*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 10126*6777b538SAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 10127*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10128*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"NO: %u", _values[0]]; 10129*6777b538SAndroid Build Coastguard Worker } 10130*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 10131*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"YES: %u", _values[1]]; 10132*6777b538SAndroid Build Coastguard Worker } 10133*6777b538SAndroid Build Coastguard Worker [result appendString:@" }"]; 10134*6777b538SAndroid Build Coastguard Worker return result; 10135*6777b538SAndroid Build Coastguard Worker} 10136*6777b538SAndroid Build Coastguard Worker 10137*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 10138*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10139*6777b538SAndroid Build Coastguard Worker} 10140*6777b538SAndroid Build Coastguard Worker 10141*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt32:(uint32_t *)value forKey:(BOOL)key { 10142*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 10143*6777b538SAndroid Build Coastguard Worker if (_valueSet[idx]) { 10144*6777b538SAndroid Build Coastguard Worker if (value) { 10145*6777b538SAndroid Build Coastguard Worker *value = _values[idx]; 10146*6777b538SAndroid Build Coastguard Worker } 10147*6777b538SAndroid Build Coastguard Worker return YES; 10148*6777b538SAndroid Build Coastguard Worker } 10149*6777b538SAndroid Build Coastguard Worker return NO; 10150*6777b538SAndroid Build Coastguard Worker} 10151*6777b538SAndroid Build Coastguard Worker 10152*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 10153*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 10154*6777b538SAndroid Build Coastguard Worker int idx = (key->valueBool ? 1 : 0); 10155*6777b538SAndroid Build Coastguard Worker _values[idx] = value->valueUInt32; 10156*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10157*6777b538SAndroid Build Coastguard Worker} 10158*6777b538SAndroid Build Coastguard Worker 10159*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 10160*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10161*6777b538SAndroid Build Coastguard Worker block(@"false", [NSString stringWithFormat:@"%u", _values[0]]); 10162*6777b538SAndroid Build Coastguard Worker } 10163*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 10164*6777b538SAndroid Build Coastguard Worker block(@"true", [NSString stringWithFormat:@"%u", _values[1]]); 10165*6777b538SAndroid Build Coastguard Worker } 10166*6777b538SAndroid Build Coastguard Worker} 10167*6777b538SAndroid Build Coastguard Worker 10168*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt32sUsingBlock: 10169*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, uint32_t value, BOOL *stop))block { 10170*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 10171*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10172*6777b538SAndroid Build Coastguard Worker block(NO, _values[0], &stop); 10173*6777b538SAndroid Build Coastguard Worker } 10174*6777b538SAndroid Build Coastguard Worker if (!stop && _valueSet[1]) { 10175*6777b538SAndroid Build Coastguard Worker block(YES, _values[1], &stop); 10176*6777b538SAndroid Build Coastguard Worker } 10177*6777b538SAndroid Build Coastguard Worker} 10178*6777b538SAndroid Build Coastguard Worker 10179*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 10180*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 10181*6777b538SAndroid Build Coastguard Worker NSUInteger count = 0; 10182*6777b538SAndroid Build Coastguard Worker size_t result = 0; 10183*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10184*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 10185*6777b538SAndroid Build Coastguard Worker ++count; 10186*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10187*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 10188*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 10189*6777b538SAndroid Build Coastguard Worker } 10190*6777b538SAndroid Build Coastguard Worker } 10191*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 10192*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 10193*6777b538SAndroid Build Coastguard Worker return result; 10194*6777b538SAndroid Build Coastguard Worker} 10195*6777b538SAndroid Build Coastguard Worker 10196*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 10197*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 10198*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 10199*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 10200*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10201*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 10202*6777b538SAndroid Build Coastguard Worker // Write the tag. 10203*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 10204*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 10205*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10206*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 10207*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 10208*6777b538SAndroid Build Coastguard Worker // Write the fields. 10209*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10210*6777b538SAndroid Build Coastguard Worker WriteDictUInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 10211*6777b538SAndroid Build Coastguard Worker } 10212*6777b538SAndroid Build Coastguard Worker } 10213*6777b538SAndroid Build Coastguard Worker} 10214*6777b538SAndroid Build Coastguard Worker 10215*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolUInt32Dictionary *)otherDictionary { 10216*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 10217*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10218*6777b538SAndroid Build Coastguard Worker if (otherDictionary->_valueSet[i]) { 10219*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 10220*6777b538SAndroid Build Coastguard Worker _values[i] = otherDictionary->_values[i]; 10221*6777b538SAndroid Build Coastguard Worker } 10222*6777b538SAndroid Build Coastguard Worker } 10223*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10224*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10225*6777b538SAndroid Build Coastguard Worker } 10226*6777b538SAndroid Build Coastguard Worker } 10227*6777b538SAndroid Build Coastguard Worker} 10228*6777b538SAndroid Build Coastguard Worker 10229*6777b538SAndroid Build Coastguard Worker- (void)setUInt32:(uint32_t)value forKey:(BOOL)key { 10230*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 10231*6777b538SAndroid Build Coastguard Worker _values[idx] = value; 10232*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10233*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10234*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10235*6777b538SAndroid Build Coastguard Worker } 10236*6777b538SAndroid Build Coastguard Worker} 10237*6777b538SAndroid Build Coastguard Worker 10238*6777b538SAndroid Build Coastguard Worker- (void)removeUInt32ForKey:(BOOL)aKey { 10239*6777b538SAndroid Build Coastguard Worker _valueSet[aKey ? 1 : 0] = NO; 10240*6777b538SAndroid Build Coastguard Worker} 10241*6777b538SAndroid Build Coastguard Worker 10242*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 10243*6777b538SAndroid Build Coastguard Worker _valueSet[0] = NO; 10244*6777b538SAndroid Build Coastguard Worker _valueSet[1] = NO; 10245*6777b538SAndroid Build Coastguard Worker} 10246*6777b538SAndroid Build Coastguard Worker 10247*6777b538SAndroid Build Coastguard Worker@end 10248*6777b538SAndroid Build Coastguard Worker 10249*6777b538SAndroid Build Coastguard Worker// clang-format on 10250*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int32, int32_t) 10251*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 10252*6777b538SAndroid Build Coastguard Worker// clang-format off 10253*6777b538SAndroid Build Coastguard Worker 10254*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Int32 10255*6777b538SAndroid Build Coastguard Worker 10256*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolInt32Dictionary { 10257*6777b538SAndroid Build Coastguard Worker @package 10258*6777b538SAndroid Build Coastguard Worker int32_t _values[2]; 10259*6777b538SAndroid Build Coastguard Worker BOOL _valueSet[2]; 10260*6777b538SAndroid Build Coastguard Worker} 10261*6777b538SAndroid Build Coastguard Worker 10262*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 10263*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 10264*6777b538SAndroid Build Coastguard Worker} 10265*6777b538SAndroid Build Coastguard Worker 10266*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt32s:(const int32_t [])values 10267*6777b538SAndroid Build Coastguard Worker forKeys:(const BOOL [])keys 10268*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 10269*6777b538SAndroid Build Coastguard Worker self = [super init]; 10270*6777b538SAndroid Build Coastguard Worker if (self) { 10271*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 10272*6777b538SAndroid Build Coastguard Worker int idx = keys[i] ? 1 : 0; 10273*6777b538SAndroid Build Coastguard Worker _values[idx] = values[i]; 10274*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10275*6777b538SAndroid Build Coastguard Worker } 10276*6777b538SAndroid Build Coastguard Worker } 10277*6777b538SAndroid Build Coastguard Worker return self; 10278*6777b538SAndroid Build Coastguard Worker} 10279*6777b538SAndroid Build Coastguard Worker 10280*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolInt32Dictionary *)dictionary { 10281*6777b538SAndroid Build Coastguard Worker self = [self initWithInt32s:NULL forKeys:NULL count:0]; 10282*6777b538SAndroid Build Coastguard Worker if (self) { 10283*6777b538SAndroid Build Coastguard Worker if (dictionary) { 10284*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10285*6777b538SAndroid Build Coastguard Worker if (dictionary->_valueSet[i]) { 10286*6777b538SAndroid Build Coastguard Worker _values[i] = dictionary->_values[i]; 10287*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 10288*6777b538SAndroid Build Coastguard Worker } 10289*6777b538SAndroid Build Coastguard Worker } 10290*6777b538SAndroid Build Coastguard Worker } 10291*6777b538SAndroid Build Coastguard Worker } 10292*6777b538SAndroid Build Coastguard Worker return self; 10293*6777b538SAndroid Build Coastguard Worker} 10294*6777b538SAndroid Build Coastguard Worker 10295*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 10296*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 10297*6777b538SAndroid Build Coastguard Worker return [self initWithInt32s:NULL forKeys:NULL count:0]; 10298*6777b538SAndroid Build Coastguard Worker} 10299*6777b538SAndroid Build Coastguard Worker 10300*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS) 10301*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 10302*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 10303*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 10304*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 10305*6777b538SAndroid Build Coastguard Worker [super dealloc]; 10306*6777b538SAndroid Build Coastguard Worker} 10307*6777b538SAndroid Build Coastguard Worker#endif // !defined(NS_BLOCK_ASSERTIONS) 10308*6777b538SAndroid Build Coastguard Worker 10309*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 10310*6777b538SAndroid Build Coastguard Worker return [[GPBBoolInt32Dictionary allocWithZone:zone] initWithDictionary:self]; 10311*6777b538SAndroid Build Coastguard Worker} 10312*6777b538SAndroid Build Coastguard Worker 10313*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 10314*6777b538SAndroid Build Coastguard Worker if (self == other) { 10315*6777b538SAndroid Build Coastguard Worker return YES; 10316*6777b538SAndroid Build Coastguard Worker } 10317*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolInt32Dictionary class]]) { 10318*6777b538SAndroid Build Coastguard Worker return NO; 10319*6777b538SAndroid Build Coastguard Worker } 10320*6777b538SAndroid Build Coastguard Worker GPBBoolInt32Dictionary *otherDictionary = other; 10321*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] != otherDictionary->_valueSet[0]) || 10322*6777b538SAndroid Build Coastguard Worker (_valueSet[1] != otherDictionary->_valueSet[1])) { 10323*6777b538SAndroid Build Coastguard Worker return NO; 10324*6777b538SAndroid Build Coastguard Worker } 10325*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) || 10326*6777b538SAndroid Build Coastguard Worker (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) { 10327*6777b538SAndroid Build Coastguard Worker return NO; 10328*6777b538SAndroid Build Coastguard Worker } 10329*6777b538SAndroid Build Coastguard Worker return YES; 10330*6777b538SAndroid Build Coastguard Worker} 10331*6777b538SAndroid Build Coastguard Worker 10332*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 10333*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10334*6777b538SAndroid Build Coastguard Worker} 10335*6777b538SAndroid Build Coastguard Worker 10336*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 10337*6777b538SAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 10338*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10339*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"NO: %d", _values[0]]; 10340*6777b538SAndroid Build Coastguard Worker } 10341*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 10342*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"YES: %d", _values[1]]; 10343*6777b538SAndroid Build Coastguard Worker } 10344*6777b538SAndroid Build Coastguard Worker [result appendString:@" }"]; 10345*6777b538SAndroid Build Coastguard Worker return result; 10346*6777b538SAndroid Build Coastguard Worker} 10347*6777b538SAndroid Build Coastguard Worker 10348*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 10349*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10350*6777b538SAndroid Build Coastguard Worker} 10351*6777b538SAndroid Build Coastguard Worker 10352*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt32:(int32_t *)value forKey:(BOOL)key { 10353*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 10354*6777b538SAndroid Build Coastguard Worker if (_valueSet[idx]) { 10355*6777b538SAndroid Build Coastguard Worker if (value) { 10356*6777b538SAndroid Build Coastguard Worker *value = _values[idx]; 10357*6777b538SAndroid Build Coastguard Worker } 10358*6777b538SAndroid Build Coastguard Worker return YES; 10359*6777b538SAndroid Build Coastguard Worker } 10360*6777b538SAndroid Build Coastguard Worker return NO; 10361*6777b538SAndroid Build Coastguard Worker} 10362*6777b538SAndroid Build Coastguard Worker 10363*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 10364*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 10365*6777b538SAndroid Build Coastguard Worker int idx = (key->valueBool ? 1 : 0); 10366*6777b538SAndroid Build Coastguard Worker _values[idx] = value->valueInt32; 10367*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10368*6777b538SAndroid Build Coastguard Worker} 10369*6777b538SAndroid Build Coastguard Worker 10370*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 10371*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10372*6777b538SAndroid Build Coastguard Worker block(@"false", [NSString stringWithFormat:@"%d", _values[0]]); 10373*6777b538SAndroid Build Coastguard Worker } 10374*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 10375*6777b538SAndroid Build Coastguard Worker block(@"true", [NSString stringWithFormat:@"%d", _values[1]]); 10376*6777b538SAndroid Build Coastguard Worker } 10377*6777b538SAndroid Build Coastguard Worker} 10378*6777b538SAndroid Build Coastguard Worker 10379*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt32sUsingBlock: 10380*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, int32_t value, BOOL *stop))block { 10381*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 10382*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10383*6777b538SAndroid Build Coastguard Worker block(NO, _values[0], &stop); 10384*6777b538SAndroid Build Coastguard Worker } 10385*6777b538SAndroid Build Coastguard Worker if (!stop && _valueSet[1]) { 10386*6777b538SAndroid Build Coastguard Worker block(YES, _values[1], &stop); 10387*6777b538SAndroid Build Coastguard Worker } 10388*6777b538SAndroid Build Coastguard Worker} 10389*6777b538SAndroid Build Coastguard Worker 10390*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 10391*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 10392*6777b538SAndroid Build Coastguard Worker NSUInteger count = 0; 10393*6777b538SAndroid Build Coastguard Worker size_t result = 0; 10394*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10395*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 10396*6777b538SAndroid Build Coastguard Worker ++count; 10397*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10398*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 10399*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 10400*6777b538SAndroid Build Coastguard Worker } 10401*6777b538SAndroid Build Coastguard Worker } 10402*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 10403*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 10404*6777b538SAndroid Build Coastguard Worker return result; 10405*6777b538SAndroid Build Coastguard Worker} 10406*6777b538SAndroid Build Coastguard Worker 10407*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 10408*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 10409*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 10410*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 10411*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10412*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 10413*6777b538SAndroid Build Coastguard Worker // Write the tag. 10414*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 10415*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 10416*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10417*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 10418*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 10419*6777b538SAndroid Build Coastguard Worker // Write the fields. 10420*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10421*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 10422*6777b538SAndroid Build Coastguard Worker } 10423*6777b538SAndroid Build Coastguard Worker } 10424*6777b538SAndroid Build Coastguard Worker} 10425*6777b538SAndroid Build Coastguard Worker 10426*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolInt32Dictionary *)otherDictionary { 10427*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 10428*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10429*6777b538SAndroid Build Coastguard Worker if (otherDictionary->_valueSet[i]) { 10430*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 10431*6777b538SAndroid Build Coastguard Worker _values[i] = otherDictionary->_values[i]; 10432*6777b538SAndroid Build Coastguard Worker } 10433*6777b538SAndroid Build Coastguard Worker } 10434*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10435*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10436*6777b538SAndroid Build Coastguard Worker } 10437*6777b538SAndroid Build Coastguard Worker } 10438*6777b538SAndroid Build Coastguard Worker} 10439*6777b538SAndroid Build Coastguard Worker 10440*6777b538SAndroid Build Coastguard Worker- (void)setInt32:(int32_t)value forKey:(BOOL)key { 10441*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 10442*6777b538SAndroid Build Coastguard Worker _values[idx] = value; 10443*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10444*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10445*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10446*6777b538SAndroid Build Coastguard Worker } 10447*6777b538SAndroid Build Coastguard Worker} 10448*6777b538SAndroid Build Coastguard Worker 10449*6777b538SAndroid Build Coastguard Worker- (void)removeInt32ForKey:(BOOL)aKey { 10450*6777b538SAndroid Build Coastguard Worker _valueSet[aKey ? 1 : 0] = NO; 10451*6777b538SAndroid Build Coastguard Worker} 10452*6777b538SAndroid Build Coastguard Worker 10453*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 10454*6777b538SAndroid Build Coastguard Worker _valueSet[0] = NO; 10455*6777b538SAndroid Build Coastguard Worker _valueSet[1] = NO; 10456*6777b538SAndroid Build Coastguard Worker} 10457*6777b538SAndroid Build Coastguard Worker 10458*6777b538SAndroid Build Coastguard Worker@end 10459*6777b538SAndroid Build Coastguard Worker 10460*6777b538SAndroid Build Coastguard Worker// clang-format on 10461*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt64, uint64_t) 10462*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 10463*6777b538SAndroid Build Coastguard Worker// clang-format off 10464*6777b538SAndroid Build Coastguard Worker 10465*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> UInt64 10466*6777b538SAndroid Build Coastguard Worker 10467*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolUInt64Dictionary { 10468*6777b538SAndroid Build Coastguard Worker @package 10469*6777b538SAndroid Build Coastguard Worker uint64_t _values[2]; 10470*6777b538SAndroid Build Coastguard Worker BOOL _valueSet[2]; 10471*6777b538SAndroid Build Coastguard Worker} 10472*6777b538SAndroid Build Coastguard Worker 10473*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 10474*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 10475*6777b538SAndroid Build Coastguard Worker} 10476*6777b538SAndroid Build Coastguard Worker 10477*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithUInt64s:(const uint64_t [])values 10478*6777b538SAndroid Build Coastguard Worker forKeys:(const BOOL [])keys 10479*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 10480*6777b538SAndroid Build Coastguard Worker self = [super init]; 10481*6777b538SAndroid Build Coastguard Worker if (self) { 10482*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 10483*6777b538SAndroid Build Coastguard Worker int idx = keys[i] ? 1 : 0; 10484*6777b538SAndroid Build Coastguard Worker _values[idx] = values[i]; 10485*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10486*6777b538SAndroid Build Coastguard Worker } 10487*6777b538SAndroid Build Coastguard Worker } 10488*6777b538SAndroid Build Coastguard Worker return self; 10489*6777b538SAndroid Build Coastguard Worker} 10490*6777b538SAndroid Build Coastguard Worker 10491*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolUInt64Dictionary *)dictionary { 10492*6777b538SAndroid Build Coastguard Worker self = [self initWithUInt64s:NULL forKeys:NULL count:0]; 10493*6777b538SAndroid Build Coastguard Worker if (self) { 10494*6777b538SAndroid Build Coastguard Worker if (dictionary) { 10495*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10496*6777b538SAndroid Build Coastguard Worker if (dictionary->_valueSet[i]) { 10497*6777b538SAndroid Build Coastguard Worker _values[i] = dictionary->_values[i]; 10498*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 10499*6777b538SAndroid Build Coastguard Worker } 10500*6777b538SAndroid Build Coastguard Worker } 10501*6777b538SAndroid Build Coastguard Worker } 10502*6777b538SAndroid Build Coastguard Worker } 10503*6777b538SAndroid Build Coastguard Worker return self; 10504*6777b538SAndroid Build Coastguard Worker} 10505*6777b538SAndroid Build Coastguard Worker 10506*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 10507*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 10508*6777b538SAndroid Build Coastguard Worker return [self initWithUInt64s:NULL forKeys:NULL count:0]; 10509*6777b538SAndroid Build Coastguard Worker} 10510*6777b538SAndroid Build Coastguard Worker 10511*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS) 10512*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 10513*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 10514*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 10515*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 10516*6777b538SAndroid Build Coastguard Worker [super dealloc]; 10517*6777b538SAndroid Build Coastguard Worker} 10518*6777b538SAndroid Build Coastguard Worker#endif // !defined(NS_BLOCK_ASSERTIONS) 10519*6777b538SAndroid Build Coastguard Worker 10520*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 10521*6777b538SAndroid Build Coastguard Worker return [[GPBBoolUInt64Dictionary allocWithZone:zone] initWithDictionary:self]; 10522*6777b538SAndroid Build Coastguard Worker} 10523*6777b538SAndroid Build Coastguard Worker 10524*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 10525*6777b538SAndroid Build Coastguard Worker if (self == other) { 10526*6777b538SAndroid Build Coastguard Worker return YES; 10527*6777b538SAndroid Build Coastguard Worker } 10528*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolUInt64Dictionary class]]) { 10529*6777b538SAndroid Build Coastguard Worker return NO; 10530*6777b538SAndroid Build Coastguard Worker } 10531*6777b538SAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *otherDictionary = other; 10532*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] != otherDictionary->_valueSet[0]) || 10533*6777b538SAndroid Build Coastguard Worker (_valueSet[1] != otherDictionary->_valueSet[1])) { 10534*6777b538SAndroid Build Coastguard Worker return NO; 10535*6777b538SAndroid Build Coastguard Worker } 10536*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) || 10537*6777b538SAndroid Build Coastguard Worker (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) { 10538*6777b538SAndroid Build Coastguard Worker return NO; 10539*6777b538SAndroid Build Coastguard Worker } 10540*6777b538SAndroid Build Coastguard Worker return YES; 10541*6777b538SAndroid Build Coastguard Worker} 10542*6777b538SAndroid Build Coastguard Worker 10543*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 10544*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10545*6777b538SAndroid Build Coastguard Worker} 10546*6777b538SAndroid Build Coastguard Worker 10547*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 10548*6777b538SAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 10549*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10550*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"NO: %llu", _values[0]]; 10551*6777b538SAndroid Build Coastguard Worker } 10552*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 10553*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"YES: %llu", _values[1]]; 10554*6777b538SAndroid Build Coastguard Worker } 10555*6777b538SAndroid Build Coastguard Worker [result appendString:@" }"]; 10556*6777b538SAndroid Build Coastguard Worker return result; 10557*6777b538SAndroid Build Coastguard Worker} 10558*6777b538SAndroid Build Coastguard Worker 10559*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 10560*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10561*6777b538SAndroid Build Coastguard Worker} 10562*6777b538SAndroid Build Coastguard Worker 10563*6777b538SAndroid Build Coastguard Worker- (BOOL)getUInt64:(uint64_t *)value forKey:(BOOL)key { 10564*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 10565*6777b538SAndroid Build Coastguard Worker if (_valueSet[idx]) { 10566*6777b538SAndroid Build Coastguard Worker if (value) { 10567*6777b538SAndroid Build Coastguard Worker *value = _values[idx]; 10568*6777b538SAndroid Build Coastguard Worker } 10569*6777b538SAndroid Build Coastguard Worker return YES; 10570*6777b538SAndroid Build Coastguard Worker } 10571*6777b538SAndroid Build Coastguard Worker return NO; 10572*6777b538SAndroid Build Coastguard Worker} 10573*6777b538SAndroid Build Coastguard Worker 10574*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 10575*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 10576*6777b538SAndroid Build Coastguard Worker int idx = (key->valueBool ? 1 : 0); 10577*6777b538SAndroid Build Coastguard Worker _values[idx] = value->valueUInt64; 10578*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10579*6777b538SAndroid Build Coastguard Worker} 10580*6777b538SAndroid Build Coastguard Worker 10581*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 10582*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10583*6777b538SAndroid Build Coastguard Worker block(@"false", [NSString stringWithFormat:@"%llu", _values[0]]); 10584*6777b538SAndroid Build Coastguard Worker } 10585*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 10586*6777b538SAndroid Build Coastguard Worker block(@"true", [NSString stringWithFormat:@"%llu", _values[1]]); 10587*6777b538SAndroid Build Coastguard Worker } 10588*6777b538SAndroid Build Coastguard Worker} 10589*6777b538SAndroid Build Coastguard Worker 10590*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndUInt64sUsingBlock: 10591*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, uint64_t value, BOOL *stop))block { 10592*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 10593*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10594*6777b538SAndroid Build Coastguard Worker block(NO, _values[0], &stop); 10595*6777b538SAndroid Build Coastguard Worker } 10596*6777b538SAndroid Build Coastguard Worker if (!stop && _valueSet[1]) { 10597*6777b538SAndroid Build Coastguard Worker block(YES, _values[1], &stop); 10598*6777b538SAndroid Build Coastguard Worker } 10599*6777b538SAndroid Build Coastguard Worker} 10600*6777b538SAndroid Build Coastguard Worker 10601*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 10602*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 10603*6777b538SAndroid Build Coastguard Worker NSUInteger count = 0; 10604*6777b538SAndroid Build Coastguard Worker size_t result = 0; 10605*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10606*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 10607*6777b538SAndroid Build Coastguard Worker ++count; 10608*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10609*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 10610*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 10611*6777b538SAndroid Build Coastguard Worker } 10612*6777b538SAndroid Build Coastguard Worker } 10613*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 10614*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 10615*6777b538SAndroid Build Coastguard Worker return result; 10616*6777b538SAndroid Build Coastguard Worker} 10617*6777b538SAndroid Build Coastguard Worker 10618*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 10619*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 10620*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 10621*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 10622*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10623*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 10624*6777b538SAndroid Build Coastguard Worker // Write the tag. 10625*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 10626*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 10627*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10628*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictUInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 10629*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 10630*6777b538SAndroid Build Coastguard Worker // Write the fields. 10631*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10632*6777b538SAndroid Build Coastguard Worker WriteDictUInt64Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 10633*6777b538SAndroid Build Coastguard Worker } 10634*6777b538SAndroid Build Coastguard Worker } 10635*6777b538SAndroid Build Coastguard Worker} 10636*6777b538SAndroid Build Coastguard Worker 10637*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolUInt64Dictionary *)otherDictionary { 10638*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 10639*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10640*6777b538SAndroid Build Coastguard Worker if (otherDictionary->_valueSet[i]) { 10641*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 10642*6777b538SAndroid Build Coastguard Worker _values[i] = otherDictionary->_values[i]; 10643*6777b538SAndroid Build Coastguard Worker } 10644*6777b538SAndroid Build Coastguard Worker } 10645*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10646*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10647*6777b538SAndroid Build Coastguard Worker } 10648*6777b538SAndroid Build Coastguard Worker } 10649*6777b538SAndroid Build Coastguard Worker} 10650*6777b538SAndroid Build Coastguard Worker 10651*6777b538SAndroid Build Coastguard Worker- (void)setUInt64:(uint64_t)value forKey:(BOOL)key { 10652*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 10653*6777b538SAndroid Build Coastguard Worker _values[idx] = value; 10654*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10655*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10656*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10657*6777b538SAndroid Build Coastguard Worker } 10658*6777b538SAndroid Build Coastguard Worker} 10659*6777b538SAndroid Build Coastguard Worker 10660*6777b538SAndroid Build Coastguard Worker- (void)removeUInt64ForKey:(BOOL)aKey { 10661*6777b538SAndroid Build Coastguard Worker _valueSet[aKey ? 1 : 0] = NO; 10662*6777b538SAndroid Build Coastguard Worker} 10663*6777b538SAndroid Build Coastguard Worker 10664*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 10665*6777b538SAndroid Build Coastguard Worker _valueSet[0] = NO; 10666*6777b538SAndroid Build Coastguard Worker _valueSet[1] = NO; 10667*6777b538SAndroid Build Coastguard Worker} 10668*6777b538SAndroid Build Coastguard Worker 10669*6777b538SAndroid Build Coastguard Worker@end 10670*6777b538SAndroid Build Coastguard Worker 10671*6777b538SAndroid Build Coastguard Worker// clang-format on 10672*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int64, int64_t) 10673*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 10674*6777b538SAndroid Build Coastguard Worker// clang-format off 10675*6777b538SAndroid Build Coastguard Worker 10676*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Int64 10677*6777b538SAndroid Build Coastguard Worker 10678*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolInt64Dictionary { 10679*6777b538SAndroid Build Coastguard Worker @package 10680*6777b538SAndroid Build Coastguard Worker int64_t _values[2]; 10681*6777b538SAndroid Build Coastguard Worker BOOL _valueSet[2]; 10682*6777b538SAndroid Build Coastguard Worker} 10683*6777b538SAndroid Build Coastguard Worker 10684*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 10685*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 10686*6777b538SAndroid Build Coastguard Worker} 10687*6777b538SAndroid Build Coastguard Worker 10688*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithInt64s:(const int64_t [])values 10689*6777b538SAndroid Build Coastguard Worker forKeys:(const BOOL [])keys 10690*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 10691*6777b538SAndroid Build Coastguard Worker self = [super init]; 10692*6777b538SAndroid Build Coastguard Worker if (self) { 10693*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 10694*6777b538SAndroid Build Coastguard Worker int idx = keys[i] ? 1 : 0; 10695*6777b538SAndroid Build Coastguard Worker _values[idx] = values[i]; 10696*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10697*6777b538SAndroid Build Coastguard Worker } 10698*6777b538SAndroid Build Coastguard Worker } 10699*6777b538SAndroid Build Coastguard Worker return self; 10700*6777b538SAndroid Build Coastguard Worker} 10701*6777b538SAndroid Build Coastguard Worker 10702*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolInt64Dictionary *)dictionary { 10703*6777b538SAndroid Build Coastguard Worker self = [self initWithInt64s:NULL forKeys:NULL count:0]; 10704*6777b538SAndroid Build Coastguard Worker if (self) { 10705*6777b538SAndroid Build Coastguard Worker if (dictionary) { 10706*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10707*6777b538SAndroid Build Coastguard Worker if (dictionary->_valueSet[i]) { 10708*6777b538SAndroid Build Coastguard Worker _values[i] = dictionary->_values[i]; 10709*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 10710*6777b538SAndroid Build Coastguard Worker } 10711*6777b538SAndroid Build Coastguard Worker } 10712*6777b538SAndroid Build Coastguard Worker } 10713*6777b538SAndroid Build Coastguard Worker } 10714*6777b538SAndroid Build Coastguard Worker return self; 10715*6777b538SAndroid Build Coastguard Worker} 10716*6777b538SAndroid Build Coastguard Worker 10717*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 10718*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 10719*6777b538SAndroid Build Coastguard Worker return [self initWithInt64s:NULL forKeys:NULL count:0]; 10720*6777b538SAndroid Build Coastguard Worker} 10721*6777b538SAndroid Build Coastguard Worker 10722*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS) 10723*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 10724*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 10725*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 10726*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 10727*6777b538SAndroid Build Coastguard Worker [super dealloc]; 10728*6777b538SAndroid Build Coastguard Worker} 10729*6777b538SAndroid Build Coastguard Worker#endif // !defined(NS_BLOCK_ASSERTIONS) 10730*6777b538SAndroid Build Coastguard Worker 10731*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 10732*6777b538SAndroid Build Coastguard Worker return [[GPBBoolInt64Dictionary allocWithZone:zone] initWithDictionary:self]; 10733*6777b538SAndroid Build Coastguard Worker} 10734*6777b538SAndroid Build Coastguard Worker 10735*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 10736*6777b538SAndroid Build Coastguard Worker if (self == other) { 10737*6777b538SAndroid Build Coastguard Worker return YES; 10738*6777b538SAndroid Build Coastguard Worker } 10739*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolInt64Dictionary class]]) { 10740*6777b538SAndroid Build Coastguard Worker return NO; 10741*6777b538SAndroid Build Coastguard Worker } 10742*6777b538SAndroid Build Coastguard Worker GPBBoolInt64Dictionary *otherDictionary = other; 10743*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] != otherDictionary->_valueSet[0]) || 10744*6777b538SAndroid Build Coastguard Worker (_valueSet[1] != otherDictionary->_valueSet[1])) { 10745*6777b538SAndroid Build Coastguard Worker return NO; 10746*6777b538SAndroid Build Coastguard Worker } 10747*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) || 10748*6777b538SAndroid Build Coastguard Worker (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) { 10749*6777b538SAndroid Build Coastguard Worker return NO; 10750*6777b538SAndroid Build Coastguard Worker } 10751*6777b538SAndroid Build Coastguard Worker return YES; 10752*6777b538SAndroid Build Coastguard Worker} 10753*6777b538SAndroid Build Coastguard Worker 10754*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 10755*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10756*6777b538SAndroid Build Coastguard Worker} 10757*6777b538SAndroid Build Coastguard Worker 10758*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 10759*6777b538SAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 10760*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10761*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"NO: %lld", _values[0]]; 10762*6777b538SAndroid Build Coastguard Worker } 10763*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 10764*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"YES: %lld", _values[1]]; 10765*6777b538SAndroid Build Coastguard Worker } 10766*6777b538SAndroid Build Coastguard Worker [result appendString:@" }"]; 10767*6777b538SAndroid Build Coastguard Worker return result; 10768*6777b538SAndroid Build Coastguard Worker} 10769*6777b538SAndroid Build Coastguard Worker 10770*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 10771*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10772*6777b538SAndroid Build Coastguard Worker} 10773*6777b538SAndroid Build Coastguard Worker 10774*6777b538SAndroid Build Coastguard Worker- (BOOL)getInt64:(int64_t *)value forKey:(BOOL)key { 10775*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 10776*6777b538SAndroid Build Coastguard Worker if (_valueSet[idx]) { 10777*6777b538SAndroid Build Coastguard Worker if (value) { 10778*6777b538SAndroid Build Coastguard Worker *value = _values[idx]; 10779*6777b538SAndroid Build Coastguard Worker } 10780*6777b538SAndroid Build Coastguard Worker return YES; 10781*6777b538SAndroid Build Coastguard Worker } 10782*6777b538SAndroid Build Coastguard Worker return NO; 10783*6777b538SAndroid Build Coastguard Worker} 10784*6777b538SAndroid Build Coastguard Worker 10785*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 10786*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 10787*6777b538SAndroid Build Coastguard Worker int idx = (key->valueBool ? 1 : 0); 10788*6777b538SAndroid Build Coastguard Worker _values[idx] = value->valueInt64; 10789*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10790*6777b538SAndroid Build Coastguard Worker} 10791*6777b538SAndroid Build Coastguard Worker 10792*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 10793*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10794*6777b538SAndroid Build Coastguard Worker block(@"false", [NSString stringWithFormat:@"%lld", _values[0]]); 10795*6777b538SAndroid Build Coastguard Worker } 10796*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 10797*6777b538SAndroid Build Coastguard Worker block(@"true", [NSString stringWithFormat:@"%lld", _values[1]]); 10798*6777b538SAndroid Build Coastguard Worker } 10799*6777b538SAndroid Build Coastguard Worker} 10800*6777b538SAndroid Build Coastguard Worker 10801*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndInt64sUsingBlock: 10802*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, int64_t value, BOOL *stop))block { 10803*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 10804*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10805*6777b538SAndroid Build Coastguard Worker block(NO, _values[0], &stop); 10806*6777b538SAndroid Build Coastguard Worker } 10807*6777b538SAndroid Build Coastguard Worker if (!stop && _valueSet[1]) { 10808*6777b538SAndroid Build Coastguard Worker block(YES, _values[1], &stop); 10809*6777b538SAndroid Build Coastguard Worker } 10810*6777b538SAndroid Build Coastguard Worker} 10811*6777b538SAndroid Build Coastguard Worker 10812*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 10813*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 10814*6777b538SAndroid Build Coastguard Worker NSUInteger count = 0; 10815*6777b538SAndroid Build Coastguard Worker size_t result = 0; 10816*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10817*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 10818*6777b538SAndroid Build Coastguard Worker ++count; 10819*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10820*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 10821*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 10822*6777b538SAndroid Build Coastguard Worker } 10823*6777b538SAndroid Build Coastguard Worker } 10824*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 10825*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 10826*6777b538SAndroid Build Coastguard Worker return result; 10827*6777b538SAndroid Build Coastguard Worker} 10828*6777b538SAndroid Build Coastguard Worker 10829*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 10830*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 10831*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 10832*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 10833*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10834*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 10835*6777b538SAndroid Build Coastguard Worker // Write the tag. 10836*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 10837*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 10838*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10839*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt64FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 10840*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 10841*6777b538SAndroid Build Coastguard Worker // Write the fields. 10842*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 10843*6777b538SAndroid Build Coastguard Worker WriteDictInt64Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 10844*6777b538SAndroid Build Coastguard Worker } 10845*6777b538SAndroid Build Coastguard Worker } 10846*6777b538SAndroid Build Coastguard Worker} 10847*6777b538SAndroid Build Coastguard Worker 10848*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolInt64Dictionary *)otherDictionary { 10849*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 10850*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10851*6777b538SAndroid Build Coastguard Worker if (otherDictionary->_valueSet[i]) { 10852*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 10853*6777b538SAndroid Build Coastguard Worker _values[i] = otherDictionary->_values[i]; 10854*6777b538SAndroid Build Coastguard Worker } 10855*6777b538SAndroid Build Coastguard Worker } 10856*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10857*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10858*6777b538SAndroid Build Coastguard Worker } 10859*6777b538SAndroid Build Coastguard Worker } 10860*6777b538SAndroid Build Coastguard Worker} 10861*6777b538SAndroid Build Coastguard Worker 10862*6777b538SAndroid Build Coastguard Worker- (void)setInt64:(int64_t)value forKey:(BOOL)key { 10863*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 10864*6777b538SAndroid Build Coastguard Worker _values[idx] = value; 10865*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10866*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 10867*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 10868*6777b538SAndroid Build Coastguard Worker } 10869*6777b538SAndroid Build Coastguard Worker} 10870*6777b538SAndroid Build Coastguard Worker 10871*6777b538SAndroid Build Coastguard Worker- (void)removeInt64ForKey:(BOOL)aKey { 10872*6777b538SAndroid Build Coastguard Worker _valueSet[aKey ? 1 : 0] = NO; 10873*6777b538SAndroid Build Coastguard Worker} 10874*6777b538SAndroid Build Coastguard Worker 10875*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 10876*6777b538SAndroid Build Coastguard Worker _valueSet[0] = NO; 10877*6777b538SAndroid Build Coastguard Worker _valueSet[1] = NO; 10878*6777b538SAndroid Build Coastguard Worker} 10879*6777b538SAndroid Build Coastguard Worker 10880*6777b538SAndroid Build Coastguard Worker@end 10881*6777b538SAndroid Build Coastguard Worker 10882*6777b538SAndroid Build Coastguard Worker// clang-format on 10883*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Bool, BOOL) 10884*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 10885*6777b538SAndroid Build Coastguard Worker// clang-format off 10886*6777b538SAndroid Build Coastguard Worker 10887*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Bool 10888*6777b538SAndroid Build Coastguard Worker 10889*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolBoolDictionary { 10890*6777b538SAndroid Build Coastguard Worker @package 10891*6777b538SAndroid Build Coastguard Worker BOOL _values[2]; 10892*6777b538SAndroid Build Coastguard Worker BOOL _valueSet[2]; 10893*6777b538SAndroid Build Coastguard Worker} 10894*6777b538SAndroid Build Coastguard Worker 10895*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 10896*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 10897*6777b538SAndroid Build Coastguard Worker} 10898*6777b538SAndroid Build Coastguard Worker 10899*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithBools:(const BOOL [])values 10900*6777b538SAndroid Build Coastguard Worker forKeys:(const BOOL [])keys 10901*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 10902*6777b538SAndroid Build Coastguard Worker self = [super init]; 10903*6777b538SAndroid Build Coastguard Worker if (self) { 10904*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 10905*6777b538SAndroid Build Coastguard Worker int idx = keys[i] ? 1 : 0; 10906*6777b538SAndroid Build Coastguard Worker _values[idx] = values[i]; 10907*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 10908*6777b538SAndroid Build Coastguard Worker } 10909*6777b538SAndroid Build Coastguard Worker } 10910*6777b538SAndroid Build Coastguard Worker return self; 10911*6777b538SAndroid Build Coastguard Worker} 10912*6777b538SAndroid Build Coastguard Worker 10913*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolBoolDictionary *)dictionary { 10914*6777b538SAndroid Build Coastguard Worker self = [self initWithBools:NULL forKeys:NULL count:0]; 10915*6777b538SAndroid Build Coastguard Worker if (self) { 10916*6777b538SAndroid Build Coastguard Worker if (dictionary) { 10917*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 10918*6777b538SAndroid Build Coastguard Worker if (dictionary->_valueSet[i]) { 10919*6777b538SAndroid Build Coastguard Worker _values[i] = dictionary->_values[i]; 10920*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 10921*6777b538SAndroid Build Coastguard Worker } 10922*6777b538SAndroid Build Coastguard Worker } 10923*6777b538SAndroid Build Coastguard Worker } 10924*6777b538SAndroid Build Coastguard Worker } 10925*6777b538SAndroid Build Coastguard Worker return self; 10926*6777b538SAndroid Build Coastguard Worker} 10927*6777b538SAndroid Build Coastguard Worker 10928*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 10929*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 10930*6777b538SAndroid Build Coastguard Worker return [self initWithBools:NULL forKeys:NULL count:0]; 10931*6777b538SAndroid Build Coastguard Worker} 10932*6777b538SAndroid Build Coastguard Worker 10933*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS) 10934*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 10935*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 10936*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 10937*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 10938*6777b538SAndroid Build Coastguard Worker [super dealloc]; 10939*6777b538SAndroid Build Coastguard Worker} 10940*6777b538SAndroid Build Coastguard Worker#endif // !defined(NS_BLOCK_ASSERTIONS) 10941*6777b538SAndroid Build Coastguard Worker 10942*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 10943*6777b538SAndroid Build Coastguard Worker return [[GPBBoolBoolDictionary allocWithZone:zone] initWithDictionary:self]; 10944*6777b538SAndroid Build Coastguard Worker} 10945*6777b538SAndroid Build Coastguard Worker 10946*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 10947*6777b538SAndroid Build Coastguard Worker if (self == other) { 10948*6777b538SAndroid Build Coastguard Worker return YES; 10949*6777b538SAndroid Build Coastguard Worker } 10950*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolBoolDictionary class]]) { 10951*6777b538SAndroid Build Coastguard Worker return NO; 10952*6777b538SAndroid Build Coastguard Worker } 10953*6777b538SAndroid Build Coastguard Worker GPBBoolBoolDictionary *otherDictionary = other; 10954*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] != otherDictionary->_valueSet[0]) || 10955*6777b538SAndroid Build Coastguard Worker (_valueSet[1] != otherDictionary->_valueSet[1])) { 10956*6777b538SAndroid Build Coastguard Worker return NO; 10957*6777b538SAndroid Build Coastguard Worker } 10958*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) || 10959*6777b538SAndroid Build Coastguard Worker (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) { 10960*6777b538SAndroid Build Coastguard Worker return NO; 10961*6777b538SAndroid Build Coastguard Worker } 10962*6777b538SAndroid Build Coastguard Worker return YES; 10963*6777b538SAndroid Build Coastguard Worker} 10964*6777b538SAndroid Build Coastguard Worker 10965*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 10966*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10967*6777b538SAndroid Build Coastguard Worker} 10968*6777b538SAndroid Build Coastguard Worker 10969*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 10970*6777b538SAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 10971*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 10972*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"NO: %d", _values[0]]; 10973*6777b538SAndroid Build Coastguard Worker } 10974*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 10975*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"YES: %d", _values[1]]; 10976*6777b538SAndroid Build Coastguard Worker } 10977*6777b538SAndroid Build Coastguard Worker [result appendString:@" }"]; 10978*6777b538SAndroid Build Coastguard Worker return result; 10979*6777b538SAndroid Build Coastguard Worker} 10980*6777b538SAndroid Build Coastguard Worker 10981*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 10982*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 10983*6777b538SAndroid Build Coastguard Worker} 10984*6777b538SAndroid Build Coastguard Worker 10985*6777b538SAndroid Build Coastguard Worker- (BOOL)getBool:(BOOL *)value forKey:(BOOL)key { 10986*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 10987*6777b538SAndroid Build Coastguard Worker if (_valueSet[idx]) { 10988*6777b538SAndroid Build Coastguard Worker if (value) { 10989*6777b538SAndroid Build Coastguard Worker *value = _values[idx]; 10990*6777b538SAndroid Build Coastguard Worker } 10991*6777b538SAndroid Build Coastguard Worker return YES; 10992*6777b538SAndroid Build Coastguard Worker } 10993*6777b538SAndroid Build Coastguard Worker return NO; 10994*6777b538SAndroid Build Coastguard Worker} 10995*6777b538SAndroid Build Coastguard Worker 10996*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 10997*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 10998*6777b538SAndroid Build Coastguard Worker int idx = (key->valueBool ? 1 : 0); 10999*6777b538SAndroid Build Coastguard Worker _values[idx] = value->valueBool; 11000*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11001*6777b538SAndroid Build Coastguard Worker} 11002*6777b538SAndroid Build Coastguard Worker 11003*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 11004*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11005*6777b538SAndroid Build Coastguard Worker block(@"false", (_values[0] ? @"true" : @"false")); 11006*6777b538SAndroid Build Coastguard Worker } 11007*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 11008*6777b538SAndroid Build Coastguard Worker block(@"true", (_values[1] ? @"true" : @"false")); 11009*6777b538SAndroid Build Coastguard Worker } 11010*6777b538SAndroid Build Coastguard Worker} 11011*6777b538SAndroid Build Coastguard Worker 11012*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndBoolsUsingBlock: 11013*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, BOOL value, BOOL *stop))block { 11014*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 11015*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11016*6777b538SAndroid Build Coastguard Worker block(NO, _values[0], &stop); 11017*6777b538SAndroid Build Coastguard Worker } 11018*6777b538SAndroid Build Coastguard Worker if (!stop && _valueSet[1]) { 11019*6777b538SAndroid Build Coastguard Worker block(YES, _values[1], &stop); 11020*6777b538SAndroid Build Coastguard Worker } 11021*6777b538SAndroid Build Coastguard Worker} 11022*6777b538SAndroid Build Coastguard Worker 11023*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 11024*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11025*6777b538SAndroid Build Coastguard Worker NSUInteger count = 0; 11026*6777b538SAndroid Build Coastguard Worker size_t result = 0; 11027*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11028*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 11029*6777b538SAndroid Build Coastguard Worker ++count; 11030*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11031*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11032*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 11033*6777b538SAndroid Build Coastguard Worker } 11034*6777b538SAndroid Build Coastguard Worker } 11035*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 11036*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 11037*6777b538SAndroid Build Coastguard Worker return result; 11038*6777b538SAndroid Build Coastguard Worker} 11039*6777b538SAndroid Build Coastguard Worker 11040*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 11041*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 11042*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11043*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 11044*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11045*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 11046*6777b538SAndroid Build Coastguard Worker // Write the tag. 11047*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 11048*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 11049*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11050*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictBoolFieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11051*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 11052*6777b538SAndroid Build Coastguard Worker // Write the fields. 11053*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11054*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 11055*6777b538SAndroid Build Coastguard Worker } 11056*6777b538SAndroid Build Coastguard Worker } 11057*6777b538SAndroid Build Coastguard Worker} 11058*6777b538SAndroid Build Coastguard Worker 11059*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolBoolDictionary *)otherDictionary { 11060*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 11061*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11062*6777b538SAndroid Build Coastguard Worker if (otherDictionary->_valueSet[i]) { 11063*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 11064*6777b538SAndroid Build Coastguard Worker _values[i] = otherDictionary->_values[i]; 11065*6777b538SAndroid Build Coastguard Worker } 11066*6777b538SAndroid Build Coastguard Worker } 11067*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 11068*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 11069*6777b538SAndroid Build Coastguard Worker } 11070*6777b538SAndroid Build Coastguard Worker } 11071*6777b538SAndroid Build Coastguard Worker} 11072*6777b538SAndroid Build Coastguard Worker 11073*6777b538SAndroid Build Coastguard Worker- (void)setBool:(BOOL)value forKey:(BOOL)key { 11074*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 11075*6777b538SAndroid Build Coastguard Worker _values[idx] = value; 11076*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11077*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 11078*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 11079*6777b538SAndroid Build Coastguard Worker } 11080*6777b538SAndroid Build Coastguard Worker} 11081*6777b538SAndroid Build Coastguard Worker 11082*6777b538SAndroid Build Coastguard Worker- (void)removeBoolForKey:(BOOL)aKey { 11083*6777b538SAndroid Build Coastguard Worker _valueSet[aKey ? 1 : 0] = NO; 11084*6777b538SAndroid Build Coastguard Worker} 11085*6777b538SAndroid Build Coastguard Worker 11086*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 11087*6777b538SAndroid Build Coastguard Worker _valueSet[0] = NO; 11088*6777b538SAndroid Build Coastguard Worker _valueSet[1] = NO; 11089*6777b538SAndroid Build Coastguard Worker} 11090*6777b538SAndroid Build Coastguard Worker 11091*6777b538SAndroid Build Coastguard Worker@end 11092*6777b538SAndroid Build Coastguard Worker 11093*6777b538SAndroid Build Coastguard Worker// clang-format on 11094*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Float, float) 11095*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 11096*6777b538SAndroid Build Coastguard Worker// clang-format off 11097*6777b538SAndroid Build Coastguard Worker 11098*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Float 11099*6777b538SAndroid Build Coastguard Worker 11100*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolFloatDictionary { 11101*6777b538SAndroid Build Coastguard Worker @package 11102*6777b538SAndroid Build Coastguard Worker float _values[2]; 11103*6777b538SAndroid Build Coastguard Worker BOOL _valueSet[2]; 11104*6777b538SAndroid Build Coastguard Worker} 11105*6777b538SAndroid Build Coastguard Worker 11106*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 11107*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 11108*6777b538SAndroid Build Coastguard Worker} 11109*6777b538SAndroid Build Coastguard Worker 11110*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithFloats:(const float [])values 11111*6777b538SAndroid Build Coastguard Worker forKeys:(const BOOL [])keys 11112*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 11113*6777b538SAndroid Build Coastguard Worker self = [super init]; 11114*6777b538SAndroid Build Coastguard Worker if (self) { 11115*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 11116*6777b538SAndroid Build Coastguard Worker int idx = keys[i] ? 1 : 0; 11117*6777b538SAndroid Build Coastguard Worker _values[idx] = values[i]; 11118*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11119*6777b538SAndroid Build Coastguard Worker } 11120*6777b538SAndroid Build Coastguard Worker } 11121*6777b538SAndroid Build Coastguard Worker return self; 11122*6777b538SAndroid Build Coastguard Worker} 11123*6777b538SAndroid Build Coastguard Worker 11124*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolFloatDictionary *)dictionary { 11125*6777b538SAndroid Build Coastguard Worker self = [self initWithFloats:NULL forKeys:NULL count:0]; 11126*6777b538SAndroid Build Coastguard Worker if (self) { 11127*6777b538SAndroid Build Coastguard Worker if (dictionary) { 11128*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11129*6777b538SAndroid Build Coastguard Worker if (dictionary->_valueSet[i]) { 11130*6777b538SAndroid Build Coastguard Worker _values[i] = dictionary->_values[i]; 11131*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 11132*6777b538SAndroid Build Coastguard Worker } 11133*6777b538SAndroid Build Coastguard Worker } 11134*6777b538SAndroid Build Coastguard Worker } 11135*6777b538SAndroid Build Coastguard Worker } 11136*6777b538SAndroid Build Coastguard Worker return self; 11137*6777b538SAndroid Build Coastguard Worker} 11138*6777b538SAndroid Build Coastguard Worker 11139*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 11140*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 11141*6777b538SAndroid Build Coastguard Worker return [self initWithFloats:NULL forKeys:NULL count:0]; 11142*6777b538SAndroid Build Coastguard Worker} 11143*6777b538SAndroid Build Coastguard Worker 11144*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS) 11145*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 11146*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 11147*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 11148*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 11149*6777b538SAndroid Build Coastguard Worker [super dealloc]; 11150*6777b538SAndroid Build Coastguard Worker} 11151*6777b538SAndroid Build Coastguard Worker#endif // !defined(NS_BLOCK_ASSERTIONS) 11152*6777b538SAndroid Build Coastguard Worker 11153*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 11154*6777b538SAndroid Build Coastguard Worker return [[GPBBoolFloatDictionary allocWithZone:zone] initWithDictionary:self]; 11155*6777b538SAndroid Build Coastguard Worker} 11156*6777b538SAndroid Build Coastguard Worker 11157*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 11158*6777b538SAndroid Build Coastguard Worker if (self == other) { 11159*6777b538SAndroid Build Coastguard Worker return YES; 11160*6777b538SAndroid Build Coastguard Worker } 11161*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolFloatDictionary class]]) { 11162*6777b538SAndroid Build Coastguard Worker return NO; 11163*6777b538SAndroid Build Coastguard Worker } 11164*6777b538SAndroid Build Coastguard Worker GPBBoolFloatDictionary *otherDictionary = other; 11165*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] != otherDictionary->_valueSet[0]) || 11166*6777b538SAndroid Build Coastguard Worker (_valueSet[1] != otherDictionary->_valueSet[1])) { 11167*6777b538SAndroid Build Coastguard Worker return NO; 11168*6777b538SAndroid Build Coastguard Worker } 11169*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) || 11170*6777b538SAndroid Build Coastguard Worker (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) { 11171*6777b538SAndroid Build Coastguard Worker return NO; 11172*6777b538SAndroid Build Coastguard Worker } 11173*6777b538SAndroid Build Coastguard Worker return YES; 11174*6777b538SAndroid Build Coastguard Worker} 11175*6777b538SAndroid Build Coastguard Worker 11176*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 11177*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 11178*6777b538SAndroid Build Coastguard Worker} 11179*6777b538SAndroid Build Coastguard Worker 11180*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 11181*6777b538SAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 11182*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11183*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"NO: %f", _values[0]]; 11184*6777b538SAndroid Build Coastguard Worker } 11185*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 11186*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"YES: %f", _values[1]]; 11187*6777b538SAndroid Build Coastguard Worker } 11188*6777b538SAndroid Build Coastguard Worker [result appendString:@" }"]; 11189*6777b538SAndroid Build Coastguard Worker return result; 11190*6777b538SAndroid Build Coastguard Worker} 11191*6777b538SAndroid Build Coastguard Worker 11192*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 11193*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 11194*6777b538SAndroid Build Coastguard Worker} 11195*6777b538SAndroid Build Coastguard Worker 11196*6777b538SAndroid Build Coastguard Worker- (BOOL)getFloat:(float *)value forKey:(BOOL)key { 11197*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 11198*6777b538SAndroid Build Coastguard Worker if (_valueSet[idx]) { 11199*6777b538SAndroid Build Coastguard Worker if (value) { 11200*6777b538SAndroid Build Coastguard Worker *value = _values[idx]; 11201*6777b538SAndroid Build Coastguard Worker } 11202*6777b538SAndroid Build Coastguard Worker return YES; 11203*6777b538SAndroid Build Coastguard Worker } 11204*6777b538SAndroid Build Coastguard Worker return NO; 11205*6777b538SAndroid Build Coastguard Worker} 11206*6777b538SAndroid Build Coastguard Worker 11207*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 11208*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 11209*6777b538SAndroid Build Coastguard Worker int idx = (key->valueBool ? 1 : 0); 11210*6777b538SAndroid Build Coastguard Worker _values[idx] = value->valueFloat; 11211*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11212*6777b538SAndroid Build Coastguard Worker} 11213*6777b538SAndroid Build Coastguard Worker 11214*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 11215*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11216*6777b538SAndroid Build Coastguard Worker block(@"false", [NSString stringWithFormat:@"%.*g", FLT_DIG, _values[0]]); 11217*6777b538SAndroid Build Coastguard Worker } 11218*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 11219*6777b538SAndroid Build Coastguard Worker block(@"true", [NSString stringWithFormat:@"%.*g", FLT_DIG, _values[1]]); 11220*6777b538SAndroid Build Coastguard Worker } 11221*6777b538SAndroid Build Coastguard Worker} 11222*6777b538SAndroid Build Coastguard Worker 11223*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndFloatsUsingBlock: 11224*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, float value, BOOL *stop))block { 11225*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 11226*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11227*6777b538SAndroid Build Coastguard Worker block(NO, _values[0], &stop); 11228*6777b538SAndroid Build Coastguard Worker } 11229*6777b538SAndroid Build Coastguard Worker if (!stop && _valueSet[1]) { 11230*6777b538SAndroid Build Coastguard Worker block(YES, _values[1], &stop); 11231*6777b538SAndroid Build Coastguard Worker } 11232*6777b538SAndroid Build Coastguard Worker} 11233*6777b538SAndroid Build Coastguard Worker 11234*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 11235*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11236*6777b538SAndroid Build Coastguard Worker NSUInteger count = 0; 11237*6777b538SAndroid Build Coastguard Worker size_t result = 0; 11238*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11239*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 11240*6777b538SAndroid Build Coastguard Worker ++count; 11241*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11242*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11243*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 11244*6777b538SAndroid Build Coastguard Worker } 11245*6777b538SAndroid Build Coastguard Worker } 11246*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 11247*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 11248*6777b538SAndroid Build Coastguard Worker return result; 11249*6777b538SAndroid Build Coastguard Worker} 11250*6777b538SAndroid Build Coastguard Worker 11251*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 11252*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 11253*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11254*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 11255*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11256*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 11257*6777b538SAndroid Build Coastguard Worker // Write the tag. 11258*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 11259*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 11260*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11261*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictFloatFieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11262*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 11263*6777b538SAndroid Build Coastguard Worker // Write the fields. 11264*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11265*6777b538SAndroid Build Coastguard Worker WriteDictFloatField(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 11266*6777b538SAndroid Build Coastguard Worker } 11267*6777b538SAndroid Build Coastguard Worker } 11268*6777b538SAndroid Build Coastguard Worker} 11269*6777b538SAndroid Build Coastguard Worker 11270*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolFloatDictionary *)otherDictionary { 11271*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 11272*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11273*6777b538SAndroid Build Coastguard Worker if (otherDictionary->_valueSet[i]) { 11274*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 11275*6777b538SAndroid Build Coastguard Worker _values[i] = otherDictionary->_values[i]; 11276*6777b538SAndroid Build Coastguard Worker } 11277*6777b538SAndroid Build Coastguard Worker } 11278*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 11279*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 11280*6777b538SAndroid Build Coastguard Worker } 11281*6777b538SAndroid Build Coastguard Worker } 11282*6777b538SAndroid Build Coastguard Worker} 11283*6777b538SAndroid Build Coastguard Worker 11284*6777b538SAndroid Build Coastguard Worker- (void)setFloat:(float)value forKey:(BOOL)key { 11285*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 11286*6777b538SAndroid Build Coastguard Worker _values[idx] = value; 11287*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11288*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 11289*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 11290*6777b538SAndroid Build Coastguard Worker } 11291*6777b538SAndroid Build Coastguard Worker} 11292*6777b538SAndroid Build Coastguard Worker 11293*6777b538SAndroid Build Coastguard Worker- (void)removeFloatForKey:(BOOL)aKey { 11294*6777b538SAndroid Build Coastguard Worker _valueSet[aKey ? 1 : 0] = NO; 11295*6777b538SAndroid Build Coastguard Worker} 11296*6777b538SAndroid Build Coastguard Worker 11297*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 11298*6777b538SAndroid Build Coastguard Worker _valueSet[0] = NO; 11299*6777b538SAndroid Build Coastguard Worker _valueSet[1] = NO; 11300*6777b538SAndroid Build Coastguard Worker} 11301*6777b538SAndroid Build Coastguard Worker 11302*6777b538SAndroid Build Coastguard Worker@end 11303*6777b538SAndroid Build Coastguard Worker 11304*6777b538SAndroid Build Coastguard Worker// clang-format on 11305*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Double, double) 11306*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 11307*6777b538SAndroid Build Coastguard Worker// clang-format off 11308*6777b538SAndroid Build Coastguard Worker 11309*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Double 11310*6777b538SAndroid Build Coastguard Worker 11311*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolDoubleDictionary { 11312*6777b538SAndroid Build Coastguard Worker @package 11313*6777b538SAndroid Build Coastguard Worker double _values[2]; 11314*6777b538SAndroid Build Coastguard Worker BOOL _valueSet[2]; 11315*6777b538SAndroid Build Coastguard Worker} 11316*6777b538SAndroid Build Coastguard Worker 11317*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 11318*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 11319*6777b538SAndroid Build Coastguard Worker} 11320*6777b538SAndroid Build Coastguard Worker 11321*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDoubles:(const double [])values 11322*6777b538SAndroid Build Coastguard Worker forKeys:(const BOOL [])keys 11323*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 11324*6777b538SAndroid Build Coastguard Worker self = [super init]; 11325*6777b538SAndroid Build Coastguard Worker if (self) { 11326*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 11327*6777b538SAndroid Build Coastguard Worker int idx = keys[i] ? 1 : 0; 11328*6777b538SAndroid Build Coastguard Worker _values[idx] = values[i]; 11329*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11330*6777b538SAndroid Build Coastguard Worker } 11331*6777b538SAndroid Build Coastguard Worker } 11332*6777b538SAndroid Build Coastguard Worker return self; 11333*6777b538SAndroid Build Coastguard Worker} 11334*6777b538SAndroid Build Coastguard Worker 11335*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolDoubleDictionary *)dictionary { 11336*6777b538SAndroid Build Coastguard Worker self = [self initWithDoubles:NULL forKeys:NULL count:0]; 11337*6777b538SAndroid Build Coastguard Worker if (self) { 11338*6777b538SAndroid Build Coastguard Worker if (dictionary) { 11339*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11340*6777b538SAndroid Build Coastguard Worker if (dictionary->_valueSet[i]) { 11341*6777b538SAndroid Build Coastguard Worker _values[i] = dictionary->_values[i]; 11342*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 11343*6777b538SAndroid Build Coastguard Worker } 11344*6777b538SAndroid Build Coastguard Worker } 11345*6777b538SAndroid Build Coastguard Worker } 11346*6777b538SAndroid Build Coastguard Worker } 11347*6777b538SAndroid Build Coastguard Worker return self; 11348*6777b538SAndroid Build Coastguard Worker} 11349*6777b538SAndroid Build Coastguard Worker 11350*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 11351*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 11352*6777b538SAndroid Build Coastguard Worker return [self initWithDoubles:NULL forKeys:NULL count:0]; 11353*6777b538SAndroid Build Coastguard Worker} 11354*6777b538SAndroid Build Coastguard Worker 11355*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS) 11356*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 11357*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 11358*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 11359*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 11360*6777b538SAndroid Build Coastguard Worker [super dealloc]; 11361*6777b538SAndroid Build Coastguard Worker} 11362*6777b538SAndroid Build Coastguard Worker#endif // !defined(NS_BLOCK_ASSERTIONS) 11363*6777b538SAndroid Build Coastguard Worker 11364*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 11365*6777b538SAndroid Build Coastguard Worker return [[GPBBoolDoubleDictionary allocWithZone:zone] initWithDictionary:self]; 11366*6777b538SAndroid Build Coastguard Worker} 11367*6777b538SAndroid Build Coastguard Worker 11368*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 11369*6777b538SAndroid Build Coastguard Worker if (self == other) { 11370*6777b538SAndroid Build Coastguard Worker return YES; 11371*6777b538SAndroid Build Coastguard Worker } 11372*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolDoubleDictionary class]]) { 11373*6777b538SAndroid Build Coastguard Worker return NO; 11374*6777b538SAndroid Build Coastguard Worker } 11375*6777b538SAndroid Build Coastguard Worker GPBBoolDoubleDictionary *otherDictionary = other; 11376*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] != otherDictionary->_valueSet[0]) || 11377*6777b538SAndroid Build Coastguard Worker (_valueSet[1] != otherDictionary->_valueSet[1])) { 11378*6777b538SAndroid Build Coastguard Worker return NO; 11379*6777b538SAndroid Build Coastguard Worker } 11380*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) || 11381*6777b538SAndroid Build Coastguard Worker (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) { 11382*6777b538SAndroid Build Coastguard Worker return NO; 11383*6777b538SAndroid Build Coastguard Worker } 11384*6777b538SAndroid Build Coastguard Worker return YES; 11385*6777b538SAndroid Build Coastguard Worker} 11386*6777b538SAndroid Build Coastguard Worker 11387*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 11388*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 11389*6777b538SAndroid Build Coastguard Worker} 11390*6777b538SAndroid Build Coastguard Worker 11391*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 11392*6777b538SAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 11393*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11394*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"NO: %lf", _values[0]]; 11395*6777b538SAndroid Build Coastguard Worker } 11396*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 11397*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"YES: %lf", _values[1]]; 11398*6777b538SAndroid Build Coastguard Worker } 11399*6777b538SAndroid Build Coastguard Worker [result appendString:@" }"]; 11400*6777b538SAndroid Build Coastguard Worker return result; 11401*6777b538SAndroid Build Coastguard Worker} 11402*6777b538SAndroid Build Coastguard Worker 11403*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 11404*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 11405*6777b538SAndroid Build Coastguard Worker} 11406*6777b538SAndroid Build Coastguard Worker 11407*6777b538SAndroid Build Coastguard Worker- (BOOL)getDouble:(double *)value forKey:(BOOL)key { 11408*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 11409*6777b538SAndroid Build Coastguard Worker if (_valueSet[idx]) { 11410*6777b538SAndroid Build Coastguard Worker if (value) { 11411*6777b538SAndroid Build Coastguard Worker *value = _values[idx]; 11412*6777b538SAndroid Build Coastguard Worker } 11413*6777b538SAndroid Build Coastguard Worker return YES; 11414*6777b538SAndroid Build Coastguard Worker } 11415*6777b538SAndroid Build Coastguard Worker return NO; 11416*6777b538SAndroid Build Coastguard Worker} 11417*6777b538SAndroid Build Coastguard Worker 11418*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 11419*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 11420*6777b538SAndroid Build Coastguard Worker int idx = (key->valueBool ? 1 : 0); 11421*6777b538SAndroid Build Coastguard Worker _values[idx] = value->valueDouble; 11422*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11423*6777b538SAndroid Build Coastguard Worker} 11424*6777b538SAndroid Build Coastguard Worker 11425*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 11426*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11427*6777b538SAndroid Build Coastguard Worker block(@"false", [NSString stringWithFormat:@"%.*lg", DBL_DIG, _values[0]]); 11428*6777b538SAndroid Build Coastguard Worker } 11429*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 11430*6777b538SAndroid Build Coastguard Worker block(@"true", [NSString stringWithFormat:@"%.*lg", DBL_DIG, _values[1]]); 11431*6777b538SAndroid Build Coastguard Worker } 11432*6777b538SAndroid Build Coastguard Worker} 11433*6777b538SAndroid Build Coastguard Worker 11434*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndDoublesUsingBlock: 11435*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, double value, BOOL *stop))block { 11436*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 11437*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11438*6777b538SAndroid Build Coastguard Worker block(NO, _values[0], &stop); 11439*6777b538SAndroid Build Coastguard Worker } 11440*6777b538SAndroid Build Coastguard Worker if (!stop && _valueSet[1]) { 11441*6777b538SAndroid Build Coastguard Worker block(YES, _values[1], &stop); 11442*6777b538SAndroid Build Coastguard Worker } 11443*6777b538SAndroid Build Coastguard Worker} 11444*6777b538SAndroid Build Coastguard Worker 11445*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 11446*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11447*6777b538SAndroid Build Coastguard Worker NSUInteger count = 0; 11448*6777b538SAndroid Build Coastguard Worker size_t result = 0; 11449*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11450*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 11451*6777b538SAndroid Build Coastguard Worker ++count; 11452*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11453*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11454*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 11455*6777b538SAndroid Build Coastguard Worker } 11456*6777b538SAndroid Build Coastguard Worker } 11457*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 11458*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 11459*6777b538SAndroid Build Coastguard Worker return result; 11460*6777b538SAndroid Build Coastguard Worker} 11461*6777b538SAndroid Build Coastguard Worker 11462*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 11463*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 11464*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11465*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 11466*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11467*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 11468*6777b538SAndroid Build Coastguard Worker // Write the tag. 11469*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 11470*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 11471*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11472*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictDoubleFieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11473*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 11474*6777b538SAndroid Build Coastguard Worker // Write the fields. 11475*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11476*6777b538SAndroid Build Coastguard Worker WriteDictDoubleField(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 11477*6777b538SAndroid Build Coastguard Worker } 11478*6777b538SAndroid Build Coastguard Worker } 11479*6777b538SAndroid Build Coastguard Worker} 11480*6777b538SAndroid Build Coastguard Worker 11481*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolDoubleDictionary *)otherDictionary { 11482*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 11483*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11484*6777b538SAndroid Build Coastguard Worker if (otherDictionary->_valueSet[i]) { 11485*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 11486*6777b538SAndroid Build Coastguard Worker _values[i] = otherDictionary->_values[i]; 11487*6777b538SAndroid Build Coastguard Worker } 11488*6777b538SAndroid Build Coastguard Worker } 11489*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 11490*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 11491*6777b538SAndroid Build Coastguard Worker } 11492*6777b538SAndroid Build Coastguard Worker } 11493*6777b538SAndroid Build Coastguard Worker} 11494*6777b538SAndroid Build Coastguard Worker 11495*6777b538SAndroid Build Coastguard Worker- (void)setDouble:(double)value forKey:(BOOL)key { 11496*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 11497*6777b538SAndroid Build Coastguard Worker _values[idx] = value; 11498*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11499*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 11500*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 11501*6777b538SAndroid Build Coastguard Worker } 11502*6777b538SAndroid Build Coastguard Worker} 11503*6777b538SAndroid Build Coastguard Worker 11504*6777b538SAndroid Build Coastguard Worker- (void)removeDoubleForKey:(BOOL)aKey { 11505*6777b538SAndroid Build Coastguard Worker _valueSet[aKey ? 1 : 0] = NO; 11506*6777b538SAndroid Build Coastguard Worker} 11507*6777b538SAndroid Build Coastguard Worker 11508*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 11509*6777b538SAndroid Build Coastguard Worker _valueSet[0] = NO; 11510*6777b538SAndroid Build Coastguard Worker _valueSet[1] = NO; 11511*6777b538SAndroid Build Coastguard Worker} 11512*6777b538SAndroid Build Coastguard Worker 11513*6777b538SAndroid Build Coastguard Worker@end 11514*6777b538SAndroid Build Coastguard Worker 11515*6777b538SAndroid Build Coastguard Worker// clang-format on 11516*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(Object, id) 11517*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 11518*6777b538SAndroid Build Coastguard Worker// clang-format off 11519*6777b538SAndroid Build Coastguard Worker 11520*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Object 11521*6777b538SAndroid Build Coastguard Worker 11522*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolObjectDictionary { 11523*6777b538SAndroid Build Coastguard Worker @package 11524*6777b538SAndroid Build Coastguard Worker id _values[2]; 11525*6777b538SAndroid Build Coastguard Worker} 11526*6777b538SAndroid Build Coastguard Worker 11527*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 11528*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 11529*6777b538SAndroid Build Coastguard Worker} 11530*6777b538SAndroid Build Coastguard Worker 11531*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects 11532*6777b538SAndroid Build Coastguard Worker forKeys:(const BOOL [])keys 11533*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 11534*6777b538SAndroid Build Coastguard Worker self = [super init]; 11535*6777b538SAndroid Build Coastguard Worker if (self) { 11536*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 11537*6777b538SAndroid Build Coastguard Worker if (!objects[i]) { 11538*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 11539*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 11540*6777b538SAndroid Build Coastguard Worker } 11541*6777b538SAndroid Build Coastguard Worker int idx = keys[i] ? 1 : 0; 11542*6777b538SAndroid Build Coastguard Worker [_values[idx] release]; 11543*6777b538SAndroid Build Coastguard Worker _values[idx] = (id)[objects[i] retain]; 11544*6777b538SAndroid Build Coastguard Worker } 11545*6777b538SAndroid Build Coastguard Worker } 11546*6777b538SAndroid Build Coastguard Worker return self; 11547*6777b538SAndroid Build Coastguard Worker} 11548*6777b538SAndroid Build Coastguard Worker 11549*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolObjectDictionary *)dictionary { 11550*6777b538SAndroid Build Coastguard Worker self = [self initWithObjects:NULL forKeys:NULL count:0]; 11551*6777b538SAndroid Build Coastguard Worker if (self) { 11552*6777b538SAndroid Build Coastguard Worker if (dictionary) { 11553*6777b538SAndroid Build Coastguard Worker _values[0] = [dictionary->_values[0] retain]; 11554*6777b538SAndroid Build Coastguard Worker _values[1] = [dictionary->_values[1] retain]; 11555*6777b538SAndroid Build Coastguard Worker } 11556*6777b538SAndroid Build Coastguard Worker } 11557*6777b538SAndroid Build Coastguard Worker return self; 11558*6777b538SAndroid Build Coastguard Worker} 11559*6777b538SAndroid Build Coastguard Worker 11560*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)numItems { 11561*6777b538SAndroid Build Coastguard Worker #pragma unused(numItems) 11562*6777b538SAndroid Build Coastguard Worker return [self initWithObjects:NULL forKeys:NULL count:0]; 11563*6777b538SAndroid Build Coastguard Worker} 11564*6777b538SAndroid Build Coastguard Worker 11565*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 11566*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 11567*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 11568*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 11569*6777b538SAndroid Build Coastguard Worker [_values[0] release]; 11570*6777b538SAndroid Build Coastguard Worker [_values[1] release]; 11571*6777b538SAndroid Build Coastguard Worker [super dealloc]; 11572*6777b538SAndroid Build Coastguard Worker} 11573*6777b538SAndroid Build Coastguard Worker 11574*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 11575*6777b538SAndroid Build Coastguard Worker return [[GPBBoolObjectDictionary allocWithZone:zone] initWithDictionary:self]; 11576*6777b538SAndroid Build Coastguard Worker} 11577*6777b538SAndroid Build Coastguard Worker 11578*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 11579*6777b538SAndroid Build Coastguard Worker if (self == other) { 11580*6777b538SAndroid Build Coastguard Worker return YES; 11581*6777b538SAndroid Build Coastguard Worker } 11582*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolObjectDictionary class]]) { 11583*6777b538SAndroid Build Coastguard Worker return NO; 11584*6777b538SAndroid Build Coastguard Worker } 11585*6777b538SAndroid Build Coastguard Worker GPBBoolObjectDictionary *otherDictionary = other; 11586*6777b538SAndroid Build Coastguard Worker if (((_values[0] != nil) != (otherDictionary->_values[0] != nil)) || 11587*6777b538SAndroid Build Coastguard Worker ((_values[1] != nil) != (otherDictionary->_values[1] != nil))) { 11588*6777b538SAndroid Build Coastguard Worker return NO; 11589*6777b538SAndroid Build Coastguard Worker } 11590*6777b538SAndroid Build Coastguard Worker if (((_values[0] != nil) && (![_values[0] isEqual:otherDictionary->_values[0]])) || 11591*6777b538SAndroid Build Coastguard Worker ((_values[1] != nil) && (![_values[1] isEqual:otherDictionary->_values[1]]))) { 11592*6777b538SAndroid Build Coastguard Worker return NO; 11593*6777b538SAndroid Build Coastguard Worker } 11594*6777b538SAndroid Build Coastguard Worker return YES; 11595*6777b538SAndroid Build Coastguard Worker} 11596*6777b538SAndroid Build Coastguard Worker 11597*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 11598*6777b538SAndroid Build Coastguard Worker return ((_values[0] != nil) ? 1 : 0) + ((_values[1] != nil) ? 1 : 0); 11599*6777b538SAndroid Build Coastguard Worker} 11600*6777b538SAndroid Build Coastguard Worker 11601*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 11602*6777b538SAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 11603*6777b538SAndroid Build Coastguard Worker if ((_values[0] != nil)) { 11604*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"NO: %@", _values[0]]; 11605*6777b538SAndroid Build Coastguard Worker } 11606*6777b538SAndroid Build Coastguard Worker if ((_values[1] != nil)) { 11607*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"YES: %@", _values[1]]; 11608*6777b538SAndroid Build Coastguard Worker } 11609*6777b538SAndroid Build Coastguard Worker [result appendString:@" }"]; 11610*6777b538SAndroid Build Coastguard Worker return result; 11611*6777b538SAndroid Build Coastguard Worker} 11612*6777b538SAndroid Build Coastguard Worker 11613*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 11614*6777b538SAndroid Build Coastguard Worker return ((_values[0] != nil) ? 1 : 0) + ((_values[1] != nil) ? 1 : 0); 11615*6777b538SAndroid Build Coastguard Worker} 11616*6777b538SAndroid Build Coastguard Worker 11617*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(BOOL)key { 11618*6777b538SAndroid Build Coastguard Worker return _values[key ? 1 : 0]; 11619*6777b538SAndroid Build Coastguard Worker} 11620*6777b538SAndroid Build Coastguard Worker 11621*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 11622*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 11623*6777b538SAndroid Build Coastguard Worker int idx = (key->valueBool ? 1 : 0); 11624*6777b538SAndroid Build Coastguard Worker [_values[idx] release]; 11625*6777b538SAndroid Build Coastguard Worker _values[idx] = [value->valueString retain]; 11626*6777b538SAndroid Build Coastguard Worker} 11627*6777b538SAndroid Build Coastguard Worker 11628*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 11629*6777b538SAndroid Build Coastguard Worker if (_values[0] != nil) { 11630*6777b538SAndroid Build Coastguard Worker block(@"false", _values[0]); 11631*6777b538SAndroid Build Coastguard Worker } 11632*6777b538SAndroid Build Coastguard Worker if ((_values[1] != nil)) { 11633*6777b538SAndroid Build Coastguard Worker block(@"true", _values[1]); 11634*6777b538SAndroid Build Coastguard Worker } 11635*6777b538SAndroid Build Coastguard Worker} 11636*6777b538SAndroid Build Coastguard Worker 11637*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock: 11638*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, id object, BOOL *stop))block { 11639*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 11640*6777b538SAndroid Build Coastguard Worker if (_values[0] != nil) { 11641*6777b538SAndroid Build Coastguard Worker block(NO, _values[0], &stop); 11642*6777b538SAndroid Build Coastguard Worker } 11643*6777b538SAndroid Build Coastguard Worker if (!stop && (_values[1] != nil)) { 11644*6777b538SAndroid Build Coastguard Worker block(YES, _values[1], &stop); 11645*6777b538SAndroid Build Coastguard Worker } 11646*6777b538SAndroid Build Coastguard Worker} 11647*6777b538SAndroid Build Coastguard Worker 11648*6777b538SAndroid Build Coastguard Worker- (BOOL)isInitialized { 11649*6777b538SAndroid Build Coastguard Worker if (_values[0] && ![_values[0] isInitialized]) { 11650*6777b538SAndroid Build Coastguard Worker return NO; 11651*6777b538SAndroid Build Coastguard Worker } 11652*6777b538SAndroid Build Coastguard Worker if (_values[1] && ![_values[1] isInitialized]) { 11653*6777b538SAndroid Build Coastguard Worker return NO; 11654*6777b538SAndroid Build Coastguard Worker } 11655*6777b538SAndroid Build Coastguard Worker return YES; 11656*6777b538SAndroid Build Coastguard Worker} 11657*6777b538SAndroid Build Coastguard Worker 11658*6777b538SAndroid Build Coastguard Worker- (instancetype)deepCopyWithZone:(NSZone *)zone { 11659*6777b538SAndroid Build Coastguard Worker GPBBoolObjectDictionary *newDict = 11660*6777b538SAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] init]; 11661*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11662*6777b538SAndroid Build Coastguard Worker if (_values[i] != nil) { 11663*6777b538SAndroid Build Coastguard Worker newDict->_values[i] = [_values[i] copyWithZone:zone]; 11664*6777b538SAndroid Build Coastguard Worker } 11665*6777b538SAndroid Build Coastguard Worker } 11666*6777b538SAndroid Build Coastguard Worker return newDict; 11667*6777b538SAndroid Build Coastguard Worker} 11668*6777b538SAndroid Build Coastguard Worker 11669*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 11670*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11671*6777b538SAndroid Build Coastguard Worker NSUInteger count = 0; 11672*6777b538SAndroid Build Coastguard Worker size_t result = 0; 11673*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11674*6777b538SAndroid Build Coastguard Worker if (_values[i] != nil) { 11675*6777b538SAndroid Build Coastguard Worker ++count; 11676*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11677*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11678*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 11679*6777b538SAndroid Build Coastguard Worker } 11680*6777b538SAndroid Build Coastguard Worker } 11681*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 11682*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 11683*6777b538SAndroid Build Coastguard Worker return result; 11684*6777b538SAndroid Build Coastguard Worker} 11685*6777b538SAndroid Build Coastguard Worker 11686*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 11687*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 11688*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11689*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 11690*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11691*6777b538SAndroid Build Coastguard Worker if (_values[i] != nil) { 11692*6777b538SAndroid Build Coastguard Worker // Write the tag. 11693*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 11694*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 11695*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11696*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictObjectFieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11697*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 11698*6777b538SAndroid Build Coastguard Worker // Write the fields. 11699*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11700*6777b538SAndroid Build Coastguard Worker WriteDictObjectField(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 11701*6777b538SAndroid Build Coastguard Worker } 11702*6777b538SAndroid Build Coastguard Worker } 11703*6777b538SAndroid Build Coastguard Worker} 11704*6777b538SAndroid Build Coastguard Worker 11705*6777b538SAndroid Build Coastguard Worker- (void)addEntriesFromDictionary:(GPBBoolObjectDictionary *)otherDictionary { 11706*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 11707*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11708*6777b538SAndroid Build Coastguard Worker if (otherDictionary->_values[i] != nil) { 11709*6777b538SAndroid Build Coastguard Worker [_values[i] release]; 11710*6777b538SAndroid Build Coastguard Worker _values[i] = [otherDictionary->_values[i] retain]; 11711*6777b538SAndroid Build Coastguard Worker } 11712*6777b538SAndroid Build Coastguard Worker } 11713*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 11714*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 11715*6777b538SAndroid Build Coastguard Worker } 11716*6777b538SAndroid Build Coastguard Worker } 11717*6777b538SAndroid Build Coastguard Worker} 11718*6777b538SAndroid Build Coastguard Worker 11719*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)object forKey:(BOOL)key { 11720*6777b538SAndroid Build Coastguard Worker if (!object) { 11721*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 11722*6777b538SAndroid Build Coastguard Worker format:@"Attempting to add nil object to a Dictionary"]; 11723*6777b538SAndroid Build Coastguard Worker } 11724*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 11725*6777b538SAndroid Build Coastguard Worker [_values[idx] release]; 11726*6777b538SAndroid Build Coastguard Worker _values[idx] = [object retain]; 11727*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 11728*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 11729*6777b538SAndroid Build Coastguard Worker } 11730*6777b538SAndroid Build Coastguard Worker} 11731*6777b538SAndroid Build Coastguard Worker 11732*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(BOOL)aKey { 11733*6777b538SAndroid Build Coastguard Worker int idx = (aKey ? 1 : 0); 11734*6777b538SAndroid Build Coastguard Worker [_values[idx] release]; 11735*6777b538SAndroid Build Coastguard Worker _values[idx] = nil; 11736*6777b538SAndroid Build Coastguard Worker} 11737*6777b538SAndroid Build Coastguard Worker 11738*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 11739*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11740*6777b538SAndroid Build Coastguard Worker [_values[i] release]; 11741*6777b538SAndroid Build Coastguard Worker _values[i] = nil; 11742*6777b538SAndroid Build Coastguard Worker } 11743*6777b538SAndroid Build Coastguard Worker} 11744*6777b538SAndroid Build Coastguard Worker 11745*6777b538SAndroid Build Coastguard Worker@end 11746*6777b538SAndroid Build Coastguard Worker 11747*6777b538SAndroid Build Coastguard Worker// clang-format on 11748*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND-END (8 expansions) 11749*6777b538SAndroid Build Coastguard Worker 11750*6777b538SAndroid Build Coastguard Worker#pragma mark - Bool -> Enum 11751*6777b538SAndroid Build Coastguard Worker 11752*6777b538SAndroid Build Coastguard Worker@implementation GPBBoolEnumDictionary { 11753*6777b538SAndroid Build Coastguard Worker @package 11754*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc _validationFunc; 11755*6777b538SAndroid Build Coastguard Worker int32_t _values[2]; 11756*6777b538SAndroid Build Coastguard Worker BOOL _valueSet[2]; 11757*6777b538SAndroid Build Coastguard Worker} 11758*6777b538SAndroid Build Coastguard Worker 11759*6777b538SAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc; 11760*6777b538SAndroid Build Coastguard Worker 11761*6777b538SAndroid Build Coastguard Worker- (instancetype)init { 11762*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:NULL rawValues:NULL forKeys:NULL count:0]; 11763*6777b538SAndroid Build Coastguard Worker} 11764*6777b538SAndroid Build Coastguard Worker 11765*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func { 11766*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 11767*6777b538SAndroid Build Coastguard Worker} 11768*6777b538SAndroid Build Coastguard Worker 11769*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 11770*6777b538SAndroid Build Coastguard Worker rawValues:(const int32_t [])rawValues 11771*6777b538SAndroid Build Coastguard Worker forKeys:(const BOOL [])keys 11772*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 11773*6777b538SAndroid Build Coastguard Worker self = [super init]; 11774*6777b538SAndroid Build Coastguard Worker if (self) { 11775*6777b538SAndroid Build Coastguard Worker _validationFunc = (func != NULL ? func : DictDefault_IsValidValue); 11776*6777b538SAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 11777*6777b538SAndroid Build Coastguard Worker int idx = keys[i] ? 1 : 0; 11778*6777b538SAndroid Build Coastguard Worker _values[idx] = rawValues[i]; 11779*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11780*6777b538SAndroid Build Coastguard Worker } 11781*6777b538SAndroid Build Coastguard Worker } 11782*6777b538SAndroid Build Coastguard Worker return self; 11783*6777b538SAndroid Build Coastguard Worker} 11784*6777b538SAndroid Build Coastguard Worker 11785*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithDictionary:(GPBBoolEnumDictionary *)dictionary { 11786*6777b538SAndroid Build Coastguard Worker self = [self initWithValidationFunction:dictionary.validationFunc 11787*6777b538SAndroid Build Coastguard Worker rawValues:NULL 11788*6777b538SAndroid Build Coastguard Worker forKeys:NULL 11789*6777b538SAndroid Build Coastguard Worker count:0]; 11790*6777b538SAndroid Build Coastguard Worker if (self) { 11791*6777b538SAndroid Build Coastguard Worker if (dictionary) { 11792*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11793*6777b538SAndroid Build Coastguard Worker if (dictionary->_valueSet[i]) { 11794*6777b538SAndroid Build Coastguard Worker _values[i] = dictionary->_values[i]; 11795*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 11796*6777b538SAndroid Build Coastguard Worker } 11797*6777b538SAndroid Build Coastguard Worker } 11798*6777b538SAndroid Build Coastguard Worker } 11799*6777b538SAndroid Build Coastguard Worker } 11800*6777b538SAndroid Build Coastguard Worker return self; 11801*6777b538SAndroid Build Coastguard Worker} 11802*6777b538SAndroid Build Coastguard Worker 11803*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 11804*6777b538SAndroid Build Coastguard Worker capacity:(NSUInteger)numItems { 11805*6777b538SAndroid Build Coastguard Worker#pragma unused(numItems) 11806*6777b538SAndroid Build Coastguard Worker return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0]; 11807*6777b538SAndroid Build Coastguard Worker} 11808*6777b538SAndroid Build Coastguard Worker 11809*6777b538SAndroid Build Coastguard Worker#if !defined(NS_BLOCK_ASSERTIONS) 11810*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 11811*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 11812*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 11813*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 11814*6777b538SAndroid Build Coastguard Worker [super dealloc]; 11815*6777b538SAndroid Build Coastguard Worker} 11816*6777b538SAndroid Build Coastguard Worker#endif // !defined(NS_BLOCK_ASSERTIONS) 11817*6777b538SAndroid Build Coastguard Worker 11818*6777b538SAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 11819*6777b538SAndroid Build Coastguard Worker return [[GPBBoolEnumDictionary allocWithZone:zone] initWithDictionary:self]; 11820*6777b538SAndroid Build Coastguard Worker} 11821*6777b538SAndroid Build Coastguard Worker 11822*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 11823*6777b538SAndroid Build Coastguard Worker if (self == other) { 11824*6777b538SAndroid Build Coastguard Worker return YES; 11825*6777b538SAndroid Build Coastguard Worker } 11826*6777b538SAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolEnumDictionary class]]) { 11827*6777b538SAndroid Build Coastguard Worker return NO; 11828*6777b538SAndroid Build Coastguard Worker } 11829*6777b538SAndroid Build Coastguard Worker GPBBoolEnumDictionary *otherDictionary = other; 11830*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] != otherDictionary->_valueSet[0]) || 11831*6777b538SAndroid Build Coastguard Worker (_valueSet[1] != otherDictionary->_valueSet[1])) { 11832*6777b538SAndroid Build Coastguard Worker return NO; 11833*6777b538SAndroid Build Coastguard Worker } 11834*6777b538SAndroid Build Coastguard Worker if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) || 11835*6777b538SAndroid Build Coastguard Worker (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) { 11836*6777b538SAndroid Build Coastguard Worker return NO; 11837*6777b538SAndroid Build Coastguard Worker } 11838*6777b538SAndroid Build Coastguard Worker return YES; 11839*6777b538SAndroid Build Coastguard Worker} 11840*6777b538SAndroid Build Coastguard Worker 11841*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash { 11842*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 11843*6777b538SAndroid Build Coastguard Worker} 11844*6777b538SAndroid Build Coastguard Worker 11845*6777b538SAndroid Build Coastguard Worker- (NSString *)description { 11846*6777b538SAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> {", [self class], self]; 11847*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11848*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"NO: %d", _values[0]]; 11849*6777b538SAndroid Build Coastguard Worker } 11850*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 11851*6777b538SAndroid Build Coastguard Worker [result appendFormat:@"YES: %d", _values[1]]; 11852*6777b538SAndroid Build Coastguard Worker } 11853*6777b538SAndroid Build Coastguard Worker [result appendString:@" }"]; 11854*6777b538SAndroid Build Coastguard Worker return result; 11855*6777b538SAndroid Build Coastguard Worker} 11856*6777b538SAndroid Build Coastguard Worker 11857*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 11858*6777b538SAndroid Build Coastguard Worker return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0); 11859*6777b538SAndroid Build Coastguard Worker} 11860*6777b538SAndroid Build Coastguard Worker 11861*6777b538SAndroid Build Coastguard Worker- (BOOL)getEnum:(int32_t*)value forKey:(BOOL)key { 11862*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 11863*6777b538SAndroid Build Coastguard Worker if (_valueSet[idx]) { 11864*6777b538SAndroid Build Coastguard Worker if (value) { 11865*6777b538SAndroid Build Coastguard Worker int32_t result = _values[idx]; 11866*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(result)) { 11867*6777b538SAndroid Build Coastguard Worker result = kGPBUnrecognizedEnumeratorValue; 11868*6777b538SAndroid Build Coastguard Worker } 11869*6777b538SAndroid Build Coastguard Worker *value = result; 11870*6777b538SAndroid Build Coastguard Worker } 11871*6777b538SAndroid Build Coastguard Worker return YES; 11872*6777b538SAndroid Build Coastguard Worker } 11873*6777b538SAndroid Build Coastguard Worker return NO; 11874*6777b538SAndroid Build Coastguard Worker} 11875*6777b538SAndroid Build Coastguard Worker 11876*6777b538SAndroid Build Coastguard Worker- (BOOL)getRawValue:(int32_t*)rawValue forKey:(BOOL)key { 11877*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 11878*6777b538SAndroid Build Coastguard Worker if (_valueSet[idx]) { 11879*6777b538SAndroid Build Coastguard Worker if (rawValue) { 11880*6777b538SAndroid Build Coastguard Worker *rawValue = _values[idx]; 11881*6777b538SAndroid Build Coastguard Worker } 11882*6777b538SAndroid Build Coastguard Worker return YES; 11883*6777b538SAndroid Build Coastguard Worker } 11884*6777b538SAndroid Build Coastguard Worker return NO; 11885*6777b538SAndroid Build Coastguard Worker} 11886*6777b538SAndroid Build Coastguard Worker 11887*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndRawValuesUsingBlock: 11888*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, int32_t value, BOOL *stop))block { 11889*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 11890*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11891*6777b538SAndroid Build Coastguard Worker block(NO, _values[0], &stop); 11892*6777b538SAndroid Build Coastguard Worker } 11893*6777b538SAndroid Build Coastguard Worker if (!stop && _valueSet[1]) { 11894*6777b538SAndroid Build Coastguard Worker block(YES, _values[1], &stop); 11895*6777b538SAndroid Build Coastguard Worker } 11896*6777b538SAndroid Build Coastguard Worker} 11897*6777b538SAndroid Build Coastguard Worker 11898*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndEnumsUsingBlock: 11899*6777b538SAndroid Build Coastguard Worker (void (NS_NOESCAPE ^)(BOOL key, int32_t rawValue, BOOL *stop))block { 11900*6777b538SAndroid Build Coastguard Worker BOOL stop = NO; 11901*6777b538SAndroid Build Coastguard Worker GPBEnumValidationFunc func = _validationFunc; 11902*6777b538SAndroid Build Coastguard Worker int32_t validatedValue; 11903*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11904*6777b538SAndroid Build Coastguard Worker validatedValue = _values[0]; 11905*6777b538SAndroid Build Coastguard Worker if (!func(validatedValue)) { 11906*6777b538SAndroid Build Coastguard Worker validatedValue = kGPBUnrecognizedEnumeratorValue; 11907*6777b538SAndroid Build Coastguard Worker } 11908*6777b538SAndroid Build Coastguard Worker block(NO, validatedValue, &stop); 11909*6777b538SAndroid Build Coastguard Worker } 11910*6777b538SAndroid Build Coastguard Worker if (!stop && _valueSet[1]) { 11911*6777b538SAndroid Build Coastguard Worker validatedValue = _values[1]; 11912*6777b538SAndroid Build Coastguard Worker if (!func(validatedValue)) { 11913*6777b538SAndroid Build Coastguard Worker validatedValue = kGPBUnrecognizedEnumeratorValue; 11914*6777b538SAndroid Build Coastguard Worker } 11915*6777b538SAndroid Build Coastguard Worker block(YES, validatedValue, &stop); 11916*6777b538SAndroid Build Coastguard Worker } 11917*6777b538SAndroid Build Coastguard Worker} 11918*6777b538SAndroid Build Coastguard Worker 11919*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool) 11920*6777b538SAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 11921*6777b538SAndroid Build Coastguard Worker// clang-format off 11922*6777b538SAndroid Build Coastguard Worker 11923*6777b538SAndroid Build Coastguard Worker- (NSData *)serializedDataForUnknownValue:(int32_t)value 11924*6777b538SAndroid Build Coastguard Worker forKey:(GPBGenericValue *)key 11925*6777b538SAndroid Build Coastguard Worker keyDataType:(GPBDataType)keyDataType { 11926*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize(key->valueBool, kMapKeyFieldNumber, keyDataType); 11927*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictEnumFieldSize(value, kMapValueFieldNumber, GPBDataTypeEnum); 11928*6777b538SAndroid Build Coastguard Worker NSMutableData *data = [NSMutableData dataWithLength:msgSize]; 11929*6777b538SAndroid Build Coastguard Worker GPBCodedOutputStream *outputStream = [[GPBCodedOutputStream alloc] initWithData:data]; 11930*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, key->valueBool, kMapKeyFieldNumber, keyDataType); 11931*6777b538SAndroid Build Coastguard Worker WriteDictEnumField(outputStream, value, kMapValueFieldNumber, GPBDataTypeEnum); 11932*6777b538SAndroid Build Coastguard Worker [outputStream release]; 11933*6777b538SAndroid Build Coastguard Worker return data; 11934*6777b538SAndroid Build Coastguard Worker} 11935*6777b538SAndroid Build Coastguard Worker 11936*6777b538SAndroid Build Coastguard Worker// clang-format on 11937*6777b538SAndroid Build Coastguard Worker//%PDDM-EXPAND-END SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool) 11938*6777b538SAndroid Build Coastguard Worker 11939*6777b538SAndroid Build Coastguard Worker- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field { 11940*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11941*6777b538SAndroid Build Coastguard Worker NSUInteger count = 0; 11942*6777b538SAndroid Build Coastguard Worker size_t result = 0; 11943*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11944*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 11945*6777b538SAndroid Build Coastguard Worker ++count; 11946*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11947*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11948*6777b538SAndroid Build Coastguard Worker result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize; 11949*6777b538SAndroid Build Coastguard Worker } 11950*6777b538SAndroid Build Coastguard Worker } 11951*6777b538SAndroid Build Coastguard Worker size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage); 11952*6777b538SAndroid Build Coastguard Worker result += tagSize * count; 11953*6777b538SAndroid Build Coastguard Worker return result; 11954*6777b538SAndroid Build Coastguard Worker} 11955*6777b538SAndroid Build Coastguard Worker 11956*6777b538SAndroid Build Coastguard Worker- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream 11957*6777b538SAndroid Build Coastguard Worker asField:(GPBFieldDescriptor *)field { 11958*6777b538SAndroid Build Coastguard Worker GPBDataType valueDataType = GPBGetFieldDataType(field); 11959*6777b538SAndroid Build Coastguard Worker uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited); 11960*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11961*6777b538SAndroid Build Coastguard Worker if (_valueSet[i]) { 11962*6777b538SAndroid Build Coastguard Worker // Write the tag. 11963*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:tag]; 11964*6777b538SAndroid Build Coastguard Worker // Write the size of the message. 11965*6777b538SAndroid Build Coastguard Worker size_t msgSize = ComputeDictBoolFieldSize((i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11966*6777b538SAndroid Build Coastguard Worker msgSize += ComputeDictInt32FieldSize(_values[i], kMapValueFieldNumber, valueDataType); 11967*6777b538SAndroid Build Coastguard Worker [outputStream writeInt32NoTag:(int32_t)msgSize]; 11968*6777b538SAndroid Build Coastguard Worker // Write the fields. 11969*6777b538SAndroid Build Coastguard Worker WriteDictBoolField(outputStream, (i == 1), kMapKeyFieldNumber, GPBDataTypeBool); 11970*6777b538SAndroid Build Coastguard Worker WriteDictInt32Field(outputStream, _values[i], kMapValueFieldNumber, valueDataType); 11971*6777b538SAndroid Build Coastguard Worker } 11972*6777b538SAndroid Build Coastguard Worker } 11973*6777b538SAndroid Build Coastguard Worker} 11974*6777b538SAndroid Build Coastguard Worker 11975*6777b538SAndroid Build Coastguard Worker- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block { 11976*6777b538SAndroid Build Coastguard Worker if (_valueSet[0]) { 11977*6777b538SAndroid Build Coastguard Worker block(@"false", @(_values[0])); 11978*6777b538SAndroid Build Coastguard Worker } 11979*6777b538SAndroid Build Coastguard Worker if (_valueSet[1]) { 11980*6777b538SAndroid Build Coastguard Worker block(@"true", @(_values[1])); 11981*6777b538SAndroid Build Coastguard Worker } 11982*6777b538SAndroid Build Coastguard Worker} 11983*6777b538SAndroid Build Coastguard Worker 11984*6777b538SAndroid Build Coastguard Worker- (void)setGPBGenericValue:(GPBGenericValue *)value 11985*6777b538SAndroid Build Coastguard Worker forGPBGenericValueKey:(GPBGenericValue *)key { 11986*6777b538SAndroid Build Coastguard Worker int idx = (key->valueBool ? 1 : 0); 11987*6777b538SAndroid Build Coastguard Worker _values[idx] = value->valueInt32; 11988*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 11989*6777b538SAndroid Build Coastguard Worker} 11990*6777b538SAndroid Build Coastguard Worker 11991*6777b538SAndroid Build Coastguard Worker- (void)addRawEntriesFromDictionary:(GPBBoolEnumDictionary *)otherDictionary { 11992*6777b538SAndroid Build Coastguard Worker if (otherDictionary) { 11993*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 11994*6777b538SAndroid Build Coastguard Worker if (otherDictionary->_valueSet[i]) { 11995*6777b538SAndroid Build Coastguard Worker _valueSet[i] = YES; 11996*6777b538SAndroid Build Coastguard Worker _values[i] = otherDictionary->_values[i]; 11997*6777b538SAndroid Build Coastguard Worker } 11998*6777b538SAndroid Build Coastguard Worker } 11999*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 12000*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 12001*6777b538SAndroid Build Coastguard Worker } 12002*6777b538SAndroid Build Coastguard Worker } 12003*6777b538SAndroid Build Coastguard Worker} 12004*6777b538SAndroid Build Coastguard Worker 12005*6777b538SAndroid Build Coastguard Worker- (void)setEnum:(int32_t)value forKey:(BOOL)key { 12006*6777b538SAndroid Build Coastguard Worker if (!_validationFunc(value)) { 12007*6777b538SAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 12008*6777b538SAndroid Build Coastguard Worker format:@"GPBBoolEnumDictionary: Attempt to set an unknown enum value (%d)", 12009*6777b538SAndroid Build Coastguard Worker value]; 12010*6777b538SAndroid Build Coastguard Worker } 12011*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 12012*6777b538SAndroid Build Coastguard Worker _values[idx] = value; 12013*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 12014*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 12015*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 12016*6777b538SAndroid Build Coastguard Worker } 12017*6777b538SAndroid Build Coastguard Worker} 12018*6777b538SAndroid Build Coastguard Worker 12019*6777b538SAndroid Build Coastguard Worker- (void)setRawValue:(int32_t)rawValue forKey:(BOOL)key { 12020*6777b538SAndroid Build Coastguard Worker int idx = (key ? 1 : 0); 12021*6777b538SAndroid Build Coastguard Worker _values[idx] = rawValue; 12022*6777b538SAndroid Build Coastguard Worker _valueSet[idx] = YES; 12023*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 12024*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 12025*6777b538SAndroid Build Coastguard Worker } 12026*6777b538SAndroid Build Coastguard Worker} 12027*6777b538SAndroid Build Coastguard Worker 12028*6777b538SAndroid Build Coastguard Worker- (void)removeEnumForKey:(BOOL)aKey { 12029*6777b538SAndroid Build Coastguard Worker _valueSet[aKey ? 1 : 0] = NO; 12030*6777b538SAndroid Build Coastguard Worker} 12031*6777b538SAndroid Build Coastguard Worker 12032*6777b538SAndroid Build Coastguard Worker- (void)removeAll { 12033*6777b538SAndroid Build Coastguard Worker _valueSet[0] = NO; 12034*6777b538SAndroid Build Coastguard Worker _valueSet[1] = NO; 12035*6777b538SAndroid Build Coastguard Worker} 12036*6777b538SAndroid Build Coastguard Worker 12037*6777b538SAndroid Build Coastguard Worker@end 12038*6777b538SAndroid Build Coastguard Worker 12039*6777b538SAndroid Build Coastguard Worker#pragma mark - NSDictionary Subclass 12040*6777b538SAndroid Build Coastguard Worker 12041*6777b538SAndroid Build Coastguard Worker@implementation GPBAutocreatedDictionary { 12042*6777b538SAndroid Build Coastguard Worker NSMutableDictionary *_dictionary; 12043*6777b538SAndroid Build Coastguard Worker} 12044*6777b538SAndroid Build Coastguard Worker 12045*6777b538SAndroid Build Coastguard Worker- (void)dealloc { 12046*6777b538SAndroid Build Coastguard Worker NSAssert(!_autocreator, 12047*6777b538SAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 12048*6777b538SAndroid Build Coastguard Worker [self class], _autocreator); 12049*6777b538SAndroid Build Coastguard Worker [_dictionary release]; 12050*6777b538SAndroid Build Coastguard Worker [super dealloc]; 12051*6777b538SAndroid Build Coastguard Worker} 12052*6777b538SAndroid Build Coastguard Worker 12053*6777b538SAndroid Build Coastguard Worker#pragma mark Required NSDictionary overrides 12054*6777b538SAndroid Build Coastguard Worker 12055*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithObjects:(const id [])objects 12056*6777b538SAndroid Build Coastguard Worker forKeys:(const id<NSCopying> [])keys 12057*6777b538SAndroid Build Coastguard Worker count:(NSUInteger)count { 12058*6777b538SAndroid Build Coastguard Worker self = [super init]; 12059*6777b538SAndroid Build Coastguard Worker if (self) { 12060*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] initWithObjects:objects 12061*6777b538SAndroid Build Coastguard Worker forKeys:keys 12062*6777b538SAndroid Build Coastguard Worker count:count]; 12063*6777b538SAndroid Build Coastguard Worker } 12064*6777b538SAndroid Build Coastguard Worker return self; 12065*6777b538SAndroid Build Coastguard Worker} 12066*6777b538SAndroid Build Coastguard Worker 12067*6777b538SAndroid Build Coastguard Worker- (NSUInteger)count { 12068*6777b538SAndroid Build Coastguard Worker return [_dictionary count]; 12069*6777b538SAndroid Build Coastguard Worker} 12070*6777b538SAndroid Build Coastguard Worker 12071*6777b538SAndroid Build Coastguard Worker- (id)objectForKey:(id)aKey { 12072*6777b538SAndroid Build Coastguard Worker return [_dictionary objectForKey:aKey]; 12073*6777b538SAndroid Build Coastguard Worker} 12074*6777b538SAndroid Build Coastguard Worker 12075*6777b538SAndroid Build Coastguard Worker- (NSEnumerator *)keyEnumerator { 12076*6777b538SAndroid Build Coastguard Worker if (_dictionary == nil) { 12077*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 12078*6777b538SAndroid Build Coastguard Worker } 12079*6777b538SAndroid Build Coastguard Worker return [_dictionary keyEnumerator]; 12080*6777b538SAndroid Build Coastguard Worker} 12081*6777b538SAndroid Build Coastguard Worker 12082*6777b538SAndroid Build Coastguard Worker#pragma mark Required NSMutableDictionary overrides 12083*6777b538SAndroid Build Coastguard Worker 12084*6777b538SAndroid Build Coastguard Worker// Only need to call GPBAutocreatedDictionaryModified() when adding things 12085*6777b538SAndroid Build Coastguard Worker// since we only autocreate empty dictionaries. 12086*6777b538SAndroid Build Coastguard Worker 12087*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)anObject forKey:(id<NSCopying>)aKey { 12088*6777b538SAndroid Build Coastguard Worker if (_dictionary == nil) { 12089*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 12090*6777b538SAndroid Build Coastguard Worker } 12091*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:anObject forKey:aKey]; 12092*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 12093*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 12094*6777b538SAndroid Build Coastguard Worker } 12095*6777b538SAndroid Build Coastguard Worker} 12096*6777b538SAndroid Build Coastguard Worker 12097*6777b538SAndroid Build Coastguard Worker- (void)removeObjectForKey:(id)aKey { 12098*6777b538SAndroid Build Coastguard Worker [_dictionary removeObjectForKey:aKey]; 12099*6777b538SAndroid Build Coastguard Worker} 12100*6777b538SAndroid Build Coastguard Worker 12101*6777b538SAndroid Build Coastguard Worker#pragma mark Extra things hooked 12102*6777b538SAndroid Build Coastguard Worker 12103*6777b538SAndroid Build Coastguard Worker- (id)copyWithZone:(NSZone *)zone { 12104*6777b538SAndroid Build Coastguard Worker if (_dictionary == nil) { 12105*6777b538SAndroid Build Coastguard Worker return [[NSMutableDictionary allocWithZone:zone] init]; 12106*6777b538SAndroid Build Coastguard Worker } 12107*6777b538SAndroid Build Coastguard Worker return [_dictionary copyWithZone:zone]; 12108*6777b538SAndroid Build Coastguard Worker} 12109*6777b538SAndroid Build Coastguard Worker 12110*6777b538SAndroid Build Coastguard Worker- (id)mutableCopyWithZone:(NSZone *)zone { 12111*6777b538SAndroid Build Coastguard Worker if (_dictionary == nil) { 12112*6777b538SAndroid Build Coastguard Worker return [[NSMutableDictionary allocWithZone:zone] init]; 12113*6777b538SAndroid Build Coastguard Worker } 12114*6777b538SAndroid Build Coastguard Worker return [_dictionary mutableCopyWithZone:zone]; 12115*6777b538SAndroid Build Coastguard Worker} 12116*6777b538SAndroid Build Coastguard Worker 12117*6777b538SAndroid Build Coastguard Worker// Not really needed, but subscripting is likely common enough it doesn't hurt 12118*6777b538SAndroid Build Coastguard Worker// to ensure it goes directly to the real NSMutableDictionary. 12119*6777b538SAndroid Build Coastguard Worker- (id)objectForKeyedSubscript:(id)key { 12120*6777b538SAndroid Build Coastguard Worker return [_dictionary objectForKeyedSubscript:key]; 12121*6777b538SAndroid Build Coastguard Worker} 12122*6777b538SAndroid Build Coastguard Worker 12123*6777b538SAndroid Build Coastguard Worker// Not really needed, but subscripting is likely common enough it doesn't hurt 12124*6777b538SAndroid Build Coastguard Worker// to ensure it goes directly to the real NSMutableDictionary. 12125*6777b538SAndroid Build Coastguard Worker- (void)setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key { 12126*6777b538SAndroid Build Coastguard Worker if (_dictionary == nil) { 12127*6777b538SAndroid Build Coastguard Worker _dictionary = [[NSMutableDictionary alloc] init]; 12128*6777b538SAndroid Build Coastguard Worker } 12129*6777b538SAndroid Build Coastguard Worker [_dictionary setObject:obj forKeyedSubscript:key]; 12130*6777b538SAndroid Build Coastguard Worker if (_autocreator) { 12131*6777b538SAndroid Build Coastguard Worker GPBAutocreatedDictionaryModified(_autocreator, self); 12132*6777b538SAndroid Build Coastguard Worker } 12133*6777b538SAndroid Build Coastguard Worker} 12134*6777b538SAndroid Build Coastguard Worker 12135*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsUsingBlock:(void (NS_NOESCAPE ^)(id key, 12136*6777b538SAndroid Build Coastguard Worker id obj, 12137*6777b538SAndroid Build Coastguard Worker BOOL *stop))block { 12138*6777b538SAndroid Build Coastguard Worker [_dictionary enumerateKeysAndObjectsUsingBlock:block]; 12139*6777b538SAndroid Build Coastguard Worker} 12140*6777b538SAndroid Build Coastguard Worker 12141*6777b538SAndroid Build Coastguard Worker- (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts 12142*6777b538SAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(id key, 12143*6777b538SAndroid Build Coastguard Worker id obj, 12144*6777b538SAndroid Build Coastguard Worker BOOL *stop))block { 12145*6777b538SAndroid Build Coastguard Worker [_dictionary enumerateKeysAndObjectsWithOptions:opts usingBlock:block]; 12146*6777b538SAndroid Build Coastguard Worker} 12147*6777b538SAndroid Build Coastguard Worker 12148*6777b538SAndroid Build Coastguard Worker@end 12149*6777b538SAndroid Build Coastguard Worker 12150*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic pop 12151