88 lines
1.6 KiB
C
Raw Normal View History

2013-10-03 04:27:49 +02:00
/*
* Copyright 2013-2022, Haiku, Inc. All rights reserved.
2013-10-03 04:27:49 +02:00
* Distributed under the terms of the MIT License.
*
* Authors:
* Paweł Dziepak, pdziepak@quarnos.org
* Augustin Cavalier <waddlesplash>
2013-10-03 04:27:49 +02:00
*/
#ifndef KERNEL_UTIL_BITMAP_H
#define KERNEL_UTIL_BITMAP_H
#ifdef _KERNEL_MODE
# include <debug.h>
#else
# include <Debug.h>
#endif
2013-10-03 04:27:49 +02:00
#include <SupportDefs.h>
namespace BKernel {
2013-10-03 04:27:49 +02:00
class Bitmap {
public:
Bitmap(size_t bitCount);
2013-10-03 04:27:49 +02:00
~Bitmap();
status_t InitCheck();
2013-10-03 04:27:49 +02:00
status_t Resize(size_t bitCount);
void Shift(ssize_t bitCount);
2013-10-03 04:27:49 +02:00
inline bool Get(size_t index) const;
inline void Set(size_t index);
inline void Clear(size_t index);
2013-10-03 04:27:49 +02:00
ssize_t GetHighestSet() const;
2013-10-03 04:27:49 +02:00
private:
size_t fElementsCount;
size_t fSize;
2013-10-03 04:27:49 +02:00
addr_t* fBits;
static const int kBitsPerElement = (sizeof(addr_t) * 8);
2013-10-03 04:27:49 +02:00
};
bool
Bitmap::Get(size_t index) const
2013-10-03 04:27:49 +02:00
{
ASSERT(index < fSize);
const size_t kArrayElement = index / kBitsPerElement;
2013-10-03 04:27:49 +02:00
const addr_t kBitMask = addr_t(1) << (index % kBitsPerElement);
return fBits[kArrayElement] & kBitMask;
}
void
Bitmap::Set(size_t index)
2013-10-03 04:27:49 +02:00
{
ASSERT(index < fSize);
const size_t kArrayElement = index / kBitsPerElement;
2013-10-03 04:27:49 +02:00
const addr_t kBitMask = addr_t(1) << (index % kBitsPerElement);
fBits[kArrayElement] |= kBitMask;
}
void
Bitmap::Clear(size_t index)
2013-10-03 04:27:49 +02:00
{
ASSERT(index < fSize);
const size_t kArrayElement = index / kBitsPerElement;
2013-10-03 04:27:49 +02:00
const addr_t kBitMask = addr_t(1) << (index % kBitsPerElement);
fBits[kArrayElement] &= ~addr_t(kBitMask);
}
} // namespace BKernel
using BKernel::Bitmap;
2013-10-03 04:27:49 +02:00
#endif // KERNEL_UTIL_BITMAP_H