A function to efficiently check for the common case pure ascii strings

This commit is contained in:
Kovid Goyal 2016-10-17 09:11:10 +05:30
parent 3bc7fc1933
commit f345ac1bdd
2 changed files with 19 additions and 0 deletions

View File

@ -3,6 +3,7 @@
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net> # License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
import os import os
import sys
import termios import termios
import struct import struct
import shlex import shlex
@ -82,3 +83,10 @@ def hangup():
pgrp = os.getpgid(pid) pgrp = os.getpgid(pid)
os.killpg(pgrp, signal.SIGHUP) os.killpg(pgrp, signal.SIGHUP)
os.close(create_pty()[0]) os.close(create_pty()[0])
base_size = sys.getsizeof('')
def is_simple_string(x):
' We use the fact that python stores unicode strings with a 1-byte representation when possible '
return sys.getsizeof(x) == base_size + len(x)

View File

@ -2,9 +2,12 @@
# vim:fileencoding=utf-8 # vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net> # License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
import codecs
from . import BaseTest, set_text_in_line from . import BaseTest, set_text_in_line
from kitty.data_types import Line, Cursor from kitty.data_types import Line, Cursor
from kitty.utils import is_simple_string, wcwidth
class TestDataTypes(BaseTest): class TestDataTypes(BaseTest):
@ -72,3 +75,11 @@ class TestDataTypes(BaseTest):
l.set_decoration(0, q.decoration) l.set_decoration(0, q.decoration)
c = l.cursor_from(0) c = l.cursor_from(0)
self.ae(c, q) self.ae(c, q)
def test_utils(self):
d = codecs.getincrementaldecoder('utf-8')('strict').decode
self.ae(tuple(map(wcwidth, 'a1\0')), (1, 1, 0, 2))
for s in ('abd38453*(+\n\t\f\r !\0~[]{}()"\':;<>/?ASD`',):
self.assertTrue(is_simple_string(s))
self.assertTrue(is_simple_string(d(s.encode('utf-8'))))
self.assertFalse(is_simple_string('a1コ'))