34
34
#import " GPBDescriptor.h"
35
35
36
36
@implementation GPBExtensionRegistry {
37
- NSMutableDictionary * mutableClassMap_;
37
+ CFMutableDictionaryRef mutableClassMap_;
38
38
}
39
39
40
40
- (instancetype )init {
41
41
if ((self = [super init ])) {
42
- mutableClassMap_ = [[NSMutableDictionary alloc ] init ];
42
+ // The keys are ObjC classes, so straight up ptr comparisons are fine.
43
+ mutableClassMap_ = CFDictionaryCreateMutable (kCFAllocatorDefault , 0 , NULL ,
44
+ &kCFTypeDictionaryValueCallBacks );
43
45
}
44
46
return self;
45
47
}
46
48
47
49
- (void )dealloc {
48
- [ mutableClassMap_ release ] ;
50
+ CFRelease ( mutableClassMap_) ;
49
51
[super dealloc ];
50
52
}
51
53
@@ -68,14 +70,13 @@ - (void)addExtension:(GPBExtensionDescriptor *)extension {
68
70
69
71
Class containingMessageClass = extension.containingMessageClass ;
70
72
CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef )
71
- [ mutableClassMap_ objectForKey: containingMessageClass] ;
73
+ CFDictionaryGetValue ( mutableClassMap_, containingMessageClass) ;
72
74
if (extensionMap == nil ) {
73
75
// Use a custom dictionary here because the keys are numbers and conversion
74
76
// back and forth from NSNumber isn't worth the cost.
75
77
extensionMap = CFDictionaryCreateMutable (kCFAllocatorDefault , 0 , NULL ,
76
78
&kCFTypeDictionaryValueCallBacks );
77
- [mutableClassMap_ setObject: (id )extensionMap
78
- forKey: (id <NSCopying >)containingMessageClass];
79
+ CFDictionarySetValue (mutableClassMap_, containingMessageClass, extensionMap);
79
80
CFRelease (extensionMap);
80
81
}
81
82
@@ -87,7 +88,7 @@ - (GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor
87
88
fieldNumber : (NSInteger )fieldNumber {
88
89
Class messageClass = descriptor.messageClass ;
89
90
CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef )
90
- [ mutableClassMap_ objectForKey: messageClass] ;
91
+ CFDictionaryGetValue ( mutableClassMap_, messageClass) ;
91
92
ssize_t key = fieldNumber;
92
93
GPBExtensionDescriptor *result =
93
94
(extensionMap
@@ -101,28 +102,28 @@ static void CopyKeyValue(const void *key, const void *value, void *context) {
101
102
CFDictionarySetValue (extensionMap, key, value);
102
103
}
103
104
105
+ static void CopySubDictionary (const void *key, const void *value, void *context) {
106
+ CFMutableDictionaryRef mutableClassMap = (CFMutableDictionaryRef )context;
107
+ Class containingMessageClass = key;
108
+ CFMutableDictionaryRef otherExtensionMap = (CFMutableDictionaryRef )value;
109
+
110
+ CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef )
111
+ CFDictionaryGetValue (mutableClassMap, containingMessageClass);
112
+ if (extensionMap == nil ) {
113
+ extensionMap = CFDictionaryCreateMutableCopy (kCFAllocatorDefault , 0 , otherExtensionMap);
114
+ CFDictionarySetValue (mutableClassMap, containingMessageClass, extensionMap);
115
+ CFRelease (extensionMap);
116
+ } else {
117
+ CFDictionaryApplyFunction (otherExtensionMap, CopyKeyValue, extensionMap);
118
+ }
119
+ }
120
+
104
121
- (void )addExtensions : (GPBExtensionRegistry *)registry {
105
122
if (registry == nil ) {
106
123
// In the case where there are no extensions just ignore.
107
124
return ;
108
125
}
109
- NSMutableDictionary *otherClassMap = registry->mutableClassMap_ ;
110
- [otherClassMap enumerateKeysAndObjectsUsingBlock: ^(id key, id value, BOOL * stop) {
111
- #pragma unused(stop)
112
- Class containingMessageClass = key;
113
- CFMutableDictionaryRef otherExtensionMap = (CFMutableDictionaryRef )value;
114
-
115
- CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef )
116
- [mutableClassMap_ objectForKey: containingMessageClass];
117
- if (extensionMap == nil ) {
118
- extensionMap = CFDictionaryCreateMutableCopy (kCFAllocatorDefault , 0 , otherExtensionMap);
119
- [mutableClassMap_ setObject: (id )extensionMap
120
- forKey: (id <NSCopying >)containingMessageClass];
121
- CFRelease (extensionMap);
122
- } else {
123
- CFDictionaryApplyFunction (otherExtensionMap, CopyKeyValue, extensionMap);
124
- }
125
- }];
126
+ CFDictionaryApplyFunction (registry->mutableClassMap_ , CopySubDictionary, mutableClassMap_);
126
127
}
127
128
128
129
#pragma clang diagnostic pop
0 commit comments