46 template <
class P,
class Native,
class Output>
51 static_assert(std::same_as<typename Output::policy_type, P>);
52 static_assert(std::is_nothrow_move_assignable_v<Output>,
53 "index output move assignment must not throw");
54 static_assert(
noexcept(std::declval<Output const &>().finished()));
55 static_assert(
noexcept(std::declval<Output const &>().failed()));
56 static_assert(std::same_as<typename Native::policy_type, P>);
60 static constexpr std::uint64_t
group_size = P::group_size;
63 requires (std::same_as<Native, typename blob_type::native_array> &&
64 std::same_as<Output, profile_detail::index_output<P>>)
68 requires std::is_default_constructible_v<Output>
83 bool done() const noexcept {
111 if (
input_closed_) error_detail::raise<std::logic_error>(
"index input is already closed");
115 std::uint64_t
step(std::uint64_t budget_entries) {
122 auto take_borrowed = comparison.order > 0;
169 if (!outgoing_) error_detail::raise<std::logic_error>(
"index builder has no outgoing sample");
180 if (!outgoing_) error_detail::raise<std::logic_error>(
"index builder has no outgoing sample");
181 auto result = std::move(*outgoing_);
190 requires (std::same_as<Native, typename blob_type::native_array> &&
192 auto index = finish_index(target ? target->virtual_size() : 0);
196 result.borrowed_ = std::move(index.borrowed_);
197 result.interleave_ = std::move(index.interleave_);
198 result.false_borrows_ = std::move(index.false_borrows_);
199 result.virtual_count_ = index.virtual_count_;
200 result.cut_lcps_ = std::move(index.cut_lcps_);
201 result.target_ = std::move(target);
215 if (!done()) error_detail::raise<std::logic_error>(
"index builder is not drained at EOF");
216 auto expected = target_count / group_size + (target_count % group_size != 0);
217 if (expected != received_) error_detail::raise<std::invalid_argument>(
"index samples disagree with target extent");
221 if (virtual_count_) {
222 auto tail = virtual_count_ % group_size;
223 classes_.append(current_class_, tail ? tail : group_size);
225 auto interleave = classes_.finish();
227 std::move(false_borrows_), std::move(cut_lcps_), virtual_count_};
228 auto result = writer_.finish(std::move(metadata));
246 bool incoming_ =
false;
251 std::uint64_t current_class_ = 0;
254 std::uint64_t virtual_count_ = 0;
255 std::uint64_t borrowed_count_ = 0;
256 std::uint64_t received_ = 0;
258 std::uint64_t native_common_ = 0, incoming_common_ = 0;
261 std::uint64_t outgoing_common_ = 0, pending_common_ = 0;
262 std::uint64_t incoming_borrowed_common_ = 0;
264 bool incoming_false_ =
false;
265 bool previous_false_ =
false;
266 bool input_closed_ =
false;
267 bool finished_ =
false;
268 bool failed_ =
false;
271 if (!native_ || finished_ || failed_) error_detail::raise<std::logic_error>(
"index builder is no longer active");
274 if (output.size() || output.finished() || output.failed())
275 error_detail::raise<std::invalid_argument>(
"index builder requires an empty active output");
279 if (!
native) error_detail::raise<std::invalid_argument>(
"index builder requires a pinned native source");
283 if (!needs_input()) error_detail::raise<std::logic_error>(
"index builder cannot accept another lookahead");
284 if (received_ > std::numeric_limits<std::uint64_t>::max() / group_size ||
285 target_ordinal != received_ * group_size)
286 error_detail::raise<std::invalid_argument>(
"index samples must name consecutive target groups");
287 if (received_ == std::numeric_limits<std::uint64_t>::max() - native_->size())
288 error_detail::raise<std::length_error>(
"index augmented count overflows");
291 check_input_slot(target_ordinal);
292 auto comparison = incoming_decoder_.
accept_full(key, target_ordinal);
293 accept_key(comparison);
300 incoming_false_ = !comparison.order && previous_false_;
301 incoming_common_ = incoming_borrowed_common_ = comparison.common_bits;
305 if (!incoming_)
return {0, -1};
306 if (native_cursor_.
done())
return {0, 1};
307 if (native_common_ != incoming_common_)
308 return {std::min(native_common_, incoming_common_), native_common_ > incoming_common_ ? -1 : 1};
309 auto native = native_cursor_.
peek().key.prefix;
310 auto incoming = incoming_decoder_.
key();
312 auto start = native_common_ & ~std::uint64_t{7};
313 if (!start)
return compare_common_bits<typename P::architecture>(
native, incoming);
314 auto comparison = compare_common_bits<typename P::architecture>(
native.subview(start,
native.size() - start),
315 incoming.subview(start, incoming.size() - start));
316 comparison.common_bits += start;
Outlines exceptional check failures while preserving their types and messages.
Definition active_engine.h:18
Declares Everett's sequential sampling of pinned encoded blob pairs.
static bit_string copy(bit_view source)
Definition profile.h:181
Definition index_builder.h:47
static constexpr std::uint64_t group_size
Definition index_builder.h:60
std::vector< std::byte > false_borrows_
Definition index_builder.h:252
profile_sample_decoder< P > incoming_decoder_
Definition index_builder.h:249
index_builder(Output output, std::shared_ptr< Native const > native)
Definition index_builder.h:70
Output writer_
Definition index_builder.h:242
input_mode input_mode_
Definition index_builder.h:263
index_builder(index_builder const &)=delete
void push(coded_sample_type const &sample)
Definition index_builder.h:98
void check_input_slot(std::uint64_t target_ordinal) const
Definition index_builder.h:282
void push(bit_view key, std::uint64_t target_ordinal)
Definition index_builder.h:91
P policy_type
Definition index_builder.h:48
std::uint64_t incoming_borrowed_common_
Definition index_builder.h:262
bit_comparison compare_heads() const
Definition index_builder.h:304
std::uint64_t received_
Definition index_builder.h:256
bool failed_
Definition index_builder.h:268
std::optional< coded_sample_type > outgoing_
Definition index_builder.h:247
Native native_type
Definition index_builder.h:49
std::shared_ptr< Native const > native_
Definition index_builder.h:240
std::uint64_t size() const noexcept
Definition index_builder.h:88
profile_cursor< P, stream_role::native > native_cursor_
Definition index_builder.h:241
bool needs_input() const noexcept
Definition index_builder.h:79
std::uint64_t native_common_
Definition index_builder.h:258
Output output_type
Definition index_builder.h:50
index_builder & operator=(index_builder const &)=delete
std::uint64_t step(std::uint64_t budget_entries)
Definition index_builder.h:115
bool finished_
Definition index_builder.h:267
bool incoming_false_
Definition index_builder.h:264
std::uint64_t incoming_common_
Definition index_builder.h:258
auto finish_index(std::uint64_t target_count) -> decltype(std::declval< Output & >().finish(std::declval< profile_detail::index_metadata< P > >()))
Definition index_builder.h:212
void push_key(bit_view key, std::uint64_t target_ordinal)
Definition index_builder.h:290
std::uint64_t pending_common_
Definition index_builder.h:261
sample_type take_output()
Definition index_builder.h:167
std::uint64_t virtual_count_
Definition index_builder.h:254
bool finished() const noexcept
Definition index_builder.h:86
static Output checked_output(Output output)
Definition index_builder.h:273
profile_sample_encoder< P > outgoing_encoder_
Definition index_builder.h:248
bool failed() const noexcept
Definition index_builder.h:87
index_builder(index_builder &&)=default
static std::shared_ptr< Native const > checked_native(std::shared_ptr< Native const > native)
Definition index_builder.h:278
bool done() const noexcept
Definition index_builder.h:83
blob_type finish(std::shared_ptr< blob_type const > target={})
Definition index_builder.h:189
void close_input()
Definition index_builder.h:109
std::uint64_t outgoing_common_
Definition index_builder.h:261
std::uint64_t borrowed_count_
Definition index_builder.h:255
bool has_output() const noexcept
Definition index_builder.h:82
index_builder(std::shared_ptr< Native const > native)
Definition index_builder.h:67
bool previous_false_
Definition index_builder.h:265
void check_active() const
Definition index_builder.h:270
void accept_key(bit_comparison comparison) noexcept
Definition index_builder.h:298
bool incoming_
Definition index_builder.h:246
std::vector< std::uint64_t > cut_lcps_
Definition index_builder.h:253
index_builder(blob_type const &source)
Definition index_builder.h:62
rank_groups_builder< group_size > classes_
Definition index_builder.h:250
coded_sample_type take_coded_output()
Definition index_builder.h:178
std::uint64_t current_class_
Definition index_builder.h:251
bool input_closed_
Definition index_builder.h:266
input_mode
Definition index_builder.h:238
std::uint64_t received_samples() const noexcept
Definition index_builder.h:89
index_builder & operator=(index_builder &&)=default
Definition profile_blob.h:187
std::shared_ptr< native_array const > native_
Definition profile_blob.h:271
std::uint64_t target_ordinal
Definition sampling.h:50
Definition profile.h:1066
bool done() const noexcept
Definition profile.h:1091
profile_item< P > peek() const &
Definition profile.h:1093
std::optional< bit_comparison > advance_comparison()
Definition profile.h:1108
Definition profile_index.h:86
Definition sampling.h:119
bit_comparison accept_full(bit_view key, std::uint64_t ordinal)
Definition sampling.h:132
bit_view key() const &
Definition sampling.h:124
Definition rank_groups.h:283
void append(std::uint64_t population, std::uint64_t width=K)
Definition rank_groups.h:305