mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-17 17:42:22 -07:00
eval visualization: vidx <-> num mappings; helpers to move from logical nums -> rows, feed through windowed row production path
This commit is contained in:
@@ -1049,6 +1049,52 @@ ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal U64
|
||||
ev_vidx_from_num(EV_BlockRangeList *block_ranges, U64 num)
|
||||
{
|
||||
U64 vidx = 0;
|
||||
{
|
||||
U64 base_vidx = 0;
|
||||
U64 base_num = 1;
|
||||
for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)
|
||||
{
|
||||
U64 next_base_num = base_num + (n->v.block->single_item ? 1 : dim_1u64(n->v.range));
|
||||
if(base_num <= num && num < next_base_num)
|
||||
{
|
||||
U64 relative_vidx = (n->v.block->single_item ? 0 : (num - base_num));
|
||||
vidx = base_vidx + relative_vidx;
|
||||
break;
|
||||
}
|
||||
base_num = next_base_num;
|
||||
base_vidx += dim_1u64(n->v.range);
|
||||
}
|
||||
}
|
||||
return vidx;
|
||||
}
|
||||
|
||||
internal U64
|
||||
ev_num_from_vidx(EV_BlockRangeList *block_ranges, U64 vidx)
|
||||
{
|
||||
U64 num = 0;
|
||||
{
|
||||
U64 base_vidx = 0;
|
||||
U64 base_num = 1;
|
||||
for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)
|
||||
{
|
||||
U64 next_base_vidx = base_vidx + dim_1u64(n->v.range);
|
||||
if(base_vidx <= vidx && vidx < next_base_vidx)
|
||||
{
|
||||
U64 relative_num = (n->v.block->single_item ? 0 : (vidx - base_vidx));
|
||||
num = base_num + relative_num;
|
||||
break;
|
||||
}
|
||||
base_vidx = next_base_vidx;
|
||||
base_num += (n->v.block->single_item ? 1 : dim_1u64(n->v.range));
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Row Building
|
||||
|
||||
@@ -1126,18 +1172,19 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
EV_Row *row = push_array(arena, EV_Row, 1);
|
||||
SLLQueuePush(rows.first, rows.last, row);
|
||||
EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);
|
||||
SLLQueuePush(rows.first, rows.last, row_node);
|
||||
rows.count += 1;
|
||||
row->block = n->v.block;
|
||||
row->key = ev_key_make(ev_hash_from_key(row->block->key), 1);
|
||||
row->visual_size = n->v.block->single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1;
|
||||
row->visual_size_skipped = num_skipped;
|
||||
row->visual_size_chopped = num_chopped;
|
||||
row->string = n->v.block->string;
|
||||
row->expr = n->v.block->expr;
|
||||
row->member = member;
|
||||
row->view_rules = n->v.block->view_rules;
|
||||
row_node->visual_size_skipped = num_skipped;
|
||||
row_node->visual_size_chopped = num_chopped;
|
||||
EV_Row *row = &row_node->row;
|
||||
row->block = n->v.block;
|
||||
row->key = ev_key_make(ev_hash_from_key(row->block->key), 1);
|
||||
row->visual_size = n->v.block->single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1;
|
||||
row->string = n->v.block->string;
|
||||
row->expr = n->v.block->expr;
|
||||
row->member = member;
|
||||
row->view_rules = n->v.block->view_rules;
|
||||
}
|
||||
|
||||
// rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range
|
||||
@@ -1165,14 +1212,13 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
|
||||
scratch_end(scratch);
|
||||
}
|
||||
E_Expr *row_expr__resolved = ev_resolved_from_expr(arena, row_expr, row_view_rules);
|
||||
EV_Row *row = push_array(arena, EV_Row, 1);
|
||||
SLLQueuePush(rows.first, rows.last, row);
|
||||
EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);
|
||||
SLLQueuePush(rows.first, rows.last, row_node);
|
||||
rows.count += 1;
|
||||
EV_Row *row = &row_node->row;
|
||||
row->block = n->v.block;
|
||||
row->key = row_key;
|
||||
row->visual_size = 1;
|
||||
row->visual_size_skipped = 0;
|
||||
row->visual_size_chopped = 0;
|
||||
row->string = expand_range_info.row_strings[idx];
|
||||
row->expr = row_expr__resolved;
|
||||
row->member = expand_range_info.row_members[idx];
|
||||
@@ -1205,6 +1251,31 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
|
||||
return rows;
|
||||
}
|
||||
|
||||
internal EV_Row *
|
||||
ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, U64 num)
|
||||
{
|
||||
U64 vidx = ev_vidx_from_num(block_ranges, num);
|
||||
EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, filter, block_ranges, r1u64(vidx, vidx+1));
|
||||
EV_Row *result = 0;
|
||||
if(rows.first != 0)
|
||||
{
|
||||
result = &rows.first->row;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = push_array(arena, EV_Row, 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal EV_WindowedRowList
|
||||
ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 num_range)
|
||||
{
|
||||
Rng1U64 vidx_range = r1u64(ev_vidx_from_num(block_ranges, num_range.min), ev_vidx_from_num(block_ranges, num_range.max)+1);
|
||||
EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, filter, block_ranges, vidx_range);
|
||||
return rows;
|
||||
}
|
||||
|
||||
internal String8
|
||||
ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags)
|
||||
{
|
||||
|
||||
@@ -256,29 +256,29 @@ struct EV_BlockRangeList
|
||||
typedef struct EV_Row EV_Row;
|
||||
struct EV_Row
|
||||
{
|
||||
EV_Row *next;
|
||||
|
||||
// rjf: block hierarchy info
|
||||
EV_Block *block;
|
||||
EV_Key key;
|
||||
|
||||
// rjf: row size/scroll info
|
||||
U64 visual_size;
|
||||
U64 visual_size_skipped;
|
||||
U64 visual_size_chopped;
|
||||
|
||||
// rjf: expression / visualization info
|
||||
String8 string;
|
||||
E_Expr *expr;
|
||||
E_Member *member;
|
||||
EV_ViewRuleList *view_rules;
|
||||
};
|
||||
|
||||
typedef struct EV_WindowedRowNode EV_WindowedRowNode;
|
||||
struct EV_WindowedRowNode
|
||||
{
|
||||
EV_WindowedRowNode *next;
|
||||
U64 visual_size_skipped;
|
||||
U64 visual_size_chopped;
|
||||
EV_Row row;
|
||||
};
|
||||
|
||||
typedef struct EV_WindowedRowList EV_WindowedRowList;
|
||||
struct EV_WindowedRowList
|
||||
{
|
||||
EV_Row *first;
|
||||
EV_Row *last;
|
||||
EV_WindowedRowNode *first;
|
||||
EV_WindowedRowNode *last;
|
||||
U64 count;
|
||||
U64 count_before_visual;
|
||||
U64 count_before_semantic;
|
||||
@@ -429,11 +429,15 @@ internal EV_BlockRangeList ev_block_range_list_from_tree(Arena *arena, EV_BlockT
|
||||
internal EV_BlockRange ev_block_range_from_num(EV_BlockRangeList *block_ranges, U64 num);
|
||||
internal EV_Key ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num);
|
||||
internal U64 ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key);
|
||||
internal U64 ev_vidx_from_num(EV_BlockRangeList *block_ranges, U64 num);
|
||||
internal U64 ev_num_from_vidx(EV_BlockRangeList *block_ranges, U64 vidx);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Row Building
|
||||
|
||||
internal EV_WindowedRowList ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 visible_range);
|
||||
internal EV_Row *ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, U64 num);
|
||||
internal EV_WindowedRowList ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 num_range);
|
||||
internal String8 ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags);
|
||||
internal B32 ev_row_is_expandable(EV_Row *row);
|
||||
internal B32 ev_row_is_editable(EV_Row *row);
|
||||
|
||||
Reference in New Issue
Block a user