Генерируемый SWIG Lua <-> C ++ Wrapper неправильно обрабатывает примитивные типы, переименованные в typedef - PullRequest
1 голос
/ 28 декабря 2011

Я использую SWIG для создания оболочки C ++ <-> Lua для рабочего проекта. Моя главная проблема в том, что в этом базовом проекте существуют определения типов для каждой платформы. Например. для Win32 существует заголовок Win32Types.h, где такие вещи, как

typedef char Char;
typedef char TChar;
typedef signed int Int;
typedef unsigned int UInt;
typedef signed char Int8;
typedef unsigned char UInt8;
...

определены. Проблема в том, что с примером класса, как

class Named
{
  public:
    Named();
    virtual ~Named();

    void setName(const Char *name);
    const Char* GetName() const;
}

, setName - Метод, сгенерированный в SWIG-обертке, выглядит примерно так:

static int _wrap_Named_SetName(lua_State* L) {
  int SWIG_arg = 0;
  Named *arg1 = (Named *) 0 ;
  Char *arg2 = (Char *) 0 ;

  SWIG_check_num_args("Named::SetName",2,2)

  if(!SWIG_isptrtype(L,1))
    SWIG_fail_arg("Named::SetName",1,"Named *");

  if(!SWIG_isptrtype(L,2)) 
    SWIG_fail_arg("Named::SetName",2,"Char const *");

  if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Named,0))){
    SWIG_fail_ptr("Named_SetName",1,SWIGTYPE_p_Named);
  }

  if (!SWIG_IsOK(SWIG_ConvertPtr(L,2,(void**)&arg2,SWIGTYPE_p_Char,0))){
    SWIG_fail_ptr("Named_SetName",2,SWIGTYPE_p_Char);
  }

  ...
}

проблема здесь в том, что оболочка пытается трактовать Char как просто еще один указатель класса, хотя это просто указатель char, переименованный в Char. есть ли способ обойти это поведение?

Я пытался написать карту типа, такую ​​как

%typemap(in) Char {
  $1 = lua_tostring($input);
}

, но я не уверен, что сделал все правильно ...

1 Ответ

1 голос
/ 29 декабря 2011

Есть два более простых способа сделать это:

  1. Показать SWIG typedef с для этой платформы, вероятно, используя %include
  2. Скажите SWIG простоиспользуйте обычную unsigned char * карту типов, используя %apply:

    %apply unsigned char * { const Char * }
    
...