Launchpad automatic translations update.
[odoo/odoo.git] / addons / document_webdav / cache.py
1 import time
2 import heapq
3
4 def memoize(maxsize):
5     """decorator to 'memoize' a function - caching its results"""
6     def decorating_function(f):
7         cache = {}  # map from key to value
8         heap = []   # list of keys, in LRU heap
9         cursize = 0 # because len() is slow
10         def wrapper(*args):
11             key = repr(args)
12             # performance crap
13             _cache=cache
14             _heap=heap
15             _heappop = heapq.heappop
16             _heappush = heapq.heappush
17             _time = time.time
18             _cursize = cursize
19             _maxsize = maxsize
20             if not _cache.has_key(key):
21                 if _cursize == _maxsize:
22                     # pop oldest element
23                     (_,oldkey) = _heappop(_heap)
24                     _cache.pop(oldkey)
25                 else:
26                     _cursize += 1
27                 # insert this element
28                 _cache[key] = f(*args)
29                 _heappush(_heap,(_time(),key))
30                 wrapper.misses += 1
31             else:
32                 wrapper.hits += 1
33             return cache[key]
34         wrapper.__doc__ = f.__doc__
35         wrapper.__name__ = f.__name__
36         wrapper.hits = wrapper.misses = 0
37         return wrapper 
38     return decorating_function
39
40
41 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: