[Numpy-svn] r3706 - trunk/numpy/doc
numpy-svn at scipy.org
numpy-svn at scipy.org
Wed Apr 11 22:02:48 EDT 2007
Author: oliphant
Date: 2007-04-11 21:02:44 -0500 (Wed, 11 Apr 2007)
New Revision: 3706
Modified:
trunk/numpy/doc/pep_buffer.txt
Log:
Add example to buffer interface.
Modified: trunk/numpy/doc/pep_buffer.txt
===================================================================
--- trunk/numpy/doc/pep_buffer.txt 2007-04-11 20:38:46 UTC (rev 3705)
+++ trunk/numpy/doc/pep_buffer.txt 2007-04-12 02:02:44 UTC (rev 3706)
@@ -172,44 +172,44 @@
All of the following assume that at least buf, len, and readonly will
be utilized by the caller.
-BUF_SIMPLE
+Py_BUF_SIMPLE
The returned buffer will only be assumed to be readable (the object
may or may not have writeable memory). Only the buf, len, and
readonly variables may be accessed. The format will be assumed to
be unsigned bytes. This is a "stand-alone" flag constant. It
never needs to be |'d to the others.
-BUF_WRITEABLE
+Py_BUF_WRITEABLE
The returned buffer must be writeable. If it cannot be, then raise
an error.
-BUF_READONLY
+Py_BUF_READONLY
The returned buffer must be readonly and the underlying object
should make its memory readonly. If it cannot do that, then an
error should be raised if this flag is requested.
-BUF_FORMAT
+Py_BUF_FORMAT
The consumer will be using the format string information so make
sure that member is filled correctly.
-BUF_SHAPE
+Py_BUF_SHAPE
The consumer can (and might) make use of using the ndims and shape
members of the structure so make sure they are filled in correctly.
-BUF_STRIDES (implies BUF_SHAPE)
+Py_BUF_STRIDES (implies Py_BUF_SHAPE)
The consumer can (and might) make use of the strides member of the
structure (as well as ndims and shape)
-BUF_OFFSETS (implies BUF_STRIDES)
+Py_BUF_OFFSETS (implies Py_BUF_STRIDES)
The consumer can (and might) make use of the suboffsets member (as
well as ndims, shape, and strides)
-BUF_FULL
- This is the same as BUF_OFFSETS | BUF_FORMAT
+Py_BUF_FULL
+ This is the same as Py_BUF_OFFSETS | Py_BUF_FORMAT
-Thus, the consumer simply wanting an contiguous chunk of bytes from
-the object would use BUF_SIMPLE, while a consumer that understands
-how to make use of the most complicated cases would use BUF_FULL.
+Thus, the consumer simply wanting a contiguous chunk of bytes from
+the object would use Py_BUF_SIMPLE, while a consumer that understands
+how to make use of the most complicated cases could use Py_BUF_FULL.
There is a C-API that simple exporting objects can use to fill-in the
buffer info structure correctly according to the provided flags if a
@@ -441,7 +441,7 @@
::
int PyObject_GetContiguous(PyObject *obj, void **buf, Py_ssize_t *len,
- int fortran)
+ char **format, int fortran)
Return a contiguous chunk of memory representing the buffer. If a
copy is made then return 1. If no copy was needed return 0. If an
@@ -452,7 +452,7 @@
the fastest in the buffer. If fortran is 0, then the last dimension
will vary the fastest (C-style contiguous). If fortran is -1, then it
does not matter and you will get whatever the object decides is more
-efficient.
+efficient.
::
@@ -685,10 +685,12 @@
=========
Ex. 1
-----------
+-----------
This example shows how an image object that uses contiguous lines might expose its buffer.::
+::
+
struct rgba {
unsigned char r, g, b, a;
};
@@ -711,6 +713,8 @@
So what does ImageObject's getbuffer do? Leaving error checking out::
+::
+
int Image_getbuffer(PyObject *self, struct bufferinfo *view, int flags) {
static Py_ssize_t suboffsets[2] = { -1, 0 };
@@ -746,19 +750,21 @@
chunk of memory (which will never be re-allocated while the object is
alive) would do that.
-int myobject_getbuffer(PyObject *self, struct bufferinfo *view, int flags) {
+::
- void *buf;
- Py_ssize_t len;
- int readonly=0;
+ int myobject_getbuffer(PyObject *self, struct bufferinfo *view, int flags) {
+
+ void *buf;
+ Py_ssize_t len;
+ int readonly=0;
- buf = /* Point to buffer */
- len = /* Set to size of buffer */
- readonly = /* Set to 1 if readonly */
+ buf = /* Point to buffer */
+ len = /* Set to size of buffer */
+ readonly = /* Set to 1 if readonly */
+
+ return PyObject_FillBufferInfo(view, buf, len, readonly, flags);
+ }
- return PyObject_FillBufferInfo(view, buf, len, readonly, flags);
-}
-
/* No releasebuffer is necessary because the memory will never
be re-allocated so the locking mechanism is not needed
*/
@@ -769,6 +775,7 @@
A consumer that wants to only get a simple contiguous chunk of bytes
from a Python object, obj would do the following:
+::
struct bufferinfo view;
int ret;
@@ -790,8 +797,37 @@
}
+Ex. 4
+-----------
+A consumer that wants to be able to use any object's memory but is
+writing an algorithm that only handle contiguous memory could do the following:
+::
+
+ void *buf;
+ Py_ssize_t len;
+ char *format;
+
+ if (PyObject_GetContiguous(obj, &buf, &len, &format, 0) < 0) {
+ /* error return */
+ }
+
+ /* process memory pointed to by buffer if format is correct */
+
+ /* Optional:
+
+ if, after processing, we want to copy data from buffer back
+ into the the object
+
+ we could do
+ */
+
+ if (PyObject_CopyToObject(obj, buf, len, 0) < 0) {
+ /* error return */
+ }
+
+
Copyright
=========
More information about the Numpy-svn
mailing list