Simplify: use a bit vector.

This commit is contained in:
Steve Checkoway
2008-01-19 21:12:52 +00:00
parent b984649787
commit e255c1a0b7
+18 -25
View File
@@ -45,45 +45,38 @@
// Helper class to ensure that each row is only judged once without taking too much memory. // Helper class to ensure that each row is only judged once without taking too much memory.
class JudgedRows class JudgedRows
{ {
char *m_pRows; vector<bool> m_vRows;
int m_iStart; int m_iStart;
int m_iOffset; int m_iOffset;
int m_iLen;
void Resize( int iMin ) void Resize( size_t iMin )
{ {
char *p = m_pRows; size_t iNewSize = max( 2*m_vRows.size(), iMin );
int newSize = max( m_iLen*2, iMin ); vector<bool> vNewRows( m_vRows.begin() + m_iOffset, m_vRows.end() );
m_pRows = new char[newSize]; vNewRows.reserve( iNewSize );
int i = 0; vNewRows.insert( vNewRows.end(), m_vRows.begin(), m_vRows.begin() + m_iOffset );
if( p ) vNewRows.resize( iNewSize, false );
{ m_vRows.swap( vNewRows );
for( ; i < m_iLen; ++i )
m_pRows[i] = p[(i+m_iOffset)%m_iLen];
delete[] p;
}
m_iOffset = 0; m_iOffset = 0;
m_iLen = newSize;
memset( m_pRows + i, 0, newSize - i );
} }
public: public:
JudgedRows() : m_pRows(NULL), m_iStart(0), m_iOffset(0), m_iLen(0) { Resize( 32 ); } JudgedRows() : m_iStart(0), m_iOffset(0) { Resize( 32 ); }
~JudgedRows() { delete[] m_pRows; }
// Returns true if the row has already been judged. // Returns true if the row has already been judged.
bool JudgeRow( int iRow ) bool JudgeRow( int iRow )
{ {
if( iRow < m_iStart ) if( iRow < m_iStart )
return true; return true;
if( iRow >= m_iStart+m_iLen ) if( iRow >= m_iStart+int(m_vRows.size()) )
Resize( iRow+1-m_iStart ); Resize( iRow+1-m_iStart );
const bool ret = m_pRows[(iRow-m_iStart+m_iOffset)%m_iLen] != 0; const int iIndex = (iRow - m_iStart + m_iOffset) % m_vRows.size();
m_pRows[(iRow-m_iStart+m_iOffset)%m_iLen] = 1; const bool ret = m_vRows[iIndex];
while( m_pRows[m_iOffset] ) m_vRows[iIndex] = true;
while( m_vRows[m_iOffset] )
{ {
m_pRows[m_iOffset] = 0; m_vRows[m_iOffset] = false;
++m_iStart; ++m_iStart;
if( ++m_iOffset >= m_iLen ) if( ++m_iOffset >= int(m_vRows.size()) )
m_iOffset -= m_iLen; m_iOffset -= m_vRows.size();
} }
return ret; return ret;
} }
@@ -91,7 +84,7 @@ public:
{ {
m_iStart = iStart; m_iStart = iStart;
m_iOffset = 0; m_iOffset = 0;
memset( m_pRows, 0, m_iLen ); m_vRows.assign( m_vRows.size(), false );
} }
}; };