MyTree.m
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:9k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //
  2. //  MyTree.m
  3. //  celestia
  4. //
  5. //  Created by Bob Ippolito on Thu Jun 20 2002.
  6. //  Copyright (C) 2007, Celestia Development Team
  7. //
  8. #import "MyTree.h"
  9. // HACK
  10. #import "CelestiaFavorite.h"
  11. #import <objc/objc-class.h>
  12. @implementation MyVector
  13. -(void)encodeWithCoder:(NSCoder*)coder
  14. {
  15. //    NSLog(@"[MyVector encodeWithCoder:%@]",coder);
  16.     //[super encodeWithCoder:coder];
  17.     [coder encodeObject:_array];
  18.     //[coder encodeValueOfObjCType:@encode(Class) at:&_myClass];
  19. }
  20. -(id)initWithCoder:(NSCoder*)coder
  21. {
  22. //    NSLog(@"[MyVector initWithCoder:%@]",coder);
  23.     //self = [super initWithCoder:coder];
  24.     self = [self init];
  25.     _array = [[coder decodeObject] retain];
  26.     //[coder decodeValueOfObjCType:@encode(Class) at:&_myClass];
  27.     return self;
  28. }
  29. -(id)init
  30. {
  31.     self = [super init];
  32.     _array = [[NSMutableArray arrayWithCapacity:0] retain];
  33.     _myClass = [NSObject class];
  34.     return self;
  35. }
  36. -(id)initWithClass:(Class)myClass
  37. {
  38.     self = [self init];
  39.     _myClass = myClass;
  40.     return self;
  41. }
  42. -(void)dealloc
  43. {
  44.     [_array release];
  45.     [super dealloc];
  46. }
  47. -(void)addObject:(id)obj
  48. {
  49.     if (![obj isKindOfClass:_myClass])
  50.         [NSException raise:@"TypeError" format:@"%s invalid, only %s allowed",NAMEOF(obj),_myClass->name];
  51.     [_array addObject:obj];
  52. }
  53. -(void)insertObject:(id)obj atIndex:(unsigned)idx
  54. {
  55.     if (![obj isKindOfClass:_myClass])
  56.         [NSException raise:@"TypeError" format:@"%s invalid, only %s allowed",NAMEOF(obj),_myClass->name];
  57.     [_array insertObject:obj atIndex:idx];
  58. }
  59. -(void)removeLastObject
  60. {
  61.     [_array removeLastObject];
  62. }
  63. -(void)removeObjectAtIndex:(unsigned)idx
  64. {
  65.     [_array removeObjectAtIndex:idx];
  66. }
  67. -(void)replaceObjectAtIndex:(unsigned)idx withObject:(id)obj
  68. {
  69.     if (![obj isKindOfClass:_myClass])
  70.         [NSException raise:@"TypeError" format:@"%s invalid, only %s allowed",NAMEOF(obj),_myClass->name];
  71.     [_array replaceObjectAtIndex:idx withObject:obj];
  72. }
  73. -(unsigned)count
  74. {
  75.     return [_array count];
  76. }
  77. -(id)objectAtIndex:(unsigned)idx
  78. {
  79.     return [_array objectAtIndex:idx];
  80. }
  81. @end
  82. @implementation MyTree
  83. -(void)encodeWithCoder:(NSCoder*)coder
  84. {
  85. //    NSLog(@"[MyTree encodeWithCoder:%@]",coder);
  86.     //[super encodeWithCoder:coder];
  87.     [coder encodeObject:_nodeValue];
  88.     [coder encodeObject:_children];
  89. }
  90. -(id)initWithCoder:(NSCoder*)coder
  91. {
  92. //    NSLog(@"[MyTree initWithCoder:%@]",coder);
  93.     //self = [super initWithCoder:coder];
  94.     self = [self init];
  95.     _parent = nil;
  96.     _nodeValue = [[coder decodeObject] retain];
  97.     _children = [[coder decodeObject] retain];
  98.     [_children makeObjectsPerformSelector:@selector(setParent:) withObject:self];
  99.     return self;
  100. }
  101. -(id)init
  102. {
  103.     self = [super init];
  104.     _nodeValue = nil;
  105.     _children = nil;
  106.     _parent = nil;
  107.     return self;
  108. }
  109. -(void)dealloc
  110. {
  111. //    NSLog(@"[MyTree dealloc]");
  112. //    NSLog(@"%@",self);
  113.     if ([self nodeValue] != nil)
  114.         [[self nodeValue] autorelease];
  115.     if ([self children] != nil)
  116.         [[self children] autorelease];
  117.     _nodeValue = nil;
  118.     _children = nil;
  119.     _parent = nil;
  120.     [super dealloc];
  121. }
  122. -(id)initWithNode:(id)obj parent:(MyTree*)parent
  123. {
  124.     self = [self init];
  125.     _nodeValue = [obj retain];
  126.     _parent = parent;
  127.     _children = nil;
  128.     return self;
  129. }
  130. -(id)initWithNode:(id)obj parent:(MyTree*)parent children:(NSArray*)children
  131. {
  132.     NSEnumerator* enumerator;
  133.     self = [self initWithNode:obj parent:parent];
  134.     _children = [[MyVector alloc] initWithClass:[MyTree class]];
  135.     enumerator = [children objectEnumerator];
  136.     while ((obj = [enumerator nextObject]) != nil)
  137.         [_children addObject:obj];
  138.     return self;
  139. }
  140. -(id)initWithDictionary:(NSDictionary*)dict parent:(MyTree*)parent
  141. {
  142.     NSMutableArray* children = nil;
  143.     NSArray* origArray = nil;
  144.     NSEnumerator* enumerator = nil;
  145.     NSDictionary* childDict = nil;
  146.     id <NSCoding> nodeValue = nil;
  147.     // NSLog(@"[MyTree initWithDictionary:%@ parent:%@]",dict,parent);
  148.     // this part could use some work
  149.     nodeValue = [[[CelestiaFavorite alloc] initWithDictionary:[dict objectForKey:@"nodeValue"]] autorelease];
  150.     // Leaf
  151.     if ((origArray = [dict objectForKey:@"children"]) == nil)
  152.         return [self initWithNode:nodeValue parent:parent];
  153.     children = [[[MyVector alloc] initWithClass:[MyTree class]] autorelease];
  154.     enumerator = [origArray objectEnumerator];
  155.     while ((childDict = [enumerator nextObject]) != nil)
  156.         [children addObject:[[[MyTree alloc] initWithDictionary:childDict parent:self] autorelease]];
  157.     return [self initWithNode:nodeValue parent:parent children:children];
  158. }
  159. -(MyTree*)parent
  160. {
  161.     return _parent;
  162. }
  163. -(MyVector*)children
  164. {
  165.     return _children;
  166. }
  167. -(id)nodeValue
  168. {
  169.     return _nodeValue;
  170. }
  171. -(BOOL)isLeaf
  172. {
  173.     return (([self children] == nil) ? YES : NO);
  174. }
  175. -(void)setNode:(id)obj
  176. {
  177.     if ([self nodeValue] != nil)
  178.         [[self nodeValue] autorelease];
  179.     _nodeValue = [obj retain];
  180. }
  181. -(void)setParent:(MyTree*)obj
  182. {
  183.     _parent = obj;
  184. }
  185. -(void)setChildren:(NSArray*)children
  186. {
  187.     NSEnumerator *enumerator = nil;
  188.     id obj = nil;
  189.     if ([self children] == nil)
  190.         [[self children] autorelease];
  191.     if (children == nil) {
  192.         _children = nil;
  193.         return;
  194.     }
  195.     enumerator = [children objectEnumerator];
  196.     _children = [[MyVector alloc] initWithClass:[MyTree class]];
  197.     while ((obj = [enumerator nextObject]) != nil)
  198.         [_children addObject:obj];
  199. }
  200. -(NSDictionary*)dictionary
  201. {
  202.     return [NSDictionary dictionaryWithObjectsAndKeys:[[self nodeValue] dictionary],@"nodeValue",[NSNumber numberWithBool:[self isLeaf]],@"isLeaf",[self children],@"children",nil,nil];
  203. }
  204. -(NSDictionary*)recursiveDictionary
  205. {
  206.     NSMutableArray* array;
  207.     NSEnumerator* enumerator;
  208.     MyTree* obj;
  209.     if ([self isLeaf])
  210.         return [self dictionary];
  211.     enumerator = [[self children] objectEnumerator];
  212.     array = [NSMutableArray arrayWithCapacity:[[self children] count]];
  213.     while ((obj = [enumerator nextObject]) != nil)
  214.         [array addObject:[obj recursiveDictionary]];
  215.     return [NSDictionary dictionaryWithObjectsAndKeys:[[self nodeValue] dictionary],@"nodeValue",[NSArray arrayWithArray:array],@"children",nil,nil];
  216. }
  217. -(NSString*)description
  218. {
  219.     return [[self dictionary] description];
  220. }
  221. -(BOOL)isDescendantOfNode:(MyTree*)node
  222. {
  223.     MyTree* parent = self;
  224.     if ([self isEqualTo:node])
  225.         return YES;
  226.     while ((parent = [parent parent]) != nil)
  227.         if ([node isEqualTo:parent])
  228.             return YES;
  229.     return NO;
  230. }
  231. -(BOOL)isDescendantOfNodeInArray:(NSArray*)array
  232. {
  233.     NSEnumerator* enumerator = [array objectEnumerator];
  234.     MyTree* node = nil;
  235.     while ((node = [enumerator nextObject]) != nil)
  236.         if ([self isDescendantOfNode:node] == YES)
  237.             return YES;
  238.     return NO;
  239. }
  240. - (void)insertChild:(MyTree*)child atIndex:(int)index {
  241.     [[self children] insertObject:child atIndex:index];
  242.     [child setParent: self];
  243. }
  244. - (void)insertChildren:(NSArray*)children atIndex:(int)index {
  245.     [[self children] insertObjectsFromArray: children atIndex: index];
  246.     [children makeObjectsPerformSelector:@selector(setParent:) withObject:self];
  247. }
  248. - (void)_removeChildrenIdenticalTo:(NSArray*)children {
  249.     MyTree *child;
  250.     NSEnumerator *childEnumerator = [children objectEnumerator];
  251.     [children makeObjectsPerformSelector:@selector(setParent:) withObject:nil];
  252.     while ((child = [childEnumerator nextObject]) != nil) {
  253.         [[self children] removeObjectIdenticalTo:child];
  254.     }
  255. }
  256. - (void)removeChild:(MyTree*)child {
  257.     [[self children] removeObject:child];
  258. /*
  259.     int index = [self indexOfChild: child];
  260.     if (index != NSNotFound) {
  261.         [self _removeChildrenIdenticalTo: [NSArray arrayWithObject: [self childAtIndex:index]]];
  262.     }
  263. */
  264. }
  265. - (void)removeFromParent {
  266.     [[self parent] removeChild:self];
  267. }
  268. - (int)indexOfChild:(MyTree*)child {
  269.     return [[self children] indexOfObject:child];
  270. }
  271. - (int)indexOfChildIdenticalTo:(MyTree*)child {
  272.     return [[self children] indexOfObjectIdenticalTo:child];
  273. }
  274. - (int)numberOfChildren {
  275.     return [[self children] count];
  276. }
  277. - (MyTree*)firstChild {
  278.     return [[self children] objectAtIndex:0];
  279. }
  280. - (MyTree*)lastChild {
  281.     return [[self children] lastObject];
  282. }
  283. - (MyTree*)childAtIndex:(int)index {
  284.     return [[self children] objectAtIndex:index];
  285. }
  286. // Returns the minimum nodes from 'allNodes' required to cover the nodes in 'allNodes'.
  287. // This methods returns an array containing nodes from 'allNodes' such that no node in
  288. // the returned array has an ancestor in the returned array.
  289. // There are better ways to compute this, but this implementation should be efficient for our app.
  290. + (NSArray *) minimumNodeCoverFromNodesInArray: (NSArray *)allNodes {
  291.     NSMutableArray *minimumCover = [NSMutableArray array];
  292.     NSMutableArray *nodeQueue = [NSMutableArray arrayWithArray:allNodes];
  293.     MyTree *node = nil;
  294.     while ([nodeQueue count]) {
  295.         node = [nodeQueue objectAtIndex:0];
  296.         [nodeQueue removeObjectAtIndex:0];
  297.         while ( [node parent] && [nodeQueue containsObjectIdenticalTo:[node parent]] ) {
  298.             [nodeQueue removeObjectIdenticalTo: node];
  299.             node = [node parent];
  300.         }
  301.         if (![node isDescendantOfNodeInArray: minimumCover]) [minimumCover addObject: node];
  302.         [nodeQueue removeObjectIdenticalTo: node];
  303.     }
  304.     return minimumCover;
  305. }
  306. @end