txti -> txt; checkpoint #5

This commit is contained in:
Ryan Fleury
2024-03-26 16:38:12 -07:00
parent 8792c2280c
commit 4272258f99
3 changed files with 105 additions and 4 deletions
+94 -1
View File
@@ -1016,7 +1016,8 @@ txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt)
// rjf: unpack line info
Rng1U64 line_range = info->lines_ranges[pt.line-1];
String8 line_text = str8_substr(data, line_range);
TXT_TokenArray line_tokens = txt_token_array_from_info_line_num__linear_scan(info, pt.line);
TXT_LineTokensSlice line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, info, data, r1s64(pt.line, pt.line));
TXT_TokenArray line_tokens = line_tokens_slice.line_tokens[0];
TXT_Token *line_tokens_first = line_tokens.v;
TXT_Token *line_tokens_opl = line_tokens.v+line_tokens.count;
U64 pt_off = line_range.min + (pt.column-1);
@@ -1036,6 +1037,98 @@ txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng)
return result;
}
internal TXT_LineTokensSlice
txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range)
{
TXT_LineTokensSlice result = {0};
Temp scratch = scratch_begin(&arena, 1);
if(info->lines_count != 0)
{
Rng1S64 line_range_clamped = r1s64(Clamp(1, line_range.min, (S64)info->lines_count), Clamp(1, line_range.max, (S64)info->lines_count));
U64 line_count = (U64)dim_1s64(line_range_clamped)+1;
// rjf: allocate output arrays
result.line_tokens = push_array(arena, TXT_TokenArray, line_count);
// rjf: binary search to find first token
TXT_Token *tokens_first = 0;
ProfScope("binary search to find first token")
{
Rng1U64 slice_range = r1u64(info->lines_ranges[line_range_clamped.min-1].min, info->lines_ranges[line_range_clamped.max-1].max);
U64 min_idx = 0;
U64 opl_idx = info->tokens.count;
for(;;)
{
U64 mid_idx = (opl_idx+min_idx)/2;
if(mid_idx >= opl_idx)
{
break;
}
TXT_Token *mid_token = &info->tokens.v[mid_idx];
if(mid_token->range.min > slice_range.max)
{
opl_idx = mid_idx;
}
else if(mid_token->range.max < slice_range.min)
{
min_idx = mid_idx;
}
else if(tokens_first == 0 || mid_token->range.min < tokens_first->range.min)
{
tokens_first = mid_token;
opl_idx = mid_idx;
}
if(mid_idx == min_idx && mid_idx+1 == opl_idx)
{
break;
}
}
}
// rjf: grab per-line tokens
TXT_TokenList *line_tokens_lists = push_array(scratch.arena, TXT_TokenList, line_count);
if(tokens_first != 0) ProfScope("grab per-line tokens")
{
TXT_Token *tokens_opl = info->tokens.v+info->tokens.count;
U64 line_slice_idx = 0;
for(TXT_Token *token = tokens_first; token < tokens_opl && line_slice_idx < line_count;)
{
if(token->range.min < info->lines_ranges[line_slice_idx+line_range.min-1].max)
{
if(token->range.max > info->lines_ranges[line_slice_idx+line_range.min-1].min)
{
txt_token_list_push(scratch.arena, &line_tokens_lists[line_slice_idx], token);
}
B32 need_token_advance = 0;
B32 need_line_advance = 0;
if(token->range.max >= info->lines_ranges[line_slice_idx+line_range.min-1].max)
{
need_line_advance = 1;
}
if(token->range.max <= info->lines_ranges[line_slice_idx+line_range.min-1].max)
{
need_token_advance += 1;
}
if(need_line_advance) { line_slice_idx += 1; }
if(need_token_advance) { token += 1; }
}
else
{
line_slice_idx += 1;
}
}
}
// rjf: bake per-line tokens to arrays
for(U64 line_slice_idx = 0; line_slice_idx < line_count; line_slice_idx += 1)
{
result.line_tokens[line_slice_idx] = txt_token_array_from_list(arena, &line_tokens_lists[line_slice_idx]);
}
}
scratch_end(scratch);
return result;
}
////////////////////////////////
//~ rjf: Transfer Threads