114 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "thin-provisioning/fixed_chunk_stream.h"
 | 
						|
 | 
						|
using namespace thin_provisioning;
 | 
						|
 | 
						|
//----------------------------------------------------------------
 | 
						|
 | 
						|
fixed_chunk_stream::fixed_chunk_stream(chunk_stream &stream, unsigned chunk_size)
 | 
						|
	: index_(0),
 | 
						|
	  stream_(stream),
 | 
						|
	  chunk_size_(chunk_size),
 | 
						|
	  big_chunk_(0) {
 | 
						|
	next_big_chunk();
 | 
						|
}
 | 
						|
 | 
						|
fixed_chunk_stream::~fixed_chunk_stream()
 | 
						|
{
 | 
						|
	put_big_chunk();
 | 
						|
}
 | 
						|
 | 
						|
bcache::block_address
 | 
						|
fixed_chunk_stream::size() const
 | 
						|
{
 | 
						|
	return stream_.size();
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
fixed_chunk_stream::rewind()
 | 
						|
{
 | 
						|
	// FIXME: not complete
 | 
						|
	index_ = 0;
 | 
						|
	stream_.rewind();
 | 
						|
}
 | 
						|
 | 
						|
bool
 | 
						|
fixed_chunk_stream::next(bcache::block_address count)
 | 
						|
{
 | 
						|
	while (count--) {
 | 
						|
		index_++;
 | 
						|
		advance_one();
 | 
						|
	}
 | 
						|
 | 
						|
	return !eof();
 | 
						|
}
 | 
						|
 | 
						|
bool
 | 
						|
fixed_chunk_stream::eof() const
 | 
						|
{
 | 
						|
	return stream_.eof();
 | 
						|
}
 | 
						|
 | 
						|
chunk const &
 | 
						|
fixed_chunk_stream::get()
 | 
						|
{
 | 
						|
	assert(big_chunk_);
 | 
						|
 | 
						|
	little_chunk_.len_ = little_e_ - little_b_;
 | 
						|
	little_chunk_.offset_ = big_chunk_->offset_ + little_chunk_.len_;
 | 
						|
 | 
						|
	little_chunk_.mem_.begin = little_b_;
 | 
						|
	little_chunk_.mem_.end = little_e_;
 | 
						|
 | 
						|
	return little_chunk_;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
fixed_chunk_stream::put(chunk const &c)
 | 
						|
{
 | 
						|
	// noop
 | 
						|
}
 | 
						|
 | 
						|
bool
 | 
						|
fixed_chunk_stream::next_big_chunk()
 | 
						|
{
 | 
						|
	put_big_chunk();
 | 
						|
 | 
						|
	if (!stream_.next())
 | 
						|
		return false;
 | 
						|
 | 
						|
	big_chunk_ = &stream_.get();
 | 
						|
	little_b_ = little_e_ = last_hashed_ = big_chunk_->mem_.begin;
 | 
						|
 | 
						|
	return true;
 | 
						|
}
 | 
						|
 | 
						|
bool
 | 
						|
fixed_chunk_stream::advance_one()
 | 
						|
{
 | 
						|
	uint8_t *big_e;
 | 
						|
 | 
						|
	big_e = big_chunk_->mem_.end;
 | 
						|
	little_b_ = little_e_;
 | 
						|
 | 
						|
	if (little_b_ >= big_e) {
 | 
						|
		if (next_big_chunk())
 | 
						|
			big_e = big_chunk_->mem_.end;
 | 
						|
		else
 | 
						|
			return false;
 | 
						|
	}
 | 
						|
 | 
						|
	little_e_ += chunk_size_;
 | 
						|
	return true;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
fixed_chunk_stream::put_big_chunk()
 | 
						|
{
 | 
						|
	if (big_chunk_)
 | 
						|
		stream_.put(*big_chunk_);
 | 
						|
 | 
						|
	big_chunk_ = 0;
 | 
						|
}
 | 
						|
 | 
						|
//----------------------------------------------------------------
 |