mirror of https://github.com/swig/swig
149 lines
3.3 KiB
Plaintext
149 lines
3.3 KiB
Plaintext
/* -----------------------------------------------------------------------------
|
|
* director.swg
|
|
*
|
|
* This file contains support for director classes so that Octave proxy
|
|
* methods can be called from C++.
|
|
* ----------------------------------------------------------------------------- */
|
|
|
|
# define SWIG_DIRECTOR_CAST(ARG) dynamic_cast<Swig::Director *>(ARG)
|
|
|
|
#include <exception>
|
|
|
|
namespace Swig {
|
|
|
|
class Director {
|
|
octave_swig_type *self;
|
|
bool swig_disowned;
|
|
|
|
Director(const Director &x);
|
|
Director &operator=(const Director &rhs);
|
|
public:
|
|
|
|
Director(void *vptr):self(0), swig_disowned(false) {
|
|
set_rtdir(vptr, this);
|
|
}
|
|
|
|
~Director() {
|
|
swig_director_destroyed(self, this);
|
|
if (swig_disowned)
|
|
self->decref();
|
|
}
|
|
|
|
void swig_set_self(octave_swig_type *new_self) {
|
|
assert(!swig_disowned);
|
|
self = new_self;
|
|
}
|
|
|
|
octave_swig_type *swig_get_self() const {
|
|
return self;
|
|
}
|
|
|
|
void swig_disown() {
|
|
if (swig_disowned)
|
|
return;
|
|
swig_disowned = true;
|
|
self->incref();
|
|
}
|
|
};
|
|
|
|
// Base class for director exceptions.
|
|
class DirectorException : public std::exception {
|
|
public:
|
|
static void raise(const char *msg) {
|
|
// ... todo
|
|
throw(DirectorException());
|
|
}
|
|
|
|
static void raise(const octave_value &ov, const char *msg) {
|
|
// ... todo
|
|
raise(msg);
|
|
}
|
|
};
|
|
|
|
class DirectorTypeMismatchException : public DirectorException {
|
|
public:
|
|
static void raise(const char *msg) {
|
|
// ... todo
|
|
throw(DirectorTypeMismatchException());
|
|
}
|
|
|
|
static void raise(const octave_value &ov, const char *msg) {
|
|
// ... todo
|
|
raise(msg);
|
|
}
|
|
};
|
|
|
|
class DirectorPureVirtualException : public DirectorException {
|
|
public:
|
|
static void raise(const char *msg) {
|
|
// ... todo
|
|
throw(DirectorPureVirtualException());
|
|
}
|
|
|
|
static void raise(const octave_value &ov, const char *msg) {
|
|
// ... todo
|
|
raise(msg);
|
|
}
|
|
};
|
|
|
|
SWIGINTERN rtdir_map *get_rtdir_map() {
|
|
static swig_module_info *module = 0;
|
|
if (!module)
|
|
module = SWIG_GetModule(0);
|
|
if (!module)
|
|
return 0;
|
|
if (!module->clientdata)
|
|
module->clientdata = new rtdir_map;
|
|
return (rtdir_map *) module->clientdata;
|
|
}
|
|
|
|
SWIGINTERNINLINE void set_rtdir(void *vptr, Director *d) {
|
|
rtdir_map *rm = get_rtdir_map();
|
|
if (rm)
|
|
(*rm)[vptr] = d;
|
|
}
|
|
|
|
SWIGINTERNINLINE void erase_rtdir(void *vptr) {
|
|
rtdir_map *rm = get_rtdir_map();
|
|
if (rm)
|
|
(*rm).erase(vptr);
|
|
}
|
|
|
|
SWIGINTERNINLINE Director *get_rtdir(void *vptr) {
|
|
rtdir_map *rm = get_rtdir_map();
|
|
if (!rm)
|
|
return 0;
|
|
rtdir_map::const_iterator pos = rm->find(vptr);
|
|
Director *rtdir = (pos != rm->end())? pos->second : 0;
|
|
return rtdir;
|
|
}
|
|
|
|
SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d) {
|
|
self->director_destroyed(d);
|
|
}
|
|
|
|
SWIGRUNTIME octave_swig_type *swig_director_get_self(Director *d) {
|
|
return d->swig_get_self();
|
|
}
|
|
|
|
SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self) {
|
|
d->swig_set_self(self);
|
|
}
|
|
|
|
}
|
|
|
|
SWIGRUNTIME void swig_acquire_ownership(void *vptr) {
|
|
// assert(0);
|
|
// ... todo
|
|
}
|
|
|
|
SWIGRUNTIME void swig_acquire_ownership_array(void *vptr) {
|
|
// assert(0);
|
|
// ... todo
|
|
}
|
|
|
|
SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own) {
|
|
// assert(0);
|
|
// ... todo
|
|
}
|