11#import "TSXAdditions.h"
13@implementation NSObject (TSXAdditions)
15- (void)setValuesForKeyPathsWithDictionary:(NSDictionary *)keyedValues
17 for (
id keyPath in keyedValues)
18 [
self setValue:[keyedValues objectForKey:keyPath] forKeyPath:keyPath];
23 if ([
self respondsToSelector:@selector(mutableCopyWithZone:)])
24 return [self mutableCopy];
25 else if ([
self respondsToSelector:@selector(copyWithZone:)])
35@implementation NSString (TSXAdditions)
37#pragma mark Creation routines
38+ (NSString *)stringWithUUID
40 CFUUIDRef uuidObj = CFUUIDCreate(nil);
41 NSString *uuidString = (NSString *)CFUUIDCreateString(nil, uuidObj);
43 return [uuidString autorelease];
49- (NSData *)dataFromHexString
51 NSData *hexData = [
self dataUsingEncoding:NSASCIIStringEncoding];
52 const char *hexBuf = [hexData bytes];
53 NSUInteger hexLen = [hexData length];
59 if ((hexLen % 2) != 0)
64 NSMutableData *binaryData = [NSMutableData dataWithLength:(hexLen / 2)];
65 unsigned char *binaryPtr = [binaryData mutableBytes];
66 unsigned char value = 0;
67 for (NSUInteger i = 0; i < hexLen; i++)
82 value += 10 + c - 'a';
86 value += 10 + c - 'A';
100 return [NSData dataWithData:binaryData];
103+ (NSString *)hexStringFromData:(const
unsigned char *)data
104 ofSize:(
unsigned int)size
105 withSeparator:(NSString *)sep
106 afterNthChar:(
int)sepnth
108 NSMutableString *result;
109 NSString *immutableResult;
111 result = [[NSMutableString alloc] init];
112 for (
int i = 0; i < size; i++)
114 if (i && sep && sepnth && i % sepnth == 0)
115 [result appendString:sep];
116 [result appendFormat:@"%02X", data[i]];
119 immutableResult = [NSString stringWithString:result];
121 return immutableResult;
126#pragma mark Mutable deep copy for dictionary, array and set
128@implementation NSDictionary (TSXAdditions)
132 NSMutableDictionary *newDictionary = [[NSMutableDictionary alloc] init];
133 NSEnumerator *enumerator = [
self keyEnumerator];
135 while ((key = [enumerator nextObject]))
137 id obj = [[
self objectForKey:key] mutableDeepCopy];
138 [newDictionary setObject:obj forKey:key];
141 return newDictionary;
146@implementation NSArray (TSXAdditions)
150 NSMutableArray *newArray = [[NSMutableArray alloc] init];
151 NSEnumerator *enumerator = [
self objectEnumerator];
153 while ((obj = [enumerator nextObject]))
155 obj = [obj mutableDeepCopy];
156 [newArray addObject:obj];
164@implementation NSSet (TSXAdditions)
168 NSMutableSet *newSet = [[NSMutableSet alloc] init];
169 NSEnumerator *enumerator = [
self objectEnumerator];
171 while ((obj = [enumerator nextObject]))
173 obj = [obj mutableDeepCopy];
174 [newSet addObject:obj];
187@implementation NSData (TSXAdditions)
189#pragma mark - String Conversion
190- (NSString *)hexadecimalString
194 const unsigned char *dataBuffer = (
const unsigned char *)[
self bytes];
197 return [NSString string];
199 NSUInteger dataLength = [
self length];
200 NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
202 for (
int i = 0; i < dataLength; ++i)
203 [hexString appendString:[NSString stringWithFormat:
@"%02lx", (
unsigned long)dataBuffer[i]]];
205 return [NSString stringWithString:hexString];
209- (NSString *)base64EncodedString
211 const char *data = (
const char *)[
self bytes];
213 NSData *nsData = [data dataUsingEncoding:NSUTF8StringEncoding];
214 NSString *sEnc = [nsData base64EncodedStringWithOptions:0];