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
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, size_t count, struct of_dictionary_bucket **data, size_t *size)
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;

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

	 * Throw an OFOutOfRangeException if it would overflow (unlikely to
	 * happen).
	 */
	if (fill > 0.75)
		newsize = *size * 2;
	else if (fill < 0.25)
	} 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
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, count + 1, &data, &size);
		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
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, count, &data, &size);
	resize(self, isa, count, &data, &size);

	return self;
}

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