# 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
