/ 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