Source

railgun-doc-ja / source / simobj.rst

:class:`SimObject`: Cの共有ライブラリから必要な関数をロードしてくれるクラス

あなたが定義すべき属性/関数

RailGun を使ってCの共有ライブラリから必要な関数をロードするには, :class:`railgun.SimObject` をオーバーライドし, 必要な属性(attribute)を定義する必要があります.

Note

このドキュメントの :class:`YourSimObject`あなたが定義すべきクラス の事を指します. RailGunに含まれているクラスでは有りません.

このクラス :class:`yourcode.YourSimObject` の名前は,対応する Cの構造体の名前と同じである必要があります.別の名前を使う方法については, :attr:`_cstructname_`:attr:`_cfuncprefix_` を参照してください.

RailGun の使う特別な属性のうち,最低限必要な属性は :attr:`_clibname_`, :attr:`_clibdir_`, :attr:`_cmembers_`, :attr:`_cfuncs_` です.

例:

class YourSimObject(SimObject):
    _clibname_ = 'name_of_shared_library.so'
    _clibdir_ = 'path/to/shared/library'

    _cmembers_ = [
        'num_i',
        'num_j',
        'int scalar',
        'int vector[i]',
        'int matrix[i][j]',
        ...
        ]

    _cfuncs_ = [
        'name_of_c_function',
        ...
        ]

    def __init__(self, num_i, num_j, **kwds):
        SimObject.__init__(self, num_i=num_i, num_j=num_j, **kwds)

    def some_function(self, ...):
        ...
  • :meth:`railgun.SimObject.__init__` はオーバーライド可能です.
  • Cの関数(:attr:`_cfuncs_`)や構造体メンバー(:attr:`_cmembers_`)と 名前が被らない限り,Pythonの関数を定義したり,メンバー変数を 用いても問題ありません.
  • Cの関数や構造体メンバーと名前が被ると,上書きされてしまいます.

Cの構造体のメンバーに任意のオブジェクトを指定する

:class:`SimObject` に定義されている便利な関数

:class:`SimObject` には,いくつかの便利な関数が既に定義されています.

C Data Type (CDT) と numpy の dtype と ctypes の対応関係

以下の C Data Types (CDTs) を使って,C構造体のメンバーを指定することが 出来ます.

CDT C-language type numpy dtype ctypes
char :c:type:`char` character c_char
short :c:type:`short` short c_short
ushort :c:type:`unsigned short` ushort c_ushort
int :c:type:`int` int32 c_int
uint :c:type:`unsigned int` uint32 c_uint
long :c:type:`long` int32 or int64 c_long
ulong :c:type:`unsigned long` uint32 or uint64 c_ulong
longlong :c:type:`long long` longlong c_longlong
ulonglong :c:type:`unsigned long long` ulonglong c_ulonglong
float :c:type:`float` float32 c_float
double :c:type:`double` float c_double
longdouble :c:type:`long double` longdouble c_longdouble
bool :c:type:`bool` bool c_bool

Note

CDT long / ulong に対応する numpy の dtype は :func:`platform.architecture` を使ったプラットフォームの判定に従って 決定しています.