Оберните "вариантную" структуру / объединение, используя SWIG - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь обернуть некий «вариантный» тип с помощью 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, но я не могу найти его снова ...

...