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);
49 std::numeric_limits<uint32_t>::max() / 2;
53 const uint64_t average_chunk_size,
54 const uint64_t maximal_chunk_size)
55 : minimal_chunk_size_(minimal_chunk_size)
56 , average_chunk_size_(average_chunk_size)
57 , maximal_chunk_size_(maximal_chunk_size)
58 , threshold_((average_chunk_size > 0)
59 ? (std::numeric_limits<uint32_t>::max() / average_chunk_size)
75 const unsigned char *data = buffer->
data();
81 const uint64_t global_offset =
88 if (global_offset >=
offset() + static_cast<uint64_t>(buffer->
size())) {
89 return NoCut(global_offset);
93 uint64_t internal_offset = global_offset -
offset();
94 assert(internal_offset < static_cast<uint64_t>(buffer->
size()));
101 const int64_t internal_precompute_end =
102 std::min(static_cast<int64_t>(precompute_end -
offset()),
103 static_cast<int64_t>(buffer->
size()));
104 assert(internal_precompute_end - static_cast<int64_t>(internal_offset) <=
106 for (;
static_cast<int64_t
>(internal_offset) < internal_precompute_end;
109 xor32(data[internal_offset]);
115 const uint64_t internal_max_chunk_size_end =
117 const uint64_t internal_compute_end =
118 std::min(internal_max_chunk_size_end,
119 static_cast<uint64_t>(buffer->
size()));
120 for (; internal_offset < internal_compute_end; ++internal_offset) {
121 xor32(data[internal_offset]);
132 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