2012-05-08 33 views
3

我是一個非常新的swig,我想創建一個swig包裝器,以便在python中使用幾個C++文件。我有以下C++類。創建Swig包裝的C++(指針)到python

以下是代碼片段,我想轉換:

/*packet_buffer.h*/ 
class CPacketBuffer { 
public: 
    // construct based on given buffer, data is not copied 
    CPacketBuffer(uint8_t* data, uint32_t length) { 
     mpBuffer = data; 
     mLength = length; 
     mHead = 0; 
     mTail = length; 
    } 
    uint8_t* GetBuffer() { 
     return (mpBuffer + mHead); 
    } 
    void Add(const uint8_t* data, uint32_t length) { 
      if ((mTail + length) > mLength) { 
      length = (mLength - mTail); 
     } 
//.... 
} 

我一直想寫一個example.i文件,將接受指針類型定義(uint8_t *)今天一天都使用swig文檔的幫助,但我一直不成功。

以下是我試過的packet_buffer.i文件,它不起作用。

%module packet_buffer 
%include typemaps.i 
%apply unsigned char* {uint8_t*}; 
%apply unit8_t *INPUT {uint8_t *data}; 



%{ 
    #define SWIG_FILE_WITH_INIT 
    #include "../include/packet_buffer.h" 
%} 
%include "../include/packet_buffer.h" 
  1. 我如何寫該採取指針的typedef成員函數痛飲代碼?
  2. 我可以寫一個可以在代碼中使用的通用%應用程序,還是必須爲每個INPUT,OUTPUT參數編寫特定的代碼?

回答

3

如果我正確地理解了這個問題,你面對的問題不是它們是指針,而是它們可能是無界數組。使用carrays.i和 「%array_class」 宏觀調控,例如

您可以warp an unbounded C array

%module packet 
%include "stdint.i" 

%{ 
    #include "packet.h" 
%} 

%include "carrays.i" 
%array_class(uint8_t, buffer); 

%include "packet.h" 

隨後將允許你用Python寫類似:

a = packet.buffer(10000000) 
p = packet.CPacketBuffer(a.cast(), 10000000) 

注意,你」需要確保緩衝區的生命週期是足夠的 - 如果Python對象在沒有C++代碼的情況下被釋放,那麼最終會導致未定義的行爲。

你可以轉換uint8_t*指針(無界的陣列)使用frompointer方法,該%array_class宏還創建,例如緩衝實例在Python:

r = packet.GetBuffer() 
buf = packet.buffer_frompointer(r) 

可以add additional Python code自動化/隱藏大多數之間的轉換的如果需要,可以使用緩衝區,或者使用MemoryViews在C API端與Python更緊密地結合。

一般來說,因爲這是C++,所以我建議使用std::vector這樣做 - 它在Python方面比無界陣列更好用,而且它爲您提供的安全性和簡單性成本最低。

+0

非常感謝回覆。由於這些是低級包處理程序,我們不允許使用STL。這工作沒有錯誤,但我不知道如何轉換這樣的函數uint8_t * GetBuffer()返回(mpBuffer + mHead); },它返回一個指向成員的指針? –

+0

@GuruGovindan - 我已經添加了一個更新的語法去其他方式。就我個人而言,我仍然認爲排除'std :: vector'是一個錯誤,它可能會降低您的缺陷率,如果您可以制定切實可行的基準測試,那麼它會非常驚訝。 (尤其是Python方面的一個)。 – Flexo

+0

感謝您的更新awoodland,很遺憾,我無法做出改變設計的決定。但我會明確地建議使用矢量。 –