eliminate old weld-together path for block tree walk & windowed row list build

This commit is contained in:
Ryan Fleury
2024-09-25 16:37:11 -07:00
parent d6f6ec83da
commit 48b10411bc
2 changed files with 0 additions and 129 deletions
@@ -750,134 +750,6 @@ ev2_block_range_list_from_tree(Arena *arena, EV2_BlockTree *block_tree)
////////////////////////////////
//~ rjf: Row Building (v2)
internal EV2_WindowedRowList
ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, String8 filter, EV2_BlockTree *block_tree, Rng1U64 visible_range)
{
EV2_WindowedRowList rows = {0};
{
Temp scratch = scratch_begin(&arena, 1);
typedef struct BlockTask BlockTask;
struct BlockTask
{
BlockTask *next;
EV2_Block *block;
EV2_Block *next_child;
Rng1U64 block_relative_range;
};
U64 visual_idx_off = 0;
BlockTask start_task = {0, block_tree->root, block_tree->root->first, r1u64(0, block_tree->root->visual_row_count)};
for(BlockTask *t = &start_task; t != 0; t = t->next)
{
// rjf: get block-relative range, truncated by split position of next child
Rng1U64 block_relative_range = t->block_relative_range;
if(t->next_child != &ev2_nil_block)
{
block_relative_range.max = t->next_child->split_relative_idx+1;
}
U64 block_num_visual_rows = dim_1u64(block_relative_range);
// rjf: get global range of this block
Rng1U64 block_global_range = r1u64(visual_idx_off, visual_idx_off + block_num_visual_rows);
// rjf: get skip/chop of global range
U64 num_skipped = 0;
U64 num_chopped = 0;
{
if(visible_range.min > block_global_range.min)
{
num_skipped = (visible_range.min - block_global_range.min);
num_skipped = Min(num_skipped, block_num_visual_rows);
}
if(visible_range.max < block_global_range.max)
{
num_chopped = (block_global_range.max - visible_range.max);
num_chopped = Min(num_chopped, block_num_visual_rows);
}
}
// rjf: get block-relative *windowed* range
Rng1U64 block_relative_range__windowed = r1u64(block_relative_range.min + num_skipped,
block_relative_range.max - num_chopped);
// rjf: sum & advance
visual_idx_off += block_num_visual_rows;
rows.count_before_visual += num_skipped;
// rjf: generate rows before next splitting child
if(block_relative_range__windowed.max > block_relative_range__windowed.min)
{
// rjf: no expansion operator applied -> push row for block expression; pass through block info
if(t->block->expand_view_rule_info == &ev_nil_view_rule_info)
{
EV2_Row *row = push_array(arena, EV2_Row, 1);
SLLQueuePush(rows.first, rows.last, row);
rows.count += 1;
row->block = t->block;
row->key = t->block->key;
row->visual_size = t->block->visual_row_count;
row->visual_size_skipped = 0; // TODO(rjf)
row->visual_size_chopped = 0; // TODO(rjf)
row->string = t->block->string;
row->expr = t->block->expr;
row->member = &e_member_nil;
row->view_rules = t->block->view_rules;
}
// rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range
else
{
EV_ExpandRangeInfo expand_range_info = t->block->expand_view_rule_info->expr_expand_range_info(arena, view, filter, t->block->expr, t->block->expand_view_rule_params, block_relative_range__windowed, t->block->expand_view_rule_info_user_data);
for EachIndex(idx, expand_range_info.row_exprs_count)
{
U64 row_visual_size = expand_range_info.row_exprs_num_visual_rows[idx];
U64 child_num = block_relative_range.min + idx + 1;
U64 child_id = t->block->expand_view_rule_info->expr_expand_id_from_num(child_num, t->block->expand_view_rule_info_user_data);
EV2_Row *row = push_array(arena, EV2_Row, 1);
SLLQueuePush(rows.first, rows.last, row);
rows.count += 1;
row->block = t->block;
row->key = ev_key_make(ev_hash_from_key(row->block->key), child_id);
row->visual_size = row_visual_size;
row->visual_size_skipped = 0; // TODO(rjf)
row->visual_size_chopped = 0; // TODO(rjf)
row->string = t->block->string;
row->expr = expand_range_info.row_exprs[idx];
row->member = expand_range_info.row_members[idx];
row->view_rules = ev_view_rule_list_from_inheritance(arena, t->block->view_rules);
// TODO(rjf): mix in view rules based on row's key, row's type
}
}
}
// rjf: generate task for child, + for post-child parts of this block
if(t->next_child != &ev2_nil_block)
{
// rjf: generate task for child - do *before* remainder (descend block tree depth first)
BlockTask *child_task = push_array(scratch.arena, BlockTask, 1);
child_task->next = t->next;
t->next = child_task;
child_task->block = t->next_child;
child_task->next_child = t->next_child->first;
child_task->block_relative_range = r1u64(0, t->next_child->visual_row_count);
// rjf: generate task for post-child rows, if any, after children
Rng1U64 remainder_range = r1u64(t->next_child->split_relative_idx+1, t->block_relative_range.max);
if(remainder_range.max > remainder_range.min)
{
BlockTask *remainder_task = push_array(scratch.arena, BlockTask, 1);
remainder_task->next = child_task->next;
child_task->next = remainder_task;
remainder_task->block = t->block;
remainder_task->next_child = t->next_child->next;
remainder_task->block_relative_range = remainder_range;
}
}
}
scratch_end(scratch);
}
return rows;
}
internal EV2_WindowedRowList
ev2_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV2_BlockRangeList *block_ranges, Rng1U64 visible_range)
{
@@ -517,7 +517,6 @@ internal EV2_BlockRangeList ev2_block_range_list_from_tree(Arena *arena, EV2_Blo
////////////////////////////////
//~ rjf: Row Building (v2)
internal EV2_WindowedRowList ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, String8 filter, EV2_BlockTree *block_tree, Rng1U64 visible_range);
internal EV2_WindowedRowList ev2_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV2_BlockRangeList *block_ranges, Rng1U64 visible_range);
internal String8 ev2_expr_string_from_row(Arena *arena, EV2_Row *row, EV_StringFlags flags);
internal B32 ev2_row_is_expandable(EV2_Row *row);