#ifndef THIN_PROVISIONING_VARIABLE_CHUNK_STREAM_H
#define THIN_PROVISIONING_VARIABLE_CHUNK_STREAM_H

#include "base/rolling_hash.h"
#include "thin-provisioning/chunk_stream.h"

//----------------------------------------------------------------

namespace thin_provisioning {
	class variable_chunk_stream : public chunk_stream {
	public:
		// window_size must be a power of 2
		variable_chunk_stream(chunk_stream &stream, unsigned window_size);
		~variable_chunk_stream();

		virtual bcache::block_address size() const;
		virtual void rewind();
		virtual bool next(bcache::block_address count = 1ull);
		virtual bool eof() const;
		virtual chunk const &get();
		virtual void put(chunk const &c);

	private:
		bool next_big_chunk();
		bool advance_one();
		void put_big_chunk();

		bcache::block_address index_;
		base::content_based_hash h_;

		chunk_stream &stream_;
		chunk const *big_chunk_;

		uint8_t *little_b_, *little_e_, *last_hashed_;
		chunk little_chunk_;
	};
}

//----------------------------------------------------------------

#endif