#include "blockdevice.hpp" namespace helos { class SlicedBlockDevice: public BlockDevice { public: SlicedBlockDevice(BlockDevice *backing, uint64_t off, uint64_t cnt) : backing(backing), off(off), cnt(cnt) {} public: virtual uint64_t BlockSize() const override { return backing->BlockSize(); } uint64_t Size() const override { return cnt; } uint64_t SizeBytes() const override { return backing->BlockSize() * cnt; } ::helos::Permission DevicePermission() const override { return backing->DevicePermission(); } uint64_t ReadBlock(uint64_t blockOffset, void *data, uint64_t blockCount) const override { return backing->ReadBlock(blockOffset + off, data, blockCount); } uint64_t WriteBlock(uint64_t blockOffset, const void *data, uint64_t blockCount) override { return backing->WriteBlock(blockOffset + off, data, blockCount); } private: BlockDevice *backing; uint64_t off, cnt; }; BlockDevice *BlockDevice::Slice(uint64_t blockOffset, uint64_t blockCount) { return new SlicedBlockDevice(this, blockOffset, blockCount); } } // namespace helos