| Index: swig/Lib/python/director.swg
|
| ===================================================================
|
| --- swig/Lib/python/director.swg (revision 0)
|
| +++ swig/Lib/python/director.swg (revision 0)
|
| @@ -0,0 +1,475 @@
|
| +/* -----------------------------------------------------------------------------
|
| + * See the LICENSE file for information on copyright, usage and redistribution
|
| + * of SWIG, and the README file for authors - http://www.swig.org/release.html.
|
| + *
|
| + * director.swg
|
| + *
|
| + * This file contains support for director classes that proxy
|
| + * method calls from C++ to Python extensions.
|
| + * ----------------------------------------------------------------------------- */
|
| +
|
| +#ifndef SWIG_DIRECTOR_PYTHON_HEADER_
|
| +#define SWIG_DIRECTOR_PYTHON_HEADER_
|
| +
|
| +#ifdef __cplusplus
|
| +
|
| +#include <string>
|
| +#include <iostream>
|
| +#include <exception>
|
| +#include <vector>
|
| +#include <map>
|
| +
|
| +
|
| +/*
|
| + Use -DSWIG_PYTHON_DIRECTOR_NO_VTABLE if you don't want to generate a 'virtual
|
| + table', and avoid multiple GetAttr calls to retrieve the python
|
| + methods.
|
| +*/
|
| +
|
| +#ifndef SWIG_PYTHON_DIRECTOR_NO_VTABLE
|
| +#ifndef SWIG_PYTHON_DIRECTOR_VTABLE
|
| +#define SWIG_PYTHON_DIRECTOR_VTABLE
|
| +#endif
|
| +#endif
|
| +
|
| +
|
| +
|
| +/*
|
| + Use -DSWIG_DIRECTOR_NO_UEH if you prefer to avoid the use of the
|
| + Undefined Exception Handler provided by swift
|
| +*/
|
| +#ifndef SWIG_DIRECTOR_NO_UEH
|
| +#ifndef SWIG_DIRECTOR_UEH
|
| +#define SWIG_DIRECTOR_UEH
|
| +#endif
|
| +#endif
|
| +
|
| +
|
| +/*
|
| + Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the
|
| + 'Swig' namespace. This could be useful for multi-modules projects.
|
| +*/
|
| +#ifdef SWIG_DIRECTOR_STATIC
|
| +/* Force anonymous (static) namespace */
|
| +#define Swig
|
| +#endif
|
| +
|
| +
|
| +/*
|
| + Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the
|
| + native C++ RTTI and dynamic_cast<>. But be aware that directors
|
| + could stop working when using this option.
|
| +*/
|
| +#ifdef SWIG_DIRECTOR_NORTTI
|
| +/*
|
| + When we don't use the native C++ RTTI, we implement a minimal one
|
| + only for Directors.
|
| +*/
|
| +# ifndef SWIG_DIRECTOR_RTDIR
|
| +# define SWIG_DIRECTOR_RTDIR
|
| +#include <map>
|
| +
|
| +namespace Swig {
|
| + class Director;
|
| + SWIGINTERN std::map<void*,Director*>& get_rtdir_map() {
|
| + static std::map<void*,Director*> rtdir_map;
|
| + return rtdir_map;
|
| + }
|
| +
|
| + SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) {
|
| + get_rtdir_map()[vptr] = rtdir;
|
| + }
|
| +
|
| + SWIGINTERNINLINE Director *get_rtdir(void *vptr) {
|
| + std::map<void*,Director*>::const_iterator pos = get_rtdir_map().find(vptr);
|
| + Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0;
|
| + return rtdir;
|
| + }
|
| +}
|
| +# endif /* SWIG_DIRECTOR_RTDIR */
|
| +
|
| +# define SWIG_DIRECTOR_CAST(Arg) Swig::get_rtdir(static_cast<void*>(Arg))
|
| +# define SWIG_DIRECTOR_RGTR(Arg1, Arg2) Swig::set_rtdir(static_cast<void*>(Arg1), Arg2)
|
| +
|
| +#else
|
| +
|
| +# define SWIG_DIRECTOR_CAST(Arg) dynamic_cast<Swig::Director*>(Arg)
|
| +# define SWIG_DIRECTOR_RGTR(Arg1, Arg2)
|
| +
|
| +#endif /* SWIG_DIRECTOR_NORTTI */
|
| +
|
| +extern "C" {
|
| + struct swig_type_info;
|
| +}
|
| +
|
| +namespace Swig {
|
| +
|
| + /* memory handler */
|
| + struct GCItem
|
| + {
|
| + virtual ~GCItem() {}
|
| +
|
| + virtual int get_own() const
|
| + {
|
| + return 0;
|
| + }
|
| + };
|
| +
|
| + struct GCItem_var
|
| + {
|
| + GCItem_var(GCItem *item = 0) : _item(item)
|
| + {
|
| + }
|
| +
|
| + GCItem_var& operator=(GCItem *item)
|
| + {
|
| + GCItem *tmp = _item;
|
| + _item = item;
|
| + delete tmp;
|
| + return *this;
|
| + }
|
| +
|
| + ~GCItem_var()
|
| + {
|
| + delete _item;
|
| + }
|
| +
|
| + GCItem * operator->() const
|
| + {
|
| + return _item;
|
| + }
|
| +
|
| + private:
|
| + GCItem *_item;
|
| + };
|
| +
|
| + struct GCItem_Object : GCItem
|
| + {
|
| + GCItem_Object(int own) : _own(own)
|
| + {
|
| + }
|
| +
|
| + virtual ~GCItem_Object()
|
| + {
|
| + }
|
| +
|
| + int get_own() const
|
| + {
|
| + return _own;
|
| + }
|
| +
|
| + private:
|
| + int _own;
|
| + };
|
| +
|
| + template <typename Type>
|
| + struct GCItem_T : GCItem
|
| + {
|
| + GCItem_T(Type *ptr) : _ptr(ptr)
|
| + {
|
| + }
|
| +
|
| + virtual ~GCItem_T()
|
| + {
|
| + delete _ptr;
|
| + }
|
| +
|
| + private:
|
| + Type *_ptr;
|
| + };
|
| +
|
| + template <typename Type>
|
| + struct GCArray_T : GCItem
|
| + {
|
| + GCArray_T(Type *ptr) : _ptr(ptr)
|
| + {
|
| + }
|
| +
|
| + virtual ~GCArray_T()
|
| + {
|
| + delete[] _ptr;
|
| + }
|
| +
|
| + private:
|
| + Type *_ptr;
|
| + };
|
| +
|
| + /* base class for director exceptions */
|
| + class DirectorException {
|
| + protected:
|
| + std::string swig_msg;
|
| + public:
|
| + DirectorException(PyObject *error, const char* hdr ="", const char* msg ="")
|
| + : swig_msg(hdr)
|
| + {
|
| + SWIG_PYTHON_THREAD_BEGIN_BLOCK;
|
| + if (strlen(msg)) {
|
| + swig_msg += " ";
|
| + swig_msg += msg;
|
| + }
|
| + if (!PyErr_Occurred()) {
|
| + PyErr_SetString(error, getMessage());
|
| + }
|
| + SWIG_PYTHON_THREAD_END_BLOCK;
|
| + }
|
| +
|
| + const char *getMessage() const
|
| + {
|
| + return swig_msg.c_str();
|
| + }
|
| +
|
| + static void raise(PyObject *error, const char *msg)
|
| + {
|
| + throw DirectorException(error, msg);
|
| + }
|
| +
|
| + static void raise(const char *msg)
|
| + {
|
| + raise(PyExc_RuntimeError, msg);
|
| + }
|
| + };
|
| +
|
| + /* unknown exception handler */
|
| + class UnknownExceptionHandler
|
| + {
|
| +#ifdef SWIG_DIRECTOR_UEH
|
| + static void handler() {
|
| + try {
|
| + throw;
|
| + } catch (DirectorException& e) {
|
| + std::cerr << "Swig Director exception caught:" << std::endl
|
| + << e.getMessage() << std::endl;
|
| + } catch (std::exception& e) {
|
| + std::cerr << "std::exception caught: "<< e.what() << std::endl;
|
| + } catch (...) {
|
| + std::cerr << "Unknown exception caught." << std::endl;
|
| + }
|
| +
|
| + std::cerr << std::endl
|
| + << "Python interpreter traceback:" << std::endl;
|
| + PyErr_Print();
|
| + std::cerr << std::endl;
|
| +
|
| + std::cerr << "This exception was caught by the SWIG unexpected exception handler." << std::endl
|
| + << "Try using %feature(\"director:except\") to avoid reaching this point." << std::endl
|
| + << std::endl
|
| + << "Exception is being re-thrown, program will like abort/terminate." << std::endl;
|
| + throw;
|
| + }
|
| +
|
| + public:
|
| +
|
| + std::unexpected_handler old;
|
| + UnknownExceptionHandler(std::unexpected_handler nh = handler)
|
| + {
|
| + old = std::set_unexpected(nh);
|
| + }
|
| +
|
| + ~UnknownExceptionHandler()
|
| + {
|
| + std::set_unexpected(old);
|
| + }
|
| +#endif
|
| + };
|
| +
|
| + /* type mismatch in the return value from a python method call */
|
| + class DirectorTypeMismatchException : public Swig::DirectorException {
|
| + public:
|
| + DirectorTypeMismatchException(PyObject *error, const char* msg="")
|
| + : Swig::DirectorException(error, "Swig director type mismatch", msg)
|
| + {
|
| + }
|
| +
|
| + DirectorTypeMismatchException(const char* msg="")
|
| + : Swig::DirectorException(PyExc_TypeError, "Swig director type mismatch", msg)
|
| + {
|
| + }
|
| +
|
| + static void raise(PyObject *error, const char *msg)
|
| + {
|
| + throw DirectorTypeMismatchException(error, msg);
|
| + }
|
| +
|
| + static void raise(const char *msg)
|
| + {
|
| + throw DirectorTypeMismatchException(msg);
|
| + }
|
| + };
|
| +
|
| + /* any python exception that occurs during a director method call */
|
| + class DirectorMethodException : public Swig::DirectorException {
|
| + public:
|
| + DirectorMethodException(const char* msg = "")
|
| + : DirectorException(PyExc_RuntimeError, "Swig director method error.", msg)
|
| + {
|
| + }
|
| +
|
| + static void raise(const char *msg)
|
| + {
|
| + throw DirectorMethodException(msg);
|
| + }
|
| + };
|
| +
|
| + /* attempt to call a pure virtual method via a director method */
|
| + class DirectorPureVirtualException : public Swig::DirectorException
|
| + {
|
| + public:
|
| + DirectorPureVirtualException(const char* msg = "")
|
| + : DirectorException(PyExc_RuntimeError, "Swig director pure virtual method called", msg)
|
| + {
|
| + }
|
| +
|
| + static void raise(const char *msg)
|
| + {
|
| + throw DirectorPureVirtualException(msg);
|
| + }
|
| + };
|
| +
|
| +
|
| +#if defined(SWIG_PYTHON_THREADS)
|
| +/* __THREAD__ is the old macro to activate some thread support */
|
| +# if !defined(__THREAD__)
|
| +# define __THREAD__ 1
|
| +# endif
|
| +#endif
|
| +
|
| +#ifdef __THREAD__
|
| +# include "pythread.h"
|
| + class Guard
|
| + {
|
| + PyThread_type_lock & mutex_;
|
| +
|
| + public:
|
| + Guard(PyThread_type_lock & mutex) : mutex_(mutex)
|
| + {
|
| + PyThread_acquire_lock(mutex_, WAIT_LOCK);
|
| + }
|
| +
|
| + ~Guard()
|
| + {
|
| + PyThread_release_lock(mutex_);
|
| + }
|
| + };
|
| +# define SWIG_GUARD(mutex) Guard _guard(mutex)
|
| +#else
|
| +# define SWIG_GUARD(mutex)
|
| +#endif
|
| +
|
| + /* director base class */
|
| + class Director {
|
| + private:
|
| + /* pointer to the wrapped python object */
|
| + PyObject* swig_self;
|
| + /* flag indicating whether the object is owned by python or c++ */
|
| + mutable bool swig_disown_flag;
|
| +
|
| + /* decrement the reference count of the wrapped python object */
|
| + void swig_decref() const {
|
| + if (swig_disown_flag) {
|
| + SWIG_PYTHON_THREAD_BEGIN_BLOCK;
|
| + Py_DECREF(swig_self);
|
| + SWIG_PYTHON_THREAD_END_BLOCK;
|
| + }
|
| + }
|
| +
|
| + public:
|
| + /* wrap a python object, optionally taking ownership */
|
| + Director(PyObject* self) : swig_self(self), swig_disown_flag(false) {
|
| + swig_incref();
|
| + }
|
| +
|
| +
|
| + /* discard our reference at destruction */
|
| + virtual ~Director() {
|
| + swig_decref();
|
| + }
|
| +
|
| +
|
| + /* return a pointer to the wrapped python object */
|
| + PyObject *swig_get_self() const {
|
| + return swig_self;
|
| + }
|
| +
|
| + /* acquire ownership of the wrapped python object (the sense of "disown"
|
| + * is from python) */
|
| + void swig_disown() const {
|
| + if (!swig_disown_flag) {
|
| + swig_disown_flag=true;
|
| + swig_incref();
|
| + }
|
| + }
|
| +
|
| + /* increase the reference count of the wrapped python object */
|
| + void swig_incref() const {
|
| + if (swig_disown_flag) {
|
| + Py_INCREF(swig_self);
|
| + }
|
| + }
|
| +
|
| + /* methods to implement pseudo protected director members */
|
| + virtual bool swig_get_inner(const char* /* name */) const {
|
| + return true;
|
| + }
|
| +
|
| + virtual void swig_set_inner(const char* /* name */, bool /* val */) const {
|
| + }
|
| +
|
| + /* ownership management */
|
| + private:
|
| + typedef std::map<void*, GCItem_var> ownership_map;
|
| + mutable ownership_map owner;
|
| +#ifdef __THREAD__
|
| + static PyThread_type_lock swig_mutex_own;
|
| +#endif
|
| +
|
| + public:
|
| + template <typename Type>
|
| + void swig_acquire_ownership_array(Type *vptr) const
|
| + {
|
| + if (vptr) {
|
| + SWIG_GUARD(swig_mutex_own);
|
| + owner[vptr] = new GCArray_T<Type>(vptr);
|
| + }
|
| + }
|
| +
|
| + template <typename Type>
|
| + void swig_acquire_ownership(Type *vptr) const
|
| + {
|
| + if (vptr) {
|
| + SWIG_GUARD(swig_mutex_own);
|
| + owner[vptr] = new GCItem_T<Type>(vptr);
|
| + }
|
| + }
|
| +
|
| + void swig_acquire_ownership_obj(void *vptr, int own) const
|
| + {
|
| + if (vptr && own) {
|
| + SWIG_GUARD(swig_mutex_own);
|
| + owner[vptr] = new GCItem_Object(own);
|
| + }
|
| + }
|
| +
|
| + int swig_release_ownership(void *vptr) const
|
| + {
|
| + int own = 0;
|
| + if (vptr) {
|
| + SWIG_GUARD(swig_mutex_own);
|
| + ownership_map::iterator iter = owner.find(vptr);
|
| + if (iter != owner.end()) {
|
| + own = iter->second->get_own();
|
| + owner.erase(iter);
|
| + }
|
| + }
|
| + return own;
|
| + }
|
| + };
|
| +
|
| +#ifdef __THREAD__
|
| + PyThread_type_lock Director::swig_mutex_own = PyThread_allocate_lock();
|
| +#endif
|
| +}
|
| +
|
| +#endif /* __cplusplus */
|
| +
|
| +
|
| +#endif
|
|
|