[pygccxml-commit] SF.net SVN: pygccxml: [180] pyplusplus_dev/unittests/data
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-05-29 05:46:25
|
Revision: 180 Author: roman_yakovenko Date: 2006-05-28 22:46:08 -0700 (Sun, 28 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=180&view=rev Log Message: ----------- fixing is_noncopyable bug Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/type_traits.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/noncopyable_to_be_exported.hpp Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2006-05-29 04:57:23 UTC (rev 179) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2006-05-29 05:46:08 UTC (rev 180) @@ -18,6 +18,7 @@ import typedef import calldef import cpptypes +import variable import algorithm import enumeration import class_declaration @@ -260,6 +261,15 @@ return isinstance( nake_type, cpptypes.declarated_t ) \ and isinstance( nake_type.declaration, enumeration.enumeration_t ) +def is_class(type): + """returns True if type represents C++ class""" + nake_type = remove_alias( type ) + nake_type = remove_reference( nake_type ) + nake_type = remove_cv( nake_type ) + + return isinstance( nake_type, cpptypes.declarated_t ) \ + and isinstance( nake_type.declaration, class_declaration.class_t ) + def find_trivial_constructor( type ): """returns reference to trivial constructor or None""" assert isinstance( type, class_declaration.class_t ) @@ -683,6 +693,25 @@ or ( has_destructor( class_ ) and not has_public_destructor( class_ ) ): return True + #It is not enough to check base classes, we should also to check + #member variables. + mvars = filter( lambda x: isinstance( x, variable.variable_t ) + , class_.declarations ) + for mvar in mvars: + if mvar.type_qualifiers.has_static: + continue + type_ = remove_alias( mvar.type ) + type_ = remove_reference( type_ ) + if is_const( type_ ): + no_const = remove_const( type_ ) + if is_fundamental( no_const ) or is_enum( no_const): + return True + if is_class( no_const ): + return True + if is_class( type_ ): + cls = type_.declaration + if is_noncopyable( cls ): + return True return False Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-05-29 04:57:23 UTC (rev 179) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-05-29 05:46:08 UTC (rev 180) @@ -80,7 +80,7 @@ return operator_creators def _generate_noncopyable(self): - if declarations.is_noncopyable( self.declaration ): + if self.declaration.noncopyable: return algorithm.create_identifier( self, '::boost::noncopyable' ) def _generate_bases(self, base_creators): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-05-29 04:57:23 UTC (rev 179) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-05-29 05:46:08 UTC (rev 180) @@ -29,7 +29,7 @@ self._always_expose_using_scope = False self._redefine_operators = False self._held_type = None - self._noncopyable = False + self._noncopyable = None self._wrapper_alias = self._generate_valid_name() + "_wrapper" self._user_code = [] self._wrapper_user_code = [] @@ -54,6 +54,8 @@ held_type = property( _get_held_type, _set_held_type ) def _get_noncopyable(self): + if self._noncopyable is None: + self._noncopyable = declarations.is_noncopyable( self ) return self._noncopyable def _set_noncopyable(self, noncopyable): self._noncopyable= noncopyable Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-05-29 04:57:23 UTC (rev 179) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-05-29 05:46:08 UTC (rev 180) @@ -565,7 +565,7 @@ if declarations.has_trivial_copy( self.curr_decl ): #I don't know but sometimes boost.python requieres #to construct wrapper from wrapped classe - if not declarations.is_noncopyable( self.curr_decl ): + if not self.curr_decl.noncopyable: scons = code_creators.special_constructor_wrapper_t( class_inst=self.curr_decl ) wrapper.adopt_creator( scons ) trivial_constr = declarations.find_trivial_constructor(self.curr_decl) Modified: pyplusplus_dev/unittests/data/noncopyable_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/noncopyable_to_be_exported.hpp 2006-05-29 04:57:23 UTC (rev 179) +++ pyplusplus_dev/unittests/data/noncopyable_to_be_exported.hpp 2006-05-29 05:46:08 UTC (rev 180) @@ -51,6 +51,28 @@ static char get_dd(){ return 'D'; } }; +struct e_t{ + virtual void do_smth() = 0; +private: + c_t c; +}; + +struct f_t{ + f_t() : i(0){} + virtual void do_smth() = 0; +private: + const int i; +}; + +struct g_t{ + enum E{e}; + g_t() : e_(e){} + virtual void do_smth() = 0; +private: + const E e_; +}; + + } #endif//__noncopyable_to_be_exported_hpp__ \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |