Move hyperlink hashmap to verstable

Also speedup getting url for hyperlink id by using a second hash map for
it. Change behavior when there are too many hyperlinks to discard new
hyperlinks instead of remapping old hyperlink id and making some old
hyperlink wrong.
This commit is contained in:
Kovid Goyal
2024-07-09 15:11:54 +05:30
parent 9727ea1cac
commit 2955c3f7a7
4 changed files with 116 additions and 128 deletions

View File

@@ -825,32 +825,32 @@ class TestScreen(BaseTest):
s.draw('hij')
self.ae(s.line(1).hyperlink_ids(), (1, 1, 2, 2, 2))
set_link()
self.ae([('a:url-a', 1), (':url-b', 2)], s.hyperlinks_as_list())
self.ae({('a:url-a', 1), (':url-b', 2)}, s.hyperlinks_as_set())
s.garbage_collect_hyperlink_pool()
self.ae([('a:url-a', 1), (':url-b', 2)], s.hyperlinks_as_list())
self.ae({('a:url-a', 1), (':url-b', 2)}, s.hyperlinks_as_set())
for i in range(s.lines + 2):
s.linefeed()
s.garbage_collect_hyperlink_pool()
self.ae([('a:url-a', 1), (':url-b', 2)], s.hyperlinks_as_list())
self.ae({('a:url-a', 1), (':url-b', 2)}, s.hyperlinks_as_set())
for i in range(s.lines * 2):
s.linefeed()
s.garbage_collect_hyperlink_pool()
self.assertFalse(s.hyperlinks_as_list())
self.assertFalse(s.hyperlinks_as_set())
set_link('url-a', 'x')
s.draw('a')
set_link('url-a', 'y')
s.draw('a')
set_link()
self.ae([('x:url-a', 1), ('y:url-a', 2)], s.hyperlinks_as_list())
self.ae({('x:url-a', 1), ('y:url-a', 2)}, s.hyperlinks_as_set())
s = self.create_screen()
set_link('u' * 2048)
s.draw('a')
self.ae([(':' + 'u' * 2045, 1)], s.hyperlinks_as_list())
self.ae({(':' + 'u' * 2045, 1)}, s.hyperlinks_as_set())
s = self.create_screen()
set_link('u' * 2048, 'i' * 300)
s.draw('a')
self.ae([('i'*256 + ':' + 'u' * (2045 - 256), 1)], s.hyperlinks_as_list())
self.ae({('i'*256 + ':' + 'u' * (2045 - 256), 1)}, s.hyperlinks_as_set())
s = self.create_screen()
set_link('1'), s.draw('1')
@@ -859,19 +859,19 @@ class TestScreen(BaseTest):
s.cursor.x = 1
set_link(), s.draw('X')
self.ae(s.line(0).hyperlink_ids(), (1, 0, 3, 0, 0))
self.ae([(':1', 1), (':2', 2), (':3', 3)], s.hyperlinks_as_list())
self.ae({(':1', 1), (':2', 2), (':3', 3)}, s.hyperlinks_as_set())
s.garbage_collect_hyperlink_pool()
self.ae([(':1', 1), (':3', 2)], s.hyperlinks_as_list())
self.ae({(':1', 1), (':3', 2)}, s.hyperlinks_as_set())
set_link('3'), s.draw('3')
self.ae([(':1', 1), (':3', 2)], s.hyperlinks_as_list())
self.ae({(':1', 1), (':3', 2)}, s.hyperlinks_as_set())
set_link('4'), s.draw('4')
self.ae([(':1', 1), (':3', 2), (':4', 3)], s.hyperlinks_as_list())
self.ae({(':1', 1), (':3', 2), (':4', 3)}, s.hyperlinks_as_set())
s = self.create_screen()
set_link('1'), s.draw('1')
set_link('2'), s.draw('2')
set_link('1'), s.draw('1')
self.ae([(':2', 2), (':1', 1)], s.hyperlinks_as_list())
self.ae({(':2', 2), (':1', 1)}, s.hyperlinks_as_set())
s = self.create_screen()
set_link('1'), s.draw('12'), set_link(), s.draw('X'), set_link('1'), s.draw('3')