mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-18 15:11:32 -07:00
member filtering, better visualization for selection state in targets/bps/threads/etc.
This commit is contained in:
+5
-5
@@ -500,7 +500,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(slice)
|
||||
{
|
||||
if(user_data == 0)
|
||||
{
|
||||
E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, tag, idx_range, exprs, exprs_strings, user_data);
|
||||
E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, tag, filter, idx_range, exprs, exprs_strings, user_data);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -536,7 +536,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
|
||||
direct_type_kind == E_TypeKind_Class ||
|
||||
direct_type_kind == E_TypeKind_Union)
|
||||
{
|
||||
E_MemberArray data_members = e_type_data_members_from_key__cached(direct_type_key);
|
||||
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(direct_type_key, filter);
|
||||
lookup_info.named_expr_count = data_members.count;
|
||||
}
|
||||
else if(direct_type_kind == E_TypeKind_Enum)
|
||||
@@ -550,7 +550,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
|
||||
lhs_type_kind == E_TypeKind_Class ||
|
||||
lhs_type_kind == E_TypeKind_Union)
|
||||
{
|
||||
E_MemberArray data_members = e_type_data_members_from_key__cached(lhs_type_key);
|
||||
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(lhs_type_key, filter);
|
||||
lookup_info.named_expr_count = data_members.count;
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Enum)
|
||||
@@ -880,7 +880,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
|
||||
//- rjf: struct case -> the lookup-range will return a range of members
|
||||
if(do_struct_range)
|
||||
{
|
||||
E_MemberArray data_members = e_type_data_members_from_key__cached(struct_type_key);
|
||||
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(struct_type_key, filter);
|
||||
Rng1U64 legal_idx_range = r1u64(0, data_members.count);
|
||||
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
|
||||
U64 read_range_count = dim_1u64(read_range);
|
||||
@@ -1083,7 +1083,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(only_and_omit)
|
||||
{
|
||||
if(user_data == 0)
|
||||
{
|
||||
E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, tag, idx_range, exprs, exprs_strings, user_data);
|
||||
E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, tag, filter, idx_range, exprs, exprs_strings, user_data);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+1
-1
@@ -86,7 +86,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(default);
|
||||
typedef E_LOOKUP_ACCESS_FUNCTION_SIG(E_LookupAccessFunctionType);
|
||||
E_LOOKUP_ACCESS_FUNCTION_DEF(default);
|
||||
|
||||
#define E_LOOKUP_RANGE_FUNCTION_SIG(name) void name(Arena *arena, E_Expr *lhs, E_Expr *tag, Rng1U64 idx_range, E_Expr **exprs, String8 *exprs_strings, void *user_data)
|
||||
#define E_LOOKUP_RANGE_FUNCTION_SIG(name) void name(Arena *arena, E_Expr *lhs, E_Expr *tag, String8 filter, Rng1U64 idx_range, E_Expr **exprs, String8 *exprs_strings, void *user_data)
|
||||
#define E_LOOKUP_RANGE_FUNCTION_NAME(name) e_lookup_range_##name
|
||||
#define E_LOOKUP_RANGE_FUNCTION_DEF(name) internal E_LOOKUP_RANGE_FUNCTION_SIG(E_LOOKUP_RANGE_FUNCTION_NAME(name))
|
||||
typedef E_LOOKUP_RANGE_FUNCTION_SIG(E_LookupRangeFunctionType);
|
||||
|
||||
@@ -1935,6 +1935,8 @@ e_member_cache_node_from_type_key(E_TypeKey key)
|
||||
node->members = e_type_data_members_from_key(e_type_state->arena, key);
|
||||
node->member_hash_slots_count = node->members.count;
|
||||
node->member_hash_slots = push_array(e_type_state->arena, E_MemberHashSlot, node->member_hash_slots_count);
|
||||
node->member_filter_slots_count = 16;
|
||||
node->member_filter_slots = push_array(e_type_state->arena, E_MemberFilterSlot, node->member_filter_slots_count);
|
||||
for EachIndex(idx, node->members.count)
|
||||
{
|
||||
U64 hash = e_hash_from_string(5381, node->members.v[idx].name);
|
||||
@@ -1947,6 +1949,55 @@ e_member_cache_node_from_type_key(E_TypeKey key)
|
||||
return node;
|
||||
}
|
||||
|
||||
internal E_MemberArray
|
||||
e_type_data_members_from_key_filter__cached(E_TypeKey key, String8 filter)
|
||||
{
|
||||
E_MemberArray members = {0};
|
||||
E_MemberCacheNode *node = e_member_cache_node_from_type_key(key);
|
||||
if(node != 0)
|
||||
{
|
||||
if(filter.size == 0)
|
||||
{
|
||||
members = node->members;
|
||||
}
|
||||
else
|
||||
{
|
||||
U64 hash = e_hash_from_string(5381, filter);
|
||||
U64 slot_idx = hash%node->member_filter_slots_count;
|
||||
E_MemberFilterSlot *slot = &node->member_filter_slots[slot_idx];
|
||||
E_MemberFilterNode *filter_node = 0;
|
||||
for(E_MemberFilterNode *n = slot->first; n != 0; n = n->next)
|
||||
{
|
||||
if(str8_match(n->filter, filter, 0))
|
||||
{
|
||||
filter_node = n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(filter_node == 0)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
filter_node = push_array(e_type_state->arena, E_MemberFilterNode, 1);
|
||||
filter_node->filter = push_str8_copy(e_type_state->arena, filter);
|
||||
E_MemberList member_list__filtered = {0};
|
||||
for EachIndex(idx, node->members.count)
|
||||
{
|
||||
E_Member *member = &node->members.v[idx];
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, member->name);
|
||||
if(matches.count == matches.needle_part_count)
|
||||
{
|
||||
e_member_list_push(scratch.arena, &member_list__filtered, member);
|
||||
}
|
||||
}
|
||||
filter_node->members_filtered = e_member_array_from_list(e_type_state->arena, &member_list__filtered);
|
||||
scratch_end(scratch);
|
||||
}
|
||||
members = filter_node->members_filtered;
|
||||
}
|
||||
}
|
||||
return members;
|
||||
}
|
||||
|
||||
internal E_MemberArray
|
||||
e_type_data_members_from_key__cached(E_TypeKey key)
|
||||
{
|
||||
|
||||
@@ -234,6 +234,21 @@ struct E_MemberHashSlot
|
||||
E_MemberHashNode *last;
|
||||
};
|
||||
|
||||
typedef struct E_MemberFilterNode E_MemberFilterNode;
|
||||
struct E_MemberFilterNode
|
||||
{
|
||||
E_MemberFilterNode *next;
|
||||
String8 filter;
|
||||
E_MemberArray members_filtered;
|
||||
};
|
||||
|
||||
typedef struct E_MemberFilterSlot E_MemberFilterSlot;
|
||||
struct E_MemberFilterSlot
|
||||
{
|
||||
E_MemberFilterNode *first;
|
||||
E_MemberFilterNode *last;
|
||||
};
|
||||
|
||||
typedef struct E_MemberCacheNode E_MemberCacheNode;
|
||||
struct E_MemberCacheNode
|
||||
{
|
||||
@@ -242,6 +257,8 @@ struct E_MemberCacheNode
|
||||
E_MemberArray members;
|
||||
U64 member_hash_slots_count;
|
||||
E_MemberHashSlot *member_hash_slots;
|
||||
U64 member_filter_slots_count;
|
||||
E_MemberFilterSlot *member_filter_slots;
|
||||
};
|
||||
|
||||
typedef struct E_MemberCacheSlot E_MemberCacheSlot;
|
||||
@@ -381,6 +398,7 @@ internal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8
|
||||
|
||||
internal E_Type *e_type_from_key__cached(E_TypeKey key);
|
||||
internal E_MemberCacheNode *e_member_cache_node_from_type_key(E_TypeKey key);
|
||||
internal E_MemberArray e_type_data_members_from_key_filter__cached(E_TypeKey key, String8 filter);
|
||||
internal E_MemberArray e_type_data_members_from_key__cached(E_TypeKey key);
|
||||
internal E_Member e_type_member_from_key_name__cached(E_TypeKey key, String8 name);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user