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:
Ryan Fleury
2024-09-25 15:17:39 -07:00
parent a87c032305
commit a1ceb5fa3b
13 changed files with 339 additions and 91 deletions
+16
View File
@@ -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 *
+10
View File
@@ -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
View File
@@ -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
View File
@@ -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;
}
+2 -1
View File
@@ -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
View File
@@ -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)
{
+5
View File
@@ -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);