[[devel]]
[[開発ノウハウ集]]

EmbPythonSwigの標準的なグルーコードとは異なる処理をしたい場合,.iファイル内に独自のグルーコードの実装を記述して与えることができます.

クラスにない関数を新たに追加したりもできます.

- 使用例
-- コールバック関数(PyObject*)を引数に取り,コールバック登録を行う関数を作りたい場合.
-- GetHogeshi(int i)とNHogeshis()から,リスト化して返すGetHogeshis()を自動生成するなど.
--- src/EmbPython/Utility/EPObject.i の EXTEND_N_GETS_TO_LIST で使われていますので参照してください.


** NantokaクラスのHogeshiメソッドの実装を与える例 [#gc7a82a7]

 // まずignoreすることでSWIGが標準のグルーコードを吐き出すのを抑制します.
 %ignore Nantoka::Hogeshi;
 
 // 次に独自実装のグルーコードを定義します.
 %extend Nantoka{
 	PyObject* Hogeshi(){
 		// この中にグルーコードの独自実装を書く.
 		// selfのC++オブジェクトは $self で取得できる.
 
 		// 例 :
 		PyObject* result;
 		result = $self->HogeshiFunc();  // C++のNantokaオブジェクトのHogeshiFunc関数が呼ばれる
 		
 		return result;
 	}
 }
 %enddef

~

上記の記述で,以下のような関数が生成されます.
- 前処理や後処理が多数追加されること
- $selfが Nantoka* c_self に置き換わること
- return が ret_tmp= に置き換わること

に注意してください.

 PyObject* __PYDECL EPNantoka_Hogeshi( PyObject* self )
 {
 	UTAutoLock LOCK(EPCriticalSection);
 
 	if( EPObject_Ptr(self) == NULL )
 	{
 		PyErr_SetString( PyErr_Spr_NullReference , "Null Reference in Nantoka.GetContacts");
 		return NULL;
 	}
  	if(true)
 	{
 		PyObject* ret_tmp;
 		{
 			PyObject * py_self = self;
 			Nantoka* c_self = EPObject_Cast(py_self,Nantoka);
 
 			
 			// この中にグルーコードの独自実装を書く.
 			// selfのC++オブジェクトは $self で取得できる.
 		
 			// 例 :
 			PyObject* result;
 			result = c_self->HogeshiFunc();  // C++のNantokaオブジェクトのHogeshiFunc関数が呼ばれる
 		
 			ret_tmp = result;
 			
 			
 		}
 		PyObject* c_ret =  ret_tmp;
 		PyObject* py_ret = c_ret;
 		if ( !py_ret )
 		{
 			PyErr_BadInternalCall();
 			return NULL;
 		}
 		if ( py_ret == Py_None ) Py_RETURN_NONE;
 		return py_ret;
 	}
 	PyErr_BadArgument();
 	return NULL;
 }

* グルーコードヘッダにそのまま出力されるコードを書く [#e2f9ea9a]

.iファイルで

 %begin%{
 // ...
 }

で囲んだ部分は,グルーコードヘッダにそのまま出力されます.