A Bitmap class, basically a wrapper for bit shifting and masking
This commit is contained in:
parent
57aaad7d22
commit
764297de59
1 changed files with 100 additions and 0 deletions
100
src/kstd/Bitmap.hh
Normal file
100
src/kstd/Bitmap.hh
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
/* Bitmap.hh
|
||||||
|
* vim: set tw=80:
|
||||||
|
* Eryn Wells <eryn@erynwells.me>
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Declares a Bitmap object, which manages an array of bytes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __KSTD_BITMAP_HH__
|
||||||
|
#define __KSTD_BITMAP_HH__
|
||||||
|
|
||||||
|
#include "kstd/Types.hh"
|
||||||
|
|
||||||
|
namespace kstd {
|
||||||
|
|
||||||
|
/** An array-like object of N bits, where N is the size of the type T given as a template parameter. */
|
||||||
|
template <typename T>
|
||||||
|
struct Bitmap
|
||||||
|
{
|
||||||
|
typedef T FieldType;
|
||||||
|
|
||||||
|
/** Size of the bitmap in bits. */
|
||||||
|
static const usize length = sizeof(FieldType) * 8;
|
||||||
|
|
||||||
|
Bitmap()
|
||||||
|
: mBitmap(0)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
explicit
|
||||||
|
Bitmap(FieldType value)
|
||||||
|
: mBitmap(value)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
/** Get the status of a single bit. Returns `true` if the bit is 1. */
|
||||||
|
bool
|
||||||
|
isSet(usize bit)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
if (isValid(bit)) {
|
||||||
|
return (mBitmap & (1 << bit)) > 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set a single bit to 1. */
|
||||||
|
void
|
||||||
|
set(usize bit)
|
||||||
|
{
|
||||||
|
if (isValid(bit)) {
|
||||||
|
mBitmap |= 1 << bit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set a single bit to zero. */
|
||||||
|
void
|
||||||
|
clear(usize bit)
|
||||||
|
{
|
||||||
|
if (isValid(bit)) {
|
||||||
|
mBitmap &= ~(1 << bit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Toggle the state of a single bit. Returns `true` if the bit was set to 1. */
|
||||||
|
bool
|
||||||
|
toggle(usize bit)
|
||||||
|
{
|
||||||
|
if (isValid(bit)) {
|
||||||
|
mBitmap ^= 1 << bit;
|
||||||
|
return isSet(bit);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Clear the entire bit field. */
|
||||||
|
void
|
||||||
|
zero()
|
||||||
|
{
|
||||||
|
mBitmap = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set everything to 1. */
|
||||||
|
void
|
||||||
|
fill()
|
||||||
|
{
|
||||||
|
mBitmap = ~(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
FieldType mBitmap;
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
isValid(usize bit)
|
||||||
|
{
|
||||||
|
return bit >= 0 && bit < Bitmap::length;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace kstd */
|
||||||
|
|
||||||
|
#endif /* __KSTD_BITMAP_HH__ */
|
Loading…
Add table
Add a link
Reference in a new issue