Overview
Comment: | Split OFDictionary into OFDictionary and OFMutableDictionary. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
71abb030af44fd408499cba41c2cbfb0 |
User & Date: | js on 2009-05-18 20:53:42 |
Other Links: | manifest | tags |
Context
2009-05-18
| ||
22:09 | Fix error handling in init methods in OFArray. check-in: cc6d2d3987 user: js tags: trunk | |
20:53 | Split OFDictionary into OFDictionary and OFMutableDictionary. check-in: 71abb030af user: js tags: trunk | |
20:41 | Add one more convenience method to OFArray. check-in: 7107bd9906 user: js tags: trunk | |
Changes
Modified src/Makefile from [74096cf5ac] to [df14000352].
︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 | OFDictionary.m \ OFExceptions.m \ OFFile.m \ OFHashes.m \ OFIterator.m \ OFList.m \ OFMutableArray.m \ OFMutableString.m \ OFNumber.m \ OFObject.m \ ${OFPLUGIN_M} \ OFSocket.m \ OFStream.m \ OFString.m \ | > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | OFDictionary.m \ OFExceptions.m \ OFFile.m \ OFHashes.m \ OFIterator.m \ OFList.m \ OFMutableArray.m \ OFMutableDictionary.m \ OFMutableString.m \ OFNumber.m \ OFObject.m \ ${OFPLUGIN_M} \ OFSocket.m \ OFStream.m \ OFString.m \ |
︙ | ︙ |
Modified src/OFDictionary.h from [aa683549c8] to [e068e112c6].
︙ | ︙ | |||
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | * Initializes an already allocated OFDictionary with a hash of N bits. * * \param bits The size of the hash to use * \return An initialized OFDictionary */ - initWithHashSize: (int)hashsize; /** * Sets a key to an object. A key can be any object. * * \param key The key to set * \param obj The object to set the key to */ - set: (OFObject <OFCopying>*)key to: (OFObject*)obj; | > > > > > > > > > > > > > < < < < < < < < < < < < < > | 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | * Initializes an already allocated OFDictionary with a hash of N bits. * * \param bits The size of the hash to use * \return An initialized OFDictionary */ - initWithHashSize: (int)hashsize; /** * \return The average number of items in a used bucket. Buckets that are * completely empty are not in the calculation. If this value is >= 2.0, * you should resize the dictionary, in most cases even earlier! */ - (float)averageItemsPerBucket; /** * \param key The key whose object should be returned * \return The object for the given key or nil if the key was not found */ - (id)get: (OFObject*)key; /** * Sets a key to an object. A key can be any object. * * \param key The key to set * \param obj The object to set the key to */ - set: (OFObject <OFCopying>*)key to: (OFObject*)obj; /** * Remove the object with the given key from the dictionary. * * \param key The key whose object should be removed */ - remove: (OFObject*)key; /** * Changes the hash size of the dictionary. * * \param hashsize The new hash size for the dictionary */ - changeHashSize: (int)hashsize; @end #import "OFIterator.h" #import "OFMutableDictionary.h" |
Modified src/OFDictionary.m from [22afc84d9d] to [c51c9bd24f].
︙ | ︙ | |||
12 13 14 15 16 17 18 | #import "config.h" #include <string.h> #import "OFDictionary.h" #import "OFIterator.h" #import "OFExceptions.h" | < | | | 12 13 14 15 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 | #import "config.h" #include <string.h> #import "OFDictionary.h" #import "OFIterator.h" #import "OFExceptions.h" /* Reference for static linking */ void _reference_to_OFIterator_in_OFDictionary() { _OFIterator_reference = 1; } @implementation OFDictionary + dictionary; { return [[[self alloc] init] autorelease]; } + dictionaryWithHashSize: (int)hashsize { return [[[self alloc] initWithHashSize: hashsize] autorelease]; } - init { self = [super init]; size = 4096; |
︙ | ︙ | |||
84 85 86 87 88 89 90 | @throw e; } memset(data, 0, size * sizeof(OFList*)); return self; } | | | < < < | < < | < < | < < | < < < < < < | < | < < < < < | < < < < < < < < < < < < < < < | | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | @throw e; } memset(data, 0, size * sizeof(OFList*)); return self; } - (float)averageItemsPerBucket { size_t items, buckets, i; items = 0; buckets = 0; for (i = 0; i < size; i++) { if (data[i] != nil) { items += [data[i] items] / 2; buckets++; } } return (float)items / buckets; } - (id)get: (OFObject*)key { uint32_t hash; of_list_object_t *iter; |
︙ | ︙ | |||
157 158 159 160 161 162 163 164 | for (iter = [data[hash] first]; iter != NULL; iter = iter->next->next) if ([iter->object isEqual: key]) return iter->next->object; return nil; } | | < < | | < | | | < < < < < < < | | < < < < | < < < | < < < < < < < < < < < < < < < < < < < < < < < | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > > > > > > > > > > > > > > > > > > > | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | for (iter = [data[hash] first]; iter != NULL; iter = iter->next->next) if ([iter->object isEqual: key]) return iter->next->object; return nil; } - set: (OFObject <OFCopying>*)key to: (OFObject*)obj { @throw [OFNotImplementedException newWithClass: isa andSelector: _cmd]; } - remove: (OFObject*)key { @throw [OFNotImplementedException newWithClass: isa andSelector: _cmd]; } - changeHashSize: (int)hashsize { @throw [OFNotImplementedException newWithClass: isa andSelector: _cmd]; } /* FIXME: Implement this! */ /* - (BOOL)isEqual { } - (id)copy { } - (id)mutableCopy { } */ - (void)dealloc { size_t i; for (i = 0; i < size; i++) if (data[i] != nil) [data[i] release]; [super dealloc]; } @end |
Added src/OFMutableDictionary.h version [457d6af9f3].
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * Copyright (c) 2008 - 2009 * Jonathan Schleifer <js@webkeks.org> * * All rights reserved. * * This file is part of libobjfw. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE included in * the packaging of this file. */ #import "OFDictionary.h" /** * The OFMutableDictionary class provides a class for using mutable hash tables. */ @interface OFMutableDictionary: OFDictionary @end |
Added src/OFMutableDictionary.m version [e1b66eccc2].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | /* * Copyright (c) 2008 - 2009 * Jonathan Schleifer <js@webkeks.org> * * All rights reserved. * * This file is part of libobjfw. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE included in * the packaging of this file. */ #import "config.h" #include <string.h> #import "OFMutableDictionary.h" #import "OFExceptions.h" #import "OFMacros.h" @implementation OFMutableDictionary - set: (OFObject <OFCopying>*)key to: (OFObject*)obj { uint32_t hash; of_list_object_t *iter, *key_obj; if (key == nil || obj == nil) @throw [OFInvalidArgumentException newWithClass: isa andSelector: _cmd]; hash = [key hash] & (size - 1); if (data[hash] == nil) data[hash] = [[OFList alloc] init]; for (iter = [data[hash] first]; iter != NULL; iter = iter->next->next) { if ([iter->object isEqual: key]) { [iter->next->object release]; [obj retain]; iter->next->object = obj; return self; } } key = [key copy]; @try { key_obj = [data[hash] append: key]; } @finally { [key release]; } @try { [data[hash] append: obj]; } @catch (OFException *e) { [data[hash] remove: key_obj]; @throw e; } return self; } - remove: (OFObject*)key { uint32_t hash; of_list_object_t *iter; if (key == nil) @throw [OFInvalidArgumentException newWithClass: isa andSelector: _cmd]; hash = [key hash] & (size - 1); if (data[hash] == nil) return self; for (iter = [data[hash] first]; iter != NULL; iter = iter->next->next) { if ([iter->object isEqual: key]) { [data[hash] remove: iter->next]; [data[hash] remove: iter]; if ([data[hash] first] == NULL) { [data[hash] release]; data[hash] = nil; } return self; } } return self; } - changeHashSize: (int)hashsize { OFList **newdata; size_t newsize, i; of_list_object_t *iter; if (hashsize < 8 || hashsize >= 28) @throw [OFInvalidArgumentException newWithClass: isa andSelector: _cmd]; newsize = (size_t)1 << hashsize; newdata = [self allocNItems: newsize withSize: sizeof(OFList*)]; memset(data, 0, newsize * sizeof(OFList*)); for (i = 0; i < size; i++) { if (OF_LIKELY(data[i] == nil)) continue; for (iter = [data[i] first]; iter != NULL; iter = iter->next->next) { uint32_t hash = [iter->object hash] & (newsize - 1); if (newdata[hash] == nil) newdata[hash] = [[OFList alloc] init]; [newdata[hash] append: iter->object]; [newdata[hash] append: iter->next->object]; } [data[i] release]; } [self freeMem: data]; data = newdata; size = newsize; return self; } /* FIXME: Implement this! */ /* - (id)copy { } - (id)mutableCopy { } */ @end |
Modified tests/OFDictionary/OFDictionary.m from [701228e5d1] to [53a9503f21].
︙ | ︙ | |||
18 19 20 21 22 23 24 | #import "OFDictionary.h" #import "OFString.h" #import "OFExceptions.h" int main() { | | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #import "OFDictionary.h" #import "OFString.h" #import "OFExceptions.h" int main() { OFDictionary *dict = [OFMutableDictionary dictionaryWithHashSize: 16]; OFIterator *iter = [dict iterator]; OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFString *key1 = [OFString stringWithCString: "key1"]; OFString *key2 = [OFString stringWithCString: "key2"]; OFString *value1 = [OFString stringWithCString: "value1"]; OFString *value2 = [OFString stringWithCString: "value2"]; |
︙ | ︙ |