29 const uint64_t beginning =
offset();
30 const uint64_t end =
offset() + buffer->
size();
33 if (next_cut >= beginning && next_cut < end) {
34 return DoCut(next_cut);
37 return NoCut(next_cut);
52 const uint64_t average_chunk_size,
53 const uint64_t maximal_chunk_size)
54 : minimal_chunk_size_(minimal_chunk_size)
55 , average_chunk_size_(average_chunk_size)
56 , maximal_chunk_size_(maximal_chunk_size)
58 (average_chunk_size > 0)
59 ? (std::numeric_limits<uint32_t>::max() / average_chunk_size)
74 const unsigned char *data = buffer->
data();
80 const uint64_t global_offset = std::max(
85 if (global_offset >=
offset() + static_cast<uint64_t>(buffer->
size())) {
86 return NoCut(global_offset);
90 uint64_t internal_offset = global_offset -
offset();
91 assert(internal_offset < static_cast<uint64_t>(buffer->
size()));
98 const int64_t internal_precompute_end = std::min(
99 static_cast<int64_t>(precompute_end -
offset()),
100 static_cast<int64_t>(buffer->
size()));
101 assert(internal_precompute_end - static_cast<int64_t>(internal_offset)
103 for (;
static_cast<int64_t
>(internal_offset) < internal_precompute_end;
105 xor32(data[internal_offset]);
113 const uint64_t internal_compute_end = std::min(
114 internal_max_chunk_size_end, static_cast<uint64_t>(buffer->
size()));
115 for (; internal_offset < internal_compute_end; ++internal_offset) {
116 xor32(data[internal_offset]);
127 if (internal_offset == internal_max_chunk_size_end) {
virtual uint64_t DoFindNextCutMark(BlockItem *buffer)
void xor32(const unsigned char byte)
const uint64_t chunk_size_
virtual uint64_t DoCut(const uint64_t offset)
const uint64_t maximal_chunk_size_
static const int32_t kMagicNumber
virtual uint64_t NoCut(const uint64_t offset)
assert((mem||(size==0))&&"Out Of Memory")
static const unsigned kXor32Window
virtual uint64_t DoFindNextCutMark(BlockItem *buffer)
const uint64_t minimal_chunk_size_
uint64_t FindNextCutMark(BlockItem *block)
virtual uint64_t NoCut(uint64_t)
Xor32Detector(const uint64_t minimal_chunk_size, const uint64_t average_chunk_size, const uint64_t maximal_chunk_size)
virtual uint64_t DoCut(uint64_t offset)
uint64_t last_cut() const
const uint64_t average_chunk_size_
virtual uint64_t DoFindNextCutMark(BlockItem *block)=0