Node lookup acceleration
parent
999eced259
commit
400b66803c
|
@ -8,24 +8,6 @@
|
|||
|
||||
// TOP
|
||||
|
||||
// TODO(allen): do(make an index <-> node acceleration structure for history)
|
||||
|
||||
internal i32
|
||||
history__to_index(Node *sentinel, Node *node){
|
||||
i32 result = -1;
|
||||
i32 counter = 0;
|
||||
Node *it = sentinel;
|
||||
do{
|
||||
if (it == node){
|
||||
result = counter;
|
||||
break;
|
||||
}
|
||||
counter += 1;
|
||||
it = it->next;
|
||||
} while (it != sentinel);
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal Node*
|
||||
history__to_node(Node *sentinel, int32_t index){
|
||||
Node *result = 0;
|
||||
|
@ -42,12 +24,37 @@ history__to_node(Node *sentinel, int32_t index){
|
|||
return(result);
|
||||
}
|
||||
|
||||
internal i32
|
||||
history__to_index(History *history, Node *node){
|
||||
Node *sentinel = &history->records;
|
||||
return(history__to_index(sentinel, node));
|
||||
internal void
|
||||
history__push_back_record_ptr(Heap *heap, Record_Ptr_Lookup_Table *lookup, Record *record){
|
||||
if (lookup->records == 0 || lookup->count == lookup->max){
|
||||
i32 new_max = clamp_bottom(1024, lookup->max*2);
|
||||
Record **new_records = (Record**)heap_allocate(heap, sizeof(Record*)*new_max);
|
||||
block_copy(new_records, lookup->records, sizeof(*new_records)*lookup->count);
|
||||
if (lookup->records != 0){
|
||||
heap_free(heap, lookup->records);
|
||||
}
|
||||
lookup->records = new_records;
|
||||
lookup->max = new_max;
|
||||
}
|
||||
Assert(lookup->count < lookup->max);
|
||||
lookup->records[lookup->count] = record;
|
||||
lookup->count += 1;
|
||||
}
|
||||
|
||||
internal void
|
||||
history__merge_record_ptr_range_to_one_ptr(Record_Ptr_Lookup_Table *lookup, int32_t first, int32_t one_past_last, Record *record){
|
||||
first -= 1;
|
||||
one_past_last -= 1;
|
||||
Assert(0 <= first && first <= one_past_last && one_past_last <= lookup->count);
|
||||
if (first < one_past_last){
|
||||
i32 shift = 1 + first - one_past_last;
|
||||
block_copy(lookup->records + one_past_last + shift, lookup->records + one_past_last, lookup->count - one_past_last);
|
||||
lookup->count += shift;
|
||||
}
|
||||
lookup->records[first] = record;
|
||||
}
|
||||
|
||||
#if 0
|
||||
internal Node*
|
||||
history__to_node(History *history, int32_t index){
|
||||
Node *result = 0;
|
||||
|
@ -57,6 +64,23 @@ history__to_node(History *history, int32_t index){
|
|||
}
|
||||
return(result);
|
||||
}
|
||||
#else
|
||||
internal Node*
|
||||
history__to_node(History *history, int32_t index){
|
||||
Node *result = 0;
|
||||
if (index == 0){
|
||||
result = &history->records;
|
||||
}
|
||||
else if (0 < index && index <= history->record_count){
|
||||
Record_Ptr_Lookup_Table *lookup = &history->record_lookup;
|
||||
Assert(lookup->count == history->record_count);
|
||||
result = &lookup->records[index - 1]->node;
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
#endif
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
internal Record*
|
||||
history__allocate_record(Heap *heap, History *history){
|
||||
|
@ -112,6 +136,7 @@ history_init(Application_Links *app, History *history){
|
|||
dll_init_sentinel(&history->free_records);
|
||||
dll_init_sentinel(&history->records);
|
||||
history->record_count = 0;
|
||||
block_zero_struct(&history->record_lookup);
|
||||
}
|
||||
|
||||
internal b32
|
||||
|
@ -173,9 +198,10 @@ history_get_dummy_record(History *history){
|
|||
}
|
||||
|
||||
internal void
|
||||
history__stash_record(History *history, Record *new_record){
|
||||
history__stash_record(Heap *heap, History *history, Record *new_record){
|
||||
dll_insert_back(&history->records, &new_record->node);
|
||||
history->record_count += 1;
|
||||
history__push_back_record_ptr(heap, &history->record_lookup, new_record);
|
||||
}
|
||||
|
||||
internal void
|
||||
|
@ -212,7 +238,7 @@ history_record_edit(Heap *heap, Global_History *global_history, History *history
|
|||
}
|
||||
|
||||
Record *new_record = history__allocate_record(heap, history);
|
||||
history__stash_record(history, new_record);
|
||||
history__stash_record(heap, history, new_record);
|
||||
|
||||
new_record->restore_point = temp_memory_light(begin_temp_memory(&history->arena));
|
||||
new_record->edit_number = global_history_get_edit_number(global_history);
|
||||
|
@ -239,7 +265,7 @@ history_record_edit(Heap *heap, Global_History *global_history, History *history
|
|||
}
|
||||
|
||||
Record *new_record = history__allocate_record(heap, history);
|
||||
history__stash_record(history, new_record);
|
||||
history__stash_record(heap, history, new_record);
|
||||
|
||||
new_record->restore_point = temp_memory_light(begin_temp_memory(&history->arena));
|
||||
new_record->edit_number = global_history_get_edit_number(global_history);
|
||||
|
@ -380,6 +406,8 @@ history_merge_records(Heap *heap, History *history, i32 first_index, i32 last_in
|
|||
}
|
||||
|
||||
new_record->group.count = count;
|
||||
|
||||
history__merge_record_ptr_range_to_one_ptr(&history->record_lookup, first_index, last_index + 1, new_record);
|
||||
}
|
||||
|
||||
// BOTTOM
|
||||
|
|
|
@ -47,6 +47,12 @@ struct Record{
|
|||
};
|
||||
};
|
||||
|
||||
struct Record_Ptr_Lookup_Table{
|
||||
Record **records;
|
||||
i32 count;
|
||||
i32 max;
|
||||
};
|
||||
|
||||
struct History{
|
||||
b32 activated;
|
||||
Arena arena;
|
||||
|
@ -54,6 +60,7 @@ struct History{
|
|||
Node free_records;
|
||||
Node records;
|
||||
i32 record_count;
|
||||
Record_Ptr_Lookup_Table record_lookup;
|
||||
};
|
||||
|
||||
struct Global_History{
|
||||
|
|
Loading…
Reference in New Issue