Hi Norbert, On 11 May 2012, at 14:51, Norbert Hartl wrote:
I like to announce a tiny utility I did for my last project. It is only a single class that basically works like LRUCache internally but on the outside it is more like a dictionary. And it has no factory block.
If you don't know LRUCache, it's a fixed size dictionary that sorts its elements by usage in a "Least Recently Used" fashion. Meaning the last used element is put in front and the least used at the end. Elements get discarded at the end if space is full.
Apart from #at: that is provided by LRUCache , LRUDictionary implements to following methods
at:ifAbsent: at:ifAbsentPut: at:ifPresent: at:put: removeAt: removeKey: removeKey:ifAbsent
It is available here
MCHttpRepository location: 'http://source.selfish.org/mc/misc' user: '' password: ''
Blog article is here
http://norbert.hartl.name/blog/lrudictionary/
hope you like it,
Norbert
This code strikes me as less than optimal: putInFront: anObject fromIndex: aNumber values replaceFrom: 2 to: aNumber with: (values first: aNumber - 1). values at: 1 put: anObject. ^ anObject #first: does a copy no ? #replaceFrom:to:with:startingAt: can do in place shifting, if you are careful. I would also optimize for the case when the object is already in front. But even then, all this shifting on each #at: access is a bit costly for a cache, no ? The alternative, working with timestamps is also not that elegant and maybe also not faster. Did you consider it ? Compare performance ? Sven