forked from nygard/class-dump
-
Notifications
You must be signed in to change notification settings - Fork 24
/
CDTopoSortNode.m
112 lines (88 loc) · 2.79 KB
/
CDTopoSortNode.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// This file is part of class-dump, a utility for examining the
// Objective-C segment of Mach-O files.
// Copyright (C) 1997-1998, 2000-2001, 2004 Steve Nygard
#import "CDTopoSortNode.h"
#import "rcsid.h"
#import <Foundation/Foundation.h>
#import "NSObject-CDExtensions.h"
RCS_ID("$Header: /Volumes/Data/tmp/Tools/class-dump/CDTopoSortNode.m,v 1.5 2004/02/11 00:07:54 nygard Exp $");
@implementation CDTopoSortNode
- (id)initWithObject:(id <CDTopologicalSort>)anObject;
{
if ([super init] == nil)
return nil;
representedObject = [anObject retain];
dependancies = [[NSMutableSet alloc] init];
color = CDWhiteNodeColor;
[self addDependanciesFromArray:[representedObject dependancies]];
return self;
}
- (void)dealloc;
{
[representedObject release];
[dependancies release];
[super dealloc];
}
- (NSString *)identifier;
{
return [representedObject identifier];
}
- (id)representedObject;
{
return representedObject;
}
- (NSArray *)dependancies;
{
return [dependancies allObjects];
}
- (void)addDependancy:(NSString *)anIdentifier;
{
[dependancies addObject:anIdentifier];
}
- (void)removeDependancy:(NSString *)anIdentifier;
{
[dependancies removeObject:anIdentifier];
}
- (void)addDependanciesFromArray:(NSArray *)identifiers;
{
[self performSelector:@selector(addDependancy:) withObjectsFromArray:identifiers];
//[identifiers makeObject:self performSelector:@selector(addDependancy:)];
}
- (CDNodeColor)color;
{
return color;
}
- (void)setColor:(CDNodeColor)newColor;
{
color = newColor;
}
- (NSString *)description;
{
return [NSString stringWithFormat:@"%@ (%d) depends on %@", [self identifier], color, [[dependancies allObjects] componentsJoinedByString:@", "]];
}
- (NSComparisonResult)ascendingCompareByIdentifier:(id)otherNode;
{
return [[self identifier] compare:[otherNode identifier]];
}
- (void)topologicallySortNodes:(NSDictionary *)nodesByIdentifier intoArray:(NSMutableArray *)sortedArray;
{
NSArray *dependantIdentifiers;
int count, index;
NSString *anIdentifier;
CDTopoSortNode *aNode;
dependantIdentifiers = [self dependancies];
count = [dependantIdentifiers count];
for (index = 0; index < count; index++) {
anIdentifier = [dependantIdentifiers objectAtIndex:index];
aNode = [nodesByIdentifier objectForKey:anIdentifier];
if ([aNode color] == CDWhiteNodeColor) {
[aNode setColor:CDGrayNodeColor];
[aNode topologicallySortNodes:nodesByIdentifier intoArray:sortedArray];
} else if ([aNode color] == CDGrayNodeColor) {
NSLog(@"Warning: Possible circular reference? %@ -> %@", [self identifier], [aNode identifier]);
}
}
[sortedArray addObject:[self representedObject]];
[self setColor:CDBlackNodeColor];
}
@end