Add initial support for python bindings
[alexxy/gromacs.git] / src / pygromacs / sip / definitions.sip
1
2 %Exception std::out_of_range(SIP_IndexError) {
3
4 %TypeHeaderCode
5 #include <stdexcept>
6 %End
7
8 %RaiseCode
9     SIP_BLOCK_THREADS
10     PyErr_SetString(PyExc_IndexError, sipExceptionRef.what());
11     SIP_UNBLOCK_THREADS
12 %End
13 };
14
15 template<T> class RealVector /NoDefaultCtors/ {
16 %TypeHeaderCode
17 #include "vec.h"
18 %End
19
20 public:
21     T x;
22     T y;
23     T z;
24     T operator[] (unsigned int i) throw (std::out_of_range);
25     PyObject* __str__();
26     %MethodCode
27         size_t size = PyOS_snprintf(NULL, 0, "Vector [%f, %f, %f]", sipCpp->x, sipCpp->y, sipCpp->z);
28         char str[size + 1];
29         PyOS_snprintf(str, size + 1, "Vector [%f, %f, %f]", sipCpp->x, sipCpp->y, sipCpp->z);
30
31         return PyUnicode_FromString(str);
32     %End
33 };
34
35 template<T, Adaptor, Inner> class Array /NoDefaultCtors/ {
36 %TypeHeaderCode
37 #include "vec.h"
38 %End
39
40 public:
41     Adaptor operator[] (unsigned int i) throw (std::out_of_range);
42     SIP_SSIZE_T __len__();
43     %MethodCode
44         sipRes = sipCpp->len();
45     %End
46 };
47
48 class Matrix /NoDefaultCtors/ {
49 %TypeHeaderCode
50 #include "vec.h"
51 %End
52
53 public:
54     py_rvec __getitem__(int) throw (std::out_of_range);
55     %MethodCode
56         try {
57             sipRes = new py_rvec(sipCpp->get(a0));
58         } catch (const std::out_of_range &e) {
59             sipIsErr = 1;
60             SIP_BLOCK_THREADS
61             PyErr_SetString(PyExc_IndexError, e.what());
62             SIP_UNBLOCK_THREADS
63         }
64     %End
65     double __getitem__(SIP_PYTUPLE) throw (std::out_of_range);
66     %MethodCode
67         size_t i, j;
68         if (PyArg_ParseTuple(a0, "nn", &i, &j))
69             try {
70                 sipRes = sipCpp->get(i, j);
71             } catch (const std::out_of_range &e) {
72                 sipIsErr = 1;
73                 SIP_BLOCK_THREADS
74                 PyErr_SetString(PyExc_IndexError, e.what());
75                 SIP_UNBLOCK_THREADS
76             }
77         else
78             sipIsErr = 1;
79     %End
80 };
81
82 typedef double* rvec;
83 typedef double* dvec;
84 typedef double** matrix;
85 typedef double** tensor;
86 typedef int* ivec;
87 typedef int** imatrix;
88
89 typedef RealVector<double> py_rvec;
90 typedef Array<double, py_rvec, rvec> rvecs;