︙ | | | ︙ | |
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#import "OFEnumerationMutationException.h"
#import "OFInvalidArgumentException.h"
#import "OFOutOfRangeException.h"
#define MIN_CAPACITY 16
struct of_map_table_bucket {
void *key, *object;
unsigned long hash;
};
static struct of_map_table_bucket deleted = { 0 };
static void *
defaultRetain(void *object)
{
return object;
}
|
|
|
|
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#import "OFEnumerationMutationException.h"
#import "OFInvalidArgumentException.h"
#import "OFOutOfRangeException.h"
#define MIN_CAPACITY 16
struct OFMapTableBucket {
void *key, *object;
unsigned long hash;
};
static struct OFMapTableBucket deleted = { 0 };
static void *
defaultRetain(void *object)
{
return object;
}
|
︙ | | | ︙ | |
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
{
return (object1 == object2);
}
OF_DIRECT_MEMBERS
@interface OFMapTableEnumerator ()
- (instancetype)of_initWithMapTable: (OFMapTable *)mapTable
buckets: (struct of_map_table_bucket **)buckets
capacity: (unsigned long)capacity
mutationsPointer: (unsigned long *)mutationsPtr
OF_METHOD_FAMILY(init);
@end
@interface OFMapTableKeyEnumerator: OFMapTableEnumerator
@end
|
|
|
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
{
return (object1 == object2);
}
OF_DIRECT_MEMBERS
@interface OFMapTableEnumerator ()
- (instancetype)of_initWithMapTable: (OFMapTable *)mapTable
buckets: (struct OFMapTableBucket **)buckets
capacity: (unsigned long)capacity
mutationsPointer: (unsigned long *)mutationsPtr
OF_METHOD_FAMILY(init);
@end
@interface OFMapTableKeyEnumerator: OFMapTableEnumerator
@end
|
︙ | | | ︙ | |
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
[super dealloc];
}
static void
resizeForCount(OFMapTable *self, unsigned long count)
{
unsigned long fullness, capacity;
struct of_map_table_bucket **buckets;
if (count > ULONG_MAX / sizeof(*self->_buckets) ||
count > ULONG_MAX / 8)
@throw [OFOutOfRangeException exception];
fullness = count * 8 / self->_capacity;
|
|
|
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
[super dealloc];
}
static void
resizeForCount(OFMapTable *self, unsigned long count)
{
unsigned long fullness, capacity;
struct OFMapTableBucket **buckets;
if (count > ULONG_MAX / sizeof(*self->_buckets) ||
count > ULONG_MAX / 8)
@throw [OFOutOfRangeException exception];
fullness = count * 8 / self->_capacity;
|
︙ | | | ︙ | |
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
|
}
}
/* Key not in map table */
if (i >= last || self->_buckets[i] == NULL ||
self->_buckets[i] == &deleted ||
!self->_keyFunctions.equal(self->_buckets[i]->key, key)) {
struct of_map_table_bucket *bucket;
resizeForCount(self, self->_count + 1);
self->_mutations++;
last = self->_capacity;
for (i = hash & (self->_capacity - 1); i < last &&
|
|
|
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
|
}
}
/* Key not in map table */
if (i >= last || self->_buckets[i] == NULL ||
self->_buckets[i] == &deleted ||
!self->_keyFunctions.equal(self->_buckets[i]->key, key)) {
struct OFMapTableBucket *bucket;
resizeForCount(self, self->_count + 1);
self->_mutations++;
last = self->_capacity;
for (i = hash & (self->_capacity - 1); i < last &&
|
︙ | | | ︙ | |
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
|
@implementation OFMapTableEnumerator
- (instancetype)init
{
OF_INVALID_INIT_METHOD
}
- (instancetype)of_initWithMapTable: (OFMapTable *)mapTable
buckets: (struct of_map_table_bucket **)buckets
capacity: (unsigned long)capacity
mutationsPointer: (unsigned long *)mutationsPtr
{
self = [super init];
_mapTable = [mapTable retain];
_buckets = buckets;
|
|
|
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
|
@implementation OFMapTableEnumerator
- (instancetype)init
{
OF_INVALID_INIT_METHOD
}
- (instancetype)of_initWithMapTable: (OFMapTable *)mapTable
buckets: (struct OFMapTableBucket **)buckets
capacity: (unsigned long)capacity
mutationsPointer: (unsigned long *)mutationsPtr
{
self = [super init];
_mapTable = [mapTable retain];
_buckets = buckets;
|
︙ | | | ︙ | |