cython-devel
changeset 1859:750843d31989
Templating utility code
| author | Robert Bradshaw <robertwb@math.washington.edu> |
|---|---|
| date | Sat Mar 14 21:42:28 2009 -0700 (2 years ago) |
| parents | c61b867c0135 |
| children | a9ff15be28e4 |
| files | Cython/Utils.py |
line diff
1.1 --- a/Cython/Utils.py Sat Mar 14 23:05:09 2009 +0100
1.2 +++ b/Cython/Utils.py Sat Mar 14 21:42:28 2009 -0700
1.3 @@ -89,6 +89,12 @@
1.4 value = int(value)
1.5 return not -2**31 <= value < 2**31
1.6
1.7 +def none_or_sub(s, data):
1.8 + if s is None:
1.9 + return s
1.10 + else:
1.11 + return s % data
1.12 +
1.13 # a simple class that simplifies the usage of utility code
1.14
1.15 class UtilityCode(object):
1.16 @@ -98,6 +104,7 @@
1.17 self.init = init
1.18 self.cleanup = cleanup
1.19 self.requires = requires
1.20 + self._cache = {}
1.21
1.22 def write_init_code(self, writer, pos):
1.23 if not self.init:
1.24 @@ -114,3 +121,21 @@
1.25 self.cleanup(writer, pos)
1.26 else:
1.27 writer.put(self.cleanup)
1.28 +
1.29 + def specialize(self, **data):
1.30 + # Dicts aren't hashable...
1.31 + key = data.items(); key.sort(); key = tuple(key)
1.32 + try:
1.33 + return self._cache[key]
1.34 + except KeyError:
1.35 + if self.requires is None:
1.36 + requires = None
1.37 + else:
1.38 + requires = [r.specialize(data) for r in self.requires]
1.39 + s = self._cache[key] = UtilityCode(
1.40 + none_or_sub(self.proto, data),
1.41 + none_or_sub(self.impl, data),
1.42 + none_or_sub(self.init, data),
1.43 + none_or_sub(self.cleanup, data),
1.44 + requires)
1.45 + return s
