28 namespace profile_detail {
55 std::optional<std::uint64_t>(0) : P::value_width;
61 std::optional<std::uint64_t> common, Ops & ops)
77 error_detail::raise<std::logic_error>(
"profile file writer is not active");
82 if ((literal.
size() & (P::bits_per_unit - 1)) || (value.size() & (P::bits_per_unit - 1)))
83 error_detail::raise<std::invalid_argument>(
"profile file record disagrees with policy units");
84 auto value_units = value.size() >> P::unit_shift;
86 error_detail::raise<std::invalid_argument>(
"profile file value disagrees with common width");
88 error_detail::raise<std::invalid_argument>(
"profile file invalid known prefix");
89 auto literal_units = literal.
size() >> P::unit_shift;
90 auto key_units =
add(retained, literal_units);
91 (void)
multiply(key_units, P::bits_per_unit);
94 std::uint64_t zero_bits = 0;
95 auto block =
count_ % P::codec_block_size == 0;
96 if (block) write_count<P>(
control_, retained);
99 auto bits = backspace_bits<P>(backspace);
100 if (bits <= 129) write_backspace<P>(
control_, backspace);
104 constexpr auto modulus = P::backspace_parameter;
105 constexpr auto width = unsigned(std::bit_width(modulus - 1));
106 constexpr auto cutoff = golomb_cutoff<P>();
107 zero_bits = backspace / modulus;
108 auto remainder = backspace % modulus;
109 auto remainder_width = width - unsigned(remainder < cutoff);
111 std::uint64_t at = 0;
113 put_fixed(
control_, at, remainder < cutoff ? remainder : remainder + cutoff, remainder_width);
116 write_count<P>(
control_, literal_units);
120 if (next_bits > std::numeric_limits<std::uint64_t>::max() - 7)
121 error_detail::raise<std::length_error>(
"profile file FC extent is too large");
127 }
catch (...) {
failed_ =
true;
throw; }
140 auto extent =
fc_bits_ >> P::unit_shift;
143 try { offsets = elias_fano::build<typename P::architecture>(
offsets_); }
144 catch (...) {
offsets_.pop_back();
throw; }
146 std::array<std::byte, directory_bytes> directory{};
147 auto magic =
borrowed ?
"IX02" :
"KV02";
148 for (
unsigned i = 0; i != 4; ++i) directory[i] = std::byte(magic[i]);
170 std::uint64_t end = directory.size();
171 for (std::size_t i = 0; i != lengths.size(); ++i) {
172 auto start =
add(end, 7) & ~std::uint64_t{7};
173 end =
add(start, lengths[i]);
179 if (file_detail::total_bytes<P>(header.extent) > std::uint64_t(std::numeric_limits<std::int64_t>::max()))
180 error_detail::raise<std::length_error>(
"profile file exceeds supported file offsets");
196 }
catch (...) {
failed_ =
true;
throw; }
199 static std::optional<std::uint64_t>
checked_width(std::optional<std::uint64_t> common) {
201 if (common != std::optional<std::uint64_t>(0))
202 error_detail::raise<std::invalid_argument>(
"borrowed file values must be empty");
203 }
else if constexpr (P::fixed_width)
204 if (common != P::value_width)
205 error_detail::raise<std::invalid_argument>(
"profile file width disagrees with fixed policy");
206 if (common) (void)
multiply(*common, P::bits_per_unit);
214 error_detail::raise<std::invalid_argument>(
"streamed index metadata shape mismatch");
216 error_detail::raise<std::invalid_argument>(
"streamed index borrowed count mismatch");
218 error_detail::raise<std::invalid_argument>(
"streamed index flag padding is nonzero");
225 std::array<std::byte, buffer_bytes>
buffer_{};
232 while (!source.
empty()) {
235 auto bytes = source.
size() >> 3;
237 static_cast<std::size_t
>(bytes)));
238 source = source.
subview(bytes << 3, source.
size() - (bytes << 3));
244 source = source.
subview(count, source.
size() - count);
249 static constexpr std::array<std::byte, 4096> zero{};
251 auto count = std::min<std::uint64_t>(bits, zero.size() * 8);
263 static constexpr std::array<std::byte, 8> zero{};
265 stream_.
append(std::span(zero).first(
static_cast<std::size_t
>(gap)));
268 if constexpr (std::endian::native == std::endian::little)
stream_.
append(std::as_bytes(words));
270 while (!words.empty()) {
280 if constexpr (std::endian::native == std::endian::little)
stream_.
append(std::as_bytes(samples));
282 while (!samples.empty()) {
283 auto count = std::min(samples.size(),
buffer_bytes / 16);
284 for (std::size_t i = 0; i != count; ++i) {
void put(std::span< std::byte > bytes, std::size_t at, unsigned width, std::uint64_t value) noexcept
Definition file.h:70
void validate_metadata(file_header< P > const &header)
Definition file.h:93
void put_fixed(bit_string &target, std::uint64_t &at, std::uint64_t value, unsigned width)
Definition profile.h:504
std::uint64_t add(std::uint64_t a, std::uint64_t b)
Definition profile.h:39
std::uint64_t multiply(std::uint64_t a, std::uint64_t b)
Definition profile.h:44
std::uint64_t byte_count(std::uint64_t bits) noexcept
Definition profile.h:50
void resize(bit_string &value, std::uint64_t bits)
Definition profile.h:465
void copy_bits(std::byte *target, std::uint64_t first, bit_view source) noexcept
Definition profile.h:123
constexpr std::size_t native_directory_bytes
Definition sections.h:42
constexpr std::size_t native_descriptor_offset
Definition sections.h:44
constexpr std::size_t index_descriptor_offset
Definition sections.h:45
void put_id(std::span< std::byte > bytes, std::size_t at, object_id const &id)
Definition sections.h:75
constexpr std::size_t index_directory_bytes
Definition sections.h:43
constexpr std::uint16_t version
Definition sections.h:41
Definition active_engine.h:18
file_kind
Definition object_path.h:25
Appends immutable object bodies before their final envelope is known.
Encodes portable blob sections and retains mmap-backed profile directories.
std::vector< std::byte > bytes
Definition profile.h:167
bit_view view() const &
Definition profile.h:178
std::uint64_t bit_size
Definition profile.h:168
std::span< std::byte const > storage() const noexcept
Definition profile.h:67
std::uint64_t size() const noexcept
Definition profile.h:64
std::uint64_t offset() const noexcept
Definition profile.h:66
bool empty() const noexcept
Definition profile.h:65
bit_view subview(std::uint64_t first, std::uint64_t count) const
Definition profile.h:73
bit_view prefix(std::uint64_t count) const
Definition profile.h:80
Definition elias_fano.h:195
Definition elias_fano.h:397
std::vector< std::uint64_t > sparse
Definition elias_fano.h:445
std::vector< std::uint64_t > high
Definition elias_fano.h:443
std::vector< std::uint64_t > low
Definition elias_fano.h:442
std::vector< elias_fano_sample > samples
Definition elias_fano.h:444
unsigned low_width
Definition elias_fano.h:448
std::uint64_t universe
Definition elias_fano.h:447
Definition object_writer.h:39
Definition object_path.h:38
Definition object_writer.h:88
Definition object_stream.h:32
void append(std::span< std::byte const > bytes)
Definition object_stream.h:68
object_write_paths const & paths() const &noexcept
Definition object_stream.h:62
std::uint64_t body_bytes() const noexcept
Definition object_stream.h:55
bool failed() const noexcept
Definition object_stream.h:60
bool finished() const noexcept
Definition object_stream.h:61
object_seal_receipt finish(file_header< P > const &header)
Definition object_stream.h:91
Definition object_writer.h:53
Definition profile_file_output.h:31
std::span< std::byte const > false_borrows
Definition profile_file_output.h:35
object_id const & native_id
Definition profile_file_output.h:32
std::span< std::uint64_t const > cut_lcps
Definition profile_file_output.h:36
std::optional< blob_identity > const & target_id
Definition profile_file_output.h:33
rank_groups< P::group_size > const & interleave
Definition profile_file_output.h:34
std::uint64_t virtual_count
Definition profile_file_output.h:37
Definition profile_file_output.h:44
std::optional< std::uint64_t > common_value_width() const noexcept
Definition profile_file_output.h:72
object_seal_receipt finish_impl(index_file_sections< P > const *index)
Definition profile_file_output.h:137
std::uint64_t buffered_bits_
Definition profile_file_output.h:228
bool finished() const noexcept
Definition profile_file_output.h:71
object_write_paths const & paths() const &noexcept
Definition profile_file_output.h:73
static constexpr std::size_t buffer_bytes
Definition profile_file_output.h:222
void emit_zeroes(std::uint64_t bits)
Definition profile_file_output.h:248
static constexpr std::size_t descriptor_offset
Definition profile_file_output.h:51
profile_file_output(profile_file_output &&)=delete
std::array< std::byte, buffer_bytes > buffer_
Definition profile_file_output.h:225
bool failed_
Definition profile_file_output.h:229
void require_active() const
Definition profile_file_output.h:75
std::uint64_t size() const noexcept
Definition profile_file_output.h:69
std::vector< std::uint64_t > offsets_
Definition profile_file_output.h:226
static constexpr std::size_t directory_bytes
Definition profile_file_output.h:49
static bit_string control_buffer()
Definition profile_file_output.h:221
profile_file_output & operator=(profile_file_output &&)=delete
static constexpr std::size_t section_count
Definition profile_file_output.h:53
void emit_words(std::span< std::uint64_t const > words)
Definition profile_file_output.h:267
void flush_tail()
Definition profile_file_output.h:255
object_seal_receipt finish(index_file_sections< P > const &index)
Definition profile_file_output.h:132
std::uint64_t count_
Definition profile_file_output.h:228
void align_stream()
Definition profile_file_output.h:262
static constexpr file_kind kind
Definition profile_file_output.h:48
static constexpr std::optional< std::uint64_t > default_width
Definition profile_file_output.h:54
bit_string control_
Definition profile_file_output.h:224
std::uint64_t previous_units_
Definition profile_file_output.h:228
object_seal_receipt finish()
Definition profile_file_output.h:131
profile_file_output(std::filesystem::path root, object_id id, object_attempt_id attempt, std::optional< std::uint64_t > common=default_width)
Definition profile_file_output.h:56
object_write_paths const & paths() const &&=delete
static std::optional< std::uint64_t > checked_width(std::optional< std::uint64_t > common)
Definition profile_file_output.h:199
void emit_samples(std::span< elias_fano_sample const > samples)
Definition profile_file_output.h:277
bool failed() const noexcept
Definition profile_file_output.h:70
profile_file_output & operator=(profile_file_output const &)=delete
object_stream< P, Ops > stream_
Definition profile_file_output.h:227
profile_file_output(std::filesystem::path root, object_id id, object_attempt_id attempt, std::optional< std::uint64_t > common, Ops &ops)
Definition profile_file_output.h:60
std::optional< std::uint64_t > common_
Definition profile_file_output.h:223
static constexpr bool borrowed
Definition profile_file_output.h:47
std::uint64_t fc_bits_
Definition profile_file_output.h:228
void append(std::uint64_t retained, bit_view literal, bit_view value)
Definition profile_file_output.h:80
profile_file_output(profile_file_output const &)=delete
void emit(bit_view source)
Definition profile_file_output.h:231
P policy_type
Definition profile_file_output.h:45
void validate_index(index_file_sections< P > const &index) const
Definition profile_file_output.h:209
Definition rank_groups.h:241
rank_groups_view< K > view() const &
Definition rank_groups.h:271
std::uint64_t virtual_count
Definition rank_groups.h:276
std::vector< std::uint64_t > checkpoints
Definition rank_groups.h:275
std::vector< std::uint64_t > classes
Definition rank_groups.h:274