emory/chunk/map: move chunking to a free function
This commit is contained in:
parent
66ec824b44
commit
db6c4f54a2
@ -16,13 +16,17 @@ using emory::chunk::map;
|
|||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
map::map (
|
template <typename HashT, typename OutputT>
|
||||||
cruft::view<u08 const *> src,
|
static
|
||||||
|
OutputT
|
||||||
|
find_chunks (
|
||||||
|
OutputT &&dst,
|
||||||
|
cruft::view<u08 const*> src,
|
||||||
emory::chunk::params const &p
|
emory::chunk::params const &p
|
||||||
) {
|
) {
|
||||||
using hash_type = cruft::hash::buzhash<u64>;
|
using hash_type = cruft::hash::buzhash<u64>;
|
||||||
if (src.size () < p.window)
|
if (src.size () < p.window)
|
||||||
return;
|
return dst;
|
||||||
|
|
||||||
using digest_type = hash_type::digest_type ;
|
using digest_type = hash_type::digest_type ;
|
||||||
digest_type const mask = ~digest_type (0) >> (sizeof (digest_type) * 8 - p.bits);
|
digest_type const mask = ~digest_type (0) >> (sizeof (digest_type) * 8 - p.bits);
|
||||||
@ -39,20 +43,20 @@ map::map (
|
|||||||
for ( ; cursor < src.end () - p.window; ++cursor) {
|
for ( ; cursor < src.end () - p.window; ++cursor) {
|
||||||
if (likely (hash_state & mask)) {
|
if (likely (hash_state & mask)) {
|
||||||
hash_state = cruft::rotatel (hash_state, 1)
|
hash_state = cruft::rotatel (hash_state, 1)
|
||||||
^ cruft::rotatel (u64 (*(cursor - p.window)), p.window)
|
^ cruft::rotatel (u64 (*(cursor - p.window)), p.window)
|
||||||
^ *cursor;
|
^ *cursor;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
cruft::view<u08 const*> const region { start, cursor };
|
cruft::view<u08 const*> const region { start, cursor };
|
||||||
|
|
||||||
elements.push_back ({
|
*dst = {
|
||||||
.offset = {
|
.offset = {
|
||||||
std::distance (src.begin (), start),
|
std::distance (src.begin (), start),
|
||||||
std::distance (src.begin (), cursor)
|
std::distance (src.begin (), cursor)
|
||||||
},
|
},
|
||||||
.digest = static_hash {} (region)
|
.digest = HashT {} (region)
|
||||||
});
|
};
|
||||||
|
|
||||||
start = cursor;
|
start = cursor;
|
||||||
break;
|
break;
|
||||||
@ -62,12 +66,22 @@ map::map (
|
|||||||
if (start != src.end ()) {
|
if (start != src.end ()) {
|
||||||
cruft::view<u08 const*> const region { start, src.end () };
|
cruft::view<u08 const*> const region { start, src.end () };
|
||||||
|
|
||||||
elements.push_back ({
|
*dst++ = {
|
||||||
.offset = {
|
.offset = {
|
||||||
std::distance (src.begin (), start),
|
std::distance (src.begin (), start),
|
||||||
std::distance (src.begin (), src.end ())
|
std::distance (src.begin (), src.end ())
|
||||||
},
|
},
|
||||||
.digest = static_hash {} (region)
|
.digest = HashT {} (region)
|
||||||
});
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
map::map (
|
||||||
|
cruft::view<u08 const *> src,
|
||||||
|
emory::chunk::params const &p
|
||||||
|
) {
|
||||||
|
::find_chunks<static_hash> (std::back_inserter (elements), src, p);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user