mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-16 09:02:22 -07:00
on second thought... merging both view rule expansion *header* info generation, and windowed range queries into an expanded block, into the same hook, is really limiting & wrong - so split back to two hooks, one stage is just informing the expansion space, the next provides per-row information within an expanded block with range-based queries
This commit is contained in:
@@ -569,6 +569,22 @@ ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityStore *store, CTRL_Ha
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: entity array data structure
|
||||
|
||||
internal CTRL_EntityArray
|
||||
ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list)
|
||||
{
|
||||
CTRL_EntityArray result = {0};
|
||||
result.count = list->count;
|
||||
result.v = push_array_no_zero(arena, CTRL_Entity *, result.count);
|
||||
U64 idx = 0;
|
||||
for(CTRL_EntityNode *n = list->first; n != 0; n = n->next, idx += 1)
|
||||
{
|
||||
result.v[idx] = n->v;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: cache creation/destruction
|
||||
|
||||
internal CTRL_EntityStore *
|
||||
|
||||
@@ -160,6 +160,13 @@ struct CTRL_EntityList
|
||||
U64 count;
|
||||
};
|
||||
|
||||
typedef struct CTRL_EntityArray CTRL_EntityArray;
|
||||
struct CTRL_EntityArray
|
||||
{
|
||||
CTRL_Entity **v;
|
||||
U64 count;
|
||||
};
|
||||
|
||||
typedef struct CTRL_EntityRec CTRL_EntityRec;
|
||||
struct CTRL_EntityRec
|
||||
{
|
||||
@@ -806,6 +813,9 @@ internal void ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_En
|
||||
internal CTRL_EntityList ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityStore *store, CTRL_HandleList *list);
|
||||
#define ctrl_entity_list_first(list) ((list)->first ? (list)->first->v : &ctrl_entity_nil)
|
||||
|
||||
//- rjf: entity array data structure
|
||||
internal CTRL_EntityArray ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list);
|
||||
|
||||
//- rjf: cache creation/destruction
|
||||
internal CTRL_EntityStore *ctrl_entity_store_alloc(void);
|
||||
internal void ctrl_entity_store_release(CTRL_EntityStore *store);
|
||||
|
||||
+1
-1
@@ -1272,7 +1272,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
//- rjf: leaf identifiers
|
||||
case E_ExprKind_LeafIdent:
|
||||
{
|
||||
E_Expr *macro_expr = e_expr_from_string(e_ir_ctx->macro_map, expr->string);
|
||||
E_Expr *macro_expr = e_string2expr_lookup(e_ir_ctx->macro_map, expr->string);
|
||||
if(macro_expr == &e_expr_nil)
|
||||
{
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "`%S` could not be found.", expr->string);
|
||||
|
||||
+11
-1
@@ -190,7 +190,7 @@ e_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string)
|
||||
}
|
||||
|
||||
internal E_Expr *
|
||||
e_expr_from_string(E_String2ExprMap *map, String8 string)
|
||||
e_string2expr_lookup(E_String2ExprMap *map, String8 string)
|
||||
{
|
||||
E_Expr *expr = &e_expr_nil;
|
||||
if(map->slots_count != 0)
|
||||
@@ -2066,3 +2066,13 @@ e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
|
||||
E_Parse parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, e_max_precedence);
|
||||
return parse;
|
||||
}
|
||||
|
||||
internal E_Expr *
|
||||
e_parse_expr_from_text(Arena *arena, String8 text)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_TokenArray tokens = e_token_array_from_text(scratch.arena, text);
|
||||
E_Parse parse = e_parse_expr_from_text_tokens(arena, text, &tokens);
|
||||
scratch_end(scratch);
|
||||
return parse.expr;
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ internal E_String2ExprMap e_string2expr_map_make(Arena *arena, U64 slot_count);
|
||||
internal void e_string2expr_map_insert(Arena *arena, E_String2ExprMap *map, String8 string, E_Expr *expr);
|
||||
internal void e_string2expr_map_inc_poison(E_String2ExprMap *map, String8 string);
|
||||
internal void e_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string);
|
||||
internal E_Expr *e_expr_from_string(E_String2ExprMap *map, String8 string);
|
||||
internal E_Expr *e_string2expr_lookup(E_String2ExprMap *map, String8 string);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Debug-Info-Driven Map Building Functions
|
||||
@@ -239,5 +239,6 @@ internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String
|
||||
internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
|
||||
internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence);
|
||||
internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
|
||||
internal E_Expr *e_parse_expr_from_text(Arena *arena, String8 text);
|
||||
|
||||
#endif // EVAL_PARSE_H
|
||||
|
||||
@@ -113,12 +113,13 @@ EV_ViewRuleTable:
|
||||
@gen
|
||||
{
|
||||
@expand(EV_ViewRuleTable a) `$(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`;
|
||||
@expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(" .. a.name_lower .. ");")`;
|
||||
@expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`;
|
||||
@expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`;
|
||||
@expand(EV_ViewRuleTable a) `$(a.vb == "x" -> "EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`;
|
||||
}
|
||||
|
||||
@data(EV_ViewRuleInfo) @c_file ev_builtin_view_rule_info_table:
|
||||
{
|
||||
@expand(EV_ViewRuleTable a)
|
||||
```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xr != "x" -> 0), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> 0), $(a.vb == "x" -> "EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), }```;
|
||||
```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xr != "x" -> 0), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> 0), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> 0), $(a.vb == "x" -> "EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), }```;
|
||||
}
|
||||
|
||||
@@ -99,11 +99,21 @@ ev_arch_from_eval_params(E_Eval eval, MD_Node *params)
|
||||
////////////////////////////////
|
||||
//~ rjf: default
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default)
|
||||
typedef struct EV_DefaultExpandAccel EV_DefaultExpandAccel;
|
||||
struct EV_DefaultExpandAccel
|
||||
{
|
||||
E_MemberArray members;
|
||||
E_EnumValArray enum_vals;
|
||||
U64 array_count;
|
||||
B32 array_need_extra_deref;
|
||||
B32 is_ptr2ptr;
|
||||
};
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default)
|
||||
{
|
||||
EV_ExpandResult result = {0};
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
U64 needed_row_count = dim_1u64(idx_range);
|
||||
U64 total_row_count = 0;
|
||||
EV_DefaultExpandAccel *accel = push_array(arena, EV_DefaultExpandAccel, 1);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: unpack expression type info
|
||||
@@ -124,19 +134,8 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default)
|
||||
direct_type_kind == E_TypeKind_Union ||
|
||||
direct_type_kind == E_TypeKind_Class)))
|
||||
{
|
||||
E_MemberArray members = e_type_data_members_from_key__cached(e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key);
|
||||
result.total_semantic_row_count = result.total_visual_row_count = members.count;
|
||||
result.row_exprs_count = Min(needed_row_count, members.count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
E_Member *member = &members.v[idx_range.min + row_expr_idx];
|
||||
result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, member->name);
|
||||
result.row_members[row_expr_idx] = member;
|
||||
result.row_exprs_num_visual_rows[row_expr_idx] = 1;
|
||||
}
|
||||
accel->members = e_type_data_members_from_key__cached(e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key);
|
||||
total_row_count = accel->members.count;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
@@ -146,18 +145,9 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default)
|
||||
(e_type_kind_is_pointer_or_ref(type_kind) && direct_type_kind == E_TypeKind_Enum))
|
||||
{
|
||||
E_Type *type = e_type_from_key(arena, e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key);
|
||||
result.total_semantic_row_count = result.total_visual_row_count = type->count;
|
||||
result.row_exprs_count = Min(needed_row_count, type->count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
E_EnumVal *enumval = &type->enum_vals[idx_range.min + row_expr_idx];
|
||||
result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, enumval->name);
|
||||
result.row_members[row_expr_idx] = &e_member_nil;
|
||||
result.row_exprs_num_visual_rows[row_expr_idx] = 1;
|
||||
}
|
||||
accel->enum_vals.v = type->enum_vals;
|
||||
accel->enum_vals.count = type->count;
|
||||
total_row_count = accel->enum_vals.count;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
@@ -169,8 +159,84 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default)
|
||||
B32 need_extra_deref = e_type_kind_is_pointer_or_ref(type_kind);
|
||||
E_Expr *array_expr = need_extra_deref ? e_expr_ref_deref(arena, expr) : expr;
|
||||
E_Type *type = e_type_from_key(arena, need_extra_deref ? direct_type_key : type_key);
|
||||
result.total_semantic_row_count = result.total_visual_row_count = type->count;
|
||||
result.row_exprs_count = Min(needed_row_count, type->count);
|
||||
total_row_count = type->count;
|
||||
accel->array_count = type->count;
|
||||
accel->array_need_extra_deref = need_extra_deref;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: pointer-to-pointer -> expansions generate dereference
|
||||
//
|
||||
else if(e_type_kind_is_pointer_or_ref(type_kind) && e_type_kind_is_pointer_or_ref(direct_type_kind))
|
||||
{
|
||||
total_row_count = 1;
|
||||
accel->is_ptr2ptr = 1;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: package result
|
||||
//
|
||||
EV_ExpandInfo result = {0};
|
||||
{
|
||||
result.user_data = accel;
|
||||
result.total_semantic_row_count = result.total_visual_row_count = total_row_count;
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default)
|
||||
{
|
||||
EV_DefaultExpandAccel *accel = (EV_DefaultExpandAccel *)user_data;
|
||||
EV_ExpandRangeInfo result = {0};
|
||||
U64 needed_row_count = dim_1u64(idx_range);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: fill with members
|
||||
//
|
||||
if(accel->members.count != 0)
|
||||
{
|
||||
E_MemberArray *members = &accel->members;
|
||||
result.row_exprs_count = Min(needed_row_count, members->count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
E_Member *member = &members->v[idx_range.min + row_expr_idx];
|
||||
result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, member->name);
|
||||
result.row_members[row_expr_idx] = member;
|
||||
result.row_exprs_num_visual_rows[row_expr_idx] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: fill with enum vals
|
||||
//
|
||||
else if(accel->enum_vals.count != 0)
|
||||
{
|
||||
E_EnumValArray *enumvals = &accel->enum_vals;
|
||||
result.row_exprs_count = Min(needed_row_count, enumvals->count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
E_EnumVal *enumval = &enumvals->v[idx_range.min + row_expr_idx];
|
||||
result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, enumval->name);
|
||||
result.row_members[row_expr_idx] = &e_member_nil;
|
||||
result.row_exprs_num_visual_rows[row_expr_idx] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: fill with array indices
|
||||
//
|
||||
else if(accel->array_count != 0)
|
||||
{
|
||||
E_Expr *array_expr = accel->array_need_extra_deref ? e_expr_ref_deref(arena, expr) : expr;
|
||||
result.row_exprs_count = Min(needed_row_count, accel->array_count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count);
|
||||
@@ -183,11 +249,11 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default)
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: pointer-to-pointer -> expansions generate dereference
|
||||
//- rjf: fill with ptr-to-ptr deref
|
||||
//
|
||||
else if(e_type_kind_is_pointer_or_ref(type_kind) && e_type_kind_is_pointer_or_ref(direct_type_kind))
|
||||
else if(accel->is_ptr2ptr)
|
||||
{
|
||||
result.total_semantic_row_count = result.total_visual_row_count = result.row_exprs_count = 1;
|
||||
result.row_exprs_count = 1;
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
result.row_exprs_num_visual_rows = push_array(arena, U64, result.row_exprs_count);
|
||||
@@ -196,7 +262,6 @@ EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default)
|
||||
result.row_exprs_num_visual_rows[0] = 1;
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -495,7 +495,7 @@ ev_expr_from_expr_view_rules(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_r
|
||||
//~ rjf: Block Building (v2)
|
||||
|
||||
internal EV2_BlockTree
|
||||
ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules)
|
||||
ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules)
|
||||
{
|
||||
EV2_BlockTree tree = {&ev2_nil_block};
|
||||
{
|
||||
@@ -543,7 +543,7 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *ex
|
||||
for(EV_ViewRuleNode *n = t->view_rules->first; n != 0; n = n->next)
|
||||
{
|
||||
EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string);
|
||||
if(info->expr_expand != 0)
|
||||
if(info->expr_expand_info != 0 && info->expr_expand_range_info != 0)
|
||||
{
|
||||
expand_view_rule_info = info;
|
||||
expand_params = n->v.root;
|
||||
@@ -551,7 +551,7 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *ex
|
||||
}
|
||||
|
||||
// rjf: get expansion info
|
||||
EV_ExpandResult expand_result = expand_view_rule_info->expr_expand(arena, t->expr, expand_params, r1u64(0, 0));
|
||||
EV_ExpandInfo expand_info = expand_view_rule_info->expr_expand_info(arena, view, filter, t->expr, expand_params);
|
||||
|
||||
// rjf: generate block for expansion
|
||||
EV2_Block *expansion_block = push_array(arena, EV2_Block, 1);
|
||||
@@ -564,17 +564,18 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *ex
|
||||
expansion_block->view_rules = t->view_rules;
|
||||
expansion_block->expand_view_rule_info = expand_view_rule_info;
|
||||
expansion_block->expand_view_rule_params = expand_params;
|
||||
expansion_block->semantic_row_count = expand_result.total_semantic_row_count;
|
||||
expansion_block->visual_row_count = expand_result.total_visual_row_count;
|
||||
tree.total_semantic_row_count += expand_result.total_semantic_row_count;
|
||||
tree.total_visual_row_count += expand_result.total_visual_row_count;
|
||||
expansion_block->expand_view_rule_info_user_data = expand_info.user_data;
|
||||
expansion_block->semantic_row_count = expand_info.total_semantic_row_count;
|
||||
expansion_block->visual_row_count = expand_info.total_visual_row_count;
|
||||
tree.total_semantic_row_count += expand_info.total_semantic_row_count;
|
||||
tree.total_visual_row_count += expand_info.total_visual_row_count;
|
||||
|
||||
// rjf: iterate children expansions, recurse
|
||||
// TODO(rjf): need to iterate these in index order, rather than "child_num" (which needs to be renamed to "child_id") order
|
||||
for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next)
|
||||
{
|
||||
U64 split_relative_idx = child->key.child_num - 1; // TODO(rjf): key -> index
|
||||
EV_ExpandResult child_expand = expand_view_rule_info->expr_expand(arena, t->expr, expand_params, r1u64(split_relative_idx, split_relative_idx+1));
|
||||
EV_ExpandRangeInfo child_expand = expand_view_rule_info->expr_expand_range_info(arena, view, filter, t->expr, expand_params, r1u64(split_relative_idx, split_relative_idx+1), expand_info.user_data);
|
||||
if(child_expand.row_exprs_count > 0)
|
||||
{
|
||||
EV_ViewRuleList *child_view_rules = ev_view_rule_list_from_inheritance(arena, t->view_rules);
|
||||
@@ -595,7 +596,7 @@ ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *ex
|
||||
}
|
||||
|
||||
internal EV2_BlockTree
|
||||
ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 string, EV_ViewRuleList *view_rules)
|
||||
ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules)
|
||||
{
|
||||
EV2_BlockTree tree = {0};
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
@@ -648,7 +649,7 @@ ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 string, EV_ViewR
|
||||
}
|
||||
|
||||
// rjf: produce tree
|
||||
tree = ev2_block_tree_from_expr(arena, view, string, parse.expr, all_view_rules);
|
||||
tree = ev2_block_tree_from_expr(arena, view, filter, string, parse.expr, all_view_rules);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return tree;
|
||||
@@ -666,7 +667,7 @@ ev2_depth_from_block(EV2_Block *block)
|
||||
}
|
||||
|
||||
internal EV2_WindowedRowList
|
||||
ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, EV2_BlockTree *block_tree, Rng1U64 visible_range)
|
||||
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};
|
||||
{
|
||||
@@ -741,10 +742,10 @@ ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, EV2_BlockTree
|
||||
// rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range
|
||||
else
|
||||
{
|
||||
EV_ExpandResult expand = t->block->expand_view_rule_info->expr_expand(arena, t->block->expr, t->block->expand_view_rule_params, block_relative_range__windowed);
|
||||
for EachIndex(idx, expand.row_exprs_count)
|
||||
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.row_exprs_num_visual_rows[idx];
|
||||
U64 row_visual_size = expand_range_info.row_exprs_num_visual_rows[idx];
|
||||
U64 child_id = block_relative_range.min + idx + 1; // TODO(rjf): index -> key
|
||||
EV2_Row *row = push_array(arena, EV2_Row, 1);
|
||||
SLLQueuePush(rows.first, rows.last, row);
|
||||
@@ -755,8 +756,8 @@ ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, EV2_BlockTree
|
||||
row->visual_size_skipped = 0; // TODO(rjf)
|
||||
row->visual_size_chopped = 0; // TODO(rjf)
|
||||
row->string = t->block->string;
|
||||
row->expr = expand.row_exprs[idx];
|
||||
row->member = expand.row_members[idx];
|
||||
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
|
||||
}
|
||||
|
||||
@@ -98,20 +98,6 @@ struct EV_ViewRuleList
|
||||
U64 count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Expansion Hook Output
|
||||
|
||||
typedef struct EV_ExpandResult EV_ExpandResult;
|
||||
struct EV_ExpandResult
|
||||
{
|
||||
U64 total_semantic_row_count;
|
||||
U64 total_visual_row_count;
|
||||
U64 row_exprs_count;
|
||||
E_Expr **row_exprs;
|
||||
E_Member **row_members;
|
||||
U64 *row_exprs_num_visual_rows;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Blocks
|
||||
|
||||
@@ -174,13 +160,34 @@ struct EV_BlockList
|
||||
////////////////////////////////
|
||||
//~ rjf: View Rule Info Types
|
||||
|
||||
typedef struct EV_ExpandInfo EV_ExpandInfo;
|
||||
struct EV_ExpandInfo
|
||||
{
|
||||
void *user_data;
|
||||
U64 total_semantic_row_count;
|
||||
U64 total_visual_row_count;
|
||||
};
|
||||
|
||||
typedef struct EV_ExpandRangeInfo EV_ExpandRangeInfo;
|
||||
struct EV_ExpandRangeInfo
|
||||
{
|
||||
U64 row_exprs_count;
|
||||
E_Expr **row_exprs;
|
||||
E_Member **row_members;
|
||||
U64 *row_exprs_num_visual_rows;
|
||||
};
|
||||
|
||||
#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(name) E_Expr *name(Arena *arena, E_Expr *expr, MD_Node *params)
|
||||
#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name) ev_view_rule_expr_resolution__##name
|
||||
#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name))
|
||||
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_SIG(name) EV_ExpandResult name(Arena *arena, E_Expr *expr, MD_Node *params, Rng1U64 idx_range)
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_NAME(name) ev_view_rule_expr_expand__##name
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_NAME(name))
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params)
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_info__##name
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name))
|
||||
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(name) EV_ExpandRangeInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data)
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_range_info__##name
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name))
|
||||
|
||||
#define EV_VIEW_RULE_BLOCK_PROD_FUNCTION_SIG(name) void name(Arena *arena, \
|
||||
EV_View *view, \
|
||||
@@ -198,7 +205,8 @@ struct EV_BlockList *out)
|
||||
#define EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(name) internal EV_VIEW_RULE_BLOCK_PROD_FUNCTION_SIG(EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME(name))
|
||||
|
||||
typedef EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_ViewRuleExprResolutionHookFunctionType);
|
||||
typedef EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_SIG(EV_ViewRuleExprExpandHookFunctionType);
|
||||
typedef EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandInfoHookFunctionType);
|
||||
typedef EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandRangeInfoHookFunctionType);
|
||||
typedef EV_VIEW_RULE_BLOCK_PROD_FUNCTION_SIG(EV_ViewRuleBlockProdHookFunctionType);
|
||||
|
||||
typedef U32 EV_ViewRuleInfoFlags; // NOTE(rjf): see @view_rule_info
|
||||
@@ -214,7 +222,8 @@ struct EV_ViewRuleInfo
|
||||
String8 string;
|
||||
EV_ViewRuleInfoFlags flags;
|
||||
EV_ViewRuleExprResolutionHookFunctionType *expr_resolution;
|
||||
EV_ViewRuleExprExpandHookFunctionType *expr_expand;
|
||||
EV_ViewRuleExprExpandInfoHookFunctionType *expr_expand_info;
|
||||
EV_ViewRuleExprExpandRangeInfoHookFunctionType *expr_expand_range_info;
|
||||
EV_ViewRuleBlockProdHookFunctionType *block_prod;
|
||||
};
|
||||
|
||||
@@ -264,6 +273,7 @@ struct EV2_Block
|
||||
EV_ViewRuleList *view_rules;
|
||||
EV_ViewRuleInfo *expand_view_rule_info;
|
||||
MD_Node *expand_view_rule_params;
|
||||
void *expand_view_rule_info_user_data;
|
||||
|
||||
// rjf: expansion info
|
||||
U64 semantic_row_count;
|
||||
@@ -459,10 +469,10 @@ internal E_Expr *ev_expr_from_expr_view_rules(Arena *arena, E_Expr *expr, EV_Vie
|
||||
////////////////////////////////
|
||||
//~ rjf: Block Building (v2)
|
||||
|
||||
internal EV2_BlockTree ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules);
|
||||
internal EV2_BlockTree ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 string, EV_ViewRuleList *view_rules);
|
||||
internal EV2_BlockTree ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules);
|
||||
internal EV2_BlockTree ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules);
|
||||
internal U64 ev2_depth_from_block(EV2_Block *block);
|
||||
internal EV2_WindowedRowList ev2_windowed_row_list_from_block_tree(Arena *arena, EV_View *view, EV2_BlockTree *block_tree, Rng1U64 visible_range);
|
||||
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 String8 ev2_expr_string_from_row(Arena *arena, EV2_Row *row, EV_StringFlags flags);
|
||||
internal B32 ev2_row_is_expandable(EV2_Row *row);
|
||||
internal B32 ev2_row_is_editable(EV2_Row *row);
|
||||
|
||||
@@ -6,17 +6,17 @@
|
||||
C_LINKAGE_BEGIN
|
||||
EV_ViewRuleInfo ev_builtin_view_rule_info_table[11] =
|
||||
{
|
||||
{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 0, EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_NAME(default) , EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME(default) , },
|
||||
{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(array) , 0, 0, },
|
||||
{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(slice) , 0, 0, },
|
||||
{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(bswap) , 0, 0, },
|
||||
{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(cast) , 0, 0, },
|
||||
{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(only) , 0, 0, },
|
||||
{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(omit) , 0, 0, },
|
||||
{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, },
|
||||
{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, },
|
||||
{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, },
|
||||
{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, },
|
||||
{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), 0, EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_BLOCK_PROD_FUNCTION_NAME(default) , },
|
||||
{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(array) , 0, 0, 0, },
|
||||
{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(slice) , 0, 0, 0, },
|
||||
{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(bswap) , 0, 0, 0, },
|
||||
{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(cast) , 0, 0, 0, },
|
||||
{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(only) , 0, 0, 0, },
|
||||
{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(omit) , 0, 0, 0, },
|
||||
{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, 0, },
|
||||
{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, 0, },
|
||||
{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, 0, },
|
||||
{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), 0, 0, 0, 0, },
|
||||
};
|
||||
|
||||
C_LINKAGE_END
|
||||
|
||||
@@ -28,6 +28,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(bswap);
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast);
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only);
|
||||
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_FUNCTION_DEF(default);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default);
|
||||
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(default);
|
||||
#endif // EVAL_VISUALIZATION_META_H
|
||||
|
||||
+130
-2
@@ -5825,11 +5825,11 @@ rd_window_frame(RD_Window *ws)
|
||||
EV_View *ev_view = rd_ev_view_from_key(d_hash_from_string(ev_view_key_string));
|
||||
EV_Key parent_key = ev_key_make(5381, 1);
|
||||
EV_Key key = ev_key_make(ev_hash_from_key(parent_key), 1);
|
||||
EV2_BlockTree block_tree = ev2_block_tree_from_string(scratch.arena, ev_view, expr, &top_level_view_rules);
|
||||
EV2_BlockTree block_tree = ev2_block_tree_from_string(scratch.arena, ev_view, str8_zero(), expr, &top_level_view_rules);
|
||||
// EV_BlockList viz_blocks = ev_block_list_from_view_expr_keys(scratch.arena, ev_view, str8_zero(), &top_level_view_rules, expr, parent_key, key, 0);
|
||||
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);
|
||||
U32 default_radix = (entity->kind == CTRL_EntityKind_Thread ? 16 : 10);
|
||||
EV2_WindowedRowList rows = ev2_windowed_row_list_from_block_tree(scratch.arena, ev_view, &block_tree, r1u64(0, 50));
|
||||
EV2_WindowedRowList rows = ev2_windowed_row_list_from_block_tree(scratch.arena, ev_view, str8_zero(), &block_tree, r1u64(0, 50));
|
||||
// EV_WindowedRowList viz_rows = ev_windowed_row_list_from_block_list(scratch.arena, ev_view, r1s64(0, 50), &viz_blocks);
|
||||
|
||||
//- rjf: animate
|
||||
@@ -7863,6 +7863,55 @@ rd_window_frame(RD_Window *ws)
|
||||
////////////////////////////////
|
||||
//~ rjf: Eval Visualization
|
||||
|
||||
typedef struct RD_EntityExpandAccel RD_EntityExpandAccel;
|
||||
struct RD_EntityExpandAccel
|
||||
{
|
||||
RD_EntityArray entities;
|
||||
};
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watches)
|
||||
{
|
||||
RD_EntityExpandAccel *accel = push_array(arena, RD_EntityExpandAccel, 1);
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
{
|
||||
RD_EntityList entities = rd_query_cached_entity_list_with_kind(RD_EntityKind_Watch);
|
||||
RD_EntityList entities_filtered = {0};
|
||||
for(RD_EntityNode *n = entities.first; n != 0; n = n->next)
|
||||
{
|
||||
RD_Entity *entity = n->entity;
|
||||
String8 entity_expr_string = entity->string;
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity_expr_string);
|
||||
if(matches.count == matches.needle_part_count)
|
||||
{
|
||||
rd_entity_list_push(scratch.arena, &entities_filtered, entity);
|
||||
}
|
||||
}
|
||||
accel->entities = rd_entity_array_from_list(arena, &entities_filtered);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
EV_ExpandInfo info = {accel, accel->entities.count, accel->entities.count};
|
||||
return info;
|
||||
}
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watches)
|
||||
{
|
||||
RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data;
|
||||
EV_ExpandRangeInfo result = {0};
|
||||
{
|
||||
U64 needed_row_count = dim_1u64(idx_range);
|
||||
result.row_exprs_count = Min(needed_row_count, accel->entities.count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, accel->entities.v[idx_range.min + row_expr_idx]->string);
|
||||
result.row_members[row_expr_idx] = &e_member_nil;
|
||||
result.row_exprs_num_visual_rows[row_expr_idx] = 1;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(watches)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
@@ -8052,6 +8101,85 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(procedures)
|
||||
rd_ev_view_rule_block_prod_collection_debug_tables(arena, RDI_SectionKind_Procedures, view, filter, parent_key, key, expand_node, string, expr, view_rules, view_params, depth, out);
|
||||
}
|
||||
|
||||
internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind);
|
||||
internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind);
|
||||
internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind);
|
||||
internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, CTRL_EntityKind kind);
|
||||
|
||||
#if 0
|
||||
internal EV_ExpandResult
|
||||
rd_ev_view_rule_expr_expand_meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, RD_EntityKind kind)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
U64 needed_row_count = dim_1u64(idx_range);
|
||||
RD_EntityList entities = rd_query_cached_entity_list_with_kind(kind);
|
||||
RD_EntityList entities_filtered = {0};
|
||||
for(RD_EntityNode *n = entities.first; n != 0; n = n->next)
|
||||
{
|
||||
RD_Entity *entity = n->entity;
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity->string);
|
||||
if(matches.count == matches.needle_part_count)
|
||||
{
|
||||
rd_entity_list_push(scratch.arena, &entities_filtered, entity);
|
||||
}
|
||||
}
|
||||
RD_EntityArray entities_filtered_array = rd_entity_array_from_list(scratch.arena, &entities_filtered);
|
||||
EV_ExpandResult result = {0};
|
||||
{
|
||||
result.total_semantic_row_count = result.total_visual_row_count = entities_filtered_array.count;
|
||||
result.row_exprs_count = Min(needed_row_count, entities_filtered_array.count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
RD_Entity *entity = entities_filtered_array.v[idx_range.min + row_expr_idx];
|
||||
String8 entity_expr_string = push_str8f(arena, "$%I64u", entity->id);
|
||||
result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string);
|
||||
result.row_members[row_expr_idx] = &e_member_nil;
|
||||
result.row_exprs_num_visual_rows[row_expr_idx] = 1;
|
||||
}
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal EV_ExpandResult
|
||||
rd_ev_view_rule_expr_expand_meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, CTRL_EntityKind kind)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
U64 needed_row_count = dim_1u64(idx_range);
|
||||
CTRL_EntityList entities = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind);
|
||||
CTRL_EntityList entities_filtered = {0};
|
||||
for(CTRL_EntityNode *n = entities.first; n != 0; n = n->next)
|
||||
{
|
||||
CTRL_Entity *entity = n->v;
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity->string);
|
||||
if(matches.count == matches.needle_part_count)
|
||||
{
|
||||
ctrl_entity_list_push(scratch.arena, &entities_filtered, entity);
|
||||
}
|
||||
}
|
||||
CTRL_EntityArray entities_filtered_array = ctrl_entity_array_from_list(scratch.arena, &entities_filtered);
|
||||
EV_ExpandResult result = {0};
|
||||
{
|
||||
result.total_semantic_row_count = result.total_visual_row_count = entities_filtered_array.count;
|
||||
result.row_exprs_count = Min(needed_row_count, entities_filtered_array.count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
CTRL_Entity *entity = entities_filtered_array.v[idx_range.min + row_expr_idx];
|
||||
String8 entity_expr_string = push_str8f(arena, "$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]);
|
||||
result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string);
|
||||
result.row_members[row_expr_idx] = &e_member_nil;
|
||||
result.row_exprs_num_visual_rows[row_expr_idx] = 1;
|
||||
}
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
internal void
|
||||
rd_ev_view_rule_block_prod_collection_debug_tables(Arena *arena, RDI_SectionKind target, EV_View *view, String8 filter, EV_Key parent_key, EV_Key key, EV_ExpandNode *expand_node, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules, MD_Node *view_params, S32 depth, struct EV_BlockList *out)
|
||||
{
|
||||
|
||||
@@ -1280,6 +1280,11 @@ internal void rd_window_frame(RD_Window *ws);
|
||||
////////////////////////////////
|
||||
//~ rjf: Eval Visualization
|
||||
|
||||
internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind);
|
||||
internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind);
|
||||
internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind);
|
||||
internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, CTRL_EntityKind kind);
|
||||
|
||||
internal void rd_ev_view_rule_block_prod_collection_debug_tables(Arena *arena, RDI_SectionKind target, EV_View *view, String8 filter, EV_Key parent_key, EV_Key key, EV_ExpandNode *expand_node, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules, MD_Node *view_params, S32 depth, struct EV_BlockList *out);
|
||||
internal EV_View *rd_ev_view_from_key(U64 key);
|
||||
internal F32 rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out);
|
||||
|
||||
Reference in New Issue
Block a user