Skip to content

Instantly share code, notes, and snippets.

@markd2
Created June 27, 2013 15:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save markd2/5877681 to your computer and use it in GitHub Desktop.
Save markd2/5877681 to your computer and use it in GitHub Desktop.
#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