mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-30 20:20:03 +00:00
Add CreateSharedString to python builder (#7608)
Co-authored-by: Derek Bailey <derekbailey@google.com>
This commit is contained in:
@@ -112,7 +112,8 @@ class Builder(object):
|
|||||||
|
|
||||||
## @cond FLATBUFFERS_INTENRAL
|
## @cond FLATBUFFERS_INTENRAL
|
||||||
__slots__ = ("Bytes", "current_vtable", "head", "minalign", "objectEnd",
|
__slots__ = ("Bytes", "current_vtable", "head", "minalign", "objectEnd",
|
||||||
"vtables", "nested", "forceDefaults", "finished", "vectorNumElems")
|
"vtables", "nested", "forceDefaults", "finished", "vectorNumElems",
|
||||||
|
"sharedStrings")
|
||||||
|
|
||||||
"""Maximum buffer size constant, in bytes.
|
"""Maximum buffer size constant, in bytes.
|
||||||
|
|
||||||
@@ -141,6 +142,7 @@ class Builder(object):
|
|||||||
self.vtables = {}
|
self.vtables = {}
|
||||||
self.nested = False
|
self.nested = False
|
||||||
self.forceDefaults = False
|
self.forceDefaults = False
|
||||||
|
self.sharedStrings = {}
|
||||||
## @endcond
|
## @endcond
|
||||||
self.finished = False
|
self.finished = False
|
||||||
|
|
||||||
@@ -405,6 +407,20 @@ class Builder(object):
|
|||||||
self.vectorNumElems = None
|
self.vectorNumElems = None
|
||||||
return self.Offset()
|
return self.Offset()
|
||||||
|
|
||||||
|
def CreateSharedString(self, s, encoding='utf-8', errors='strict'):
|
||||||
|
"""
|
||||||
|
CreateSharedString checks if the string is already written to the buffer
|
||||||
|
before calling CreateString.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if s in self.sharedStrings:
|
||||||
|
return self.sharedStrings[s]
|
||||||
|
|
||||||
|
off = self.CreateString(s, encoding, errors)
|
||||||
|
self.sharedStrings[s] = off
|
||||||
|
|
||||||
|
return off
|
||||||
|
|
||||||
def CreateString(self, s, encoding='utf-8', errors='strict'):
|
def CreateString(self, s, encoding='utf-8', errors='strict'):
|
||||||
"""CreateString writes a null-terminated byte string as a vector."""
|
"""CreateString writes a null-terminated byte string as a vector."""
|
||||||
|
|
||||||
|
|||||||
@@ -983,6 +983,48 @@ class TestByteLayout(unittest.TestCase):
|
|||||||
b.EndVector()
|
b.EndVector()
|
||||||
self.assertBuilderEquals(b, [2, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB])
|
self.assertBuilderEquals(b, [2, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB])
|
||||||
|
|
||||||
|
def test_create_ascii_shared_string(self):
|
||||||
|
b = flatbuffers.Builder(0)
|
||||||
|
b.CreateSharedString(u'foo', encoding='ascii')
|
||||||
|
b.CreateSharedString(u'foo', encoding='ascii')
|
||||||
|
|
||||||
|
# 0-terminated, no pad:
|
||||||
|
self.assertBuilderEquals(b, [3, 0, 0, 0, 'f', 'o', 'o', 0])
|
||||||
|
b.CreateSharedString(u'moop', encoding='ascii')
|
||||||
|
b.CreateSharedString(u'moop', encoding='ascii')
|
||||||
|
# 0-terminated, 3-byte pad:
|
||||||
|
self.assertBuilderEquals(b, [
|
||||||
|
4, 0, 0, 0, 'm', 'o', 'o', 'p', 0, 0, 0, 0, 3, 0, 0, 0, 'f', 'o', 'o', 0
|
||||||
|
])
|
||||||
|
|
||||||
|
def test_create_utf8_shared_string(self):
|
||||||
|
b = flatbuffers.Builder(0)
|
||||||
|
b.CreateSharedString(u'Цлїςσδε')
|
||||||
|
b.CreateSharedString(u'Цлїςσδε')
|
||||||
|
self.assertBuilderEquals(b, '\x0e\x00\x00\x00\xd0\xa6\xd0\xbb\xd1\x97' \
|
||||||
|
'\xcf\x82\xcf\x83\xce\xb4\xce\xb5\x00\x00')
|
||||||
|
|
||||||
|
b.CreateSharedString(u'フムアムカモケモ')
|
||||||
|
b.CreateSharedString(u'フムアムカモケモ')
|
||||||
|
self.assertBuilderEquals(b, '\x18\x00\x00\x00\xef\xbe\x8c\xef\xbe\x91' \
|
||||||
|
'\xef\xbd\xb1\xef\xbe\x91\xef\xbd\xb6\xef\xbe\x93\xef\xbd\xb9\xef' \
|
||||||
|
'\xbe\x93\x00\x00\x00\x00\x0e\x00\x00\x00\xd0\xa6\xd0\xbb\xd1\x97' \
|
||||||
|
'\xcf\x82\xcf\x83\xce\xb4\xce\xb5\x00\x00')
|
||||||
|
|
||||||
|
def test_create_arbitrary_shared_string(self):
|
||||||
|
b = flatbuffers.Builder(0)
|
||||||
|
s = '\x01\x02\x03'
|
||||||
|
b.CreateSharedString(s) # Default encoding is utf-8.
|
||||||
|
b.CreateSharedString(s)
|
||||||
|
# 0-terminated, no pad:
|
||||||
|
self.assertBuilderEquals(b, [3, 0, 0, 0, 1, 2, 3, 0])
|
||||||
|
s2 = '\x04\x05\x06\x07'
|
||||||
|
b.CreateSharedString(s2) # Default encoding is utf-8.
|
||||||
|
b.CreateSharedString(s2)
|
||||||
|
# 0-terminated, 3-byte pad:
|
||||||
|
self.assertBuilderEquals(
|
||||||
|
b, [4, 0, 0, 0, 4, 5, 6, 7, 0, 0, 0, 0, 3, 0, 0, 0, 1, 2, 3, 0])
|
||||||
|
|
||||||
def test_create_ascii_string(self):
|
def test_create_ascii_string(self):
|
||||||
b = flatbuffers.Builder(0)
|
b = flatbuffers.Builder(0)
|
||||||
b.CreateString(u'foo', encoding='ascii')
|
b.CreateString(u'foo', encoding='ascii')
|
||||||
@@ -2588,6 +2630,13 @@ class TestExceptions(unittest.TestCase):
|
|||||||
assertRaises(self, lambda: b.PrependUOffsetTRelative(1),
|
assertRaises(self, lambda: b.PrependUOffsetTRelative(1),
|
||||||
flatbuffers.builder.OffsetArithmeticError)
|
flatbuffers.builder.OffsetArithmeticError)
|
||||||
|
|
||||||
|
def test_create_shared_string_is_nested_error(self):
|
||||||
|
b = flatbuffers.Builder(0)
|
||||||
|
b.StartObject(0)
|
||||||
|
s = 'test1'
|
||||||
|
assertRaises(self, lambda: b.CreateSharedString(s),
|
||||||
|
flatbuffers.builder.IsNestedError)
|
||||||
|
|
||||||
def test_create_string_is_nested_error(self):
|
def test_create_string_is_nested_error(self):
|
||||||
b = flatbuffers.Builder(0)
|
b = flatbuffers.Builder(0)
|
||||||
b.StartObject(0)
|
b.StartObject(0)
|
||||||
|
|||||||
Reference in New Issue
Block a user