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
NumBits()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
CheckUnmarked(uint32 start,uint32 length)59 BitmapBlock::CheckUnmarked(uint32 start, uint32 length)
60 {
61 return _Check(start, length, false);
62 }
63
64
65 inline bool
CheckMarked(uint32 start,uint32 length)66 BitmapBlock::CheckMarked(uint32 start, uint32 length)
67 {
68 return _Check(start, length, true);
69 }
70
71
72 inline bool
Mark(uint32 start,uint32 length,bool force)73 BitmapBlock::Mark(uint32 start, uint32 length, bool force)
74 {
75 return _Update(start, length, true, force);
76 }
77
78
79 inline bool
Unmark(uint32 start,uint32 length,bool force)80 BitmapBlock::Unmark(uint32 start, uint32 length, bool force)
81 {
82 return _Update(start, length, false, force);
83 }
84
85
86 inline void
FindNextMarked(uint32 & pos)87 BitmapBlock::FindNextMarked(uint32& pos)
88 {
89 _FindNext(pos, true);
90 }
91
92
93 inline void
FindNextUnmarked(uint32 & pos)94 BitmapBlock::FindNextUnmarked(uint32& pos)
95 {
96 _FindNext(pos, false);
97 }
98
99
100 #endif // BITMAPBLOCK_H
101