Adding a category to NSProxy that fixes a bug so as to allow NSProxies to be
[ITFoundation.git] / ITCategory-NSObject.m
1 #import "ITCategory-NSObject.h"
2 #import <objc/objc-runtime.h>
3
4 @implementation NSObject (ITCategory)
5
6 + (NSArray *)subclasses
7 {
8     NSMutableArray    *tempArray;
9     NSArray           *resultArray;
10     Class             *classes;
11     struct objc_class *superClass;
12     Class             *current;
13     int                count, newCount, index;
14
15     tempArray   = [[NSMutableArray allocWithZone:nil] initWithCapacity:12];
16     resultArray = nil;
17
18     if (tempArray)
19     {
20         classes = NULL;
21         count   = objc_getClassList(NULL, 0);
22         if (count)
23         {
24             classes = malloc(sizeof(Class) * count);
25             if (classes)
26             {
27                 newCount = objc_getClassList(classes, count);
28                 while (count < newCount)
29                 {
30                     count = newCount;
31                     free(classes);
32                     classes = malloc(sizeof(Class) * count);
33                     if (classes)
34                         newCount = objc_getClassList(classes, count);
35                 }
36                 count = newCount;
37             }
38         }
39
40         if (classes)
41         {
42             const Class thisClass = [self class];
43             current = classes;
44
45             for (index = 0; index < count; ++index)
46             {
47                 superClass = (*current)->super_class;
48                 if (superClass)
49                 {
50                     do
51                     {
52                         if (superClass == thisClass)
53                         {
54                             [tempArray addObject:*current];
55                             break;
56                         }
57                         superClass = superClass->super_class;
58                     } while (superClass);
59                 }
60
61                 ++current;
62             }
63
64             free(classes);
65         }
66
67         resultArray = [NSArray arrayWithArray:tempArray];
68         [tempArray release];
69     }
70
71     return resultArray;
72 }
73
74 + (NSArray *)directSubclasses
75 {
76     NSMutableArray *tempArray;
77     NSArray        *resultArray;
78     Class          *classes;
79     Class          *current;
80     int             count, newCount, index;
81
82     tempArray   = [[NSMutableArray allocWithZone:nil] initWithCapacity:12];
83     resultArray = nil;
84
85     if (tempArray)
86     {
87         classes = NULL;
88         count   = objc_getClassList(NULL, 0);
89         if (count)
90         {
91             classes = malloc(sizeof(Class) * count);
92             if (classes)
93             {
94                 newCount = objc_getClassList(classes, count);
95                 while (count < newCount)
96                 {
97                     count = newCount;
98                     free(classes);
99                     classes = malloc(sizeof(Class) * count);
100                     if (classes)
101                         newCount = objc_getClassList(classes, count);
102                 }
103                 count = newCount;
104             }
105         }
106
107         if (classes)
108         {
109             const Class thisClass = [self class];
110             current = classes;
111
112             for (index = 0; index < count; ++index)
113             {
114                 if ((*current)->super_class == thisClass)
115                     [tempArray addObject:*current];
116                 ++current;
117             }
118
119             free(classes);
120         }
121
122         resultArray = [NSArray arrayWithArray:tempArray];
123         [tempArray release];
124     }
125
126     return resultArray;
127 }
128
129 @end