/ QuartzCore / CIVector.m
CIVector.m
1 #import <Foundation/NSException.h> 2 #import <Foundation/NSString.h> 3 #import <QuartzCore/CIVector.h> 4 5 @implementation CIVector 6 7 + (CIVector *) vectorWithValues: (const CGFloat *) values 8 count: (size_t) count 9 { 10 return [[[self alloc] initWithValues: values count: count] autorelease]; 11 } 12 13 + (CIVector *) vectorWithX: (CGFloat) x { 14 return [[[self alloc] initWithX: x] autorelease]; 15 } 16 17 + (CIVector *) vectorWithX: (CGFloat) x Y: (CGFloat) y { 18 return [[[self alloc] initWithX: x Y: y] autorelease]; 19 } 20 21 + (CIVector *) vectorWithX: (CGFloat) x Y: (CGFloat) y Z: (CGFloat) z { 22 return [[[self alloc] initWithX: x Y: y Z: z] autorelease]; 23 } 24 25 + (CIVector *) vectorWithX: (CGFloat) x 26 Y: (CGFloat) y 27 Z: (CGFloat) z 28 W: (CGFloat) w 29 { 30 return [[[self alloc] initWithX: x Y: y Z: z W: w] autorelease]; 31 } 32 33 - initWithValues: (const CGFloat *) values count: (size_t) count { 34 _count = count; 35 _values = NSZoneMalloc(NULL, sizeof(CGFloat) * count); 36 37 int i; 38 for (i = 0; i < count; i++) 39 _values[i] = values[i]; 40 41 return self; 42 } 43 44 - (void) dealloc { 45 NSZoneFree(NULL, _values); 46 [super dealloc]; 47 } 48 49 - initWithX: (CGFloat) x { 50 return [self initWithValues: &x count: 1]; 51 } 52 53 - initWithX: (CGFloat) x Y: (CGFloat) y { 54 CGFloat values[2] = {x, y}; 55 return [self initWithValues: values count: 2]; 56 } 57 58 - initWithX: (CGFloat) x Y: (CGFloat) y Z: (CGFloat) z { 59 CGFloat values[3] = {x, y, z}; 60 return [self initWithValues: values count: 3]; 61 } 62 63 - initWithX: (CGFloat) x Y: (CGFloat) y Z: (CGFloat) z W: (CGFloat) w { 64 CGFloat values[4] = {x, y, z, w}; 65 return [self initWithValues: values count: 4]; 66 } 67 68 - (size_t) count { 69 return _count; 70 } 71 72 - (CGFloat) valueAtIndex: (size_t) index { 73 if (index >= _count) { 74 [NSException raise: NSInvalidArgumentException 75 format: @"index %d is beyond count %d", index, _count]; 76 return 0; 77 } 78 79 return _values[index]; 80 } 81 82 - (CGFloat) X { 83 return [self valueAtIndex: 0]; 84 } 85 86 - (CGFloat) Y { 87 return [self valueAtIndex: 1]; 88 } 89 90 - (CGFloat) Z { 91 return [self valueAtIndex: 2]; 92 } 93 94 - (CGFloat) W { 95 return [self valueAtIndex: 3]; 96 } 97 98 @end