Overview
Comment: | Add preliminary OFDictionary implementation. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
8177b8b8b2519d973c63b1e69a697c83 |
User & Date: | js on 2009-03-08 16:06:51 |
Other Links: | manifest | tags |
Context
2009-03-08
| ||
19:40 | Fix missing include. check-in: f79affc610 user: js tags: trunk | |
16:06 | Add preliminary OFDictionary implementation. check-in: 8177b8b8b2 user: js tags: trunk | |
16:06 | Rename initWithRetainAndReleaseEnabled to initWithoutRetainAndRelease. check-in: 43e4d25ca7 user: js tags: trunk | |
Changes
Modified src/Makefile from [97d6293a2a] to [a36117ea93].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | include ../extra.mk LIB = ${LIB_PREFIX}objfw${LIB_SUFFIX} LIB_MAJOR = 1 LIB_MINOR = 0 SRCS = OFArray.m \ OFAutoreleasePool.m \ OFExceptions.m \ OFHashes.m \ OFFile.m \ OFList.m \ OFNumber.m \ OFObject.m \ OFString.m \ | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | include ../extra.mk LIB = ${LIB_PREFIX}objfw${LIB_SUFFIX} LIB_MAJOR = 1 LIB_MINOR = 0 SRCS = OFArray.m \ OFAutoreleasePool.m \ OFDictionary.m \ OFExceptions.m \ OFHashes.m \ OFFile.m \ OFList.m \ OFNumber.m \ OFObject.m \ OFString.m \ |
︙ | ︙ |
Added src/OFDictionary.h version [0e40b77f27].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | /* * 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 "OFObject.h" #import "OFList.h" /** * The OFDictionary class provides a class for using hash tables. */ @interface OFDictionary: OFObject { OFList **data; size_t size; } /** * Creates a new OFDictionary, defaulting to a 12 bit hash. * * \return A new autoreleased OFDictionary */ + dictionary; /* * Creates a new OFDictionary with a hash of N bits. * * \param bits The size of the hash to use * \return A new autoreleased OFDictionary */ + dictionaryWithHashSize: (int)hashsize; /** * Initializes an already allocated OFDictionary, defaulting to a 12 bit hash. * * \return An initialized OFDictionary */ - init; /* * 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*)key to: (OFObject*)obj; /* * \param key The key whose object should be returned * \return The object for the given key */ - get: (OFObject*)key; /* * Remove the object with the given key from the dictionary. * * \param key The key whose object should be removed */ - remove: (OFObject*)key; @end |
Added src/OFDictionary.m version [8614525c94].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 145 146 147 148 149 150 151 | /* * 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" #import "OFExceptions.h" @implementation OFDictionary + dictionary; { return [[[OFDictionary alloc] init] autorelease]; } + dictionaryWithHashSize: (int)hashsize { return [[[OFDictionary alloc] initWithHashSize: hashsize] autorelease]; } - init { if ((self = [super init])) { size = 4096; @try { data = [self getMemForNItems: size ofSize: sizeof(OFList*)]; } @catch (OFException *e) { [self free]; @throw e; } memset(data, 0, size); } return self; } - initWithHashSize: (int)hashsize { if ((self = [super init])) { if (hashsize < 8 || hashsize > 31) { Class c = [self class]; [self free]; @throw [OFInvalidArgumentException newWithClass: c andSelector: _cmd]; } size = (size_t)1 << hashsize; @try { data = [self getMemForNItems: size ofSize: sizeof(OFList*)]; } @catch (OFException *e) { [self free]; @throw e; } memset(data, 0, size); } return self; } - free { size_t i; for (i = 0; i < size; i++) if (data[i] != nil) [data[i] release]; return [super free]; } - set: (OFObject*)key to: (OFObject*)obj { uint32_t hash = [key hash] & (size - 1); of_list_object_t *iter; if (data[hash] == nil) data[hash] = [OFList new]; if (data[hash] == nil) @throw [OFInitializationFailedException newWithClass: [OFList class]]; 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; } } [data[hash] append: key]; [data[hash] append: obj]; return self; } - get: (OFObject*)key { uint32_t hash = [key hash] & (size - 1); of_list_object_t *iter; if (data[hash] == nil) return nil; for (iter = [data[hash] first]; iter != NULL; iter = iter->next->next) if ([iter->object isEqual: key]) return iter->next->object; return nil; } - remove: (OFObject*)key { uint32_t hash = [key hash] & (size - 1); of_list_object_t *iter; if (data[hash] == nil) return self; // FIXME: Throw exception? 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]; return self; } } return self; // FIXME: Throw exception? } /* FIXME: Implement this! */ /* - (BOOL)isEqual { } */ @end |
Modified tests/Makefile from [66bc2d57ef] to [bfacede22f].
1 2 3 4 5 6 7 8 9 10 | SUBDIRS = OFObject \ OFAutoreleasePool \ OFArray \ OFHashes \ OFString \ OFTCPSocket \ OFList \ OFXMLFactory include ../buildsys.mk | > | 1 2 3 4 5 6 7 8 9 10 11 | SUBDIRS = OFObject \ OFAutoreleasePool \ OFArray \ OFDictionary \ OFHashes \ OFString \ OFTCPSocket \ OFList \ OFXMLFactory include ../buildsys.mk |
Added tests/OFDictionary/Makefile version [59b0e45da4].
> > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | PROG_NOINST = ofdictionary${PROG_SUFFIX} SRCS = OFDictionary.m include ../../buildsys.mk include ../../extra.mk CPPFLAGS += -I../../src -I../.. LIBS := -L../../src -lobjfw ${LIBS} .PHONY: run all: run run: ${PROG_NOINST} rm -f libobjfw.so.1 libobjfw.so.1.0 libobjfw.dll libobjfw.dylib ln -s ../../src/libobjfw.so libobjfw.so.1 ln -s ../../src/libobjfw.so libobjfw.so.1.0 ln -s ../../src/libobjfw.dll libobjfw.dll ln -s ../../src/libobjfw.dylib libobjfw.dylib LD_LIBRARY_PATH=.$${LD_LIBRARY_PATH+:}$$LD_LIBRARY_PATH \ DYLD_LIBRARY_PATH=.$${DYLD_LIBRARY_PATH+:}$$DYLD_LIBRARY_PATH \ ${TEST_LAUNCHER} ./${PROG_NOINST}; EXIT=$$?; \ rm -f libobjfw.so.1 libobjfw.so.1.0 libobjfw.dll libobjfw.dylib; \ exit $$EXIT |
Added tests/OFDictionary/OFDictionary.m version [d476405c0d].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | /* * 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" #import <stdio.h> #import "OFAutoreleasePool.h" #import "OFDictionary.h" #import "OFString.h" int main() { OFDictionary *dict = [OFDictionary dictionaryWithHashSize: 16]; OFAutoreleasePool *pool = [OFAutoreleasePool new]; OFString *key1 = [OFString stringWithCString: "key1"]; OFString *key2 = [OFString stringWithCString: "key2"]; OFString *value1 = [OFString stringWithCString: "value1"]; OFString *value2 = [OFString stringWithCString: "value2"]; [dict set: key1 to: value1]; [dict set: key2 to: value2]; [pool release]; puts([[dict get: key1] cString]); puts([[dict get: key2] cString]); return 0; } |