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