diff options
Diffstat (limited to 'src/libui_sdl/libui/darwin/map.m')
-rw-r--r-- | src/libui_sdl/libui/darwin/map.m | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/darwin/map.m b/src/libui_sdl/libui/darwin/map.m new file mode 100644 index 0000000..46a7b8d --- /dev/null +++ b/src/libui_sdl/libui/darwin/map.m @@ -0,0 +1,59 @@ +// 17 august 2015 +#import "uipriv_darwin.h" + +// unfortunately NSMutableDictionary copies its keys, meaning we can't use it for pointers +// hence, this file +// we could expose a NSMapTable directly, but let's treat all pointers as opaque and hide the implementation, just to be safe and prevent even more rewrites later +struct mapTable { + NSMapTable *m; +}; + +struct mapTable *newMap(void) +{ + struct mapTable *m; + + m = uiNew(struct mapTable); + m->m = [[NSMapTable alloc] initWithKeyOptions:(NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality) + valueOptions:(NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality) + capacity:0]; + return m; +} + +void mapDestroy(struct mapTable *m) +{ + if ([m->m count] != 0) + implbug("attempt to destroy map with items inside"); + [m->m release]; + uiFree(m); +} + +void *mapGet(struct mapTable *m, void *key) +{ + return NSMapGet(m->m, key); +} + +void mapSet(struct mapTable *m, void *key, void *value) +{ + NSMapInsert(m->m, key, value); +} + +void mapDelete(struct mapTable *m, void *key) +{ + NSMapRemove(m->m, key); +} + +void mapWalk(struct mapTable *m, void (*f)(void *key, void *value)) +{ + NSMapEnumerator e = NSEnumerateMapTable(m->m); + void *k = NULL; + void *v = NULL; + while (NSNextMapEnumeratorPair(&e, &k, &v)) { + f(k, v); + } + NSEndMapTableEnumeration(&e); +} + +void mapReset(struct mapTable *m) +{ + NSResetMapTable(m->m); +} |