Viewing file:      mxQueue.h (4.47 KB)      -rw-r--r-- Select action/file-type:    (+) |   (+) |   (+) | Code (+) | Session (+) |   (+) | SDB (+) |   (+) |   (+) |   (+) |   (+) |   (+) |
 
#ifndef MXQUEUE_H #define MXQUEUE_H /*    mxQueue -- A queue implementation
    Copyright (c) 1998-2000, Marc-Andre Lemburg; mailto:mal@lemburg.com   Copyright (c) 2000-2001, eGenix.com Software GmbH; mailto:info@egenix.com   See the documentation for further copyright information or contact   the author (mailto:mal@lemburg.com).    */
  /* The extension's name; must be the same as the init function's suffix */ #define MXQUEUE_MODULE "mxQueue"
  /* Name of the package or module that provides the extensions C API.    If the extension is used inside a package, provide the complete    import path. */ #define MXQUEUE_API_MODULE "mx.Queue"
  /* --- No servicable parts below this line ----------------------*/
  /* Include generic mx extension header file */ #include "mxh.h"
  #ifdef MX_BUILDING_MXQUEUE # define MXQUEUE_EXTERNALIZE MX_EXPORT #else # define MXQUEUE_EXTERNALIZE MX_IMPORT #endif
  #ifdef __cplusplus extern "C" { #endif
  /* --- Queue Object ------------------------------------------*/
  typedef struct {     PyObject_HEAD     int size;            /* Number of items allocated */     int head;            /* Index of head element */     int tail;            /* Index of tail element */     PyObject **array;        /* Pointer to the queue array */ } mxQueueObject;
  /* Fast access */
  #define mxQueue_GET_SIZE(v) \         ((((mxQueueObject *)(v))->head - ((mxQueueObject *)(v))->tail) \      % ((mxQueueObject *)(v))->size) #define mxQueue_EMPTY(v) \         (((((mxQueueObject *)(v))->head - ((mxQueueObject *)(v))->tail)) == 0)
  /* Type checking macro */
  #define mxQueue_Check(v) \         (((mxQueueObject *)(v))->ob_type == mxQueue.Queue_Type)
  /* --- C API ----------------------------------------------------*/
  /* C API for usage by other Python modules */ typedef struct {           /* Type object for Queue() */     PyTypeObject *Queue_Type;
      /* Create a new empty queue object with at least size entries        alredy allocated. */     mxQueueObject *(*mxQueue_New)(int size);
      /* Push a Python object onto the queue. The reference count is increased        by one. Queues only grow, they never shrink again. */     int (*mxQueue_Push)(mxQueueObject *queue,             PyObject *v);          /* Pop an object from the queue. Ownership is passed to the caller.        Note: This doesn't cause the allocated queue size to change. */     PyObject *(*mxQueue_Pop)(mxQueueObject *queue);          /* Clear the queue. */     int (*mxQueue_Clear)(mxQueueObject *queue);
      /* Get the number of entries in the queue. */     int (*mxQueue_Length)(mxQueueObject *queue);
      /* Create a new empty queue object from the sequence v */     mxQueueObject *(*mxQueue_FromSequence)(PyObject *v);
      /* Return a the queues content as tuple. */     PyObject *(*mxQueue_AsTuple)(mxQueueObject *queue);          /* Return a the queues content as list. */     PyObject *(*mxQueue_AsList)(mxQueueObject *queue);
      /* Pop the topmost n entries from the queue and return them as        tuple. If there are not enough entries only the available ones        are returned.  */     PyObject *(*mxQueue_PopMany)(mxQueueObject *queue,                 int n);
      /* Push the entries from sequence onto the queue. */     int (*mxQueue_PushMany)(mxQueueObject *queue,                 PyObject *sequence);
  } mxQueueModule_APIObject;
  #ifndef MX_BUILDING_MXQUEUE
  /* Interfacestructure to C API for other modules.    Call mxQueue_ImportModuleAPI() to initialize this    structure. After that usage is simple:
     PyObject *v;         v = mxQueue.Queue_New(0);    if (!v)        goto onError;    ...
  */
  static  mxQueueModule_APIObject mxQueue;
  /* You *must* call this before using any of the functions in    mxQueue and check its outcome; otherwise all accesses will    result in a segfault. Returns 0 on success. */
  #ifndef DPRINTF # define DPRINTF if (0) printf #endif
  static int mxQueue_ImportModuleAndAPI(void) {     PyObject *mod, *v = 0;     void *api;          DPRINTF("Importing the %s C API...\n",MXQUEUE_API_MODULE);     mod = PyImport_ImportModule(MXQUEUE_API_MODULE);     if (mod == NULL)     goto onError;     DPRINTF(" module found\n");     v = PyObject_GetAttrString(mod,MXQUEUE_MODULE"API");     if (v == NULL)     goto onError;     Py_DECREF(mod);     DPRINTF(" API object found\n");     api = PyCObject_AsVoidPtr(v);     if (api == NULL)     goto onError;     Py_DECREF(v);     memcpy(&mxQueue,api,sizeof(mxQueue));     DPRINTF(" API object initialized.\n");     return 0;       onError:     DPRINTF(" not found.\n");     Py_XDECREF(mod);     Py_XDECREF(v);     return -1; }
  #endif
  /* EOF */ #ifdef __cplusplus } #endif #endif 
  |