Core/Bitset: Add Reverse() method
This commit is contained in:
parent
cec547bf1f
commit
2ed65e60e1
|
|
@ -66,6 +66,8 @@ namespace Nz
|
|||
void Reset();
|
||||
void Reset(std::size_t bit);
|
||||
|
||||
void Reverse();
|
||||
|
||||
void Set(bool val = true);
|
||||
void Set(std::size_t bit, bool val = true);
|
||||
void SetBlock(std::size_t i, Block block);
|
||||
|
|
|
|||
|
|
@ -581,6 +581,30 @@ namespace Nz
|
|||
Set(bit, false);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Reverse the order of bits in a bitset
|
||||
*
|
||||
* Reverse the order of bits in the bitset (first bit swap with the last one, etc.)
|
||||
*/
|
||||
template<typename Block, class Allocator>
|
||||
void Bitset<Block, Allocator>::Reverse()
|
||||
{
|
||||
if (m_bitCount == 0)
|
||||
return;
|
||||
|
||||
std::size_t i = 0;
|
||||
std::size_t j = m_bitCount - 1;
|
||||
|
||||
while (i < j)
|
||||
{
|
||||
bool bit1 = Test(i);
|
||||
bool bit2 = Test(j);
|
||||
|
||||
Set(i++, bit2);
|
||||
Set(j--, bit1);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Sets the bitset to val
|
||||
*
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ template<typename Block> void CheckBitOps(const char* title);
|
|||
template<typename Block> void CheckConstructor(const char* title);
|
||||
template<typename Block> void CheckCopyMoveSwap(const char* title);
|
||||
template<typename Block> void CheckRead(const char* title);
|
||||
template<typename Block> void CheckReverse(const char* title);
|
||||
|
||||
SCENARIO("Bitset", "[CORE][BITSET]")
|
||||
{
|
||||
|
|
@ -30,6 +31,7 @@ void Check(const char* title)
|
|||
|
||||
CheckAppend<Block>(title);
|
||||
CheckRead<Block>(title);
|
||||
CheckReverse<Block>(title);
|
||||
}
|
||||
|
||||
template<typename Block>
|
||||
|
|
@ -115,6 +117,7 @@ void CheckBitOps(const char* title)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Block>
|
||||
void CheckConstructor(const char* title)
|
||||
{
|
||||
|
|
@ -271,3 +274,36 @@ void CheckRead(const char* title)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Block>
|
||||
void CheckReverse(const char* title)
|
||||
{
|
||||
SECTION(title)
|
||||
{
|
||||
GIVEN("A bitset")
|
||||
{
|
||||
Nz::String bits = "010011100010001101001111";
|
||||
Nz::Bitset<Block> expected(bits);
|
||||
|
||||
WHEN("We reverse the order of bits")
|
||||
{
|
||||
Nz::Bitset<Block> bitset(bits);
|
||||
bitset.Reverse();
|
||||
|
||||
THEN("The order of bits should be reversed")
|
||||
{
|
||||
CHECK(bitset == Nz::Bitset<Block>(bits.Reversed()));
|
||||
}
|
||||
AND_WHEN("We reverse the bit order again")
|
||||
{
|
||||
bitset.Reverse();
|
||||
|
||||
THEN("It should be back to normal")
|
||||
{
|
||||
CHECK(bitset == expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue