1/* 2 * Copyright 2013-2022, Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Pawe�� Dziepak, pdziepak@quarnos.org 7 * Augustin Cavalier <waddlesplash> 8 */ 9#ifndef KERNEL_UTIL_BITMAP_H 10#define KERNEL_UTIL_BITMAP_H 11 12 13#ifdef _KERNEL_MODE 14# include <debug.h> 15#else 16# include <Debug.h> 17#endif 18 19#include <SupportDefs.h> 20 21namespace BKernel { 22 23class Bitmap { 24public: 25 Bitmap(size_t bitCount = 0); 26 ~Bitmap(); 27 28 status_t InitCheck(); 29 30 status_t Resize(size_t bitCount); 31 void Shift(ssize_t bitCount); 32 33 inline bool Get(size_t index) const; 34 inline void Set(size_t index); 35 inline void Clear(size_t index); 36 37 void SetRange(size_t index, size_t count); 38 void ClearRange(size_t index, size_t count); 39 40 ssize_t GetLowestClear(size_t fromIndex = 0) const; 41 ssize_t GetLowestContiguousClear(size_t count, size_t fromIndex = 0) const; 42 ssize_t GetHighestSet() const; 43 44private: 45 size_t fElementsCount; 46 size_t fSize; 47 addr_t* fBits; 48 49 static const int kBitsPerElement = (sizeof(addr_t) * 8); 50}; 51 52 53bool 54Bitmap::Get(size_t index) const 55{ 56 ASSERT(index < fSize); 57 58 const size_t kArrayElement = index / kBitsPerElement; 59 const addr_t kBitMask = addr_t(1) << (index % kBitsPerElement); 60 return fBits[kArrayElement] & kBitMask; 61} 62 63 64void 65Bitmap::Set(size_t index) 66{ 67 ASSERT(index < fSize); 68 69 const size_t kArrayElement = index / kBitsPerElement; 70 const addr_t kBitMask = addr_t(1) << (index % kBitsPerElement); 71 fBits[kArrayElement] |= kBitMask; 72} 73 74 75void 76Bitmap::Clear(size_t index) 77{ 78 ASSERT(index < fSize); 79 80 const size_t kArrayElement = index / kBitsPerElement; 81 const addr_t kBitMask = addr_t(1) << (index % kBitsPerElement); 82 fBits[kArrayElement] &= ~addr_t(kBitMask); 83} 84 85} // namespace BKernel 86 87 88using BKernel::Bitmap; 89 90 91#endif // KERNEL_UTIL_BITMAP_H 92 93