From 22551413aa1d8c5e4f16d9559942bf938e85fabb Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Mon, 17 Aug 2015 01:03:53 -0400 Subject: [PATCH] Set up the infrastructure for replacing NSMutableDictionary with a proper non-copying map. --- redo/reredo/darwin/GNUmakeinc.mk | 1 + redo/reredo/darwin/map.m | 28 ++++++++++++++++++++++++++++ redo/reredo/darwin/menu.m | 6 +++--- redo/reredo/darwin/uipriv_darwin.h | 6 +++++- 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 redo/reredo/darwin/map.m diff --git a/redo/reredo/darwin/GNUmakeinc.mk b/redo/reredo/darwin/GNUmakeinc.mk index 80158b03..40d8d7d8 100644 --- a/redo/reredo/darwin/GNUmakeinc.mk +++ b/redo/reredo/darwin/GNUmakeinc.mk @@ -13,6 +13,7 @@ osMFILES = \ darwin/group.m \ darwin/label.m \ darwin/main.m \ + darwin/map.m \ darwin/menu.m \ darwin/progressbar.m \ darwin/radiobuttons.m \ diff --git a/redo/reredo/darwin/map.m b/redo/reredo/darwin/map.m new file mode 100644 index 00000000..18b502c5 --- /dev/null +++ b/redo/reredo/darwin/map.m @@ -0,0 +1,28 @@ +// 17 august 2015 +#import "uipriv_darwin.h" + +// unfortunately NSMutableDictionary copies its keys, meaning we can't use it for pointers +// hence, this file + +NSMapTable *newMap(void) +{ + // TODO NSPointerFunctionsOpaquePersonality? + return [NSMapTable mapTableWithKeyOptions:NSPointerFunctionsOpaqueMemory + valueOptions:NSPointerFunctionsOpaqueMemory]; +} + +void *mapGet(NSMapTable *map, id key) +{ + NSValue *v; + + v = (NSValue *) [self->items objectForKey:sender]; + return [v pointerValue]; +} + +void mapSet(NSMapTable *map, id key, void *value) +{ + NSValue *v; + + v = [NSValue valueWithPointer:value]; + [map setObject:v forKey:key]; +} diff --git a/redo/reredo/darwin/menu.m b/redo/reredo/darwin/menu.m index d007b705..9271c8c2 100644 --- a/redo/reredo/darwin/menu.m +++ b/redo/reredo/darwin/menu.m @@ -1,6 +1,8 @@ // 28 april 2015 #import "uipriv_darwin.h" +// TODO migrate to map.m functions + static NSMutableArray *menus = nil; static BOOL menusFinalized = NO; @@ -35,9 +37,7 @@ enum { { self = [super init]; if (self) { - // TODO NSPointerFunctionsOpaquePersonality? - self->items = [NSMapTable mapTableWithKeyOptions:NSPointerFunctionsOpaqueMemory - valueOptions:NSPointerFunctionsOpaqueMemory]; + self->items = newMap(); self->hasQuit = NO; self->hasPreferences = NO; self->hasAbout = NO; diff --git a/redo/reredo/darwin/uipriv_darwin.h b/redo/reredo/darwin/uipriv_darwin.h index e69b1d32..ac447922 100644 --- a/redo/reredo/darwin/uipriv_darwin.h +++ b/redo/reredo/darwin/uipriv_darwin.h @@ -11,7 +11,6 @@ // menu.m @interface menuManager : NSObject { - // unfortunately NSMutableDictionary copies its keys, meaning we can't use it for pointers NSMapTable *items; BOOL hasQuit; BOOL hasPreferences; @@ -58,5 +57,10 @@ extern void setHuggingPri(NSView *, NSLayoutPriority, NSLayoutConstraintOrientat extern void layoutSingleView(NSView *, NSView *, int); extern NSSize fittingAlignmentSize(NSView *); +// map.m +extern NSMapTable *newMap(void); +extern void *mapGet(NSMapTable *map, id key); +extern void mapSet(NSMapTable *map, id key, void *value); + // TODO #define PUT_CODE_HERE 0