Created
June 27, 2013 15:56
-
-
Save markd2/5877681 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <Foundation/Foundation.h> | |
// clang++ -DCOVER_METHODS=1 -fobjc-arc -g -ObjC++ -Wall -framework Foundation -o machinery machinery.cpp | |
// clang++ -DFORWARD_INVOCATION=1-fobjc-arc -g -ObjC++ -Wall -framework Foundation -o machinery machinery.cpp | |
// clang++ -DFORWARDING_TARGET=1-fobjc-arc -g -ObjC++ -Wall -framework Foundation -o machinery machinery.cpp | |
/* | |
#define COVER_METHODS 0 | |
#define FORWARD_INVOCATION 0 | |
#define FORWARDING_TARGET 0 | |
*/ | |
// -------------------------------------------------- | |
#pragma mark C++ Abstract Class | |
class AbstractBaseClass { | |
public: | |
virtual void overrideMe (int shoeSize) = 0; | |
}; | |
class NumberyThing { | |
public: | |
int integerValue (void) { return 23; }; | |
}; | |
class StringyThing { | |
public: | |
int length (void) { return 4; }; | |
}; | |
class CheesyThing : public NumberyThing, | |
public StringyThing { | |
}; | |
// -------------------------------------------------- | |
#pragma mark Cover Methods | |
#if COVER_METHODS | |
@protocol XXNumbery | |
- (NSInteger) integerValue; | |
@end | |
@protocol XXStringy | |
- (NSUInteger) length; | |
@end | |
@interface XXCheesyThing : NSObject <XXNumbery, XXStringy> { | |
NSNumber *_number; | |
NSString *_string; | |
} | |
@end // XXCheesyThing | |
@implementation XXCheesyThing | |
- (id) init { | |
if ((self = [super init])) { | |
_number = @( 23.42 ); | |
_string = @"Bork"; | |
} | |
return self; | |
} | |
- (NSInteger) integerValue { | |
return _number.integerValue; | |
} | |
- (NSUInteger) length { | |
return _string.length; | |
} | |
@end // XXCheesyThing, cover methods | |
#endif // COVER_METHODS | |
// -------------------------------------------------- | |
#pragma mark Forward Invocation | |
#if FORWARD_INVOCATION | |
@interface NSObject (XXNumbery) | |
- (NSInteger) integerValue; | |
@end | |
@interface NSObject (XXStringy) | |
- (NSUInteger) length; | |
@end | |
@interface XXCheesyThing : NSObject { | |
NSNumber *_number; | |
NSString *_string; | |
} | |
@end // XXCheesyThing | |
@implementation XXCheesyThing | |
- (id) init { | |
if ((self = [super init])) { | |
_number = @( 23.42 ); | |
_string = @"Bork"; | |
} | |
return self; | |
} | |
- (void) forwardInvocation: (NSInvocation *) invocation { | |
if ([_number respondsToSelector: invocation.selector]) { | |
[invocation invokeWithTarget: _number]; | |
} else if ([_string respondsToSelector: invocation.selector]) { | |
[invocation invokeWithTarget: _string]; | |
} else { | |
[super forwardInvocation: invocation]; | |
} | |
} // forwardInvocation | |
- (NSMethodSignature *) methodSignatureForSelector: (SEL) selector { | |
NSMethodSignature* signature; | |
signature = [super methodSignatureForSelector: selector]; | |
if (signature) return signature; | |
signature = [_number methodSignatureForSelector: selector]; | |
if (signature) return signature; | |
signature = [_string methodSignatureForSelector: selector]; | |
if (signature) return signature; | |
NSLog (@"could not find signature for selector %@", | |
NSStringFromSelector(selector)); | |
return NULL; | |
} // methodSignatureForSelector | |
@end // XXCheesyThing, forward invocation | |
#endif // FORWARD_INVOCATION | |
// -------------------------------------------------- | |
#pragma mark Forwarding Target | |
#if FORWARDING_TARGET | |
@interface NSObject (XXNumbery) | |
- (NSInteger) integerValue; | |
@end | |
@interface NSObject (XXStringy) | |
- (NSUInteger) length; | |
@end | |
@interface XXCheesyThing : NSObject { | |
NSNumber *_number; | |
NSString *_string; | |
} | |
@end // XXCheesyThing | |
@implementation XXCheesyThing | |
- (id) init { | |
if ((self = [super init])) { | |
_number = @( 23.42 ); | |
_string = @"Bork"; | |
} | |
return self; | |
} | |
- (id) forwardingTargetForSelector: (SEL) selector { | |
if ([_number respondsToSelector: selector]) { | |
return _number; | |
} else if ([_string respondsToSelector: selector]) { | |
return _string; | |
} else { | |
return [super forwardingTargetForSelector: selector]; | |
} | |
} // forwardingTargetForSelector | |
@end // XXCheesyThing, forwarding target | |
#endif // FORWARDING_TARGET | |
int main (void) { | |
CheesyThing cheddar; | |
NSLog (@"It's not easy being cheesy++: %d %d\n", | |
cheddar.integerValue(), cheddar.length()); | |
XXCheesyThing *chedzor = [XXCheesyThing new]; | |
NSLog (@"L33T CH3DZ()RZ: %ld %ld\n", | |
[chedzor integerValue], [chedzor length]); | |
#if FORWARD_INVOCATION || FORWARDING_TARGET | |
NSLog (@" others: %.2f, %@", | |
[(id)chedzor floatValue], [(id)chedzor uppercaseString]); | |
#endif | |
return 0; | |
} // main |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment