xref: /haiku/src/add-ons/kernel/file_systems/ext2/BitmapBlock.h (revision 0f9ffb37c166a9d9257044c8937f6450f4257b75)
1 /*
2  * Copyright 2001-2010, Haiku Inc. All rights reserved.
3  * This file may be used under the terms of the MIT License.
4  *
5  * Authors:
6  *		Janito V. Ferreira Filho
7  */
8 #ifndef BITMAPBLOCK_H
9 #define BITMAPBLOCK_H
10 
11 
12 #include "CachedBlock.h"
13 
14 
15 class BitmapBlock : public CachedBlock {
16 public:
17 							BitmapBlock(Volume* volume, uint32 numBits);
18 							~BitmapBlock();
19 
20 			bool			SetTo(off_t block);
21 			bool			SetToWritable(Transaction& transaction,
22 								off_t block, bool empty = false);
23 
24 			bool			CheckMarked(uint32 start, uint32 length);
25 			bool			CheckUnmarked(uint32 start, uint32 length);
26 
27 			bool			Mark(uint32 start, uint32 length,
28 								bool force = false);
29 			bool			Unmark(uint32 start, uint32 length,
30 								bool force = false);
31 
32 			void			FindNextMarked(uint32& pos);
33 			void			FindNextUnmarked(uint32& pos);
34 
35 			void			FindPreviousMarked(uint32& pos);
36 
37 			void			FindLargestUnmarkedRange(uint32& start,
38 								uint32& length);
39 
40 			uint32			NumBits() const { return fNumBits; }
41 			uint32			Checksum(uint32 unitsPerGroup) const;
42 
43 private:
44 			bool			_Check(uint32 start, uint32 length, bool marked);
45 			void			_FindNext(uint32& pos, bool marked);
46 			bool			_Update(uint32 start, uint32 length, bool mark,
47 								bool force);
48 
49 			Volume*			fVolume;
50 			uint32*			fData;
51 			const uint32*	fReadOnlyData;
52 
53 			uint32			fNumBits;
54 			uint32			fMaxIndex;
55 };
56 
57 
58 inline bool
59 BitmapBlock::CheckUnmarked(uint32 start, uint32 length)
60 {
61 	return _Check(start, length, false);
62 }
63 
64 
65 inline bool
66 BitmapBlock::CheckMarked(uint32 start, uint32 length)
67 {
68 	return _Check(start, length, true);
69 }
70 
71 
72 inline bool
73 BitmapBlock::Mark(uint32 start, uint32 length, bool force)
74 {
75 	return _Update(start, length, true, force);
76 }
77 
78 
79 inline bool
80 BitmapBlock::Unmark(uint32 start, uint32 length, bool force)
81 {
82 	return _Update(start, length, false, force);
83 }
84 
85 
86 inline void
87 BitmapBlock::FindNextMarked(uint32& pos)
88 {
89 	_FindNext(pos, true);
90 }
91 
92 
93 inline void
94 BitmapBlock::FindNextUnmarked(uint32& pos)
95 {
96 	_FindNext(pos, false);
97 }
98 
99 
100 #endif	// BITMAPBLOCK_H
101