1# Copyright 2004-2008 Roman Yakovenko.
2# Distributed under the Boost Software License, Version 1.0. (See
3# accompanying file LICENSE_1_0.txt or copy at
4# http://www.boost.org/LICENSE_1_0.txt)
5
6import os
7from . import code_creator
8from . import include_directories
9
10class include_t(code_creator.code_creator_t):
11    """
12    Creates C++ code for include directive
13    """
14    def __init__( self, header, user_defined=False, system=False ):
15        code_creator.code_creator_t.__init__(self)
16        self._header = include_directories.include_directories_t.normalize( header )
17        self._include_dirs_optimization = None #This parameter will be set from bpmodule_t.create function
18        self._user_defined = user_defined
19        self._system = system
20        self.__created_code = None
21
22    @property
23    def is_user_defined(self):
24        return self._user_defined
25
26    @property
27    def is_system(self):
28        """Return True if header file is system( Boost.Python or `Py++` ) header file"""
29        return self._system
30
31    def _get_header(self):
32        return self._header
33    def _set_header(self, header):
34        self._header = include_directories.include_directories_t.normalize( header )
35    header = property( _get_header, _set_header )
36
37    def _get_include_dirs_optimization(self):
38        return self._include_dirs_optimization
39    def _set_include_dirs_optimization(self, include_dirs):
40        self._include_dirs_optimization = include_dirs
41    include_dirs_optimization = property( _get_include_dirs_optimization, _set_include_dirs_optimization )
42
43    def _create_include_directive_code(self):
44        header = self.header.strip()
45        if header.startswith( '"' ) or header.startswith( '<' ):
46            return '#include %s' % self.header
47
48        if not self.include_dirs_optimization:
49            return '#include "%s"' % self.header
50        else:
51            normalize_header = self.include_dirs_optimization.normalize_header( self.header )
52            if self.include_dirs_optimization.is_std(self.header):
53                return '#include <%s>' % normalize_header
54            else:
55                return '#include "%s"' % normalize_header
56
57    def _create_impl(self):
58        if not self.__created_code:
59            self.__created_code = self._create_include_directive_code()
60        return self.__created_code
61
62    def _get_system_files_impl( self ):
63        return []
64
65
66class import_t(code_creator.code_creator_t):
67    """Creates Python import directive"""
68    def __init__( self, module_name ):
69        code_creator.code_creator_t.__init__(self)
70        self._module_name = module_name
71
72    def _create_impl(self):
73        return 'import %(module)s' % dict( module=os.path.splitext(self._module_name)[0] )
74
75    def _get_system_files_impl( self ):
76        return []
77