Как заставить SWIG автоматически оборачивать эмулируемый указатель «this» в структуру C?

У меня есть простой C-класс, который я реализовал, используя указатели функций в структуре для реализации функций-членов и передавая указатель на структуру в качестве первого аргумента каждой функции, аналогично неявному указателю "this" в С++.

%module mytest
%{
typedef struct mytest mytest;

struct mytest {
  int data;
  int (*func1)(mytest *,int);
  void (*func2)(mytest *,int);
};

int f1(mytest *me,int n) { return me->data + n; }
void f2(mytest *me,int n) { me->data += n; }

mytest *mytestNew(int n) {
  mytest *me = (mytest*) malloc(sizeof(mytest));
  me->data = n;
  me->func1 = f1;
  me->func2 = f2;
  return me;
}

%}

typedef struct mytest mytest;

struct mytest {
  int data;
  int func1(mytest *,int);
  void func2(mytest *,int);
};

extern mytest *mytestNew(int n);

Теперь моя проблема заключается в том, что когда интерфейс создается для любого языка, который я выбираю во внешнем интерфейсе, мне приходится явно передавать указатель «this» на объект, даже если сам язык поддерживает скрытие этого.

Например, предположим, что я выбираю Python. Я должен сделать что-то вроде этого:

from mytest import *
m = mytestNew(1)
m.func1(m,0)

Где я действительно хочу сделать это так:

from mytest import *
m = mytestNew(1)
m.func1(0)

Я знаю, что мог бы просто написать код-обертку, но для моего реального проекта у меня есть много функций во многих объектов существующего кода C и умножить это на каждый язык, который я хочу поддерживать, это слишком много работы! Есть ли способ заставить SWIG делать это автоматически?

6
задан Michael 13 June 2012 в 21:59
поделиться