Performance: Move vector inside SCH_SHEET_PATH so hash can be cached

This commit is contained in:
Jon Evans 2019-04-08 23:27:04 -04:00
parent 86d32fa34d
commit 541c2fdb29
2 changed files with 55 additions and 19 deletions

View File

@ -51,12 +51,7 @@ namespace std
{ {
size_t hash<SCH_SHEET_PATH>::operator()( const SCH_SHEET_PATH& path ) const size_t hash<SCH_SHEET_PATH>::operator()( const SCH_SHEET_PATH& path ) const
{ {
size_t seed = 0; return path.GetCurrentHash();
for( auto sheet : path )
boost::hash_combine( seed, sheet->GetTimeStamp() );
return seed;
} }
} }
@ -64,6 +59,16 @@ namespace std
SCH_SHEET_PATH::SCH_SHEET_PATH() SCH_SHEET_PATH::SCH_SHEET_PATH()
{ {
m_pageNumber = 0; m_pageNumber = 0;
m_current_hash = 0;
}
void SCH_SHEET_PATH::Rehash()
{
m_current_hash = 0;
for( auto sheet : m_sheets )
boost::hash_combine( m_current_hash, sheet->GetTimeStamp() );
} }
@ -339,16 +344,7 @@ bool SCH_SHEET_PATH::SetComponentFootprint( const wxString& aReference, const wx
bool SCH_SHEET_PATH::operator==( const SCH_SHEET_PATH& d1 ) const bool SCH_SHEET_PATH::operator==( const SCH_SHEET_PATH& d1 ) const
{ {
if( size() != d1.size() ) return m_current_hash == d1.GetCurrentHash();
return false;
for( unsigned i = 0; i < size(); i++ )
{
if( at( i ) != d1[i] )
return false;
}
return true;
} }

View File

@ -89,8 +89,6 @@ class SCH_REFERENCE_LIST;
#define SHEET_NOT_FOUND -1 #define SHEET_NOT_FOUND -1
typedef std::vector< SCH_SHEET* > SCH_SHEETS; // no ownership over contained SCH_SHEETs
/** /**
* Type SCH_MULTI_UNIT_REFERENCE_MAP * Type SCH_MULTI_UNIT_REFERENCE_MAP
@ -111,13 +109,52 @@ typedef std::map<wxString, SCH_REFERENCE_LIST> SCH_MULTI_UNIT_REFERENCE_MAP;
* "path" from the first to the last sheet. * "path" from the first to the last sheet.
* </p> * </p>
*/ */
class SCH_SHEET_PATH : public SCH_SHEETS class SCH_SHEET_PATH
{ {
protected:
std::vector< SCH_SHEET* > m_sheets;
size_t m_current_hash;
int m_pageNumber; /// Page numbers are maintained by the sheet load order. int m_pageNumber; /// Page numbers are maintained by the sheet load order.
public: public:
SCH_SHEET_PATH(); SCH_SHEET_PATH();
/// Forwarded method from std::vector
SCH_SHEET* at( size_t aIndex ) const { return m_sheets.at( aIndex ); }
/// Forwarded method from std::vector
void clear()
{
m_sheets.clear();
Rehash();
}
/// Forwarded method from std::vector
bool empty() const { return m_sheets.empty(); }
/// Forwarded method from std::vector
void pop_back()
{
m_sheets.pop_back();
Rehash();
}
/// Forwarded method from std::vector
void push_back( SCH_SHEET* aSheet )
{
m_sheets.push_back( aSheet );
Rehash();
}
/// Forwarded method from std::vector
size_t size() const { return m_sheets.size(); }
void Rehash();
size_t GetCurrentHash() const { return m_current_hash; }
void SetPageNumber( int aPageNumber ) { m_pageNumber = aPageNumber; } void SetPageNumber( int aPageNumber ) { m_pageNumber = aPageNumber; }
int GetPageNumber() const { return m_pageNumber; } int GetPageNumber() const { return m_pageNumber; }
@ -303,6 +340,9 @@ public:
bool operator==( const SCH_SHEET_PATH& d1 ) const; bool operator==( const SCH_SHEET_PATH& d1 ) const;
bool operator!=( const SCH_SHEET_PATH& d1 ) const { return !( *this == d1 ) ; } bool operator!=( const SCH_SHEET_PATH& d1 ) const { return !( *this == d1 ) ; }
bool operator<( const SCH_SHEET_PATH& d1 ) const { return m_sheets < d1.m_sheets; }
}; };