Skip to content
Snippets Groups Projects
Commit a5c09405 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

operator and for sparse bool vector

parent b09e7dcc
No related branches found
No related tags found
No related merge requests found
......@@ -301,6 +301,11 @@ public:
 
// --------------------------------------------------------------------------------------------------------------------------------------------------
 
friend std::ostream & operator << ( std::ostream & out, const common::SparseBoolVector & elem ) {
out << "(" << elem.m_Size << ", " << elem.m_Data << ")";
return out;
}
friend std::ostream & operator << ( std::ostream & out, const common::SparseBoolVector::element & elem ) {
out << "(" << elem.run << ", ";
for ( unsigned i = 0; i < sizeof ( elem.word ) * 8; ++ i )
......@@ -402,6 +407,52 @@ public:
return SparseBoolVectorOnesIterator ( m_Data.end ( ), m_Data.end ( ), m_Size );
}
 
// --------------------------------------------------------------------------------------------------------------------------------------------------
friend SparseBoolVector & operator &= ( SparseBoolVector & A, const SparseBoolVector & B ) {
A.resize ( std::max ( A.size ( ), B.size ( ) ) );
std::list < element >::iterator iterA = A.m_Data.begin ( );
std::list < element >::const_iterator iterB = B.m_Data.begin ( );
size_t blocksA = iterA->run;
size_t blocksB = iterB->run;
while ( iterA != A.m_Data.end ( ) && iterB != B.m_Data.end ( ) ) {
if ( blocksA == blocksB ) {
iterA->word &= iterB->word;
++ iterA;
blocksA += 1 + iterA->run;
++ iterB;
blocksB += 1 + iterB->run;
} else if ( blocksA < blocksB ) {
iterA->word = 0;
++ iterA;
blocksA += 1 + iterA->run;
} else { // blockA > blockB
++ iterB;
blocksB += 1 + iterB->run;
}
}
while ( iterA != A.m_Data.end ( ) ) {
iterA->word = 0;
++ iterA;
}
A.packData();
return A;
}
friend SparseBoolVector operator & ( SparseBoolVector A, const SparseBoolVector & B ) {
A &= B;
return A;
}
// --------------------------------------------------------------------------------------------------------------------------------------------------
 
};
......
......@@ -375,3 +375,21 @@ void SparseBoolVectorTest::testSubscript2() {
 
CPPUNIT_ASSERT ( ( std::vector < bool > ) data == ref );
}
void SparseBoolVectorTest::testOperatorAnd ( ) {
std::vector < bool > first;
std::vector < bool > second;
std::vector < bool > ref;
first.resize ( 2000 );
second.resize ( 2000 );
ref.resize ( 2000 );
first[520] = first[1] = first[3] = first[512] = first[511] = first[128] = first[127] = first[17] = first[53] = first[1999] = true;
second[80] = second[1] = second[5] = second[51] = second[5] = second[7] = second[127] = second[1] = second[77] = second[999] = true;
ref[1] = ref[127] = true;
common::SparseBoolVector data;
CPPUNIT_ASSERT ( ( first & second ) == ref );
}
......@@ -15,6 +15,7 @@ class SparseBoolVectorTest : public CppUnit::TestFixture
CPPUNIT_TEST( testCompare );
CPPUNIT_TEST( testSubscript );
CPPUNIT_TEST( testSubscript2 );
CPPUNIT_TEST( testOperatorAnd );
CPPUNIT_TEST_SUITE_END();
 
public:
......@@ -30,6 +31,7 @@ public:
void testCompare();
void testSubscript();
void testSubscript2();
void testOperatorAnd();
};
 
#endif // SPARSE_BOOL_VECTOR_TEST_H_
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment