diff options
Diffstat (limited to 'UICaboodle')
-rw-r--r-- | UICaboodle/UCInternal.h (renamed from UICaboodle/Internals.h) | 0 | ||||
-rw-r--r-- | UICaboodle/UCPlatform.h (renamed from UICaboodle/UICaboodle.h) | 3 | ||||
-rw-r--r-- | UICaboodle/UCString.h | 16 | ||||
-rw-r--r-- | UICaboodle/UCYield.h | 64 |
4 files changed, 83 insertions, 0 deletions
diff --git a/UICaboodle/Internals.h b/UICaboodle/UCInternal.h index 62b46e2..62b46e2 100644 --- a/UICaboodle/Internals.h +++ b/UICaboodle/UCInternal.h diff --git a/UICaboodle/UICaboodle.h b/UICaboodle/UCPlatform.h index f9a4eb3..0940406 100644 --- a/UICaboodle/UICaboodle.h +++ b/UICaboodle/UCPlatform.h @@ -44,3 +44,6 @@ while (false) #define _packed \ __attribute__((packed)) + +//#define _finline __attribute__((force_inline)) +#define _finline inline diff --git a/UICaboodle/UCString.h b/UICaboodle/UCString.h index 77ee6a1..d776728 100644 --- a/UICaboodle/UCString.h +++ b/UICaboodle/UCString.h @@ -3,8 +3,14 @@ #import <Foundation/NSString.h> +@interface NSString (UIKit) +- (NSString *) stringByAddingPercentEscapes; +- (NSString *) stringByReplacingCharacter:(unsigned short)arg0 withCharacter:(unsigned short)arg1; +@end + @interface NSString (UICaboodle) + (NSString *) stringWithDataSize:(double)size; +- (NSString *) stringByAddingPercentEscapesIncludingReserved; @end @implementation NSString (UICaboodle) @@ -21,6 +27,16 @@ return [NSString stringWithFormat:@"%.1f%s", size, powers_[power]]; } +- (NSString *) stringByAddingPercentEscapesIncludingReserved { + return [(id)CFURLCreateStringByAddingPercentEscapes( + kCFAllocatorDefault, + (CFStringRef) self, + NULL, + CFSTR(";/?:@&=+$,"), + kCFStringEncodingUTF8 + ) autorelease]; +} + @end #endif/*UICABOODLE_UCSTRING_H*/ diff --git a/UICaboodle/UCYield.h b/UICaboodle/UCYield.h new file mode 100644 index 0000000..dc75f8f --- /dev/null +++ b/UICaboodle/UCYield.h @@ -0,0 +1,64 @@ +@interface NSObject (UICaboodle) +- (id) yieldToSelector:(SEL)selector withObject:(id)object; +- (id) yieldToSelector:(SEL)selector; +@end + +@implementation NSObject (UICaboodle) + +- (void) doNothing { +} + +- (void) _yieldToContext:(NSMutableArray *)context { _pooled + SEL selector(reinterpret_cast<SEL>([[context objectAtIndex:0] pointerValue])); + id object([[context objectAtIndex:1] nonretainedObjectValue]); + volatile bool &stopped(*reinterpret_cast<bool *>([[context objectAtIndex:2] pointerValue])); + + /* XXX: deal with exceptions */ + id value([self performSelector:selector withObject:object]); + + NSMethodSignature *signature([self methodSignatureForSelector:selector]); + [context removeAllObjects]; + if ([signature methodReturnLength] != 0 && value != nil) + [context addObject:value]; + + stopped = true; + + [self + performSelectorOnMainThread:@selector(doNothing) + withObject:nil + waitUntilDone:NO + ]; +} + +- (id) yieldToSelector:(SEL)selector withObject:(id)object { + /*return [self performSelector:selector withObject:object];*/ + + volatile bool stopped(false); + + NSMutableArray *context([NSMutableArray arrayWithObjects: + [NSValue valueWithPointer:selector], + [NSValue valueWithNonretainedObject:object], + [NSValue valueWithPointer:const_cast<bool *>(&stopped)], + nil]); + + NSThread *thread([[[NSThread alloc] + initWithTarget:self + selector:@selector(_yieldToContext:) + object:context + ] autorelease]); + + [thread start]; + + NSRunLoop *loop([NSRunLoop currentRunLoop]); + NSDate *future([NSDate distantFuture]); + + while (!stopped && [loop runMode:NSDefaultRunLoopMode beforeDate:future]); + + return [context count] == 0 ? nil : [context objectAtIndex:0]; +} + +- (id) yieldToSelector:(SEL)selector { + return [self yieldToSelector:selector withObject:nil]; +} + +@end |