StackOverflow: Objective-C Possible shorter “if ” notation?
Run:
curl -kOs https://raw.github.com/gist/1550857/vac.m && cc -framework Cocoa -o vac vac.m && ./vac
/* | |
curl -kOs https://raw.github.com/gist/1550857/vac.m && cc -framework Cocoa -o vac vac.m && ./vac | |
For http://stackoverflow.com/questions/8693810/objective-c-possible-shorter-if-notation | |
Variadic function and NSComparator example. | |
*/ | |
#import <Cocoa/Cocoa.h> | |
#import <stdarg.h> | |
#import <stdio.h> | |
// This is just a simple object equality comparator. | |
static NSComparator compareeq = ^(id obj1, id obj2) { | |
if (obj1 == obj2) { | |
return (NSComparisonResult)NSOrderedSame; | |
} | |
return (NSComparisonResult)NSOrderedDescending; | |
}; | |
// This'll execute the above comparator to compare eq to each object in args. | |
NSComparisonResult comparatorV(NSComparator compare, NSObject *eq, va_list args) { | |
NSComparisonResult result; | |
NSObject *value; | |
do { | |
if (value = va_arg(args, NSObject*)) { | |
result = compare(eq,value); | |
} | |
} while (value && result == NSOrderedSame); | |
return (!value?NSOrderedDescending:NSOrderedSame); | |
} | |
// This test if eq is == to all the subsequent objects passed. | |
// The first parameter MUST not be nil and isn't used for comparisons. | |
// If any object passed is nil it'll end the comparison. | |
BOOL isEqualTo(NSObject* eq, ...) { | |
va_list args; | |
va_start(args, eq); | |
BOOL result = (NSOrderedSame != comparatorV(compareeq,eq,args)); | |
va_end(args); | |
return result; | |
} | |
// This'll just test if each object passed is == [NSNull null]. | |
// The first parameter MUST not be nil and isn't used for comparisons. | |
// If any object passed is nil it'll end the comparison. | |
BOOL isNSNull(NSObject *o, ...) { | |
NSNull *n = [NSNull null]; | |
if (NSOrderedSame != compareeq(n,o)) return NO; | |
va_list args; | |
va_start(args, o); | |
BOOL result = (NSOrderedSame != comparatorV(compareeq,n,args)); | |
va_end(args); | |
return result; | |
} | |
#define YN(p) (p?"PASS":"FAIL") | |
#define IS_NSNULL(p) printf("%s\n",YN(p == isNSNull(a,b,c,nil))) | |
#define ALL_ARE_NSNULL IS_NSNULL(YES) | |
#define ALL_ARE_NOT_NSNULL IS_NSNULL(NO) | |
#define IS_EQUAL(p) printf("%s\n",YN(p == isEqualTo(a,b,c,nil))) | |
#define ALL_ARE_EQUAL IS_EQUAL(YES) | |
#define ALL_ARE_NOT_EQUAL IS_EQUAL(NO) | |
int main(int argc, char* argv[]) { | |
NSObject *a,*b,*c; | |
{ | |
a =[[NSObject alloc] init]; | |
b =[[NSObject alloc] init]; | |
c =[[NSObject alloc] init]; | |
ALL_ARE_NOT_NSNULL; | |
} { | |
a =[NSNull null]; | |
b =[[NSObject alloc] init]; | |
c =[NSNull null]; | |
ALL_ARE_NOT_NSNULL; | |
} { | |
a =[NSNull null]; | |
b =[NSNull null]; | |
c =[NSNull null]; | |
ALL_ARE_NSNULL; | |
} { | |
a =[NSNull null]; | |
b =[[NSObject alloc] init]; | |
c =[[NSObject alloc] init]; | |
ALL_ARE_NOT_NSNULL; | |
} { | |
a =[NSNull null]; | |
b =[NSNull null]; | |
c =[[NSObject alloc] init]; | |
ALL_ARE_NOT_NSNULL; | |
} { | |
a =[NSNull null]; | |
b =[[NSObject alloc] init]; | |
c =nil; | |
ALL_ARE_NOT_NSNULL; | |
} { | |
a =[NSNull null]; | |
b =[NSNull null]; | |
c =nil; | |
ALL_ARE_NSNULL; | |
} { | |
a =[NSNull null]; | |
b =nil; | |
c =[NSNull null]; // This'll never be tested because comparison stops with b. | |
ALL_ARE_NSNULL; | |
} | |
printf("\n"); | |
{ | |
a =[[NSObject alloc] init]; | |
b =[[NSObject alloc] init]; | |
c =[[NSObject alloc] init]; | |
ALL_ARE_NOT_EQUAL; | |
} { | |
a =[NSNull null]; | |
b =[[NSObject alloc] init]; | |
c =[NSNull null]; | |
ALL_ARE_NOT_EQUAL; | |
} { | |
a =[NSNull null]; | |
b =[NSNull null]; | |
c =[NSNull null]; | |
ALL_ARE_EQUAL; | |
} { | |
a =b=c=[[NSObject alloc] init]; | |
ALL_ARE_EQUAL; | |
} { | |
a =[NSNull null]; | |
b =[[NSObject alloc] init]; | |
c =[[NSObject alloc] init]; | |
ALL_ARE_NOT_EQUAL; | |
} { | |
a =[NSNull null]; | |
b =[NSNull null]; | |
c =[[NSObject alloc] init]; | |
ALL_ARE_NOT_EQUAL; | |
} { | |
a =[NSNull null]; | |
b =[[NSObject alloc] init]; | |
c =nil; | |
ALL_ARE_NOT_EQUAL; | |
} { | |
a =[NSNull null]; | |
b =nil; | |
c =[NSNull null]; // This'll never be tested because comparison stops with b. | |
ALL_ARE_EQUAL; | |
} | |
} |
StackOverflow: Objective-C Possible shorter “if ” notation?
Run:
curl -kOs https://raw.github.com/gist/1550857/vac.m && cc -framework Cocoa -o vac vac.m && ./vac