cython

Форк
0
/
userbuffer.pyx 
74 строки · 1.8 Кб
1

2
__doc__ = u"""
3
>>> b1 = UserBuffer1()
4
>>> m1 = memoryview(b1)
5
>>> m1.tolist()
6
[0, 1, 2, 3, 4]
7
>>> del m1, b1
8

9
>>> b2 = UserBuffer2()
10
>>> m2 = memoryview(b2)
11
UserBuffer2: getbuffer
12
>>> m2.tolist()
13
[5, 6, 7, 8, 9]
14
>>> del m2, b2
15
UserBuffer2: release
16
"""
17

18
cdef extern from *:
19
    ctypedef struct Py_buffer # redeclared
20
    enum: PyBUF_SIMPLE
21
    int PyBuffer_FillInfo(Py_buffer *, object, void *, Py_ssize_t, bint, int) except -1
22
    int  PyObject_GetBuffer(object, Py_buffer *, int) except -1
23
    void PyBuffer_Release(Py_buffer *)
24

25
cdef char global_buf[5]
26
global_buf[0:5] = [0, 1, 2, 3, 4]
27

28
cdef class UserBuffer1:
29

30
    def __getbuffer__(self, Py_buffer* view, int flags):
31
        PyBuffer_FillInfo(view, None, global_buf, 5, 1, flags)
32

33
cdef class UserBuffer2:
34
    cdef char buf[5]
35

36
    def __cinit__(self):
37
        self.buf[0:5] = [5, 6, 7, 8, 9]
38

39
    def __getbuffer__(self, Py_buffer* view, int flags):
40
        print('UserBuffer2: getbuffer')
41
        PyBuffer_FillInfo(view, self, self.buf, 5, 0, flags)
42

43
    def __releasebuffer__(self, Py_buffer* view):
44
        print('UserBuffer2: release')
45

46

47
cdef extern from *:
48
    ctypedef struct PyBuffer"Py_buffer":
49
        void *buf
50
        Py_ssize_t len
51
        bint readonly
52

53
cdef class _memoryview:
54

55
    """
56
    Memory
57
    """
58

59
    cdef PyBuffer view
60

61
    def __cinit__(self, obj):
62
        cdef Py_buffer *view = <Py_buffer*>&self.view
63
        PyObject_GetBuffer(obj, view, PyBUF_SIMPLE)
64

65
    def __dealloc__(self):
66
        cdef Py_buffer *view = <Py_buffer*>&self.view
67
        PyBuffer_Release(view )
68
        
69
    def __getbuffer__(self, Py_buffer *view, int flags):
70
        PyBuffer_FillInfo(view, self,
71
                          self.view.buf, self.view.len,
72
                          self.view.readonly, flags)
73
    def tolist(self):
74
        cdef char *b = <char *> self.view.buf
75
        return [b[i] for i in range(self.view.len)]
76

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.