Я пытаюсь обернуть некий «вариантный» тип с помощью SWIG. Я имею в виду что-то похожее на GType или подобное, где указатель, который вы получаете, имеет базовый тип, но реальный тип на самом деле намного больше и может быть найден с помощью поля в базе.
#define OBJ_TYPE_1 1
#define OBJ_TYPE_2 2
typedef struct Base_t {
DWORD mObjectSize;
DWORD mObjectType;
} Base;
typedef struct Object1_t {
Base mBase;
DWORD member1;
DWORD member2;
// Some specific members...
} Object1;
typedef struct Object2_t {
Base mBase;
DWORD member3;
DWORD member4;
WORD member5;
// Some different specific members ...
} Object2;
В предлагаемом интерфейсе C библиотека используется таким образом, что она выглядит следующим образом
Base base;
// Get object header to find out type
PeekObject(&base);
// Treat object depending on type
if (base.mObjectType == OBJ_TYPE_1) {
Object1* obj = (Object1*) malloc(sizeof(Object1));
ReadObject(&(obj->mBase));
DWORD blahblah = obj->member2;
}
else if (base.mObjectType == OBJ_TYPE_2) {
// ...
}
Как бы вы завернули это в SWIG? В идеале, в Python вы могли бы просто "ReadObject" и напрямую получить объект нужного типа.
>>> obj = lib.read_object()
>>> obj
<class 'lib.Object1'>
Я не могу изменить библиотеку, но могу изменить упаковку (файл .i). Должен ли я пойти с пользовательским кодом? Должен ли я использовать шрифты? Я не знаю почему, я помню, что был конкретный пример для этого в документации SWIG, но я не могу найти его снова ...