public SimpleReadCachingBlockStore(IBlockStore store, uint cacheCapacity = 512)
        {
            if (store == null)
            {
                throw new ArgumentNullException("store");
            }
            _store = store;

            _blockCache = new SimpleRecentItemCache<byte[]>();
            _blockCache.CacheCapacity = cacheCapacity;
            _blockCache.ItemRemovedFromCache = ItemRemovedFromCache;
            _blockCache.OnCacheMiss = CacheMiss;
            _blockBuffPool = new ObjectPool<byte[]>(() => new byte[store.BlockSize]);
        }
        public SimpleReadWriteCachingBlockStore(IBlockStore store, uint capacity = 512)
        {
            if (store == null)
            {
                throw new ArgumentNullException("store");
            }
            _store = store;
            _blockSize = _store.BlockSize;

            _itemPool = new ObjectPool<CacheItem>(() => new CacheItem(_blockSize));

            _blockCache = new SimpleRecentItemCache<CacheItem>();
            _blockCache.CacheCapacity = capacity;
            _blockCache.ItemRemovedFromCache = ItemRemovedFromCache;
            _blockCache.OnCacheMiss = CacheMiss;
        }
        public SmarterReadCachingBlockStore(IBlockStore backend, uint cacheBlockSize, uint cacheCapacity = SimpleRecentItemCache<byte[]>.DefaultCacheSize)
        {
            if (backend == null)
            {
                throw new ArgumentNullException("backend");
            }

            _backend = backend;
            _cacheBlockSize = cacheBlockSize;
            if (cacheBlockSize % _backend.BlockSize != 0)
            {
                throw new Exception("Wrong CacheBlockSize value. Should be perfect multiple of backend block size");
            }
            _backendBlocksPerCacheBlock=cacheBlockSize/_backend.BlockSize;

            _bufferPool = new ObjectPool<byte[]>(() => new byte[cacheBlockSize]);

            _cache = new SimpleRecentItemCache<byte[]>(cacheCapacity);
            _cache.ItemRemovedFromCache = ItemRemovedFromCache;
            _cache.OnCacheMiss = CacheMiss;
        }