# 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) import os.path #============================================================================== # Exporter #============================================================================== class Exporter(object): 'Base class for objects capable to generate boost.python code.' INDENT = ' ' * 4 def __init__(self, info, parser_tail=None): self.info = info self.parser_tail = parser_tail self.interface_file = None self.declarations = [] def Name(self): raise NotImplementedError(self.__class__.__name__) def Tail(self): return self.parser_tail def Parse(self, parser): self.parser = parser header = self.info.include tail = self.parser_tail declarations, parser_header = parser.parse(header, tail) self.parser_header = parser_header self.SetDeclarations(declarations) def SetParsedHeader(self, parsed_header): self.parser_header = parsed_header def SetDeclarations(self, declarations): self.declarations = declarations def GenerateCode(self, codeunit, exported_names): self.WriteInclude(codeunit) self.Export(codeunit, exported_names) def WriteInclude(self, codeunit): codeunit.Write('include', '#include <%s>\n' % self.info.include) def Export(self, codeunit, exported_names): 'subclasses must override this to do the real work' pass def GetDeclarations(self, fullname): decls = [] for decl in self.declarations: if decl.FullName() == fullname: decls.append(decl) if not decls: raise RuntimeError, 'no %s declaration found!' % fullname return decls def GetDeclaration(self, fullname): decls = self.GetDeclarations(fullname) #assert len(decls) == 1 return decls[0] def Order(self): '''Returns a string that uniquely identifies this instance. All exporters will be sorted by Order before being exported. ''' return 0, self.info.name def Header(self): return self.info.include def __eq__(self, other): return type(self) is type(other) and self.Name() == other.Name() \ and self.interface_file == other.interface_file def __ne__(self, other): return not self == other