# HG changeset patch # User Claus Gittinger # Date 1076366653 -3600 # Node ID b803fe91b1cbec7441cb4e1eb4e974bd36fb0538 # Parent 80df105ac17c3cba07a5c05fcb6ff03209893aeb faster privateClassesSorted diff -r 80df105ac17c -r b803fe91b1cb Class.st --- a/Class.st Mon Feb 09 23:43:45 2004 +0100 +++ b/Class.st Mon Feb 09 23:44:13 2004 +0100 @@ -1042,25 +1042,31 @@ "return a collection of my private classes (if any). The classes are sorted by inheritance." - |classes| + |classes pivateClassesOf| classes := self privateClasses. (classes size > 0) ifTrue:[ - classes := classes asOrderedCollection. - classes sort:[:a :b | a name < b name]. - classes topologicalSort:[:a :b | - "/ a must come before b iff: - "/ b is a subclass of a - "/ b has a private class which is a subclass of a + classes := classes asOrderedCollection. + classes sort:[:a :b | a name < b name]. + + pivateClassesOf := IdentityDictionary new. + classes do:[:each | pivateClassesOf at:each put:(each allPrivateClasses)]. + + classes topologicalSort:[:a :b | + "/ a must come before b iff: + "/ b is a subclass of a + "/ b has a private class which is a subclass of a - |mustComeBefore| - - mustComeBefore := false. - b withAllPrivateClassesDo:[:eachClassInB | - mustComeBefore := mustComeBefore or:[eachClassInB isSubclassOf:a] - ]. - mustComeBefore - ]. + |mustComeBefore pivateClassesOfB| + + mustComeBefore := b isSubclassOf:a. + + pivateClassesOfB := pivateClassesOf at:b. + pivateClassesOfB do:[:eachClassInB | + mustComeBefore := mustComeBefore or:[eachClassInB isSubclassOf:a] + ]. + mustComeBefore + ]. ]. ^ classes. @@ -4834,5 +4840,5 @@ !Class class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/Class.st,v 1.453 2004-02-03 15:45:01 cg Exp $' + ^ '$Header: /cvs/stx/stx/libbasic/Class.st,v 1.454 2004-02-09 22:44:13 cg Exp $' ! !