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;
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------
|