def genpyx_map(t, u): """Returns the pyx snippet for a map of type <t, u>.""" t = ts.canon(t) u = ts.canon(u) kw = dict(tclsname=ts.cython_classname(t)[1], uclsname=ts.cython_classname(u)[1], thumname=ts.humanname(t)[1], uhumname=ts.humanname(u)[1], tctype=ts.cython_ctype(t), uctype=ts.cython_ctype(u), tpytype=ts.cython_pytype(t), upytype=ts.cython_pytype(u), tcytype=ts.cython_cytype(t), ucytype=ts.cython_cytype(u),) tisnotinst = ["not isinstance(key, {0})".format(x) for x in ts.from_pytypes[t]] kw['tisnotinst'] = " and ".join(tisnotinst) tc2pykeys = ['tc2pydecl', 'tc2pybody', 'tc2pyrtn'] tc2py = ts.cython_c2py("deref(inow).first", t, cached=False) kw.update([(k, indentstr(v or '')) for k, v in zip(tc2pykeys, tc2py)]) uc2pykeys = ['uc2pydecl', 'uc2pybody', 'uc2pyrtn'] uc2py = ts.cython_c2py("v", u, cached=False, existing_name="deref(self.map_ptr)[k]") kw.update([(k, indentstr(v or '')) for k, v in zip(uc2pykeys, uc2py)]) tpy2ckeys = ['tpy2cdecl', 'tpy2cbody', 'tpy2crtn'] tpy2c = ts.cython_py2c("key", t) kw.update([(k, indentstr(v or '')) for k, v in zip(tpy2ckeys, tpy2c)]) upy2ckeys = ['upy2cdecl', 'upy2cbody', 'upy2crtn'] upy2c = ts.cython_py2c("value", u) kw.update([(k, indentstr(v or '')) for k, v in zip(upy2ckeys, upy2c)]) return _pyxmap.format(**kw)
def _gen_constructor(name, name_mangled, classname, args, doc=None, cpppxd_filename=None, inst_name="self._inst"): argfill = ", ".join(['self'] + [a[0] for a in args if 2 == len(a)] + \ ["{0}={1}".format(a[0], a[2]) for a in args if 3 == len(a)]) lines = ['def {0}({1}):'.format(name_mangled, argfill)] lines += [] if doc is None else indent('\"\"\"{0}\"\"\"'.format(doc), join=False) decls = [] argbodies = [] argrtns = {} for a in args: adecl, abody, artn = cython_py2c(a[0], a[1]) if adecl is not None: decls += indent(adecl, join=False) if abody is not None: argbodies += indent(abody, join=False) argrtns[a[0]] = artn argvals = ', '.join([argrtns[a[0]] for a in args]) classname = classname if cpppxd_filename is None else \ "{0}.{1}".format(cpppxd_filename.rsplit('.', 1)[0], classname) fcall = 'self._inst = new {0}({1})'.format(classname, argvals) func_call = indent(fcall, join=False) lines += decls lines += argbodies lines += func_call lines += ['', ""] return lines
def _gen_property_set(name, t, inst_name="self._inst", cached_name=None): """This generates a Cython property setter for a variable of a given name and type.""" lines = ['def __set__(self, value):'] decl, body, rtn = cython_py2c('value', t) if decl is not None: lines += indent(decl, join=False) if body is not None: lines += indent(body, join=False) lines += indent("{0}.{1} = {2}".format(inst_name, name, rtn), join=False) if cached_name is not None: lines += indent("{0} = None".format(cached_name), join=False) return lines
def genpyx_set(t): """Returns the pyx snippet for a set of type t.""" t = ts.canon(t) kw = dict(clsname=ts.cython_classname(t)[1], humname=ts.humanname(t)[1], ctype=ts.cython_ctype(t), pytype=ts.cython_pytype(t), cytype=ts.cython_cytype(t),) fpt = ts.from_pytypes[t] kw['isinst'] = " or ".join(["isinstance(value, {0})".format(x) for x in fpt]) c2pykeys = ['c2pydecl', 'c2pybody', 'c2pyrtn'] c2py = ts.cython_c2py("deref(inow)", t, cached=False) kw.update([(k, indentstr(v or '')) for k, v in zip(c2pykeys, c2py)]) py2ckeys = ['py2cdecl', 'py2cbody', 'py2crtn'] py2c = ts.cython_py2c("value", t) kw.update([(k, indentstr(v or '')) for k, v in zip(py2ckeys, py2c)]) return _pyxset.format(**kw)
def _gen_method(name, name_mangled, args, rtn, doc=None, inst_name="self._inst"): argfill = ", ".join(['self'] + [a[0] for a in args if 2 == len(a)] + \ ["{0}={1}".format(a[0], a[2]) for a in args if 3 == len(a)]) lines = ['def {0}({1}):'.format(name_mangled, argfill)] lines += [] if doc is None else indent('\"\"\"{0}\"\"\"'.format(doc), join=False) decls = [] argbodies = [] argrtns = {} for a in args: adecl, abody, artn = cython_py2c(a[0], a[1]) if adecl is not None: decls += indent(adecl, join=False) if abody is not None: argbodies += indent(abody, join=False) argrtns[a[0]] = artn rtype = cython_ctype(rtn) hasrtn = rtype not in set(['None', None, 'NULL', 'void']) argvals = ', '.join([argrtns[a[0]] for a in args]) fcall = '{0}.{1}({2})'.format(inst_name, name, argvals) if hasrtn: fcdecl, fcbody, fcrtn, fccached = cython_c2py('rtnval', rtn, cached=False) decls += indent("cdef {0} {1}".format(rtype, 'rtnval'), join=False) func_call = indent('rtnval = {0}'.format(fcall), join=False) if fcdecl is not None: decls += indent(fcdecl, join=False) if fcbody is not None: func_call += indent(fcbody, join=False) func_rtn = indent("return {0}".format(fcrtn), join=False) else: func_call = indent(fcall, join=False) func_rtn = [] lines += decls lines += argbodies lines += func_call lines += func_rtn lines += ['', ""] return lines
def genpyx_vector(t): """Returns the pyx snippet for a vector of type t.""" t = ts.canon(t) kw = dict(clsname=ts.cython_classname(t)[1], humname=ts.humanname(t)[1], fncname=ts.cython_functionname(t)[1], ctype=ts.cython_ctype(t), pytype=ts.cython_pytype(t), cytype=ts.cython_cytype(t), stlcontainers=ts.STLCONTAINERS, extra_types=ts.EXTRA_TYPES) t0 = t while not isinstance(t0, basestring): t0 = t[0] fpt = ts.from_pytypes[t0] kw['isinst'] = " or ".join(["isinstance(value, {0})".format(x) for x in fpt]) c2pykeys = ['c2pydecl', 'c2pybody', 'c2pyrtn'] c2py = ts.cython_c2py("deref(<{0} *> data)".format(kw['ctype']), t, cached=False, proxy_name="data_proxy") kw.update([(k, indentstr(v or '')) for k, v in zip(c2pykeys, c2py)]) cself2pykeys = ['cself2pydecl', 'cself2pybody', 'cself2pyrtn'] cself2py = ts.cython_c2py("(cself.obval)", t, cached=False, proxy_name="val_proxy") kw.update([(k, indentstr(v or '')) for k, v in zip(cself2pykeys, cself2py)]) py2ckeys = ['py2cdecl', 'py2cbody', 'py2crtn'] py2c = ts.cython_py2c("value", t) kw.update([(k, indentstr(v or '')) for k, v in zip(py2ckeys, py2c)]) return _pyxvector.format(**kw)