functionexporter.py
来自「Boost provides free peer-reviewed portab」· Python 代码 · 共 93 行
PY
93 行
# Copyright Bruno da Silva de Oliveira 2003. Use, modification and # distribution is subject to the Boost Software License, Version 1.0.# (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt)from Exporter import Exporterfrom policies import *from declarations import *from settings import *import utilsimport exporterutils#==============================================================================# FunctionExporter#==============================================================================class FunctionExporter(Exporter): 'Generates boost.python code to export the given function.' def __init__(self, info, tail=None): Exporter.__init__(self, info, tail) def Export(self, codeunit, exported_names): if not self.info.exclude: decls = self.GetDeclarations(self.info.name) for decl in decls: self.info.policy = exporterutils.HandlePolicy(decl, self.info.policy) self.ExportDeclaration(decl, len(decls) == 1, codeunit) self.ExportOpaquePointer(decl, codeunit) self.GenerateOverloads(decls, codeunit) exported_names[self.Name()] = 1 def ExportDeclaration(self, decl, unique, codeunit): name = self.info.rename or decl.name defs = namespaces.python + 'def("%s", ' % name wrapper = self.info.wrapper if wrapper: pointer = '&' + wrapper.FullName() else: pointer = decl.PointerDeclaration() defs += pointer defs += self.PolicyCode() overload = self.OverloadName(decl) if overload: defs += ', %s()' % (namespaces.pyste + overload) defs += ');' codeunit.Write('module', self.INDENT + defs + '\n') # add the code of the wrapper if wrapper and wrapper.code: codeunit.Write('declaration', wrapper.code + '\n') def OverloadName(self, decl): if decl.minArgs != decl.maxArgs: return '%s_overloads_%i_%i' % \ (decl.name, decl.minArgs, decl.maxArgs) else: return '' def GenerateOverloads(self, declarations, codeunit): codes = {} for decl in declarations: overload = self.OverloadName(decl) if overload and overload not in codes: code = 'BOOST_PYTHON_FUNCTION_OVERLOADS(%s, %s, %i, %i)' %\ (overload, decl.FullName(), decl.minArgs, decl.maxArgs) codeunit.Write('declaration', code + '\n') codes[overload] = None def PolicyCode(self): policy = self.info.policy if policy is not None: assert isinstance(policy, Policy) return ', %s()' % policy.Code() else: return '' def ExportOpaquePointer(self, function, codeunit): if self.info.policy == return_value_policy(return_opaque_pointer): typename = function.result.name macro = exporterutils.EspecializeTypeID(typename) if macro: codeunit.Write('declaration-outside', macro) def Name(self): return self.info.name
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?