#ifndef PIGVIRTUAL_H
#define PIGVIRTUAL_H
#undef bool
#include "pigfunc.h"
PIG_DECLARE_VOID_FUNC_2(pig_virtual_dereference,
const
class
pig_virtual *,
void
*)
PIG_DECLARE_VOID_FUNC_2(pig_virtual_setobject,
const
class
pig_virtual *,
void
*)
class
pig_extra_data {
public
:
class
pig_extra_data *pignext, *pigprev;
pig_extra_data(pig_extra_data *pigp, pig_extra_data *pign) :
pignext(pign), pigprev(pigp) {}
virtual
~pig_extra_data() {
if
(pigprev) pigprev->pignext = pignext;
if
(pignext) pignext->pigprev = pigprev;
}
virtual
int
pigtype() = 0;
};
struct
pig_virtual {
void
*pig_rv, *pig_this;
pig_extra_data *pigdata;
pig_virtual() : pig_rv(0), pig_this(0), pigdata(0) {}
pig_virtual(
void
*pig1) : pig_rv(0), pig_this(pig1), pigdata(0) {}
virtual
~pig_virtual() {
pig_virtual_dereference(
this
, pig_rv);
if
(pigdata) {
while
(pigdata->pignext)
pigdata = pigdata->pignext;
while
(pigdata->pigprev) {
pigdata = pigdata->pigprev;
delete
pigdata->pignext;
pigdata->pignext = 0;
}
delete
pigdata;
}
}
void
pig_add_data(pig_extra_data *pigd) {
if
(pigd) {
pigd->pigprev = 0;
pigd->pignext = pigdata;
if
(pigdata) pigdata->pigprev = pigd;
pigdata = pigd;
}
}
};
PIG_IMPORT_TABLE(pigvirtual)
PIG_IMPORT_FUNC(pig_virtual_dereference)
PIG_IMPORT_FUNC(pig_virtual_setobject)
PIG_IMPORT_ENDTABLE
#endif // PIGVIRTUAL_H