summaryrefslogtreecommitdiff
path: root/zmq/utils/buffers.pxd
diff options
context:
space:
mode:
authorMicah Anderson <micah@riseup.net>2014-11-11 11:52:45 -0500
committerMicah Anderson <micah@riseup.net>2014-11-11 11:52:45 -0500
commit44be832c5708baadd146cb954befbc3dcad8d463 (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904 /zmq/utils/buffers.pxd
parent76755110103988258ec37afbb4c022f7ac3ddf54 (diff)
prepare for upgrade to new upstream
Diffstat (limited to 'zmq/utils/buffers.pxd')
-rw-r--r--zmq/utils/buffers.pxd313
1 files changed, 0 insertions, 313 deletions
diff --git a/zmq/utils/buffers.pxd b/zmq/utils/buffers.pxd
deleted file mode 100644
index 998aa55..0000000
--- a/zmq/utils/buffers.pxd
+++ /dev/null
@@ -1,313 +0,0 @@
-"""Python version-independent methods for C/Python buffers.
-
-This file was copied and adapted from mpi4py.
-
-Authors
--------
-* MinRK
-"""
-
-#-----------------------------------------------------------------------------
-# Copyright (c) 2010 Lisandro Dalcin
-# All rights reserved.
-# Used under BSD License: http://www.opensource.org/licenses/bsd-license.php
-#
-# Retrieval:
-# Jul 23, 2010 18:00 PST (r539)
-# http://code.google.com/p/mpi4py/source/browse/trunk/src/MPI/asbuffer.pxi
-#
-# Modifications from original:
-# Copyright (c) 2010-2012 Brian Granger, Min Ragan-Kelley
-#
-# Distributed under the terms of the New BSD License. The full license is in
-# the file COPYING.BSD, distributed as part of this software.
-#-----------------------------------------------------------------------------
-
-
-#-----------------------------------------------------------------------------
-# Python includes.
-#-----------------------------------------------------------------------------
-
-# get version-independent aliases:
-cdef extern from "pyversion_compat.h":
- pass
-
-# Python 3 buffer interface (PEP 3118)
-cdef extern from "Python.h":
- int PY_MAJOR_VERSION
- int PY_MINOR_VERSION
- ctypedef int Py_ssize_t
- ctypedef struct PyMemoryViewObject:
- pass
- ctypedef struct Py_buffer:
- void *buf
- Py_ssize_t len
- int readonly
- char *format
- int ndim
- Py_ssize_t *shape
- Py_ssize_t *strides
- Py_ssize_t *suboffsets
- Py_ssize_t itemsize
- void *internal
- cdef enum:
- PyBUF_SIMPLE
- PyBUF_WRITABLE
- PyBUF_FORMAT
- PyBUF_ANY_CONTIGUOUS
- int PyObject_CheckBuffer(object)
- int PyObject_GetBuffer(object, Py_buffer *, int) except -1
- void PyBuffer_Release(Py_buffer *)
-
- int PyBuffer_FillInfo(Py_buffer *view, object obj, void *buf,
- Py_ssize_t len, int readonly, int infoflags) except -1
- object PyMemoryView_FromBuffer(Py_buffer *info)
-
- object PyMemoryView_FromObject(object)
-
-# Python 2 buffer interface (legacy)
-cdef extern from "Python.h":
- ctypedef void const_void "const void"
- Py_ssize_t Py_END_OF_BUFFER
- int PyObject_CheckReadBuffer(object)
- int PyObject_AsReadBuffer (object, const_void **, Py_ssize_t *) except -1
- int PyObject_AsWriteBuffer(object, void **, Py_ssize_t *) except -1
-
- object PyBuffer_FromMemory(void *ptr, Py_ssize_t s)
- object PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t s)
-
- object PyBuffer_FromObject(object, Py_ssize_t offset, Py_ssize_t size)
- object PyBuffer_FromReadWriteObject(object, Py_ssize_t offset, Py_ssize_t size)
-
-
-#-----------------------------------------------------------------------------
-# asbuffer: C buffer from python object
-#-----------------------------------------------------------------------------
-
-
-cdef inline int memoryview_available():
- return PY_MAJOR_VERSION >= 3 or (PY_MAJOR_VERSION >=2 and PY_MINOR_VERSION >= 7)
-
-cdef inline int oldstyle_available():
- return PY_MAJOR_VERSION < 3
-
-
-cdef inline int check_buffer(object ob):
- """Version independent check for whether an object is a buffer.
-
- Parameters
- ----------
- object : object
- Any Python object
-
- Returns
- -------
- int : 0 if no buffer interface, 3 if newstyle buffer interface, 2 if oldstyle.
- """
- if PyObject_CheckBuffer(ob):
- return 3
- if oldstyle_available():
- return PyObject_CheckReadBuffer(ob) and 2
- return 0
-
-
-cdef inline object asbuffer(object ob, int writable, int format,
- void **base, Py_ssize_t *size,
- Py_ssize_t *itemsize):
- """Turn an object into a C buffer in a Python version-independent way.
-
- Parameters
- ----------
- ob : object
- The object to be turned into a buffer.
- Must provide a Python Buffer interface
- writable : int
- Whether the resulting buffer should be allowed to write
- to the object.
- format : int
- The format of the buffer. See Python buffer docs.
- base : void **
- The pointer that will be used to store the resulting C buffer.
- size : Py_ssize_t *
- The size of the buffer(s).
- itemsize : Py_ssize_t *
- The size of an item, if the buffer is non-contiguous.
-
- Returns
- -------
- An object describing the buffer format. Generally a str, such as 'B'.
- """
-
- cdef void *bptr = NULL
- cdef Py_ssize_t blen = 0, bitemlen = 0
- cdef Py_buffer view
- cdef int flags = PyBUF_SIMPLE
- cdef int mode = 0
-
- bfmt = None
-
- mode = check_buffer(ob)
- if mode == 0:
- raise TypeError("%r does not provide a buffer interface."%ob)
-
- if mode == 3:
- flags = PyBUF_ANY_CONTIGUOUS
- if writable:
- flags |= PyBUF_WRITABLE
- if format:
- flags |= PyBUF_FORMAT
- PyObject_GetBuffer(ob, &view, flags)
- bptr = view.buf
- blen = view.len
- if format:
- if view.format != NULL:
- bfmt = view.format
- bitemlen = view.itemsize
- PyBuffer_Release(&view)
- else: # oldstyle
- if writable:
- PyObject_AsWriteBuffer(ob, &bptr, &blen)
- else:
- PyObject_AsReadBuffer(ob, <const_void **>&bptr, &blen)
- if format:
- try: # numpy.ndarray
- dtype = ob.dtype
- bfmt = dtype.char
- bitemlen = dtype.itemsize
- except AttributeError:
- try: # array.array
- bfmt = ob.typecode
- bitemlen = ob.itemsize
- except AttributeError:
- if isinstance(ob, bytes):
- bfmt = b"B"
- bitemlen = 1
- else:
- # nothing found
- bfmt = None
- bitemlen = 0
- if base: base[0] = <void *>bptr
- if size: size[0] = <Py_ssize_t>blen
- if itemsize: itemsize[0] = <Py_ssize_t>bitemlen
-
- if PY_MAJOR_VERSION >= 3 and bfmt is not None:
- return bfmt.decode('ascii')
- return bfmt
-
-
-cdef inline object asbuffer_r(object ob, void **base, Py_ssize_t *size):
- """Wrapper for standard calls to asbuffer with a readonly buffer."""
- asbuffer(ob, 0, 0, base, size, NULL)
- return ob
-
-
-cdef inline object asbuffer_w(object ob, void **base, Py_ssize_t *size):
- """Wrapper for standard calls to asbuffer with a writable buffer."""
- asbuffer(ob, 1, 0, base, size, NULL)
- return ob
-
-#------------------------------------------------------------------------------
-# frombuffer: python buffer/view from C buffer
-#------------------------------------------------------------------------------
-
-
-cdef inline object frombuffer_3(void *ptr, Py_ssize_t s, int readonly):
- """Python 3 version of frombuffer.
-
- This is the Python 3 model, but will work on Python >= 2.6. Currently,
- we use it only on >= 3.0.
- """
- cdef Py_buffer pybuf
- cdef Py_ssize_t *shape = [s]
- cdef str astr=""
- PyBuffer_FillInfo(&pybuf, astr, ptr, s, readonly, PyBUF_SIMPLE)
- pybuf.format = "B"
- pybuf.shape = shape
- return PyMemoryView_FromBuffer(&pybuf)
-
-
-cdef inline object frombuffer_2(void *ptr, Py_ssize_t s, int readonly):
- """Python 2 version of frombuffer.
-
- This must be used for Python <= 2.6, but we use it for all Python < 3.
- """
-
- if oldstyle_available():
- if readonly:
- return PyBuffer_FromMemory(ptr, s)
- else:
- return PyBuffer_FromReadWriteMemory(ptr, s)
- else:
- raise NotImplementedError("Old style buffers not available.")
-
-
-cdef inline object frombuffer(void *ptr, Py_ssize_t s, int readonly):
- """Create a Python Buffer/View of a C array.
-
- Parameters
- ----------
- ptr : void *
- Pointer to the array to be copied.
- s : size_t
- Length of the buffer.
- readonly : int
- whether the resulting object should be allowed to write to the buffer.
-
- Returns
- -------
- Python Buffer/View of the C buffer.
- """
- # oldstyle first priority for now
- if oldstyle_available():
- return frombuffer_2(ptr, s, readonly)
- else:
- return frombuffer_3(ptr, s, readonly)
-
-
-cdef inline object frombuffer_r(void *ptr, Py_ssize_t s):
- """Wrapper for readonly view frombuffer."""
- return frombuffer(ptr, s, 1)
-
-
-cdef inline object frombuffer_w(void *ptr, Py_ssize_t s):
- """Wrapper for writable view frombuffer."""
- return frombuffer(ptr, s, 0)
-
-#------------------------------------------------------------------------------
-# viewfromobject: python buffer/view from python object, refcounts intact
-# frombuffer(asbuffer(obj)) would lose track of refs
-#------------------------------------------------------------------------------
-
-cdef inline object viewfromobject(object obj, int readonly):
- """Construct a Python Buffer/View object from another Python object.
-
- This work in a Python version independent manner.
-
- Parameters
- ----------
- obj : object
- The input object to be cast as a buffer
- readonly : int
- Whether the result should be prevented from overwriting the original.
-
- Returns
- -------
- Buffer/View of the original object.
- """
- if not memoryview_available():
- if readonly:
- return PyBuffer_FromObject(obj, 0, Py_END_OF_BUFFER)
- else:
- return PyBuffer_FromReadWriteObject(obj, 0, Py_END_OF_BUFFER)
- else:
- return PyMemoryView_FromObject(obj)
-
-
-cdef inline object viewfromobject_r(object obj):
- """Wrapper for readonly viewfromobject."""
- return viewfromobject(obj, 1)
-
-
-cdef inline object viewfromobject_w(object obj):
- """Wrapper for writable viewfromobject."""
- return viewfromobject(obj, 0)