1/* 2 * Copyright 2001-2008, Axel D��rfler, axeld@pinc-software.de. 3 * This file may be used under the terms of the MIT License. 4 */ 5#ifndef CACHED_BLOCK_H 6#define CACHED_BLOCK_H 7 8//! interface for the block cache 9 10#include <fs_cache.h> 11 12#include "Volume.h" 13 14 15class CachedBlock { 16public: 17 CachedBlock(Volume* volume); 18 CachedBlock(Volume* volume, off_t block); 19 ~CachedBlock(); 20 21 void Keep(); 22 void Unset(); 23 24 const uint8* SetTo(off_t block); 25 26 const uint8* Block() const { return fBlock; } 27 off_t BlockNumber() const { return fBlockNumber; } 28 29private: 30 CachedBlock(const CachedBlock &); 31 CachedBlock &operator=(const CachedBlock &); 32 // no implementation 33 34protected: 35 Volume* fVolume; 36 off_t fBlockNumber; 37 uint8* fBlock; 38}; 39 40 41// inlines 42 43 44inline 45CachedBlock::CachedBlock(Volume* volume) 46 : 47 fVolume(volume), 48 fBlockNumber(0), 49 fBlock(NULL) 50{ 51} 52 53 54inline 55CachedBlock::CachedBlock(Volume* volume, off_t block) 56 : 57 fVolume(volume), 58 fBlockNumber(0), 59 fBlock(NULL) 60{ 61 SetTo(block); 62} 63 64 65inline 66CachedBlock::~CachedBlock() 67{ 68 Unset(); 69} 70 71 72inline void 73CachedBlock::Keep() 74{ 75 fBlock = NULL; 76} 77 78 79inline void 80CachedBlock::Unset() 81{ 82 if (fBlock != NULL) { 83 block_cache_put(fVolume->BlockCache(), fBlockNumber); 84 fBlock = NULL; 85 } 86} 87 88 89inline const uint8 * 90CachedBlock::SetTo(off_t block) 91{ 92 Unset(); 93 fBlockNumber = block; 94 return fBlock = (uint8 *)block_cache_get(fVolume->BlockCache(), block); 95} 96 97#endif // CACHED_BLOCK_H 98