ObjFW  Check-in [d3d1f36316]

Overview
Comment:Fix yet another FIXME.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: d3d1f3631668ada72cd0947ab7394e9afbb2338e4e11f141ca73ff5a74019d0c
User & Date: js on 2009-11-13 21:07:26
Other Links: manifest | tags
Context
2009-11-13
23:17
Fix a bug in OFDictionary's -[initWithDictionary:]. check-in: 679bce8526 user: js tags: trunk
21:07
Fix yet another FIXME. check-in: d3d1f36316 user: js tags: trunk
21:02
Fix one more FIXME. check-in: d7d45d4b69 user: js tags: trunk
Changes

Modified src/OFMutableDictionary.m from [5bfedf083e] to [a2b20d13ec].

16
17
18
19
20
21
22
23

24
25
26
27
28
29
30

31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
#import "OFMutableDictionary.h"
#import "OFExceptions.h"
#import "OFMacros.h"

#define BUCKET_SIZE sizeof(struct of_dictionary_bucket)

static OF_INLINE void
resize(id self, size_t count, struct of_dictionary_bucket **data, size_t *size)

{
	float fill = (float)count / *size;
	size_t newsize;
	struct of_dictionary_bucket *newdata;
	uint32_t i;

	/*

	 * FIXME:

	 *
	 * Throw an OFOutOfRangeException if it would overflow (unlikely to
	 * happen).
	 */
	if (fill > 0.75)
		newsize = *size * 2;
	else if (fill < 0.25)
		newsize = *size / 2;
	else
		return;

	newdata = [self allocMemoryForNItems: newsize
				    withSize: BUCKET_SIZE];
	memset(newdata, 0, newsize * BUCKET_SIZE);







|
>






<
>
|
>
|
<
<
<
<

|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

31
32
33
34




35
36
37
38
39
40
41
42
43
#import "OFMutableDictionary.h"
#import "OFExceptions.h"
#import "OFMacros.h"

#define BUCKET_SIZE sizeof(struct of_dictionary_bucket)

static OF_INLINE void
resize(id self, Class isa, size_t count, struct of_dictionary_bucket **data,
    size_t *size)
{
	float fill = (float)count / *size;
	size_t newsize;
	struct of_dictionary_bucket *newdata;
	uint32_t i;


	if (fill > 0.75) {
		if (*size > SIZE_MAX / 2)
			@throw [OFOutOfRangeException newWithClass: isa];





		newsize = *size * 2;
	} else if (fill < 0.25)
		newsize = *size / 2;
	else
		return;

	newdata = [self allocMemoryForNItems: newsize
				    withSize: BUCKET_SIZE];
	memset(newdata, 0, newsize * BUCKET_SIZE);
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
	/* In case the last bucket is already used */
	if (i >= size)
		for (i = 0; i < size && data[i].key != nil &&
		    ![data[i].key isEqual: key]; i++);

	/* Key not in dictionary */
	if (i >= size || data[i].key == nil) {
		resize(self, count + 1, &data, &size);

		i = hash & (size - 1);
		for (; i < size && data[i].key != nil; i++);

		/* In case the last bucket is already used */
		if (i >= size)
			for (i = 0; i < size && data[i].key != nil; i++);







|







84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
	/* In case the last bucket is already used */
	if (i >= size)
		for (i = 0; i < size && data[i].key != nil &&
		    ![data[i].key isEqual: key]; i++);

	/* Key not in dictionary */
	if (i >= size || data[i].key == nil) {
		resize(self, isa, count + 1, &data, &size);

		i = hash & (size - 1);
		for (; i < size && data[i].key != nil; i++);

		/* In case the last bucket is already used */
		if (i >= size)
			for (i = 0; i < size && data[i].key != nil; i++);
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
		return self;

	[data[i].key release];
	[data[i].object release];
	data[i].key = nil;

	count--;
	resize(self, count, &data, &size);

	return self;
}

- (id)copy
{
	return [[OFDictionary alloc] initWithDictionary: self];
}
@end







|









137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
		return self;

	[data[i].key release];
	[data[i].object release];
	data[i].key = nil;

	count--;
	resize(self, isa, count, &data, &size);

	return self;
}

- (id)copy
{
	return [[OFDictionary alloc] initWithDictionary: self];
}
@end