Move Octave director-related code into Lib/octave/director.swg
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@13084 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
e4a92ee692
commit
de49578c31
2 changed files with 164 additions and 137 deletions
|
|
@ -1,3 +1,124 @@
|
||||||
|
|
||||||
// ***** move the director stuff from octrun.swg here...
|
# define SWIG_DIRECTOR_CAST(ARG) dynamic_cast<Swig::Director *>(ARG)
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DirectorTypeMismatchException {
|
||||||
|
static void raise(const char *msg) {
|
||||||
|
// ... todo
|
||||||
|
throw(DirectorTypeMismatchException());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void raise(const octave_value &ov, const char *msg) {
|
||||||
|
// ... todo
|
||||||
|
raise(msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DirectorPureVirtualException {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -106,54 +106,33 @@ SWIGRUNTIME void SWIG_Octave_SetModule(void *clientdata, swig_module_info *point
|
||||||
typedef octave_value_list(*octave_func) (const octave_value_list &, int);
|
typedef octave_value_list(*octave_func) (const octave_value_list &, int);
|
||||||
class octave_swig_type;
|
class octave_swig_type;
|
||||||
|
|
||||||
# define SWIG_DIRECTOR_CAST(ARG) dynamic_cast<Swig::Director *>(ARG)
|
|
||||||
|
|
||||||
namespace Swig {
|
namespace Swig {
|
||||||
|
|
||||||
|
#ifdef SWIG_DIRECTORS
|
||||||
|
|
||||||
class Director;
|
class Director;
|
||||||
|
|
||||||
//SWIGRUNTIME void swig_register_director(octave_swig_type *self, void *ptr, Director *d);
|
typedef std::map < void *, Director * > rtdir_map;
|
||||||
|
SWIGINTERN rtdir_map* get_rtdir_map();
|
||||||
|
SWIGINTERNINLINE void set_rtdir(void *vptr, Director *d);
|
||||||
|
SWIGINTERNINLINE void erase_rtdir(void *vptr);
|
||||||
|
SWIGINTERNINLINE Director *get_rtdir(void *vptr);
|
||||||
|
|
||||||
SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d);
|
SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d);
|
||||||
|
SWIGRUNTIME octave_swig_type *swig_director_get_self(Director *d);
|
||||||
SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self);
|
SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost);
|
SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost);
|
||||||
SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov);
|
SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov);
|
||||||
SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov);
|
SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov);
|
||||||
|
|
||||||
typedef std::map < void *, Director * > rtdir_map;
|
|
||||||
|
|
||||||
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_acquire_ownership(void *vptr);
|
||||||
|
SWIGRUNTIME void swig_acquire_ownership_array(void *vptr);
|
||||||
|
SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own);
|
||||||
|
|
||||||
struct swig_octave_member {
|
struct swig_octave_member {
|
||||||
const char *name;
|
const char *name;
|
||||||
octave_func method;
|
octave_func method;
|
||||||
|
|
@ -376,11 +355,13 @@ namespace Swig {
|
||||||
always_static(_always_static) {
|
always_static(_always_static) {
|
||||||
if (_type || _ptr)
|
if (_type || _ptr)
|
||||||
types.push_back(std::make_pair(_type, _ptr));
|
types.push_back(std::make_pair(_type, _ptr));
|
||||||
|
#ifdef SWIG_DIRECTORS
|
||||||
if (_ptr) {
|
if (_ptr) {
|
||||||
Swig::Director *d = Swig::get_rtdir(_ptr);
|
Swig::Director *d = Swig::get_rtdir(_ptr);
|
||||||
if (d)
|
if (d)
|
||||||
Swig::swig_director_set_self(d, this);
|
Swig::swig_director_set_self(d, this);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
~octave_swig_type() {
|
~octave_swig_type() {
|
||||||
|
|
@ -395,8 +376,10 @@ namespace Swig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef SWIG_DIRECTORS
|
||||||
for (unsigned int j = 0; j < types.size(); ++j)
|
for (unsigned int j = 0; j < types.size(); ++j)
|
||||||
Swig::erase_rtdir(types[j].second.ptr);
|
Swig::erase_rtdir(types[j].second.ptr);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
dim_vector dims(void) const {
|
dim_vector dims(void) const {
|
||||||
|
|
@ -503,9 +486,11 @@ namespace Swig {
|
||||||
rhs.own = 0;
|
rhs.own = 0;
|
||||||
for (unsigned int j = 0; j < rhs.types.size(); ++j) {
|
for (unsigned int j = 0; j < rhs.types.size(); ++j) {
|
||||||
assert(!rhs.types[j].second.destroyed);
|
assert(!rhs.types[j].second.destroyed);
|
||||||
|
#ifdef SWIG_DIRECTORS
|
||||||
Swig::Director *d = Swig::get_rtdir(rhs.types[j].second.ptr);
|
Swig::Director *d = Swig::get_rtdir(rhs.types[j].second.ptr);
|
||||||
if (d)
|
if (d)
|
||||||
Swig::swig_director_set_self(d, this);
|
Swig::swig_director_set_self(d, this);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
types.insert(types.end(), rhs.types.begin(), rhs.types.end());
|
types.insert(types.end(), rhs.types.begin(), rhs.types.end());
|
||||||
members.insert(rhs.members.begin(), rhs.members.end());
|
members.insert(rhs.members.begin(), rhs.members.end());
|
||||||
|
|
@ -571,6 +556,7 @@ namespace Swig {
|
||||||
return own;
|
return own;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SWIG_DIRECTORS
|
||||||
void director_destroyed(Swig::Director *d) {
|
void director_destroyed(Swig::Director *d) {
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (unsigned int j = 0; j < types.size(); ++j) {
|
for (unsigned int j = 0; j < types.size(); ++j) {
|
||||||
|
|
@ -582,6 +568,7 @@ namespace Swig {
|
||||||
}
|
}
|
||||||
assert(found);
|
assert(found);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void assign(const std::string &name, const octave_value &ov) {
|
void assign(const std::string &name, const octave_value &ov) {
|
||||||
members[name] = std::make_pair((const swig_octave_member *) 0, ov);
|
members[name] = std::make_pair((const swig_octave_member *) 0, ov);
|
||||||
|
|
@ -1225,111 +1212,28 @@ namespace Swig {
|
||||||
return octave_value(octave_uint64((unsigned long long) ost->swig_this()));
|
return octave_value(octave_uint64((unsigned long long) ost->swig_this()));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SWIG_DIRECTORS
|
|
||||||
|
|
||||||
namespace Swig {
|
namespace Swig {
|
||||||
class Director {
|
|
||||||
octave_swig_type *self;
|
|
||||||
bool swig_disowned;
|
|
||||||
|
|
||||||
Director(const Director &x);
|
SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost) {
|
||||||
Director &operator=(const Director &rhs);
|
return new octave_swig_ref(ost);
|
||||||
public:
|
}
|
||||||
|
|
||||||
Director(void *vptr):self(0), swig_disowned(false) {
|
SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov) {
|
||||||
set_rtdir(vptr, this);
|
if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1)
|
||||||
}
|
ov = ov.cell_value()(0);
|
||||||
|
return swig_value_deref(*ov.internal_rep());
|
||||||
|
}
|
||||||
|
|
||||||
~Director() {
|
SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov) {
|
||||||
swig_director_destroyed(self, this);
|
if (ov.type_id() != octave_swig_ref::static_type_id())
|
||||||
if (swig_disowned)
|
return 0;
|
||||||
self->decref();
|
const octave_swig_ref *osr = static_cast < const octave_swig_ref *>(&ov);
|
||||||
}
|
return osr->get_ptr();
|
||||||
|
}
|
||||||
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();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DirectorTypeMismatchException {
|
|
||||||
static void raise(const char *msg) {
|
|
||||||
// ... todo
|
|
||||||
throw(DirectorTypeMismatchException());
|
|
||||||
}
|
|
||||||
|
|
||||||
static void raise(const octave_value &ov, const char *msg) {
|
|
||||||
// ... todo
|
|
||||||
raise(msg);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
struct DirectorPureVirtualException {
|
|
||||||
static void raise(const char *msg) {
|
|
||||||
// ... todo
|
|
||||||
throw(DirectorPureVirtualException());
|
|
||||||
}
|
|
||||||
|
|
||||||
static void raise(const octave_value &ov, const char *msg) {
|
|
||||||
// ... todo
|
|
||||||
raise(msg);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Swig {
|
|
||||||
SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d) {
|
|
||||||
self->director_destroyed(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self) {
|
|
||||||
d->swig_set_self(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost) {
|
|
||||||
return new octave_swig_ref(ost);
|
|
||||||
}
|
|
||||||
|
|
||||||
SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov) {
|
|
||||||
if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1)
|
|
||||||
ov = ov.cell_value()(0);
|
|
||||||
return swig_value_deref(*ov.internal_rep());
|
|
||||||
}
|
|
||||||
|
|
||||||
SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov) {
|
|
||||||
if (ov.type_id() != octave_swig_ref::static_type_id())
|
|
||||||
return 0;
|
|
||||||
const octave_swig_ref *osr = static_cast < const octave_swig_ref *>(&ov);
|
|
||||||
return osr->get_ptr();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#define swig_unary_op(name) \
|
#define swig_unary_op(name) \
|
||||||
SWIGRUNTIME octave_value swig_unary_op_##name(const octave_base_value &x) { \
|
SWIGRUNTIME octave_value swig_unary_op_##name(const octave_base_value &x) { \
|
||||||
|
|
@ -1422,9 +1326,11 @@ octave_value_typeinfo::register_binary_op(octave_value::op_##name,tid1,tid2,swig
|
||||||
SWIGRUNTIME octave_value SWIG_Octave_NewPointerObj(void *ptr, swig_type_info *type, int flags) {
|
SWIGRUNTIME octave_value SWIG_Octave_NewPointerObj(void *ptr, swig_type_info *type, int flags) {
|
||||||
int own = (flags &SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
|
int own = (flags &SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
|
||||||
|
|
||||||
|
#ifdef SWIG_DIRECTORS
|
||||||
Swig::Director *d = Swig::get_rtdir(ptr);
|
Swig::Director *d = Swig::get_rtdir(ptr);
|
||||||
if (d && d->swig_get_self())
|
if (d && Swig::swig_director_get_self(d))
|
||||||
return d->swig_get_self()->as_value();
|
return Swig::swig_director_get_self(d)->as_value();
|
||||||
|
#endif
|
||||||
return Swig::swig_value_ref(new octave_swig_type(ptr, type, own));
|
return Swig::swig_value_ref(new octave_swig_type(ptr, type, own));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue