Skip to content

Commit 525d3ba

Browse files
author
roman_yakovenko
committed
small refactoring in "noncopyable" area
1 parent da8c879 commit 525d3ba

File tree

2 files changed

+30
-26
lines changed

2 files changed

+30
-26
lines changed

pygccxml/declarations/class_declaration.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import algorithm
1919
import declaration
2020
import dependencies
21+
from pygccxml import utils
2122

2223
class ACCESS_TYPES:
2324
"""class that defines "access" constants"""
@@ -498,5 +499,33 @@ def _get_partial_name_impl( self ):
498499
return 'wstring'
499500
else:
500501
return get_partial_name( self.name )
502+
503+
def find_noncopyable_vars( self ):
504+
"""returns list of all noncopyable variables"""
505+
import type_traits as tt#prevent cyclic dependencies
506+
logger = utils.loggers.cxx_parser
507+
mvars = self.vars( lambda v: not v.type_qualifiers.has_static, recursive=False, allow_empty=True )
508+
noncopyable_vars = []
509+
for mvar in mvars:
510+
type_ = tt.remove_reference( mvar.type )
511+
if tt.is_const( type_ ):
512+
no_const = remove_const( type_ )
513+
if tt.is_fundamental( no_const ) or tt.is_enum( no_const):
514+
logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes const member variable - fundamental or enum" % self.decl_string )
515+
noncopyable_vars.append( mvar )
516+
if tt.is_class( no_const ):
517+
logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes const member variable - class" % self.decl_string )
518+
noncopyable_vars.append( mvar )
519+
if tt.is_array( no_const ):
520+
logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes const member variable - array" % self.decl_string )
521+
noncopyable_vars.append( mvar )
522+
if tt.is_class( type_ ):
523+
cls = type_.declaration
524+
if tt.is_noncopyable( cls ):
525+
logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes member variable - class that is not copyable" % self.decl_string )
526+
noncopyable_vars.append( mvar )
527+
logger.debug( "__contains_noncopyable_mem_var - %s - false - doesn't contains noncopyable members" % self.decl_string )
528+
return noncopyable_vars
529+
501530

502531
class_types = ( class_t, class_declaration_t )

pygccxml/declarations/type_traits.py

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -800,31 +800,6 @@ def is_convertible( source, target ):
800800
"""returns True, if source could be converted to target, otherwise False"""
801801
return __is_convertible_t( source, target ).is_convertible()
802802

803-
def __contains_noncopyable_mem_var( class_ ):
804-
"""implementation details"""
805-
logger = utils.loggers.cxx_parser
806-
mvars = class_.vars( lambda v: not v.type_qualifiers.has_static, recursive=False, allow_empty=True )
807-
for mvar in mvars:
808-
type_ = remove_alias( mvar.type )
809-
type_ = remove_reference( type_ )
810-
if is_const( type_ ):
811-
no_const = remove_const( type_ )
812-
if is_fundamental( no_const ) or is_enum( no_const):
813-
logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes const member variable - fundamental or enum" % class_.decl_string )
814-
return True
815-
if is_class( no_const ):
816-
logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes const member variable - class" % class_.decl_string )
817-
return True
818-
if is_array( no_const ):
819-
logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes const member variable - array" % class_.decl_string )
820-
return True
821-
if is_class( type_ ):
822-
cls = type_.declaration
823-
if is_noncopyable( cls ):
824-
logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes member variable - class that is not copyable" % class_.decl_string )
825-
return True
826-
logger.debug( "__contains_noncopyable_mem_var - %s - false - doesn't contains noncopyable members" % class_.decl_string )
827-
828803
def __is_noncopyable_single( class_):
829804
"""implementation details"""
830805
#It is not enough to check base classes, we should also to check
@@ -844,7 +819,7 @@ def __is_noncopyable_single( class_):
844819
])
845820
logger.debug( msg )
846821
return False
847-
if __contains_noncopyable_mem_var( class_ ):
822+
if class_.find_noncopyable_vars():
848823
logger.debug( "__is_noncopyable_single(TRUE) - %s - contains noncopyable members" % class_.decl_string )
849824
return True
850825
else:

0 commit comments

Comments
 (0)