CachingRegistry.st
changeset 4434 887b60637a1c
child 17711 39faaaf888b4
child 18249 7d686f203624
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CachingRegistry.st	Fri Jul 23 01:17:43 1999 +0200
@@ -0,0 +1,96 @@
+"
+ COPYRIGHT (c) 1999 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+
+
+Registry subclass:#CachingRegistry
+	instanceVariableNames:'keptReferences cacheSize'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'System-Support'
+!
+
+!CachingRegistry class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1999 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+
+!
+
+documentation
+"
+    A CachingRegistry behaves generally like a registry;
+    However, it keeps hard references to the last n registered objects,
+    preventing them from being garbage collected (and finalized).
+    This is useful for resources, which do not cost too much memory,
+    but are expensive to allocate - a special canditate of this kind are
+    XFonts. With a CachingRegistry, fonts are kept a bit longer alive
+    and can therefore often be reused - even if temporarily unreferenced.
+
+    This is kind of experimental.
+
+
+    [author:]
+        Claus Gittinger (cg@exept)
+
+    [see also:]
+
+    [instance variables:]
+        keptObjects             Collection      hard referenced objects
+        cacheSize               Integer         number of hard references
+
+    [class variables:]
+"
+! !
+
+!CachingRegistry methodsFor:'private'!
+
+cacheSize:aNumber
+    keptReferences := OrderedCollection new:aNumber.
+    cacheSize := aNumber.
+! !
+
+!CachingRegistry methodsFor:'registering objects'!
+
+register:anObject as:aHandle
+    keptReferences removeIdentical:anObject ifAbsent:nil.
+    keptReferences addLast:anObject.
+    keptReferences size > cacheSize ifTrue:[
+        keptReferences removeFirst.
+    ].
+    super register:anObject as:aHandle.
+!
+
+repairTally
+    keptReferences := OrderedCollection new:cacheSize.
+    super repairTally.
+!
+
+unregister:anObject atIndex:index
+    keptReferences removeIdentical:anObject ifAbsent:nil.
+    super unregister:anObject atIndex:index.
+! !
+
+!CachingRegistry class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libbasic/CachingRegistry.st,v 1.1 1999-07-22 23:17:43 cg Exp $'
+! !