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