Advertisement
sophtwhere

NSObject+classSwitch.m

Oct 29th, 2013
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. //  NSObject+classSwitch.m
  3. //
  4. //  Created by Jonathan Annett on 30/10/13.
  5. //  Copyright (c) 2013 Sophtwhere. All rights reserved.
  6. //
  7.  
  8. #import "NSObject+classSwitch.h"
  9. #import "NSObject+arcAgnostics.h"
  10.  
  11.  
  12. /////////////////////////////////
  13. #define DEF_OBJ_CODE(NSObject)\
  14. NSString *_is##NSObject##_ = @#NSObject;
  15. DEFINE_OBECTS()
  16. #undef DEF_OBJ_CODE
  17. /////////////////////////////////
  18. NSString *_isUndefinedObject_ = @"isUndefinedObject";
  19.  
  20.  
  21. #define DEF_OBJ_CODE(NSObject)\
  22. @implementation NSObject (classSwitch)\
  23. -(enum nsObjectSwitchCode) classSwitchCode {\
  24. /**/return is##NSObject;\
  25. }\
  26. +(enum nsObjectSwitchCode) classSwitchCode {\
  27. /**/return is##NSObject;\
  28. }\
  29. -(BOOL)isUndefinedObject {\
  30. /**/return NO;\
  31. }\
  32. -(NSObject*) as##NSObject {\
  33. /**/return self;\
  34. }\
  35. -(BOOL) is##NSObject{\
  36. /**/return YES;\
  37. }\
  38. @end
  39.  
  40. DEFINE_OBECTS()
  41.  
  42. #undef DEF_OBJ_CODE
  43.  
  44.  
  45.  
  46.  
  47.  
  48. @implementation NSObject(classSwitchDefaults)
  49.  
  50. -(dispatch_block_t) class_specific_block_copy:(NSDictionary*) blocks{
  51.    
  52.     id element = nil;
  53.    
  54.     switch (self.classSwitchCode) {
  55.         case isUndefinedObject :
  56.             element = blocks[_isUndefinedObject_];\
  57.             break;
  58.            
  59. #define DEF_OBJ_CODE(NSObject)\
  60. /**/    case is##NSObject:\
  61. /**/        element = blocks[_is##NSObject##_];\
  62. /**/        break;\
  63.  
  64.            
  65.             DEFINE_OBECTS()
  66.            
  67. #undef DEF_OBJ_CODE
  68.            
  69.         default:
  70.             break;
  71.     }
  72.    
  73.     dispatch_block_t result =
  74.     element==nil ? ^{} :
  75.     (dispatch_block_t) ([element isNSString] ? blocks[element] : element);
  76.  
  77.    
  78.     return Block_copy(result);
  79.    
  80. }
  81.  
  82. #define DEF_OBJ_CODE(NSObject)\
  83. -(BOOL) is##NSObject{\
  84. /**/return NO;\
  85. }\
  86. -(NSObject*) as##NSObject{\
  87. /**/return nil;\
  88. }\
  89.  
  90. DEFINE_OBECTS()
  91. #undef DEF_OBJ_CODE
  92.  
  93. -(void) class_specific_block_dispatch:(NSDictionary*) blocks{
  94.     if (blocks){
  95.         dispatch_block_t block = [self class_specific_block_copy:blocks];
  96.         block();
  97.         Block_release(block);
  98.     }
  99. }
  100.  
  101. -(void) class_specific_block_dispatch_async:(dispatch_queue_t) queue
  102.                                      blocks:(NSDictionary*) blocks {
  103.     if (blocks){
  104.         dispatch_block_t block = [self class_specific_block_copy:blocks];
  105.         dispatch_async(queue, ^{
  106.             block();
  107.             Block_release(block);
  108.         });
  109.     }
  110. }
  111.  
  112.  
  113. -(enum nsObjectSwitchCode) classSwitchCode {
  114.     return isUndefinedObject;
  115. }
  116.  
  117. +(enum nsObjectSwitchCode) classSwitchCode {
  118.     return isUndefinedObject;
  119. }
  120.  
  121. -(BOOL)isUndefinedObject {
  122.     return YES;
  123. }
  124.  
  125. +(enum nsObjectSwitchCode) classSwitchCodeFromNSString:(NSString*) string decoder:(NSDictionary*) decode{
  126.     NSNumber *decoded = decode ? decode[string] : nil;
  127.     return decoded ? (enum nsObjectSwitchCode) decoded.unsignedIntegerValue : isUndefinedObject;
  128. }
  129.  
  130.  
  131. +(enum nsObjectSwitchCode) classSwitchCodeFromClassName:(NSString*) classname{
  132.     static NSDictionary *decode = nil;
  133.    
  134.     static dispatch_once_t onceToken;
  135.     dispatch_once(&onceToken, ^{
  136.  
  137.        decode = [@{
  138.                                  
  139. #define DEF_OBJ_CODE(NSObject)\
  140. _is##NSObject##_ :  @(is##NSObject),
  141.  
  142.                                  DEFINE_OBECTS()
  143. #undef DEF_OBJ_CODE
  144.                                  
  145.                                  
  146.                                  } retain];
  147.     });
  148.     return [self classSwitchCodeFromNSString:classname decoder:decode];
  149. }
  150.  
  151.  
  152. @end
  153.  
  154.  
  155.  
  156. @implementation NSObject(testClassSwitch)
  157.  
  158.  
  159.  
  160. +(void ) test {
  161.    
  162.    
  163.    
  164.    
  165.    
  166.     NSArray *hello_world = @[@"hello",@"world"];
  167.    
  168.     NSString *hello = [hello_world componentsJoinedByString:@" "];
  169.    
  170.     NSDictionary *message = @{@"message" : hello};
  171.  
  172.     NSMutableDictionary *greeting = [[@{@"howdie" : hello_world} mutableCopy] autorelease];
  173.  
  174.    
  175.     NSArray *checker = @[hello,hello_world,message,greeting];
  176.    
  177.    
  178.    
  179.     NSDictionary *checkerBlocks = @{
  180.                                    
  181.                                     _isUndefinedObject_ : ^{
  182.                                        
  183.                                         NSLog(@"don't know what to do with this");
  184.  
  185.                                     },
  186.                                    
  187.                                     // use same handler for NSDictionary and NSMutableDictionary
  188.                                    _isNSMutableDictionary_ : _isNSDictionary_,
  189.                                    _isNSDictionary_ :
  190.                                        ^{
  191.                                            NSLog(@"this is a block for a dictionary");
  192.                                        },
  193.                                    
  194.                                     // treat NSURL as undefined.
  195.                                     _isNSURL_ : _isUndefinedObject_,
  196.                                    
  197.                                    _isNSArray_ :
  198.                                        ^{
  199.                                            NSLog(@"this is a block for an array");
  200.                                        },
  201.                                    
  202.                                    _isNSString_ :
  203.                                        ^{
  204.                                            NSLog(@"this is a block for a string - success");
  205.                                        }
  206.                                    
  207.                                    };
  208.    
  209.    
  210.    
  211.     dispatch_block_t myblock = [hello   class_specific_block_copy:checkerBlocks];
  212.     myblock();
  213.     Block_release(myblock);
  214.  
  215.     [hello_world class_specific_block_dispatch:checkerBlocks];
  216.    
  217.     [greeting class_specific_block_dispatch_async:dispatch_get_main_queue() blocks:checkerBlocks];
  218.  
  219.    
  220.    
  221.  
  222.     [[[[UIView alloc] init] autorelease ]class_specific_block_dispatch:checkerBlocks];
  223.    
  224.     [[NSURL URLWithString:@"http://www.google.com" ] class_specific_block_dispatch:checkerBlocks];
  225.    
  226.     for (NSObject *testme in checker) {
  227.    
  228.      
  229.         if (testme.isNSArray) {
  230.             NSLog(@"yes ! testme is an array");
  231.         }
  232.        
  233.         switch (testme.classSwitchCode) {
  234.             case isNSString:
  235.                 NSLog(@"%@ is a string!",testme);
  236.                 break;
  237.             case isNSArray:
  238.                 NSLog(@"%@ is an array with %d elements!",testme,[(NSArray*) testme count]);
  239.                
  240.                 break;
  241.             case isNSMutableArray:
  242.                 NSLog(@"%@ is a mutable array with %d elements!",testme,[(NSArray*) testme count]);
  243.                
  244.                 break;
  245.             case isNSDictionary:
  246.                
  247.                 NSLog(@"%@ is an dictionary with these keys: %@!",testme,[(NSDictionary*) testme allKeys]);
  248.                
  249.                 break;
  250.                
  251.             default:
  252.                 break;
  253.         }
  254.     }
  255.    
  256.    
  257. }
  258.  
  259. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement