Move from class INSPECTOR as the EDA_ITEM::Visit() callback interface to a std::function

callback.  This improves conciseness and encourages use of Visit() due to the lower cost
of entry in C++.
This commit is contained in:
Dick Hollenbeck 2016-07-12 15:05:54 -04:00 committed by Wayne Stambaugh
parent 98ad5096b0
commit c2b8a4ee43
22 changed files with 189 additions and 324 deletions

View File

@ -107,10 +107,10 @@ EDA_ITEM* EDA_ITEM::Clone() const
}
SEARCH_RESULT EDA_ITEM::IterateForward( EDA_ITEM* listStart,
INSPECTOR* inspector,
const void* testData,
const KICAD_T scanTypes[] )
SEARCH_RESULT EDA_ITEM::IterateForward( EDA_ITEM* listStart,
INSPECTOR inspector,
void* testData,
const KICAD_T scanTypes[] )
{
EDA_ITEM* p = listStart;
@ -126,8 +126,7 @@ SEARCH_RESULT EDA_ITEM::IterateForward( EDA_ITEM* listStart,
// see base_struct.h
// many classes inherit this method, be careful:
SEARCH_RESULT EDA_ITEM::Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] )
SEARCH_RESULT EDA_ITEM::Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] )
{
KICAD_T stype;
@ -140,7 +139,7 @@ SEARCH_RESULT EDA_ITEM::Visit( INSPECTOR* inspector, const void* testData,
// If caller wants to inspect my type
if( stype == Type() )
{
if( SEARCH_QUIT == inspector->Inspect( this, testData ) )
if( SEARCH_QUIT == inspector( this, testData ) )
return SEARCH_QUIT;
break;

View File

@ -92,7 +92,7 @@ const KICAD_T LIB_COLLECTOR::RotatableItems[] = {
};
SEARCH_RESULT LIB_COLLECTOR::Inspect( EDA_ITEM* aItem, const void* aTestData )
SEARCH_RESULT LIB_COLLECTOR::Inspect( EDA_ITEM* aItem, void* testData )
{
LIB_ITEM* item = (LIB_ITEM*) aItem;
@ -125,7 +125,7 @@ void LIB_COLLECTOR::Collect( LIB_ITEMS& aItems, const KICAD_T aFilterList[],
for( size_t i = 0; i < aItems.size(); i++ )
{
if( SEARCH_QUIT == aItems[i].Visit( this, NULL, m_ScanTypes ) )
if( SEARCH_QUIT == aItems[i].Visit( m_inspector, NULL, m_ScanTypes ) )
break;
}
}

View File

@ -114,7 +114,7 @@ public:
* @return SEARCH_RESULT #SEARCH_QUIT if the iterator is to stop the scan,
* else #SEARCH_CONTINUE;
*/
SEARCH_RESULT Inspect( EDA_ITEM* aItem, const void* aTestData = NULL );
SEARCH_RESULT Inspect( EDA_ITEM* aItem, void* aTestData ) override;
/**
* Function Collect

View File

@ -93,7 +93,7 @@ class LIB_PIN : public LIB_ITEM
const TRANSFORM& aTransform );
public:
LIB_PIN( LIB_PART* aParent );
LIB_PIN( LIB_PART* aParent );
// Do not create a copy constructor. The one generated by the compiler is adequate.

View File

@ -199,7 +199,7 @@ const KICAD_T SCH_COLLECTOR::OrientableItems[] = {
};
SEARCH_RESULT SCH_COLLECTOR::Inspect( EDA_ITEM* aItem, const void* aTestData )
SEARCH_RESULT SCH_COLLECTOR::Inspect( EDA_ITEM* aItem, void* aTestData )
{
if( aItem->Type() != LIB_PIN_T && !aItem->HitTest( m_RefPos ) )
return SEARCH_CONTINUE;
@ -239,7 +239,7 @@ void SCH_COLLECTOR::Collect( SCH_ITEM* aItem, const KICAD_T aFilterList[],
// remember where the snapshot was taken from and pass refPos to the Inspect() function.
SetRefPos( aPosition );
EDA_ITEM::IterateForward( aItem, this, NULL, m_ScanTypes );
EDA_ITEM::IterateForward( aItem, m_inspector, NULL, m_ScanTypes );
}
@ -474,7 +474,7 @@ bool SCH_FIND_COLLECTOR::ReplaceItem( SCH_SHEET_PATH* aSheetPath )
}
SEARCH_RESULT SCH_FIND_COLLECTOR::Inspect( EDA_ITEM* aItem, const void* aTestData )
SEARCH_RESULT SCH_FIND_COLLECTOR::Inspect( EDA_ITEM* aItem, void* aTestData )
{
wxPoint position;
@ -524,7 +524,7 @@ void SCH_FIND_COLLECTOR::Collect( SCH_FIND_REPLACE_DATA& aFindReplaceData,
if( aSheetPath )
{
m_sheetPath = aSheetPath;
EDA_ITEM::IterateForward( aSheetPath->LastDrawList(), this, NULL, m_ScanTypes );
EDA_ITEM::IterateForward( aSheetPath->LastDrawList(), m_inspector, NULL, m_ScanTypes );
}
else
{
@ -533,7 +533,7 @@ void SCH_FIND_COLLECTOR::Collect( SCH_FIND_REPLACE_DATA& aFindReplaceData,
for( unsigned i = 0; i < schematic.size(); i++ )
{
m_sheetPath = &schematic[i];
EDA_ITEM::IterateForward( m_sheetPath->LastDrawList(), this, NULL, m_ScanTypes );
EDA_ITEM::IterateForward( m_sheetPath->LastDrawList(), m_inspector, NULL, m_ScanTypes );
}
}
@ -550,7 +550,7 @@ void SCH_FIND_COLLECTOR::Collect( SCH_FIND_REPLACE_DATA& aFindReplaceData,
}
SEARCH_RESULT SCH_TYPE_COLLECTOR::Inspect( EDA_ITEM* aItem, const void* aTestData )
SEARCH_RESULT SCH_TYPE_COLLECTOR::Inspect( EDA_ITEM* aItem, void* testData )
{
// The Vist() function only visits the testItem if its type was in the
// the scanList, so therefore we can collect anything given to us here.
@ -566,5 +566,5 @@ void SCH_TYPE_COLLECTOR::Collect( SCH_ITEM* aItem, const KICAD_T aFilterList[] )
SetScanTypes( aFilterList );
EDA_ITEM::IterateForward( aItem, this, NULL, m_ScanTypes );
EDA_ITEM::IterateForward( aItem, m_inspector, NULL, m_ScanTypes );
}

View File

@ -135,7 +135,7 @@ public:
return NULL;
}
SEARCH_RESULT Inspect( EDA_ITEM* aItem, const void* aTestData = NULL );
SEARCH_RESULT Inspect( EDA_ITEM* aItem, void* aTestData ) override;
/**
* Function Collect
@ -350,7 +350,7 @@ public:
*/
bool ReplaceItem( SCH_SHEET_PATH* aSheetPath = NULL );
SEARCH_RESULT Inspect( EDA_ITEM* aItem, const void* aTestData = NULL );
SEARCH_RESULT Inspect( EDA_ITEM* aItem, void* aTestData ) override;
/**
* Update the replace string without changing anything else.
@ -392,7 +392,7 @@ public:
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE;
*/
SEARCH_RESULT Inspect( EDA_ITEM* testItem, const void* testData );
SEARCH_RESULT Inspect( EDA_ITEM* testItem, void* testData ) override;
/**
* Function Collect

View File

@ -1812,7 +1812,7 @@ wxString SCH_COMPONENT::GetSelectMenuText() const
}
SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR* aInspector, const void* aTestData,
SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR aInspector, void* aTestData,
const KICAD_T aFilterTypes[] )
{
KICAD_T stype;
@ -1822,7 +1822,7 @@ SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR* aInspector, const void* aTestData
// If caller wants to inspect component type or and component children types.
if( stype == Type() )
{
if( SEARCH_QUIT == aInspector->Inspect( this, aTestData ) )
if( SEARCH_QUIT == aInspector( this, aTestData ) )
return SEARCH_QUIT;
}
@ -1832,23 +1832,23 @@ SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR* aInspector, const void* aTestData
// Test the bounding boxes of fields if they are visible and not empty.
for( int ii = 0; ii < GetFieldCount(); ii++ )
{
if( SEARCH_QUIT == aInspector->Inspect( GetField( ii ), (void*) this ) )
if( SEARCH_QUIT == aInspector( GetField( ii ), (void*) this ) )
return SEARCH_QUIT;
}
break;
case SCH_FIELD_LOCATE_REFERENCE_T:
if( SEARCH_QUIT == aInspector->Inspect( GetField( REFERENCE ), (void*) this ) )
if( SEARCH_QUIT == aInspector( GetField( REFERENCE ), (void*) this ) )
return SEARCH_QUIT;
break;
case SCH_FIELD_LOCATE_VALUE_T:
if( SEARCH_QUIT == aInspector->Inspect( GetField( VALUE ), (void*) this ) )
if( SEARCH_QUIT == aInspector( GetField( VALUE ), (void*) this ) )
return SEARCH_QUIT;
break;
case SCH_FIELD_LOCATE_FOOTPRINT_T:
if( SEARCH_QUIT == aInspector->Inspect( GetField( FOOTPRINT ), (void*) this ) )
if( SEARCH_QUIT == aInspector( GetField( FOOTPRINT ), (void*) this ) )
return SEARCH_QUIT;
break;
@ -1862,7 +1862,7 @@ SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR* aInspector, const void* aTestData
for( size_t i = 0; i < pins.size(); i++ )
{
if( SEARCH_QUIT == aInspector->Inspect( pins[ i ], (void*) this ) )
if( SEARCH_QUIT == aInspector( pins[ i ], (void*) this ) )
return SEARCH_QUIT;
}
}

View File

@ -512,8 +512,7 @@ public:
void GetConnectionPoints( std::vector<wxPoint>& aPoints ) const;
SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] );
SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) override;
/**
* Function GetDrawItem().

View File

@ -1042,8 +1042,7 @@ void SCH_SHEET::GetConnectionPoints( std::vector< wxPoint >& aPoints ) const
}
SEARCH_RESULT SCH_SHEET::Visit( INSPECTOR* aInspector, const void* aTestData,
const KICAD_T aFilterTypes[] )
SEARCH_RESULT SCH_SHEET::Visit( INSPECTOR aInspector, void* testData, const KICAD_T aFilterTypes[] )
{
KICAD_T stype;
@ -1052,7 +1051,7 @@ SEARCH_RESULT SCH_SHEET::Visit( INSPECTOR* aInspector, const void* aTestData,
// If caller wants to inspect my type
if( stype == Type() )
{
if( SEARCH_QUIT == aInspector->Inspect( this, NULL ) )
if( SEARCH_QUIT == aInspector( this, NULL ) )
return SEARCH_QUIT;
}
else if( stype == SCH_SHEET_PIN_T )
@ -1060,7 +1059,7 @@ SEARCH_RESULT SCH_SHEET::Visit( INSPECTOR* aInspector, const void* aTestData,
// Test the sheet labels.
for( size_t i = 0; i < m_pins.size(); i++ )
{
if( SEARCH_QUIT == aInspector->Inspect( &m_pins[ i ], (void*) this ) )
if( SEARCH_QUIT == aInspector( &m_pins[ i ], this ) )
return SEARCH_QUIT;
}
}

View File

@ -568,8 +568,7 @@ public:
void GetConnectionPoints( std::vector< wxPoint >& aPoints ) const;
SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] );
SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) override;
wxString GetSelectMenuText() const;

View File

@ -39,6 +39,7 @@
#include <richio.h>
#include <view/view_item.h>
#include <class_eda_rect.h>
#include <functional>
#if defined(DEBUG)
#include <iostream> // needed for Show()
@ -83,35 +84,25 @@ class MSG_PANEL_ITEM;
/**
* Class INSPECTOR
* is an abstract class that is used to inspect and possibly collect the
* Typedef INSPECTOR
* is used to inspect and possibly collect the
* (search) results of Iterating over a list or tree of KICAD_T objects.
* Extend from this class and implement the Inspect function and provide for
* a way for the extension to collect the results of the search/scan data and
* provide them to the caller.
* Provide an implementation as needed to inspect EDA_ITEMs visited via
* the EDA_ITEM::Visit() and EDA_ITEM::IterateForward().
* <p>
* The lambda function is used within the EDA_ITEM::Iterate() function.
* It is used primarily for searching, but not limited to that. It can also
* collect or modify the scanned objects.
*
* @param aItem An EDA_ITEM to examine.
* @param aTestData is arbitrary data needed by the inspector to determine
* if the EDA_ITEM under test meets its match criteria.
* @return A #SEARCH_RESULT type #SEARCH_QUIT if the iterator function is to
* stop the scan, else #SEARCH_CONTINUE;
*/
class INSPECTOR
{
public:
virtual ~INSPECTOR()
{
}
typedef std::function< SEARCH_RESULT ( EDA_ITEM* aItem, void* aTestData ) > INSPECTOR_FUNC;
/**
* Function Inspect
* is the examining function within the INSPECTOR which is passed to the
* EDA_ITEM::Iterate() function. It is used primarily for searching, but
* not limited to that. It can also collect or modify the scanned objects.
*
* @param aItem An EDA_ITEM to examine.
* @param aTestData is arbitrary data needed by the inspector to determine
* if the EDA_ITEM under test meets its match criteria.
* @return A #SEARCH_RESULT type #SEARCH_QUIT if the iterator function is to
* stop the scan, else #SEARCH_CONTINUE;
*/
virtual SEARCH_RESULT Inspect( EDA_ITEM* aItem, const void* aTestData ) = 0;
};
typedef const INSPECTOR_FUNC& INSPECTOR; /// std::function passed to nested users by ref, avoids copying std::function
// These define are used for the .m_Flags and .m_UndoRedoStatus member of the
@ -359,10 +350,10 @@ public:
* @return SEARCH_RESULT SEARCH_QUIT if the called INSPECTOR returned
* SEARCH_QUIT, else SCAN_CONTINUE;
*/
static SEARCH_RESULT IterateForward( EDA_ITEM* listStart,
INSPECTOR* inspector,
const void* testData,
const KICAD_T scanTypes[] );
static SEARCH_RESULT IterateForward( EDA_ITEM* listStart,
INSPECTOR inspector,
void* testData,
const KICAD_T scanTypes[] );
/**
* Function Visit
@ -378,8 +369,7 @@ public:
* @return SEARCH_RESULT SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE, and determined by the inspector.
*/
virtual SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] );
virtual SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] );
/**
* Function GetClass

View File

@ -52,9 +52,11 @@ class EDA_ITEM;
* Later, after collection, the user can iterate through all the objects
* in the remembered collection using GetCount() and the [int] operator.
*/
class COLLECTOR : public INSPECTOR
class COLLECTOR
{
protected:
INSPECTOR_FUNC m_inspector;
/// Which object types to scan
const KICAD_T* m_ScanTypes;
@ -71,7 +73,9 @@ protected:
time_t m_TimeAtCollection;
public:
COLLECTOR()
COLLECTOR() :
// Inspect() is virtual so calling it from a class common inspector preserves polymorphism.
m_inspector( [=] ( EDA_ITEM* aItem, void* aTestData ) { return Inspect( aItem, aTestData ); } )
{
m_ScanTypes = 0;
m_TimeAtCollection = 0;
@ -79,6 +83,8 @@ public:
virtual ~COLLECTOR() {}
virtual SEARCH_RESULT Inspect( EDA_ITEM* aItem, void* aTestData ) = 0;
/**
* Function IsValidIndex
* tests if \a aIndex is with the limits of the list of collected items.
@ -276,8 +282,7 @@ public:
Empty(); // empty the collection
// visit the board with the INSPECTOR (me).
container->Visit( this, // INSPECTOR* inspector
NULL, // const void* testData,
container->Visit( inspector, &aRefPos,
m_ScanTypes);
SetTimeNow(); // when it was taken
}

View File

@ -146,21 +146,6 @@ void BOARD::SetPosition( const wxPoint& aPos )
void BOARD::Move( const wxPoint& aMoveVector ) // overload
{
// Implement 'interface INSPECTOR' which is only INSPECTOR::Inspect(),
// here it does the moving.
struct MOVER : public INSPECTOR
{
SEARCH_RESULT Inspect( EDA_ITEM* item, const void* data )
{
BOARD_ITEM* brd_item = (BOARD_ITEM*) item;
const wxPoint* vector = (const wxPoint*) data;
brd_item->Move( *vector );
return SEARCH_CONTINUE;
}
} inspector;
// @todo : anything like this elsewhere? maybe put into GENERAL_COLLECTOR class.
static const KICAD_T top_level_board_stuff[] = {
PCB_MARKER_T,
@ -177,20 +162,25 @@ void BOARD::Move( const wxPoint& aMoveVector ) // overload
EOT
};
// visit this BOARD with the above inspector, which moves all items.
Visit( &inspector, &aMoveVector, top_level_board_stuff );
INSPECTOR_FUNC inspector = [&] ( EDA_ITEM* item, void* testData )
{
BOARD_ITEM* brd_item = (BOARD_ITEM*) item;
// aMoveVector was snapshotted, don't need "data".
brd_item->Move( aMoveVector );
return SEARCH_CONTINUE;
};
Visit( inspector, NULL, top_level_board_stuff );
}
void BOARD::chainMarkedSegments( wxPoint aPosition, const LSET& aLayerMask, TRACK_PTRS* aList )
void BOARD::chainMarkedSegments( wxPoint aPosition, const LSET& aLayerSet, TRACK_PTRS* aList )
{
TRACK* segment; // The current segment being analyzed.
TRACK* via; // The via identified, eventually destroy
TRACK* candidate; // The end segment to destroy (or NULL = segment)
int NbSegm;
LSET layer_set = aLayerMask;
LSET layer_set = aLayerSet;
if( !m_Track )
if( !m_Track ) // no tracks at all in board
return;
/* Set the BUSY flag of all connected segments, first search starting at
@ -218,7 +208,7 @@ void BOARD::chainMarkedSegments( wxPoint aPosition, const LSET& aLayerMask, TRAC
* is found we do not know at this time the number of connected items
* and we do not know if this via is on the track or finish the track
*/
via = m_Track->GetVia( NULL, aPosition, layer_set );
TRACK* via = m_Track->GetVia( NULL, aPosition, layer_set );
if( via )
{
@ -227,14 +217,15 @@ void BOARD::chainMarkedSegments( wxPoint aPosition, const LSET& aLayerMask, TRAC
aList->push_back( via );
}
/* Now we search all segments connected to point aPosition
* if only 1 segment: this segment is candidate
int seg_count = 0;
TRACK* candidate = NULL;
/* Search all segments connected to point aPosition.
* if only 1 segment at aPosition: then this segment is "candidate"
* if > 1 segment:
* end of track (more than 2 segment connected at this location)
* then end of "track" (because more than 2 segments are connected at aPosition)
*/
segment = m_Track;
candidate = NULL;
NbSegm = 0;
TRACK* segment = m_Track;
while( ( segment = ::GetTrack( segment, NULL, aPosition, layer_set ) ) != NULL )
{
@ -244,20 +235,18 @@ void BOARD::chainMarkedSegments( wxPoint aPosition, const LSET& aLayerMask, TRAC
continue;
}
if( segment == via ) // just previously found: skip it
if( segment == via ) // just previously found: skip it
{
segment = segment->Next();
continue;
}
NbSegm++;
if( NbSegm == 1 ) // First time we found a connected item: segment is candidate
if( ++seg_count == 1 ) // if first connected item: then segment is candidate
{
candidate = segment;
segment = segment->Next();
}
else // More than 1 segment connected -> this location is an end of the track
else // More than 1 segment connected -> location is end of track
{
return;
}
@ -502,15 +491,15 @@ LSET BOARD::GetVisibleLayers() const
}
void BOARD::SetEnabledLayers( LSET aLayerMask )
void BOARD::SetEnabledLayers( LSET aLayerSet )
{
m_designSettings.SetEnabledLayers( aLayerMask );
m_designSettings.SetEnabledLayers( aLayerSet );
}
void BOARD::SetVisibleLayers( LSET aLayerMask )
void BOARD::SetVisibleLayers( LSET aLayerSet )
{
m_designSettings.SetVisibleLayers( aLayerMask );
m_designSettings.SetVisibleLayers( aLayerSet );
}
@ -793,7 +782,6 @@ BOARD_ITEM* BOARD::Remove( BOARD_ITEM* aBoardItem )
break;
}
}
break;
case PCB_MODULE_T:
@ -990,8 +978,7 @@ void BOARD::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
// virtual, see pcbstruct.h
SEARCH_RESULT BOARD::Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] )
SEARCH_RESULT BOARD::Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] )
{
KICAD_T stype;
SEARCH_RESULT result = SEARCH_CONTINUE;
@ -1009,7 +996,7 @@ SEARCH_RESULT BOARD::Visit( INSPECTOR* inspector, const void* testData,
switch( stype )
{
case PCB_T:
result = inspector->Inspect( this, testData ); // inspect me
result = inspector( this, testData ); // inspect me
// skip over any types handled in the above call.
++p;
break;
@ -1173,86 +1160,6 @@ SEARCH_RESULT BOARD::Visit( INSPECTOR* inspector, const void* testData,
}
/* now using PcbGeneralLocateAndDisplay(), but this remains a useful example
* of how the INSPECTOR can be used in a lightweight way.
* // see pcbstruct.h
* BOARD_ITEM* BOARD::FindPadOrModule( const wxPoint& refPos, LAYER_NUM layer )
* {
* class PadOrModule : public INSPECTOR
* {
* public:
* BOARD_ITEM* found;
* LAYER_NUM layer;
* int layer_mask;
*
* PadOrModule( LAYER_NUM alayer ) :
* found(0), layer(alayer), layer_mask( g_TabOneLayerMask[alayer] )
* {}
*
* SEARCH_RESULT Inspect( EDA_ITEM* testItem, const void* testData
* )
* {
* BOARD_ITEM* item = (BOARD_ITEM*) testItem;
* const wxPoint& refPos = *(const wxPoint*) testData;
*
* if( item->Type() == PCB_PAD_T )
* {
* D_PAD* pad = (D_PAD*) item;
* if( pad->HitTest( refPos ) )
* {
* if( layer_mask & pad->GetLayerSet() )
* {
* found = item;
* return SEARCH_QUIT;
* }
* else if( !found )
* {
* MODULE* parent = (MODULE*) pad->m_Parent;
* if( IsModuleLayerVisible( parent->GetLayer() ) )
* found = item;
* }
* }
* }
*
* else if( item->Type() == PCB_MODULE_T )
* {
* MODULE* module = (MODULE*) item;
*
* // consider only visible modules
* if( IsModuleLayerVisible( module->GetLayer() ) )
* {
* if( module->HitTest( refPos ) )
* {
* if( layer == module->GetLayer() )
* {
* found = item;
* return SEARCH_QUIT;
* }
*
* // layer mismatch, save in case we don't find a
* // future layer match hit.
* if( !found )
* found = item;
* }
* }
* }
* return SEARCH_CONTINUE;
* }
* };
*
* PadOrModule inspector( layer );
*
* // search only for PADs first, then MODULES, and preferably a layer match
* static const KICAD_T scanTypes[] = { PCB_PAD_T, PCB_MODULE_T, EOT };
*
* // visit this BOARD with the above inspector
* Visit( &inspector, &refPos, scanTypes );
*
* return inspector.found;
* }
*/
NETINFO_ITEM* BOARD::FindNet( int aNetcode ) const
{
// the first valid netcode is 1 and the last is m_NetInfo.GetCount()-1.
@ -1276,36 +1183,29 @@ NETINFO_ITEM* BOARD::FindNet( const wxString& aNetname ) const
MODULE* BOARD::FindModuleByReference( const wxString& aReference ) const
{
struct FINDER : public INSPECTOR
{
MODULE* found;
FINDER() : found( 0 ) {}
// implement interface INSPECTOR
SEARCH_RESULT Inspect( EDA_ITEM* item, const void* data )
{
MODULE* module = (MODULE*) item;
const wxString& ref = *(const wxString*) data;
if( ref == module->GetReference() )
{
found = module;
return SEARCH_QUIT;
}
return SEARCH_CONTINUE;
}
} inspector;
MODULE* found = nullptr;
// search only for MODULES
static const KICAD_T scanTypes[] = { PCB_MODULE_T, EOT };
INSPECTOR_FUNC inspector = [&] ( EDA_ITEM* item, void* testData )
{
MODULE* module = (MODULE*) item;
if( aReference == module->GetReference() )
{
found = module;
return SEARCH_QUIT;
}
return SEARCH_CONTINUE;
};
// visit this BOARD with the above inspector
BOARD* nonconstMe = (BOARD*) this;
nonconstMe->Visit( &inspector, &aReference, scanTypes );
nonconstMe->Visit( inspector, NULL, scanTypes );
return inspector.found;
return found;
}
@ -1321,17 +1221,7 @@ MODULE* BOARD::FindModule( const wxString& aRefOrTimeStamp, bool aSearchByTimeSt
}
else
{
#if 0 // case independent compare, why?
for( MODULE* module = m_Modules; module; module = module->Next() )
{
if( aRefOrTimeStamp.CmpNoCase( module->GetReference() ) == 0 )
return module;
}
#else
return FindModuleByReference( aRefOrTimeStamp );
#endif
}
return NULL;
@ -1495,14 +1385,14 @@ VIA* BOARD::GetViaByPosition( const wxPoint& aPosition, LAYER_ID aLayer) const
}
D_PAD* BOARD::GetPad( const wxPoint& aPosition, LSET aLayerMask )
D_PAD* BOARD::GetPad( const wxPoint& aPosition, LSET aLayerSet )
{
if( !aLayerMask.any() )
aLayerMask = LSET::AllCuMask();
if( !aLayerSet.any() )
aLayerSet = LSET::AllCuMask();
for( MODULE* module = m_Modules; module; module = module->Next() )
{
D_PAD* pad = module->GetPad( aPosition, aLayerMask );
D_PAD* pad = module->GetPad( aPosition, aLayerSet );
if( pad )
return pad;
@ -1516,11 +1406,11 @@ D_PAD* BOARD::GetPad( TRACK* aTrace, ENDPOINT_T aEndPoint )
{
const wxPoint& aPosition = aTrace->GetEndPoint( aEndPoint );
LSET aLayerMask( aTrace->GetLayer() );
LSET lset( aTrace->GetLayer() );
for( MODULE* module = m_Modules; module; module = module->Next() )
{
D_PAD* pad = module->GetPad( aPosition, aLayerMask );
D_PAD* pad = module->GetPad( aPosition, lset );
if( pad )
return pad;
@ -1530,7 +1420,7 @@ D_PAD* BOARD::GetPad( TRACK* aTrace, ENDPOINT_T aEndPoint )
}
D_PAD* BOARD::GetPadFast( const wxPoint& aPosition, LSET aLayerMask )
D_PAD* BOARD::GetPadFast( const wxPoint& aPosition, LSET aLayerSet )
{
for( unsigned i=0; i<GetPadCount(); ++i )
{
@ -1540,7 +1430,7 @@ D_PAD* BOARD::GetPadFast( const wxPoint& aPosition, LSET aLayerMask )
continue;
// Pad found, it must be on the correct layer
if( ( pad->GetLayerSet() & aLayerMask ).any() )
if( ( pad->GetLayerSet() & aLayerSet ).any() )
return pad;
}
@ -1548,9 +1438,9 @@ D_PAD* BOARD::GetPadFast( const wxPoint& aPosition, LSET aLayerMask )
}
D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, LSET aLayerMask )
D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, LSET aLayerSet )
{
// Search the aPoint coordinates in aPadList
// Search aPadList for aPosition
// aPadList is sorted by X then Y values, and a fast binary search is used
int idxmax = aPadList.size()-1;
@ -1572,7 +1462,7 @@ D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, L
if( pad->GetPosition() == aPosition ) // candidate found
{
// The pad must match the layer mask:
if( ( aLayerMask & pad->GetLayerSet() ).any() )
if( ( aLayerSet & pad->GetLayerSet() ).any() )
return pad;
// More than one pad can be at aPosition
@ -1586,7 +1476,7 @@ D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, L
if( pad->GetPosition() != aPosition )
break;
if( (aLayerMask & pad->GetLayerSet()) != 0 )
if( ( aLayerSet & pad->GetLayerSet() ).any() )
return pad;
}
// search previous
@ -1597,7 +1487,7 @@ D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, L
if( pad->GetPosition() != aPosition )
break;
if( (aLayerMask & pad->GetLayerSet()) != 0 )
if( ( aLayerSet & pad->GetLayerSet() ).any() )
return pad;
}
@ -1605,9 +1495,9 @@ D_PAD* BOARD::GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, L
return 0;
}
if( pad->GetPosition().x == aPosition.x ) // Must search considering Y coordinate
if( pad->GetPosition().x == aPosition.x ) // Must search considering Y coordinate
{
if(pad->GetPosition().y < aPosition.y) // Must search after this item
if( pad->GetPosition().y < aPosition.y ) // Must search after this item
{
idx += delta;
@ -1684,16 +1574,17 @@ void BOARD::PadDelete( D_PAD* aPad )
}
TRACK* BOARD::GetTrack( TRACK* aTrace, const wxPoint& aPosition,
LSET aLayerMask ) const
TRACK* BOARD::GetVisibleTrack( TRACK* aStartingTrace, const wxPoint& aPosition,
LSET aLayerSet ) const
{
for( TRACK* track = aTrace; track; track = track->Next() )
for( TRACK* track = aStartingTrace; track; track = track->Next() )
{
LAYER_ID layer = track->GetLayer();
if( track->GetState( BUSY | IS_DELETED ) )
continue;
// track's layer is not visible
if( m_designSettings.IsLayerVisible( layer ) == false )
continue;
@ -1704,8 +1595,8 @@ TRACK* BOARD::GetTrack( TRACK* aTrace, const wxPoint& aPosition,
}
else
{
if( !aLayerMask[layer] )
continue; // Segments on different layers.
if( !aLayerSet[layer] )
continue; // track's layer is not in aLayerSet
if( track->HitTest( aPosition ) )
return track;
@ -1737,11 +1628,12 @@ static void dump_tracks( const char* aName, const TRACK_PTRS& aList )
#endif
TRACK* BOARD::MarkTrace( TRACK* aTrace, int* aCount,
double* aTraceLength, double* aPadToDieLength,
bool aReorder )
{
int NbSegmBusy;
TRACK_PTRS trackList;
if( aCount )
@ -1894,15 +1786,15 @@ TRACK* BOARD::MarkTrace( TRACK* aTrace, int* aCount,
* the NbSegmBusy-1 next items (NbSegmBusy when including firstTrack)
* are the flagged segments
*/
NbSegmBusy = 0;
TRACK* firstTrack;
int busy_count = 0;
TRACK* firstTrack;
for( firstTrack = m_Track; firstTrack; firstTrack = firstTrack->Next() )
{
// Search for the first flagged BUSY segments
if( firstTrack->GetState( BUSY ) )
{
NbSegmBusy = 1;
busy_count = 1;
break;
}
}
@ -1919,7 +1811,7 @@ TRACK* BOARD::MarkTrace( TRACK* aTrace, int* aCount,
wxASSERT( list );
/* Rearrange the chain starting at firstTrack
* All others flagged items are moved from their position to the end
* All other BUSY flagged items are moved from their position to the end
* of the flagged list
*/
TRACK* next;
@ -1930,7 +1822,7 @@ TRACK* BOARD::MarkTrace( TRACK* aTrace, int* aCount,
if( track->GetState( BUSY ) ) // move it!
{
NbSegmBusy++;
busy_count++;
track->UnLink();
list->Insert( track, firstTrack->Next() );
@ -1943,13 +1835,13 @@ TRACK* BOARD::MarkTrace( TRACK* aTrace, int* aCount,
// that are on each end of the track, if any
if( track->GetState( BEGIN_ONPAD ) )
{
D_PAD * pad = (D_PAD *) track->start;
D_PAD* pad = (D_PAD *) track->start;
lenPadToDie += (double) pad->GetPadToDieLength();
}
if( track->GetState( END_ONPAD ) )
{
D_PAD * pad = (D_PAD *) track->end;
D_PAD* pad = (D_PAD *) track->end;
lenPadToDie += (double) pad->GetPadToDieLength();
}
}
@ -1958,13 +1850,13 @@ TRACK* BOARD::MarkTrace( TRACK* aTrace, int* aCount,
}
else if( aTraceLength )
{
NbSegmBusy = 0;
busy_count = 0;
for( TRACK* track = firstTrack; track; track = track->Next() )
{
if( track->GetState( BUSY ) )
{
NbSegmBusy++;
busy_count++;
track->SetState( BUSY, false );
full_len += track->GetLength();
@ -1973,19 +1865,19 @@ TRACK* BOARD::MarkTrace( TRACK* aTrace, int* aCount,
// that are on each end of the track, if any
if( track->GetState( BEGIN_ONPAD ) )
{
D_PAD * pad = (D_PAD *) track->start;
D_PAD* pad = (D_PAD *) track->start;
lenPadToDie += (double) pad->GetPadToDieLength();
}
if( track->GetState( END_ONPAD ) )
{
D_PAD * pad = (D_PAD *) track->end;
D_PAD* pad = (D_PAD *) track->end;
lenPadToDie += (double) pad->GetPadToDieLength();
}
}
}
DBG( printf( "%s: NbSegmBusy:%d\n", __func__, NbSegmBusy ); )
DBG( printf( "%s: busy_count:%d\n", __func__, busy_count ); )
}
if( aTraceLength )
@ -1995,7 +1887,7 @@ TRACK* BOARD::MarkTrace( TRACK* aTrace, int* aCount,
*aPadToDieLength = lenPadToDie;
if( aCount )
*aCount = NbSegmBusy;
*aCount = busy_count;
return firstTrack;
}
@ -2070,21 +1962,21 @@ MODULE* BOARD::GetFootprint( const wxPoint& aPosition, LAYER_ID aActiveLayer,
}
BOARD_CONNECTED_ITEM* BOARD::GetLockPoint( const wxPoint& aPosition, LSET aLayerMask )
BOARD_CONNECTED_ITEM* BOARD::GetLockPoint( const wxPoint& aPosition, LSET aLayerSet )
{
for( MODULE* module = m_Modules; module; module = module->Next() )
{
D_PAD* pad = module->GetPad( aPosition, aLayerMask );
D_PAD* pad = module->GetPad( aPosition, aLayerSet );
if( pad )
return pad;
}
// No pad has been located so check for a segment of the trace.
TRACK* segment = ::GetTrack( m_Track, NULL, aPosition, aLayerMask );
TRACK* segment = ::GetTrack( m_Track, NULL, aPosition, aLayerSet );
if( segment == NULL )
segment = GetTrack( m_Track, aPosition, aLayerMask );
if( !segment )
segment = GetVisibleTrack( m_Track, aPosition, aLayerSet );
return segment;
}

View File

@ -909,8 +909,7 @@ public:
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE, and determined by the inspector.
*/
SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] );
SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) override;
/**
* Function FindModuleByReference
@ -1300,17 +1299,19 @@ public:
void GetSortedPadListByXthenYCoord( std::vector<D_PAD*>& aVector, int aNetCode = -1 );
/**
* Function GetTrack
* find the segment of \a aTrace at \a aPosition on \a aLayer if \a Layer is visible.
* Function GetVisibleTrack
* finds the neighboring visible segment of \a aTrace at \a aPosition that is
* on a layer in \a aLayerSet.
* Traces that are flagged as deleted or busy are ignored.
*
* @param aTrace A pointer to the TRACK object to search.
* @param aStartingTrace is the first TRACK to test, testing continues to end of m_Track list from
* this starting point.
* @param aPosition A wxPoint object containing the position to test.
* @param aLayerMask A layer or layers to mask the hit test. Use -1 to ignore
* layer mask.
* @param aLayerSet A set of layers; returned TRACK must be on one of these.
* May pass a full set to request any layer.
* @return A TRACK object pointer if found otherwise NULL.
*/
TRACK* GetTrack( TRACK* aTrace, const wxPoint& aPosition, LSET aLayerMask ) const;
TRACK* GetVisibleTrack( TRACK* aStartingTrace, const wxPoint& aPosition, LSET aLayerSet ) const;
/**
* Function MarkTrace

View File

@ -761,8 +761,7 @@ void MODULE::Add3DModel( S3D_MASTER* a3DModel )
// see class_module.h
SEARCH_RESULT MODULE::Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] )
SEARCH_RESULT MODULE::Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] )
{
KICAD_T stype;
SEARCH_RESULT result = SEARCH_CONTINUE;
@ -780,7 +779,7 @@ SEARCH_RESULT MODULE::Visit( INSPECTOR* inspector, const void* testData,
switch( stype )
{
case PCB_MODULE_T:
result = inspector->Inspect( this, testData ); // inspect me
result = inspector( this, testData ); // inspect me
++p;
break;
@ -790,12 +789,12 @@ SEARCH_RESULT MODULE::Visit( INSPECTOR* inspector, const void* testData,
break;
case PCB_MODULE_TEXT_T:
result = inspector->Inspect( m_Reference, testData );
result = inspector( m_Reference, testData );
if( result == SEARCH_QUIT )
break;
result = inspector->Inspect( m_Value, testData );
result = inspector( m_Value, testData );
if( result == SEARCH_QUIT )
break;

View File

@ -531,8 +531,7 @@ public:
*/
void Add3DModel( S3D_MASTER* a3DModel );
SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] );
SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) override;
wxString GetClass() const
{

View File

@ -68,24 +68,24 @@ static bool ShowClearance( DISPLAY_OPTIONS* aDisplOpts, const TRACK* aTrack )
TRACK* GetTrack( TRACK* aStartTrace, const TRACK* aEndTrace,
const wxPoint& aPosition, LSET aLayerMask )
{
for( TRACK *PtSegm = aStartTrace; PtSegm != NULL; PtSegm = PtSegm->Next() )
for( TRACK* seg = aStartTrace; seg; seg = seg->Next() )
{
if( PtSegm->GetState( IS_DELETED | BUSY ) == 0 )
if( seg->GetState( IS_DELETED | BUSY ) == 0 )
{
if( aPosition == PtSegm->GetStart() )
if( aPosition == seg->GetStart() )
{
if( ( aLayerMask & PtSegm->GetLayerSet() ).any() )
return PtSegm;
if( ( aLayerMask & seg->GetLayerSet() ).any() )
return seg;
}
if( aPosition == PtSegm->GetEnd() )
if( aPosition == seg->GetEnd() )
{
if( ( aLayerMask & PtSegm->GetLayerSet() ).any() )
return PtSegm;
if( ( aLayerMask & seg->GetLayerSet() ).any() )
return seg;
}
}
if( PtSegm == aEndTrace )
if( seg == aEndTrace )
break;
}
@ -363,15 +363,14 @@ void VIA::Flip( const wxPoint& aCentre )
// see class_track.h
SEARCH_RESULT TRACK::Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] )
SEARCH_RESULT TRACK::Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] )
{
KICAD_T stype = *scanTypes;
// If caller wants to inspect my type
if( stype == Type() )
{
if( SEARCH_QUIT == inspector->Inspect( this, testData ) )
if( SEARCH_QUIT == inspector( this, testData ) )
return SEARCH_QUIT;
}
@ -1365,7 +1364,7 @@ TRACK* TRACK::GetTrack( TRACK* aStartTrace, TRACK* aEndTrace, ENDPOINT_T aEndPoi
while( nextSegment || previousSegment )
{
// Terminate the search in the direction if the netcode mismatches
// Terminate the search in the direction if the netcode mis-matches
if( aSameNetOnly )
{
if( nextSegment && (nextSegment->GetNetCode() != GetNetCode()) )

View File

@ -215,9 +215,7 @@ public:
*/
wxString ShowWidth() const;
SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
const KICAD_T scanTypes[] );
SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) override;
virtual bool HitTest( const wxPoint& aPosition ) const;
@ -250,7 +248,7 @@ public:
/**
* Function GetTrack
* return the trace segment connected to the segment at \a aEndPoint from \a
* returns the trace segment connected to the segment at \a aEndPoint from \a
* aStartTrace to \a aEndTrace.
*
* @param aStartTrace A pointer to the TRACK object to begin searching.

View File

@ -148,11 +148,11 @@ const KICAD_T GENERAL_COLLECTOR::Zones[] = {
* that it finds and does not do any displaying.
*
* @param testItem An EDA_ITEM to examine.
* @param testData The const void* testData, not used here.
* @param testData not used here.
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE;
*/
SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, const void* testData )
SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
{
BOARD_ITEM* item = (BOARD_ITEM*) testItem;
MODULE* module = NULL;
@ -459,10 +459,7 @@ void GENERAL_COLLECTOR::Collect( BOARD_ITEM* aItem, const KICAD_T aScanList[],
// the Inspect() function.
SetRefPos( aRefPos );
// visit the board or module with the INSPECTOR (me).
aItem->Visit( this, // INSPECTOR* inspector
NULL, // const void* testData, not used here
m_ScanTypes );
aItem->Visit( m_inspector, NULL, m_ScanTypes );
SetTimeNow(); // when snapshot was taken
@ -478,7 +475,7 @@ void GENERAL_COLLECTOR::Collect( BOARD_ITEM* aItem, const KICAD_T aScanList[],
// see collectors.h
SEARCH_RESULT PCB_TYPE_COLLECTOR::Inspect( EDA_ITEM* testItem, const void* testData )
SEARCH_RESULT PCB_TYPE_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
{
// The Vist() function only visits the testItem if its type was in the
// the scanList, so therefore we can collect anything given to us here.
@ -492,10 +489,5 @@ void PCB_TYPE_COLLECTOR::Collect( BOARD_ITEM* aBoard, const KICAD_T aScanList[]
{
Empty(); // empty any existing collection
// visit the board with the INSPECTOR (me).
aBoard->Visit( this, // INSPECTOR* inspector
NULL, // const void* testData,
aScanList );
aBoard->Visit( m_inspector, NULL, aScanList );
}
//EOF

View File

@ -337,14 +337,12 @@ public:
return NULL;
}
/**
* Function GetPrimaryCount
* @return int - The number if items which met the primary search criteria
*/
int GetPrimaryCount() { return m_PrimaryLength; }
/**
* Function Inspect
* is the examining function within the INSPECTOR which is passed to the
@ -355,8 +353,7 @@ public:
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE;
*/
SEARCH_RESULT Inspect( EDA_ITEM* testItem, const void* testData );
SEARCH_RESULT Inspect( EDA_ITEM* testItem, void* testData ) override;
/**
* Function Collect
@ -595,7 +592,6 @@ public:
*/
class PCB_TYPE_COLLECTOR : public COLLECTOR
{
public:
/**
@ -612,7 +608,6 @@ public:
return NULL;
}
/**
* Function Inspect
* is the examining function within the INSPECTOR which is passed to the
@ -623,8 +618,7 @@ public:
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE;
*/
SEARCH_RESULT Inspect( EDA_ITEM* testItem, const void* testData );
SEARCH_RESULT Inspect( EDA_ITEM* testItem, void* testData ) override;
/**
* Function Collect

View File

@ -69,7 +69,7 @@ public:
* @return the parent track or via of this connected point,
* or null if the parent is a pad
*/
TRACK * GetTrack() const
TRACK* GetTrack() const
{
return m_item->Type() != PCB_PAD_T ? (TRACK*) m_item : NULL ;
}

View File

@ -214,9 +214,9 @@ bool Magnetize( PCB_EDIT_FRAME* frame, int aCurrentTool, wxSize aGridSize,
if( !currTrack )
{
LSET layer_mask( layer );
LSET layers( layer );
TRACK* track = m_Pcb->GetTrack( m_Pcb->m_Track, pos, layer_mask );
TRACK* track = m_Pcb->GetVisibleTrack( m_Pcb->m_Track, pos, layers );
if( !track || track->Type() != PCB_TRACE_T )
{