Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // NSObject+classSwitch.m
- //
- // Created by Jonathan Annett on 30/10/13.
- // Copyright (c) 2013 Sophtwhere. All rights reserved.
- //
- #import "NSObject+classSwitch.h"
- #import "NSObject+arcAgnostics.h"
- /////////////////////////////////
- #define DEF_OBJ_CODE(NSObject)\
- NSString *_is##NSObject##_ = @#NSObject;
- DEFINE_OBECTS()
- #undef DEF_OBJ_CODE
- /////////////////////////////////
- NSString *_isUndefinedObject_ = @"isUndefinedObject";
- #define DEF_OBJ_CODE(NSObject)\
- @implementation NSObject (classSwitch)\
- -(enum nsObjectSwitchCode) classSwitchCode {\
- /**/return is##NSObject;\
- }\
- +(enum nsObjectSwitchCode) classSwitchCode {\
- /**/return is##NSObject;\
- }\
- -(BOOL)isUndefinedObject {\
- /**/return NO;\
- }\
- -(NSObject*) as##NSObject {\
- /**/return self;\
- }\
- -(BOOL) is##NSObject{\
- /**/return YES;\
- }\
- @end
- DEFINE_OBECTS()
- #undef DEF_OBJ_CODE
- @implementation NSObject(classSwitchDefaults)
- -(dispatch_block_t) class_specific_block_copy:(NSDictionary*) blocks{
- id element = nil;
- switch (self.classSwitchCode) {
- case isUndefinedObject :
- element = blocks[_isUndefinedObject_];\
- break;
- #define DEF_OBJ_CODE(NSObject)\
- /**/ case is##NSObject:\
- /**/ element = blocks[_is##NSObject##_];\
- /**/ break;\
- DEFINE_OBECTS()
- #undef DEF_OBJ_CODE
- default:
- break;
- }
- dispatch_block_t result =
- element==nil ? ^{} :
- (dispatch_block_t) ([element isNSString] ? blocks[element] : element);
- return Block_copy(result);
- }
- #define DEF_OBJ_CODE(NSObject)\
- -(BOOL) is##NSObject{\
- /**/return NO;\
- }\
- -(NSObject*) as##NSObject{\
- /**/return nil;\
- }\
- DEFINE_OBECTS()
- #undef DEF_OBJ_CODE
- -(void) class_specific_block_dispatch:(NSDictionary*) blocks{
- if (blocks){
- dispatch_block_t block = [self class_specific_block_copy:blocks];
- block();
- Block_release(block);
- }
- }
- -(void) class_specific_block_dispatch_async:(dispatch_queue_t) queue
- blocks:(NSDictionary*) blocks {
- if (blocks){
- dispatch_block_t block = [self class_specific_block_copy:blocks];
- dispatch_async(queue, ^{
- block();
- Block_release(block);
- });
- }
- }
- -(enum nsObjectSwitchCode) classSwitchCode {
- return isUndefinedObject;
- }
- +(enum nsObjectSwitchCode) classSwitchCode {
- return isUndefinedObject;
- }
- -(BOOL)isUndefinedObject {
- return YES;
- }
- +(enum nsObjectSwitchCode) classSwitchCodeFromNSString:(NSString*) string decoder:(NSDictionary*) decode{
- NSNumber *decoded = decode ? decode[string] : nil;
- return decoded ? (enum nsObjectSwitchCode) decoded.unsignedIntegerValue : isUndefinedObject;
- }
- +(enum nsObjectSwitchCode) classSwitchCodeFromClassName:(NSString*) classname{
- static NSDictionary *decode = nil;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- decode = [@{
- #define DEF_OBJ_CODE(NSObject)\
- _is##NSObject##_ : @(is##NSObject),
- DEFINE_OBECTS()
- #undef DEF_OBJ_CODE
- } retain];
- });
- return [self classSwitchCodeFromNSString:classname decoder:decode];
- }
- @end
- @implementation NSObject(testClassSwitch)
- +(void ) test {
- NSArray *hello_world = @[@"hello",@"world"];
- NSString *hello = [hello_world componentsJoinedByString:@" "];
- NSDictionary *message = @{@"message" : hello};
- NSMutableDictionary *greeting = [[@{@"howdie" : hello_world} mutableCopy] autorelease];
- NSArray *checker = @[hello,hello_world,message,greeting];
- NSDictionary *checkerBlocks = @{
- _isUndefinedObject_ : ^{
- NSLog(@"don't know what to do with this");
- },
- // use same handler for NSDictionary and NSMutableDictionary
- _isNSMutableDictionary_ : _isNSDictionary_,
- _isNSDictionary_ :
- ^{
- NSLog(@"this is a block for a dictionary");
- },
- // treat NSURL as undefined.
- _isNSURL_ : _isUndefinedObject_,
- _isNSArray_ :
- ^{
- NSLog(@"this is a block for an array");
- },
- _isNSString_ :
- ^{
- NSLog(@"this is a block for a string - success");
- }
- };
- dispatch_block_t myblock = [hello class_specific_block_copy:checkerBlocks];
- myblock();
- Block_release(myblock);
- [hello_world class_specific_block_dispatch:checkerBlocks];
- [greeting class_specific_block_dispatch_async:dispatch_get_main_queue() blocks:checkerBlocks];
- [[[[UIView alloc] init] autorelease ]class_specific_block_dispatch:checkerBlocks];
- [[NSURL URLWithString:@"http://www.google.com" ] class_specific_block_dispatch:checkerBlocks];
- for (NSObject *testme in checker) {
- if (testme.isNSArray) {
- NSLog(@"yes ! testme is an array");
- }
- switch (testme.classSwitchCode) {
- case isNSString:
- NSLog(@"%@ is a string!",testme);
- break;
- case isNSArray:
- NSLog(@"%@ is an array with %d elements!",testme,[(NSArray*) testme count]);
- break;
- case isNSMutableArray:
- NSLog(@"%@ is a mutable array with %d elements!",testme,[(NSArray*) testme count]);
- break;
- case isNSDictionary:
- NSLog(@"%@ is an dictionary with these keys: %@!",testme,[(NSDictionary*) testme allKeys]);
- break;
- default:
- break;
- }
- }
- }
- @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement