From ace76a2d3f55b3a1a3a7becfb9f81f6c9894d62b Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 11 Aug 2018 23:33:52 -0700 Subject: [PATCH] Progress towards a managed object API --- 4coder_API/types.h | 13 +-- 4coder_base_commands.cpp | 8 +- 4coder_generated/app_functions.h | 37 ++++---- 4coder_generated/command_metadata.h | 20 ++--- 4coder_jump_sticky.cpp | 67 ++------------- 4coder_jump_sticky.h | 22 +---- 4ed_api_implementation.cpp | 115 ++++++++++++------------- 4ed_dynamic_variables.cpp | 127 ++++++++++++++++++++++++++++ 4ed_dynamic_variables.h | 14 +++ 4ed_file.cpp | 14 +-- 4ed_file.h | 3 - 11 files changed, 236 insertions(+), 204 deletions(-) diff --git a/4coder_API/types.h b/4coder_API/types.h index 25175e26..db659e1a 100644 --- a/4coder_API/types.h +++ b/4coder_API/types.h @@ -609,8 +609,6 @@ STRUCT Buffer_Summary{ bool32 unwrapped_lines; }; -GLOBAL_VAR Buffer_Summary null_buffer_summary = {0}; - /* DOC(A markers is a location in a buffer that, once placed, is effected by edits the same way characters are effected. In particular if an edit occurs in a location in the buffer before a marker, the marker is shifted forward or backward so that it remains on the same character.) DOC_SEE(buffer_add_markers) @@ -622,15 +620,6 @@ STRUCT Marker{ bool32 lean_right; }; -/* -DOC(A handle to an internally held array of markers.) -DOC_SEE(Marker) -DOC_SEE(buffer_add_markers) -*/ -TYPEDEF void* Marker_Handle; - -TYPEDEF void Marker_Delete_Callback(struct Application_Links *app, Marker_Handle handle, void *user_data, uint32_t user_data_size); - /* DOC(A four corner axis aligned rectangle, with integer coordinates.) */ @@ -702,6 +691,8 @@ STRUCT Query_Bar{ TYPEDEF int32_t Managed_Variable_ID; static Managed_Variable_ID ManagedVariableIndex_ERROR = -1; +TYPEDEF uint64_t Managed_Object; + ENUM(int32_t, Dynamic_Scope_Type){ DynamicScopeType_Global = 0, DynamicScopeType_Intersected = 1, diff --git a/4coder_base_commands.cpp b/4coder_base_commands.cpp index 6a2117a2..77d79620 100644 --- a/4coder_base_commands.cpp +++ b/4coder_base_commands.cpp @@ -18,13 +18,13 @@ write_character_parameter(Application_Links *app, uint8_t *character, uint32_t l next_cursor_marker.pos = character_pos_to_pos(app, &view, &buffer, view.cursor.character_pos); next_cursor_marker.lean_right = true; - Marker_Handle handle = buffer_add_markers(app, &buffer, 1, 0, 0, 0); - buffer_set_markers(app, &buffer, handle, 0, 1, &next_cursor_marker); + Managed_Object handle = buffer_add_markers(app, buffer.buffer_id, 1, 0); + buffer_set_markers(app, handle, 0, 1, &next_cursor_marker); buffer_replace_range(app, &buffer, pos, pos, (char*)character, length); - buffer_get_markers(app, &buffer, handle, 0, 1, &next_cursor_marker); - buffer_remove_markers(app, &buffer, handle); + buffer_get_markers(app, handle, 0, 1, &next_cursor_marker); + buffer_remove_markers(app, handle); view_set_cursor(app, &view, seek_pos(next_cursor_marker.pos), true); } diff --git a/4coder_generated/app_functions.h b/4coder_generated/app_functions.h index 6a6faaec..b72855eb 100644 --- a/4coder_generated/app_functions.h +++ b/4coder_generated/app_functions.h @@ -17,12 +17,11 @@ struct Application_Links; #define BUFFER_REPLACE_RANGE_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len) #define BUFFER_COMPUTE_CURSOR_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out) #define BUFFER_BATCH_EDIT_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type) -#define BUFFER_ADD_MARKERS_SIG(n) Marker_Handle n(Application_Links *app, Buffer_Summary *buffer, uint32_t marker_count, Marker_Delete_Callback *callback, void *user_data, uint32_t user_data_size) -#define GET_BUFFER_BY_MARKER_HANDLE_SIG(n) Buffer_Summary n(Application_Links *app, Marker_Handle marker, Access_Flag access) -#define GET_USER_DATA_BY_MARKER_HANDLE_SIG(n) Data n(Application_Links *app, Marker_Handle marker) -#define BUFFER_SET_MARKERS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers) -#define BUFFER_GET_MARKERS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out) -#define BUFFER_REMOVE_MARKERS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker) +#define BUFFER_ADD_MARKERS_SIG(n) Managed_Object n(Application_Links *app, Buffer_ID buffer_id, uint32_t marker_count, Dynamic_Scope *scope) +#define GET_BUFFER_BY_MARKER_HANDLE_SIG(n) Buffer_Summary n(Application_Links *app, Managed_Object marker_object, Access_Flag access) +#define BUFFER_SET_MARKERS_SIG(n) bool32 n(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers) +#define BUFFER_GET_MARKERS_SIG(n) bool32 n(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out) +#define BUFFER_REMOVE_MARKERS_SIG(n) bool32 n(Application_Links *app, Managed_Object marker) #define BUFFER_GET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out) #define BUFFER_SET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value) #define BUFFER_GET_DYNAMIC_SCOPE_SIG(n) Dynamic_Scope n(Application_Links *app, Buffer_ID buffer_id) @@ -121,7 +120,6 @@ typedef BUFFER_COMPUTE_CURSOR_SIG(Buffer_Compute_Cursor_Function); typedef BUFFER_BATCH_EDIT_SIG(Buffer_Batch_Edit_Function); typedef BUFFER_ADD_MARKERS_SIG(Buffer_Add_Markers_Function); typedef GET_BUFFER_BY_MARKER_HANDLE_SIG(Get_Buffer_By_Marker_Handle_Function); -typedef GET_USER_DATA_BY_MARKER_HANDLE_SIG(Get_User_Data_By_Marker_Handle_Function); typedef BUFFER_SET_MARKERS_SIG(Buffer_Set_Markers_Function); typedef BUFFER_GET_MARKERS_SIG(Buffer_Get_Markers_Function); typedef BUFFER_REMOVE_MARKERS_SIG(Buffer_Remove_Markers_Function); @@ -225,7 +223,6 @@ Buffer_Compute_Cursor_Function *buffer_compute_cursor; Buffer_Batch_Edit_Function *buffer_batch_edit; Buffer_Add_Markers_Function *buffer_add_markers; Get_Buffer_By_Marker_Handle_Function *get_buffer_by_marker_handle; -Get_User_Data_By_Marker_Handle_Function *get_user_data_by_marker_handle; Buffer_Set_Markers_Function *buffer_set_markers; Buffer_Get_Markers_Function *buffer_get_markers; Buffer_Remove_Markers_Function *buffer_remove_markers; @@ -328,7 +325,6 @@ Buffer_Compute_Cursor_Function *buffer_compute_cursor_; Buffer_Batch_Edit_Function *buffer_batch_edit_; Buffer_Add_Markers_Function *buffer_add_markers_; Get_Buffer_By_Marker_Handle_Function *get_buffer_by_marker_handle_; -Get_User_Data_By_Marker_Handle_Function *get_user_data_by_marker_handle_; Buffer_Set_Markers_Function *buffer_set_markers_; Buffer_Get_Markers_Function *buffer_get_markers_; Buffer_Remove_Markers_Function *buffer_remove_markers_; @@ -439,7 +435,6 @@ app_links->buffer_compute_cursor_ = Buffer_Compute_Cursor;\ app_links->buffer_batch_edit_ = Buffer_Batch_Edit;\ app_links->buffer_add_markers_ = Buffer_Add_Markers;\ app_links->get_buffer_by_marker_handle_ = Get_Buffer_By_Marker_Handle;\ -app_links->get_user_data_by_marker_handle_ = Get_User_Data_By_Marker_Handle;\ app_links->buffer_set_markers_ = Buffer_Set_Markers;\ app_links->buffer_get_markers_ = Buffer_Get_Markers;\ app_links->buffer_remove_markers_ = Buffer_Remove_Markers;\ @@ -540,12 +535,11 @@ static inline bool32 buffer_read_range(Application_Links *app, Buffer_Summary *b static inline bool32 buffer_replace_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len){return(app->buffer_replace_range(app, buffer, start, end, str, len));} static inline bool32 buffer_compute_cursor(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out){return(app->buffer_compute_cursor(app, buffer, seek, cursor_out));} static inline bool32 buffer_batch_edit(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type){return(app->buffer_batch_edit(app, buffer, str, str_len, edits, edit_count, type));} -static inline Marker_Handle buffer_add_markers(Application_Links *app, Buffer_Summary *buffer, uint32_t marker_count, Marker_Delete_Callback *callback, void *user_data, uint32_t user_data_size){return(app->buffer_add_markers(app, buffer, marker_count, callback, user_data, user_data_size));} -static inline Buffer_Summary get_buffer_by_marker_handle(Application_Links *app, Marker_Handle marker, Access_Flag access){return(app->get_buffer_by_marker_handle(app, marker, access));} -static inline Data get_user_data_by_marker_handle(Application_Links *app, Marker_Handle marker){return(app->get_user_data_by_marker_handle(app, marker));} -static inline bool32 buffer_set_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers(app, buffer, marker, first_marker_index, marker_count, source_markers));} -static inline bool32 buffer_get_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers(app, buffer, marker, first_marker_index, marker_count, markers_out));} -static inline bool32 buffer_remove_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker){return(app->buffer_remove_markers(app, buffer, marker));} +static inline Managed_Object buffer_add_markers(Application_Links *app, Buffer_ID buffer_id, uint32_t marker_count, Dynamic_Scope *scope){return(app->buffer_add_markers(app, buffer_id, marker_count, scope));} +static inline Buffer_Summary get_buffer_by_marker_handle(Application_Links *app, Managed_Object marker_object, Access_Flag access){return(app->get_buffer_by_marker_handle(app, marker_object, access));} +static inline bool32 buffer_set_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers(app, marker_object, first_marker_index, marker_count, source_markers));} +static inline bool32 buffer_get_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers(app, marker_object, first_marker_index, marker_count, markers_out));} +static inline bool32 buffer_remove_markers(Application_Links *app, Managed_Object marker){return(app->buffer_remove_markers(app, marker));} static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting(app, buffer, setting, value_out));} static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting(app, buffer, setting, value));} static inline Dynamic_Scope buffer_get_dynamic_scope(Application_Links *app, Buffer_ID buffer_id){return(app->buffer_get_dynamic_scope(app, buffer_id));} @@ -643,12 +637,11 @@ static inline bool32 buffer_read_range(Application_Links *app, Buffer_Summary *b static inline bool32 buffer_replace_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len){return(app->buffer_replace_range_(app, buffer, start, end, str, len));} static inline bool32 buffer_compute_cursor(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out){return(app->buffer_compute_cursor_(app, buffer, seek, cursor_out));} static inline bool32 buffer_batch_edit(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type){return(app->buffer_batch_edit_(app, buffer, str, str_len, edits, edit_count, type));} -static inline Marker_Handle buffer_add_markers(Application_Links *app, Buffer_Summary *buffer, uint32_t marker_count, Marker_Delete_Callback *callback, void *user_data, uint32_t user_data_size){return(app->buffer_add_markers_(app, buffer, marker_count, callback, user_data, user_data_size));} -static inline Buffer_Summary get_buffer_by_marker_handle(Application_Links *app, Marker_Handle marker, Access_Flag access){return(app->get_buffer_by_marker_handle_(app, marker, access));} -static inline Data get_user_data_by_marker_handle(Application_Links *app, Marker_Handle marker){return(app->get_user_data_by_marker_handle_(app, marker));} -static inline bool32 buffer_set_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers_(app, buffer, marker, first_marker_index, marker_count, source_markers));} -static inline bool32 buffer_get_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers_(app, buffer, marker, first_marker_index, marker_count, markers_out));} -static inline bool32 buffer_remove_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker){return(app->buffer_remove_markers_(app, buffer, marker));} +static inline Managed_Object buffer_add_markers(Application_Links *app, Buffer_ID buffer_id, uint32_t marker_count, Dynamic_Scope *scope){return(app->buffer_add_markers_(app, buffer_id, marker_count, scope));} +static inline Buffer_Summary get_buffer_by_marker_handle(Application_Links *app, Managed_Object marker_object, Access_Flag access){return(app->get_buffer_by_marker_handle_(app, marker_object, access));} +static inline bool32 buffer_set_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers_(app, marker_object, first_marker_index, marker_count, source_markers));} +static inline bool32 buffer_get_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers_(app, marker_object, first_marker_index, marker_count, markers_out));} +static inline bool32 buffer_remove_markers(Application_Links *app, Managed_Object marker){return(app->buffer_remove_markers_(app, marker));} static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting_(app, buffer, setting, value_out));} static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting_(app, buffer, setting, value));} static inline Dynamic_Scope buffer_get_dynamic_scope(Application_Links *app, Buffer_ID buffer_id){return(app->buffer_get_dynamic_scope_(app, buffer_id));} diff --git a/4coder_generated/command_metadata.h b/4coder_generated/command_metadata.h index 7fed164c..cd97d29b 100644 --- a/4coder_generated/command_metadata.h +++ b/4coder_generated/command_metadata.h @@ -263,21 +263,21 @@ static Command_Metadata fcoder_metacmd_table[202] = { { PROC_LINKS(goto_beginning_of_file, 0), "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1168 }, { PROC_LINKS(goto_end_of_file, 0), "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1175 }, { PROC_LINKS(goto_first_jump_direct, 0), "goto_first_jump_direct", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 84 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 571 }, -{ PROC_LINKS(goto_first_jump_sticky, 0), "goto_first_jump_sticky", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 553 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 532 }, +{ PROC_LINKS(goto_first_jump_sticky, 0), "goto_first_jump_sticky", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 514 }, { PROC_LINKS(goto_jump_at_cursor_direct, 0), "goto_jump_at_cursor_direct", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 8 }, { PROC_LINKS(goto_jump_at_cursor_same_panel_direct, 0), "goto_jump_at_cursor_same_panel_direct", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list..", 168, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 29 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel_sticky, 0), "goto_jump_at_cursor_same_panel_sticky", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 399 }, -{ PROC_LINKS(goto_jump_at_cursor_sticky, 0), "goto_jump_at_cursor_sticky", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 371 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel_sticky, 0), "goto_jump_at_cursor_same_panel_sticky", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 360 }, +{ PROC_LINKS(goto_jump_at_cursor_sticky, 0), "goto_jump_at_cursor_sticky", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 332 }, { PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 585 }, { PROC_LINKS(goto_next_jump_direct, 0), "goto_next_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 48 }, { PROC_LINKS(goto_next_jump_no_skips_direct, 0), "goto_next_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 66 }, -{ PROC_LINKS(goto_next_jump_no_skips_sticky, 0), "goto_next_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 522 }, -{ PROC_LINKS(goto_next_jump_sticky, 0), "goto_next_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 492 }, +{ PROC_LINKS(goto_next_jump_no_skips_sticky, 0), "goto_next_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 483 }, +{ PROC_LINKS(goto_next_jump_sticky, 0), "goto_next_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 453 }, { PROC_LINKS(goto_prev_jump_direct, 0), "goto_prev_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 57 }, { PROC_LINKS(goto_prev_jump_no_skips_direct, 0), "goto_prev_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 75 }, -{ PROC_LINKS(goto_prev_jump_no_skips_sticky, 0), "goto_prev_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 538 }, -{ PROC_LINKS(goto_prev_jump_sticky, 0), "goto_prev_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 508 }, +{ PROC_LINKS(goto_prev_jump_no_skips_sticky, 0), "goto_prev_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 499 }, +{ PROC_LINKS(goto_prev_jump_sticky, 0), "goto_prev_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 469 }, { PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 471 }, { PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 457 }, { PROC_LINKS(highlight_next_scope_absolute, 0), "highlight_next_scope_absolute", 29, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 363 }, @@ -334,8 +334,8 @@ static Command_Metadata fcoder_metacmd_table[202] = { { PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 256 }, { PROC_LINKS(newline_or_goto_position_direct, 0), "newline_or_goto_position_direct", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 101 }, { PROC_LINKS(newline_or_goto_position_same_panel_direct, 0), "newline_or_goto_position_same_panel_direct", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 116 }, -{ PROC_LINKS(newline_or_goto_position_same_panel_sticky, 0), "newline_or_goto_position_same_panel_sticky", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 609 }, -{ PROC_LINKS(newline_or_goto_position_sticky, 0), "newline_or_goto_position_sticky", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 594 }, +{ PROC_LINKS(newline_or_goto_position_same_panel_sticky, 0), "newline_or_goto_position_same_panel_sticky", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 570 }, +{ PROC_LINKS(newline_or_goto_position_sticky, 0), "newline_or_goto_position_sticky", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 555 }, { PROC_LINKS(open_all_code, 0), "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1055 }, { PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1062 }, { PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder theme selector list.", 37, "w:\\4ed\\code\\4coder_lists.cpp", 31, 792 }, diff --git a/4coder_jump_sticky.cpp b/4coder_jump_sticky.cpp index e63e6bd7..af1c4c19 100644 --- a/4coder_jump_sticky.cpp +++ b/4coder_jump_sticky.cpp @@ -38,55 +38,6 @@ binary_search(uint32_t *array, int32_t stride, int32_t count, uint32_t x){ return(i); } -static Sticky_Jump_Destination_Array -make_sticky_jump_destination_array(uint32_t first_jump_index, Marker_Handle handle){ - Sticky_Jump_Destination_Array r; - r.first_jump_index = first_jump_index; - r.handle = handle; - return(r); -} - -static Sticky_Jump_Source -make_sticky_jump_source(uint32_t line_number, uint32_t flags){ - Sticky_Jump_Source r; - r.line_number = line_number; - r.flags = flags; - return(r); -} - -static void -double_dst_max(General_Memory *general, Marker_List *list){ - uint32_t new_dst_max = list->dst_max*2; - list->dst = gen_realloc_array(general, Sticky_Jump_Destination_Array, list->dst, list->dst_max, new_dst_max); - list->dst_max = new_dst_max; -} - -static void -double_jump_max(General_Memory *general, Marker_List *list){ - uint32_t new_jump_max = list->jump_max*2; - list->jumps = gen_realloc_array(general, Sticky_Jump_Source, list->jumps, list->jump_max, new_jump_max); - list->jump_max = new_jump_max; -} - -static void -marker_list_remove_references(Marker_List *list, Marker_Handle handle){ - int32_t count = list->dst_count; - Sticky_Jump_Destination_Array *dst = list->dst; - for (int32_t i = 0; i < count; ++i, ++dst){ - if (dst->handle == handle){ - dst->handle = 0; - } - } -} - -static void -sticky_jump_markers_cleanup(Application_Links *app, Marker_Handle handle, void *user_data, uint32_t user_data_size){ - if (user_data_size == sizeof(Marker_List*)){ - Marker_List *list = *(Marker_List**)user_data; - marker_list_remove_references(list, handle); - } -} - static Sticky_Jump_Array parse_buffer_to_jump_array(Application_Links *app, Partition *arena, Buffer_Summary buffer){ Sticky_Jump_Array result = {0}; @@ -176,7 +127,7 @@ init_marker_list(Application_Links *app, Partition *part, General_Memory *genera Dynamic_Scope scope_array[2]; scope_array[0] = buffer_get_dynamic_scope(app, buffer_id); - List_Node_Handle list_sentinel = managed_list_node_alloc(app, scope_array[0]); + Managed_Object list_sentinel = managed_list_node_alloc(app, scope_array[0]); for (int32_t i = 0; i < buffer_ranges.count; i += 1){ Range range = buffer_ranges.ranges[i]; @@ -186,18 +137,18 @@ init_marker_list(Application_Links *app, Partition *part, General_Memory *genera scope_array[1] = buffer_get_dynamic_scope(app, target_buffer_id); Dynamic_Scope scope = get_intersected_dynamic_scope(app, scope_array, ArrayCount(scope_array)); - Marker_Handle marker_handle = buffer_add_markers(app, target_buffer_id, jump_count, &scope); + Managed_Object marker_handle = buffer_add_markers(app, target_buffer_id, jump_count, &scope); Temp_Memory marker_temp = begin_temp_memory(part); Marker *markers = push_array(part, Marker, jump_count); for (int32_t j = 0; j < jump_count; j += 1){ markers[j].pos = jumps.jumps[j + range.first].jump_pos; markers[j].lean_right = false; } - buffer_set_markers(app, handle, 0, jump_count, markers); + buffer_set_markers(app, marker_handle, 0, jump_count, markers); end_temp_memory(marker_temp); int32_t line_details_mem_size = sizeof(Sticky_Jump_Line_Details)*jump_count; - Memory_Handle memory = managed_memory_alloc(app, scope, line_details_mem_size); + Managed_Object memory = managed_memory_alloc(app, scope, line_details_mem_size); Temp_Memory details_temp = begin_temp_memory(part); Sticky_Jump_Line_Details *details = push_array(part, Sticky_Jump_Line_Details, jump_count); for (int32_t j = 0; j < jump_count; j += 1){ @@ -208,12 +159,12 @@ init_marker_list(Application_Links *app, Partition *part, General_Memory *genera managed_memory_set(app, memory, 0, details, line_details_mem_size); end_temp_memory(details_temp); - List_Node_Handle node_handle = managed_list_node_alloc(app, scope, sizeof(Sticky_Jump_Node_Header)); + Managed_Object node_handle = managed_list_node_alloc(app, scope, sizeof(Sticky_Jump_Node_Header)); managed_list_node_insert(app, list_sentinel, node_handle, ListInsert_Back); Sticky_Jump_Node_Header node_header = {0}; node_header.memory = memory; node_header.markers = marker_handle; - node_handle.count = jump_count; + node_header.count = jump_count; managed_memory_set(app, node_handle, 0, &node_header, sizeof(node_header)); } end_temp_memory(temp); @@ -282,12 +233,6 @@ init_marker_list(Application_Links *app, Partition *part, General_Memory *genera } #endif -static void -free_marker_list(General_Memory *general, Marker_List list){ - general_memory_free(general, list.dst); - general_memory_free(general, list.jumps); -} - static void delete_marker_list(Marker_List_Node *node){ zdll_remove(marker_list_first, marker_list_last, node); diff --git a/4coder_jump_sticky.h b/4coder_jump_sticky.h index 013afad6..df4f718e 100644 --- a/4coder_jump_sticky.h +++ b/4coder_jump_sticky.h @@ -27,8 +27,8 @@ struct Sticky_Jump_Array{ }; struct Sticky_Jump_Node_Header{ - Memory_Handle memory; - Marker_Handle markers; + Managed_Object memory; + Managed_Object markers; int32_t first_index; int32_t count; }; @@ -37,25 +37,7 @@ enum Jump_Location_Flag{ JumpFlag_IsSubJump = 0x1, }; -struct Sticky_Jump_Destination_Array{ - uint32_t first_jump_index; - Marker_Handle handle; -}; - -struct Sticky_Jump_Source{ - uint32_t line_number; - uint32_t flags; -}; - struct Marker_List{ - Sticky_Jump_Destination_Array *dst; - int32_t dst_count; - int32_t dst_max; - - Sticky_Jump_Source *jumps; - int32_t jump_count; - int32_t jump_max; - int32_t previous_size; }; diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index de2bc378..c86a5018 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -788,65 +788,46 @@ DOC_SEE(Buffer_Batch_Edit_Type) return(result); } -API_EXPORT Marker_Handle -Buffer_Add_Markers(Application_Links *app, Buffer_Summary *buffer, uint32_t marker_count, Marker_Delete_Callback *callback, void *user_data, uint32_t user_data_size) +API_EXPORT Managed_Object +Buffer_Add_Markers(Application_Links *app, Buffer_ID buffer_id, uint32_t marker_count, Dynamic_Scope *scope) /* -DOC_PARAM(buffer, The buffer on which to add the new markers.) +DOC_PARAM(buffer_id, The id of the buffer on which to add the new markers.) DOC_PARAM(marker_count, How many markers to be stored in the new marker array.) -DOC_PARAM(callback, A callback that will be called if the buffer closes with these markers still attached.) -DOC_PARAM(user_data, A pointer to data that will be passed to the callback on close. The data will be copied so you do not need to manage it's lifetime.) -DOC_PARAM(user_data_size, The size of the data pointed to by user_data in bytes.) +DOC_PARAM(scope, Optional dynamic scope tied to the marker's lifetime. Note this scope will be implicitly interesected with the scope tied to the target buffer.) DOC_RETURN(If this call succeeds it returns a handle to the new markers. If it fails it returns a null handle.) DOC(This call makes an allocation of markers for the specified buffer. The newly allocated markers are not immediately activated. To activate a marker use buffer_set_markers to give the marker a value. The markers will remain allocated on the buffer until buffer_remove_markers is called or until the buffer is killed.) DOC_SEE(Marker) */{ Command_Data *cmd = (Command_Data*)app->cmd_context; Models *models = cmd->models; - Editing_File *file = imp_get_file(cmd, buffer); - - Marker_Handle result = 0; + Editing_File *file = imp_get_file(cmd, buffer_id); + Managed_Object result = 0; if (file != 0){ - result = allocate_markers_state(&models->mem.general, file, marker_count, - callback, user_data, user_data_size); + result = (Managed_Object)allocate_markers_state(&models->mem.general, file, marker_count); } - return(result); } API_EXPORT Buffer_Summary -Get_Buffer_By_Marker_Handle(Application_Links *app, Marker_Handle marker, Access_Flag access) +Get_Buffer_By_Marker_Handle(Application_Links *app, Managed_Object marker_object, Access_Flag access) /* -DOC_PARAM(marker, The marker handle to query.) +DOC_PARAM(marker_object, The marker handle to query.) DOC_PARAM(access, The access parameter determines what levels of protection this call can access.) DOC_SEE(Marker) */{ Buffer_Summary buffer = {0}; - if (marker != 0){ - Buffer_ID buffer_id = get_buffer_id_from_marker_handle(marker); + if (object != 0){ + void *ptr = IntAsPtr(marker_object); + Buffer_ID buffer_id = get_buffer_id_from_marker_handle(ptr); buffer = Get_Buffer(app, buffer_id, access); } return(buffer); } -API_EXPORT Data -Get_User_Data_By_Marker_Handle(Application_Links *app, Marker_Handle marker) -/* -DOC_PARAM(marker, The marker thandle to query.) -DOC_RETURN(Returns a data struct containing the user data passed in to buffer_add_markers, or a zero struct if the handle is null.) -DOC_SEE(Marker) -*/{ - Data data = {0}; - if (marker != 0){ - data = get_user_data_from_marker_handle(marker); - } - return(data); -} - API_EXPORT bool32 -Buffer_Set_Markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers) +Buffer_Set_Markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers) /* -DOC_PARAM(buffer, The buffer on which the specified markers are attached.) -DOC_PARAM(marker, The marker handle refering to the markers to be set.) +DOC_PARAM(marker_object, The marker handle refering to the markers to be set.) DOC_PARAM(first_marker_index, The index of the first marker to be set by this call.) DOC_PARAM(marker_count, The number of markers to be set by this call.) DOC_PARAM(source_markers, An array of marker_count Markers to specify the values to set to the markers specified.) @@ -855,23 +836,24 @@ DOC(This call sets the value of a Marker, eliminating whatever value was there b DOC_SEE(Marker) */{ Command_Data *cmd = (Command_Data*)app->cmd_context; - Editing_File *file = imp_get_file(cmd, buffer); - bool32 result = false; - if (file != 0){ - if (markers_set(file, marker, first_marker_index, marker_count, source_markers)){ - result = true; + if (marker_object != 0){ + void *ptr = IntAsPtr(marker_object); + Buffer_ID buffer_id = get_buffer_id_from_marker_handle(ptr); + Editing_File *file = imp_get_file(cmd, buffer_id); + if (file != 0){ + if (markers_set(file, ptr, first_marker_index, marker_count, source_markers)){ + result = true; + } } } - return(result); } API_EXPORT bool32 -Buffer_Get_Markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out) +Buffer_Get_Markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out) /* -DOC_PARAM(buffer, The buffer on which the specified markers are attached.) -DOC_PARAM(marker, The marker handle refering to the markers to be read.) +DOC_PARAM(marker_object, The marker handle refering to the markers to be read.) DOC_PARAM(first_marker_index, The index of the first marker to be read by this call.) DOC_PARAM(marker_count, The number of markers to be read by this call.) DOC_PARAM(markers_out, An array of marker_count Markers to be filled by the result of the read.) @@ -880,20 +862,22 @@ DOC(When the range specified by first_marker_index and marker_count is a range o DOC_SEE(Marker) */{ Command_Data *cmd = (Command_Data*)app->cmd_context; - Editing_File *file = imp_get_file(cmd, buffer); - bool32 result = false; - if (file != 0){ - if (markers_get(file, marker, first_marker_index, marker_count, markers_out)){ - result = true; + if (marker_object != 0){ + void *ptr = IntAsPtr(marker_object); + Buffer_ID buffer_id = get_buffer_id_from_marker_handle(ptr); + Editing_File *file = imp_get_file(cmd, buffer_id); + if (file != 0){ + if (markers_get(file, ptr, first_marker_index, marker_count, markers_out)){ + result = true; + } } } - return(result); } API_EXPORT bool32 -Buffer_Remove_Markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker) +Buffer_Remove_Markers(Application_Links *app, Managed_Object marker) /* DOC_PARAM(buffer, The buffer on which the specified markers are attached.) DOC_PARAM(marker, The marker handle refering to the markers to be detached from the buffer.) @@ -903,15 +887,17 @@ DOC_SEE(buffer_add_markers) */{ Command_Data *cmd = (Command_Data*)app->cmd_context; Models *models = cmd->models; - Editing_File *file = imp_get_file(cmd, buffer); - bool32 result = false; - if (file != 0){ - if (markers_free(&models->mem.general, file, marker)){ - result = true; + if (marker_object != 0){ + void *ptr = IntAsPtr(marker_object); + Buffer_ID buffer_id = get_buffer_id_from_marker_handle(ptr); + Editing_File *file = imp_get_file(cmd, buffer_id); + if (file != 0){ + if (markers_free(&models->mem.general, file, ptr)){ + result = true; + } } } - return(result); } @@ -2369,6 +2355,7 @@ Get_Intersected_Dynamic_Scope(Application_Links *app, Dynamic_Scope *intersected { Command_Data *cmd = (Command_Data*)app->cmd_context; Models *models = cmd->models; + Lifetime_Allocator *lifetime_allocator = &models->lifetime_allocator; Partition *scratch = &models->mem.part; Dynamic_Scope result = {0}; @@ -2388,11 +2375,13 @@ Get_Intersected_Dynamic_Scope(Application_Links *app, Dynamic_Scope *intersected case DynamicScopeType_Intersected: { Lifetime_Key *key = (Lifetime_Key*)IntAsPtr(handle.intersected_opaque_handle); - i32 member_count = key->count; - Lifetime_Object **key_member_ptr = key->members; - for (i32 j = 0; j < member_count; j += 1, key_member_ptr += 1){ - Lifetime_Object **new_object_ptr = push_array(scratch, Lifetime_Object*, 1); - *new_object_ptr = *key_member_ptr; + if (lifetime_key_check(lifetime_allocator, key)){ + i32 member_count = key->count; + Lifetime_Object **key_member_ptr = key->members; + for (i32 j = 0; j < member_count; j += 1, key_member_ptr += 1){ + Lifetime_Object **new_object_ptr = push_array(scratch, Lifetime_Object*, 1); + *new_object_ptr = *key_member_ptr; + } } }break; @@ -2426,7 +2415,6 @@ Get_Intersected_Dynamic_Scope(Application_Links *app, Dynamic_Scope *intersected member_count = lifetime_sort_and_dedup_object_set(object_ptr_array, member_count); General_Memory *general = &models->mem.general; - Lifetime_Allocator *lifetime_allocator = &models->lifetime_allocator; Lifetime_Key *key = lifetime_get_or_create_intersection_key(general, lifetime_allocator, object_ptr_array, member_count); result.type = DynamicScopeType_Intersected; result.intersected_opaque_handle = (u64)(PtrAsInt(key)); @@ -2472,6 +2460,7 @@ Managed_Variable_Create_Or_Get_ID(Application_Links *app, char *null_terminated_ internal bool32 get_dynamic_variable(Command_Data *cmd, Dynamic_Scope handle, int32_t location, uint64_t **ptr_out){ Models *models = cmd->models; + Lifetime_Allocator *lifetime_allocator = &models->lifetime_allocator; General_Memory *general = &models->mem.general; Dynamic_Variable_Layout *layout = &models->variable_layout; Dynamic_Variable_Block *block = 0; @@ -2485,7 +2474,9 @@ get_dynamic_variable(Command_Data *cmd, Dynamic_Scope handle, int32_t location, case DynamicScopeType_Intersected: { Lifetime_Key *key = (Lifetime_Key*)IntAsPtr(handle.intersected_opaque_handle); - block = &key->dynamic_vars; + if (lifetime_key_check(lifetime_allocator, key)){ + block = &key->dynamic_vars; + } }break; case DynamicScopeType_Buffer: diff --git a/4ed_dynamic_variables.cpp b/4ed_dynamic_variables.cpp index 58475249..effd7428 100644 --- a/4ed_dynamic_variables.cpp +++ b/4ed_dynamic_variables.cpp @@ -122,6 +122,125 @@ dynamic_variables_get_ptr(General_Memory *general, //////////////////////////////// +internal u64 +ptr_check__hash(Lifetime_Key *key){ + u64 x = (u64)(PtrAsInt(key)); + return(x >> 3); +} + +internal b32 +ptr_check_table_check(Ptr_Check_Table *table, void *key){ + u32 max = table->max; + if (max > 0 && table->count > 0){ + u64 hash = ptr_check_hash(key); + u32 first_index = hash%max; + u32 index = first_index; + void *keys = table->keys; + for (;;){ + if (keys[index] == key){ + return(true); + } + else if (hashes[index] == LifetimeKeyHash_Empty){ + return(false); + } + index += 1; + if (index == max){ + index = 0; + } + if (index == first_index){ + return(false); + } + } + } + return(false); +} + +internal Ptr_Check_Table +ptr_check_table_copy(General_Memory *general, Ptr_Check_Table *table, u32 new_max); + +internal void +ptr_check_table_insert(General_Memory *general, Ptr_Check_Table *table, void *key){ + { + u32 max = table->max; + u32 count = table->count; + if (max == 0 || (count + 1)*6 > max*5){ + Assert(general != 0); + Ptr_Check_Table new_table = ptr_check_table_copy(general, *table, max*2); + general_memory_free(general, table->mem_ptr); + *table = new_table; + } + } + + { + u32 max = table->max; + if (max > 0 && table->count > 0){ + u64 hash = ptr_check_hash(key); + u32 first_index = hash%max; + u32 index = first_index; + void **keys = table->keys; + for (;;){ + if (keys[index] == 0 || keys[index] == (Lifetime_Key*)1){ + keys[index] = key; + return; + } + index += 1; + if (index == max){ + index = 0; + } + if (index == first_index){ + return; + } + } + } + } +} + +internal void +ptr_check_table_erase(Ptr_Check_Table *table, Lifetime_Key *erase_key){ + u32 max = table->max; + if (max > 0 && table->count > 0){ + u64 hash = ptr_check_hash(erase_key); + u32 first_index = hash%max; + u32 index = first_index; + void **keys = table->keys; + for (;;){ + if (keys[index] == erase_key){ + keys[index] = 0; + return; + } + else if (hashes[index] == LifetimeKeyHash_Empty){ + return; + } + index += 1; + if (index == max){ + index = 0; + } + if (index == first_index){ + return; + } + } + } +} + +internal Lifetime_Key_Check_Table +ptr_check_table_copy(General_Memory *general, Lifetime_Key_Check_Table *table, u32 new_max){ + Lifetime_Key_Check_Table new_table = {0}; + new_table.max = clamp_bottom(table.max, new_max); + new_table.max = clamp_bottom(307, new_table.max); + i32 item_size = sizeof(*new_table.keys); + new_table.keys = (Lifetime_Key**)general_memory_allocate(general, item_size*new_table.max); + memset(new_table.keys, 0, item_size*new_table.max); + for (u32 i = 0; i < table.max; i += 1){ + u64 k = (u64)(PtrAsInt(table.keys[i])); + if (k > 1){ + ptr_check_table_insert(0, &new_table, table.keys[i]); + } + } + return(new_table); +} + +//////////////////////////////// + internal u64 lifetime__key_hash(Lifetime_Object **object_ptr_array, i32 count){ u64 hash = bit_1; @@ -219,6 +338,7 @@ lifetime__key_table_erase(Lifetime_Key_Table *table, Lifetime_Key *erase_key){ if (erase_key == key){ hashes[index] = LifetimeKeyHash_Deleted; table->keys[index] = 0; + return; } } else if (hashes[index] == LifetimeKeyHash_Empty){ @@ -299,6 +419,7 @@ lifetime__free_key(General_Memory *general, Lifetime_Allocator *lifetime_allocat // Free lifetime__key_table_erase(&lifetime_allocator->key_table, key); + ptr_check_table_erase(&lifetime_allocator->key_check_table, key); general_memory_free(general, key->members); zdll_push_back(lifetime_allocator->free_keys.first, lifetime_allocator->free_keys.last, key); } @@ -475,9 +596,15 @@ lifetime_get_or_create_intersection_key(General_Memory *general, Lifetime_Alloca dynamic_variables_block_init(general, &new_key->dynamic_vars); lifetime__key_table_insert(general, &lifetime_allocator->key_table, hash, new_key); + ptr_check_table_insert(general, &lifetime_allocator->key_check_table, new_key); return(new_key); } +internal b32 +lifetime_key_check(Lifetime_Allocator *lifetime_allocator, Lifetime_Key *key){ + return(ptr_check_table_check(&lifetime_allocator->key_check_table, key)); +} + // BOTTOM diff --git a/4ed_dynamic_variables.h b/4ed_dynamic_variables.h index 854b09da..b62f1c3b 100644 --- a/4ed_dynamic_variables.h +++ b/4ed_dynamic_variables.h @@ -33,6 +33,14 @@ struct Dynamic_Variable_Block{ //////////////////////////////// +struct Ptr_Check_Table{ + void **keys; + u32 count; + u32 max; +}; + +//////////////////////////////// + global_const i32 lifetime_key_reference_per_node = 32; struct Lifetime_Key_Ref_Node{ @@ -105,6 +113,12 @@ struct Lifetime_Allocator{ Lifetime_Object_List free_objects; Lifetime_Key_List free_keys; Lifetime_Key_Table key_table; + Lifetime_Ptr_Check_Table key_check_table; +}; + +struct Lifetime_Key_With_Opaque_ID{ + Lifetime_Key *key; + u64 opaque_id; }; #endif diff --git a/4ed_file.cpp b/4ed_file.cpp index 77e1362d..6fe91248 100644 --- a/4ed_file.cpp +++ b/4ed_file.cpp @@ -45,23 +45,15 @@ clear_file_markers_state(Application_Links *app, General_Memory *general, Editin } internal void* -allocate_markers_state(General_Memory *general, Editing_File *file, u32 new_array_max, - Marker_Delete_Callback *callback, void *user_data, u32 user_data_size){ - u32 rounded_user_data_size = l_round_up_u32(user_data_size, 8); - u32 memory_size = sizeof(Marker_Array) + rounded_user_data_size + sizeof(Marker)*new_array_max; - memory_size = l_round_up_u32(memory_size, KB(4)); - u32 real_max = (memory_size - sizeof(Marker_Array) - rounded_user_data_size)/sizeof(Marker); +allocate_markers_state(General_Memory *general, Editing_File *file, u32 new_array_max){ + u32 memory_size = sizeof(Marker_Array) + sizeof(Marker)*new_array_max; Marker_Array *array = (Marker_Array*)general_memory_allocate(general, memory_size); dll_insert_back(&file->markers.sentinel, array); array->buffer_id = file->id; array->count = 0; array->sim_max = new_array_max; - array->max = real_max; - array->callback = callback; - array->user_data_size = user_data_size; - array->rounded_user_data_size = rounded_user_data_size; - memcpy(array + 1, user_data, user_data_size); + array->max = new_array_max; ++file->markers.array_count; diff --git a/4ed_file.h b/4ed_file.h index 14a7b6ef..2e8ee26b 100644 --- a/4ed_file.h +++ b/4ed_file.h @@ -46,9 +46,6 @@ struct Marker_Array{ u32 count; u32 sim_max; u32 max; - Marker_Delete_Callback *callback; - u32 user_data_size; - u32 rounded_user_data_size; }; #define MarkerArrayBase(a) (Marker*)((u8*)(a) + sizeof(Marker_Array) + ((Marker_Array*)(a))->rounded_user_data_size)