summaryrefslogtreecommitdiff
path: root/UICaboodle
diff options
context:
space:
mode:
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.h16
-rw-r--r--UICaboodle/UCYield.h64
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