Core/Bitset: Add Reverse() method
This commit is contained in:
parent
cec547bf1f
commit
2ed65e60e1
|
|
@ -66,6 +66,8 @@ namespace Nz
|
||||||
void Reset();
|
void Reset();
|
||||||
void Reset(std::size_t bit);
|
void Reset(std::size_t bit);
|
||||||
|
|
||||||
|
void Reverse();
|
||||||
|
|
||||||
void Set(bool val = true);
|
void Set(bool val = true);
|
||||||
void Set(std::size_t bit, bool val = true);
|
void Set(std::size_t bit, bool val = true);
|
||||||
void SetBlock(std::size_t i, Block block);
|
void SetBlock(std::size_t i, Block block);
|
||||||
|
|
|
||||||
|
|
@ -581,6 +581,30 @@ namespace Nz
|
||||||
Set(bit, false);
|
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
|
* \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 CheckConstructor(const char* title);
|
||||||
template<typename Block> void CheckCopyMoveSwap(const char* title);
|
template<typename Block> void CheckCopyMoveSwap(const char* title);
|
||||||
template<typename Block> void CheckRead(const char* title);
|
template<typename Block> void CheckRead(const char* title);
|
||||||
|
template<typename Block> void CheckReverse(const char* title);
|
||||||
|
|
||||||
SCENARIO("Bitset", "[CORE][BITSET]")
|
SCENARIO("Bitset", "[CORE][BITSET]")
|
||||||
{
|
{
|
||||||
|
|
@ -30,6 +31,7 @@ void Check(const char* title)
|
||||||
|
|
||||||
CheckAppend<Block>(title);
|
CheckAppend<Block>(title);
|
||||||
CheckRead<Block>(title);
|
CheckRead<Block>(title);
|
||||||
|
CheckReverse<Block>(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Block>
|
template<typename Block>
|
||||||
|
|
@ -115,6 +117,7 @@ void CheckBitOps(const char* title)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Block>
|
template<typename Block>
|
||||||
void CheckConstructor(const char* title)
|
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