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