Add move operators to MODULE
This fixes a memory leak in the std:: containers in MODULE that is noticable when moving a module on the board and cancelling the operation.
This commit is contained in:
parent
0ab8b9a2d9
commit
5ba0855c36
|
@ -141,6 +141,13 @@ MODULE::MODULE( const MODULE& aModule ) :
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MODULE::MODULE( MODULE&& aModule ) :
|
||||||
|
BOARD_ITEM_CONTAINER( aModule )
|
||||||
|
{
|
||||||
|
*this = std::move( aModule );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MODULE::~MODULE()
|
MODULE::~MODULE()
|
||||||
{
|
{
|
||||||
// Clean up the owned elements
|
// Clean up the owned elements
|
||||||
|
@ -165,6 +172,98 @@ MODULE::~MODULE()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MODULE& MODULE::operator=( MODULE&& aOther )
|
||||||
|
{
|
||||||
|
BOARD_ITEM::operator=( aOther );
|
||||||
|
|
||||||
|
m_Pos = aOther.m_Pos;
|
||||||
|
m_fpid = aOther.m_fpid;
|
||||||
|
m_Attributs = aOther.m_Attributs;
|
||||||
|
m_ModuleStatus = aOther.m_ModuleStatus;
|
||||||
|
m_Orient = aOther.m_Orient;
|
||||||
|
m_BoundaryBox = aOther.m_BoundaryBox;
|
||||||
|
m_CntRot90 = aOther.m_CntRot90;
|
||||||
|
m_CntRot180 = aOther.m_CntRot180;
|
||||||
|
m_LastEditTime = aOther.m_LastEditTime;
|
||||||
|
m_Link = aOther.m_Link;
|
||||||
|
m_Path = aOther.m_Path;
|
||||||
|
|
||||||
|
m_LocalClearance = aOther.m_LocalClearance;
|
||||||
|
m_LocalSolderMaskMargin = aOther.m_LocalSolderMaskMargin;
|
||||||
|
m_LocalSolderPasteMargin = aOther.m_LocalSolderPasteMargin;
|
||||||
|
m_LocalSolderPasteMarginRatio = aOther.m_LocalSolderPasteMarginRatio;
|
||||||
|
m_ZoneConnection = aOther.m_ZoneConnection;
|
||||||
|
m_ThermalWidth = aOther.m_ThermalWidth;
|
||||||
|
m_ThermalGap = aOther.m_ThermalGap;
|
||||||
|
|
||||||
|
// Move reference and value
|
||||||
|
m_Reference = aOther.m_Reference;
|
||||||
|
m_Reference->SetParent( this );
|
||||||
|
m_Value = aOther.m_Value;
|
||||||
|
m_Value->SetParent( this );
|
||||||
|
|
||||||
|
|
||||||
|
// Move the pads
|
||||||
|
m_pads.clear();
|
||||||
|
|
||||||
|
for( D_PAD* pad : aOther.Pads() )
|
||||||
|
Add( pad );
|
||||||
|
|
||||||
|
// Move the zones
|
||||||
|
m_fp_zones.clear();
|
||||||
|
|
||||||
|
for( MODULE_ZONE_CONTAINER* item : aOther.Zones() )
|
||||||
|
{
|
||||||
|
Add( static_cast<MODULE_ZONE_CONTAINER*>( item ) );
|
||||||
|
|
||||||
|
// Ensure the net info is OK and especially uses the net info list
|
||||||
|
// living in the current board
|
||||||
|
// Needed when copying a fp from fp editor that has its own board
|
||||||
|
// Must be NETINFO_LIST::ORPHANED_ITEM for a keepout that has no net.
|
||||||
|
item->SetNetCode( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move the drawings
|
||||||
|
m_drawings.clear();
|
||||||
|
|
||||||
|
for( BOARD_ITEM* item : aOther.GraphicalItems() )
|
||||||
|
{
|
||||||
|
switch( item->Type() )
|
||||||
|
{
|
||||||
|
case PCB_MODULE_TEXT_T:
|
||||||
|
case PCB_MODULE_EDGE_T:
|
||||||
|
Add( static_cast<BOARD_ITEM*>( item ) );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
wxLogMessage( wxT( "MODULE::operator=() internal error: unknown type" ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy auxiliary data: 3D_Drawings info
|
||||||
|
m_3D_Drawings.clear();
|
||||||
|
m_3D_Drawings = aOther.m_3D_Drawings;
|
||||||
|
m_Doc = aOther.m_Doc;
|
||||||
|
m_KeyWord = aOther.m_KeyWord;
|
||||||
|
|
||||||
|
// Ensure auxiliary data is up to date
|
||||||
|
CalculateBoundingBox();
|
||||||
|
|
||||||
|
m_initial_comments = aOther.m_initial_comments;
|
||||||
|
|
||||||
|
// Clear the other item's containers since this is a move
|
||||||
|
aOther.Pads().clear();
|
||||||
|
aOther.Zones().clear();
|
||||||
|
aOther.GraphicalItems().clear();
|
||||||
|
aOther.m_Value = nullptr;
|
||||||
|
aOther.m_Reference = nullptr;
|
||||||
|
aOther.m_initial_comments = nullptr;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MODULE& MODULE::operator=( const MODULE& aOther )
|
MODULE& MODULE::operator=( const MODULE& aOther )
|
||||||
{
|
{
|
||||||
BOARD_ITEM::operator=( aOther );
|
BOARD_ITEM::operator=( aOther );
|
||||||
|
@ -242,6 +341,9 @@ MODULE& MODULE::operator=( const MODULE& aOther )
|
||||||
// Ensure auxiliary data is up to date
|
// Ensure auxiliary data is up to date
|
||||||
CalculateBoundingBox();
|
CalculateBoundingBox();
|
||||||
|
|
||||||
|
m_initial_comments = aOther.m_initial_comments ?
|
||||||
|
new wxArrayString( *aOther.m_initial_comments ) : nullptr;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -109,9 +109,13 @@ public:
|
||||||
|
|
||||||
MODULE( const MODULE& aModule );
|
MODULE( const MODULE& aModule );
|
||||||
|
|
||||||
|
// Move constructor and operator needed due to std containers inside the module
|
||||||
|
MODULE( MODULE&& aModule );
|
||||||
|
|
||||||
~MODULE();
|
~MODULE();
|
||||||
|
|
||||||
MODULE& operator=( const MODULE& aOther );
|
MODULE& operator=( const MODULE& aOther );
|
||||||
|
MODULE& operator=( MODULE&& aOther );
|
||||||
|
|
||||||
static inline bool ClassOf( const EDA_ITEM* aItem )
|
static inline bool ClassOf( const EDA_ITEM* aItem )
|
||||||
{
|
{
|
||||||
|
@ -181,14 +185,20 @@ public:
|
||||||
return m_drawings;
|
return m_drawings;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MODULE_ZONE_CONTAINERS& Zones() const
|
const DRAWINGS& GraphicalItems() const
|
||||||
|
{
|
||||||
|
return m_drawings;
|
||||||
|
}
|
||||||
|
|
||||||
|
MODULE_ZONE_CONTAINERS& Zones()
|
||||||
{
|
{
|
||||||
return m_fp_zones;
|
return m_fp_zones;
|
||||||
}
|
}
|
||||||
|
|
||||||
const DRAWINGS& GraphicalItems() const
|
|
||||||
|
const MODULE_ZONE_CONTAINERS& Zones() const
|
||||||
{
|
{
|
||||||
return m_drawings;
|
return m_fp_zones;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue