|
5 | 5 | create_string_buffer, string_at, |
6 | 6 | create_unicode_buffer, wstring_at, |
7 | 7 | memmove, memset, |
| 8 | + memoryview_at, c_void_p, |
8 | 9 | c_char_p, c_byte, c_ubyte, c_wchar) |
9 | 10 |
|
10 | 11 |
|
@@ -77,6 +78,25 @@ def test_wstring_at(self): |
77 | 78 | self.assertEqual(wstring_at(a, 16), "Hello, World\0\0\0\0") |
78 | 79 | self.assertEqual(wstring_at(a, 0), "") |
79 | 80 |
|
| 81 | + def test_memoryview_at(self): |
| 82 | + b = (c_byte * 10)() |
| 83 | + |
| 84 | + foreign_ptr = cast(b, c_void_p) |
| 85 | + foreign_ptr_size = len(b) |
| 86 | + |
| 87 | + # memoryview_at() is normally used with pointers given to us |
| 88 | + # by C APIs. It's an efficient way to get a buffer |
| 89 | + # representing a dynamically-sized memory region without having |
| 90 | + # to create an array type first. |
| 91 | + v = memoryview_at(foreign_ptr, foreign_ptr_size) |
| 92 | + |
| 93 | + # test that writes to source buffer get reflected in memoryview |
| 94 | + b[:] = b"0123456789" |
| 95 | + self.assertEqual(bytes(v), b"0123456789") |
| 96 | + |
| 97 | + # test that writes to memoryview get reflected in source buffer |
| 98 | + v[:] = b"9876543210" |
| 99 | + self.assertEqual(bytes(b), b"9876543210") |
80 | 100 |
|
81 | 101 | if __name__ == "__main__": |
82 | 102 | unittest.main() |
0 commit comments