|
1 | 1 | from __future__ import absolute_import |
2 | | -from ._dss_capi import lib, ffi |
3 | 2 | import numpy as np |
4 | 3 |
|
5 | 4 | freeze = True |
@@ -41,99 +40,97 @@ def __getattr__(self, key): |
41 | 40 |
|
42 | 41 |
|
43 | 42 | def __setattr__(self, key, value): |
44 | | - |
45 | 43 | if _case_insensitive: |
46 | 44 | okey = key |
47 | 45 | key = self._dss_atributes.get(key.lower(), None) |
48 | 46 | if key is None: |
49 | | - raise TypeError( "%r is a frozen class" % self) |
| 47 | + raise TypeError("%r is a frozen class" % self) |
50 | 48 |
|
51 | 49 | if self._isfrozen and not hasattr(self, key): |
52 | | - raise TypeError( "%r is a frozen class" % self ) |
| 50 | + raise TypeError("%r is a frozen class" % self) |
53 | 51 |
|
54 | 52 | object.__setattr__(self, key, value) |
55 | 53 |
|
56 | 54 |
|
57 | | -def get_string(b): |
58 | | - return ffi.string(b).decode(codec) |
59 | | - |
60 | | -def get_float64_array(func, *args): |
61 | | - ptr = ffi.new('double**') |
62 | | - cnt = ffi.new('int32_t*') |
63 | | - func(ptr, cnt, *args) |
64 | | - if not cnt[0]: |
65 | | - res = None |
66 | | - else: |
67 | | - res = np.frombuffer(ffi.buffer(ptr[0], cnt[0] * 8), dtype=np.float).copy() |
68 | 55 |
|
69 | | - lib.DSS_Dispose_PDouble(ptr) |
70 | | - return res |
| 56 | +class CffiApiUtil(object): |
| 57 | + def __init__(self, ffi, lib): |
| 58 | + self.ffi = ffi |
| 59 | + self.lib = lib |
71 | 60 |
|
72 | | - |
73 | | - |
74 | | -def get_int32_array(func, *args): |
75 | | - ptr = ffi.new('int32_t**') |
76 | | - cnt = ffi.new('int32_t*') |
77 | | - func(ptr, cnt, *args) |
78 | | - if not cnt[0]: |
79 | | - res = None |
80 | | - else: |
81 | | - res = np.frombuffer(ffi.buffer(ptr[0], cnt[0] * 4), dtype=np.int32).copy() |
82 | | - |
83 | | - lib.DSS_Dispose_PInteger(ptr) |
84 | | - return res |
| 61 | + def get_string(self, b): |
| 62 | + return self.ffi.string(b).decode(codec) |
85 | 63 |
|
| 64 | + def get_float64_array(self, func, *args): |
| 65 | + ptr = self.ffi.new('double**') |
| 66 | + cnt = self.ffi.new('int32_t*') |
| 67 | + func(ptr, cnt, *args) |
| 68 | + if not cnt[0]: |
| 69 | + res = None |
| 70 | + else: |
| 71 | + res = np.frombuffer(self.ffi.buffer(ptr[0], cnt[0] * 8), dtype=np.float).copy() |
| 72 | + |
| 73 | + self.lib.DSS_Dispose_PDouble(ptr) |
| 74 | + return res |
86 | 75 |
|
87 | | -def get_int8_array(func, *args): |
88 | | - ptr = ffi.new('int8_t**') |
89 | | - cnt = ffi.new('int32_t*') |
90 | | - func(ptr, cnt, *args) |
91 | | - if not cnt[0]: |
92 | | - res = None |
93 | | - else: |
94 | | - res = np.frombuffer(ffi.buffer(ptr[0], cnt[0] * 1), dtype=np.int8).copy() |
95 | | - |
96 | | - lib.DSS_Dispose_PByte(ptr) |
97 | | - return res |
98 | | - |
| 76 | + def get_int32_array(self, func, *args): |
| 77 | + ptr = self.ffi.new('int32_t**') |
| 78 | + cnt = self.ffi.new('int32_t*') |
| 79 | + func(ptr, cnt, *args) |
| 80 | + if not cnt[0]: |
| 81 | + res = None |
| 82 | + else: |
| 83 | + res = np.frombuffer(self.ffi.buffer(ptr[0], cnt[0] * 4), dtype=np.int32).copy() |
| 84 | + |
| 85 | + self.lib.DSS_Dispose_PInteger(ptr) |
| 86 | + return res |
| 87 | + |
| 88 | + def get_int8_array(self, func, *args): |
| 89 | + ptr = self.ffi.new('int8_t**') |
| 90 | + cnt = self.ffi.new('int32_t*') |
| 91 | + func(ptr, cnt, *args) |
| 92 | + if not cnt[0]: |
| 93 | + res = None |
| 94 | + else: |
| 95 | + res = np.frombuffer(self.ffi.buffer(ptr[0], cnt[0] * 1), dtype=np.int8).copy() |
99 | 96 |
|
100 | | -def get_string_array(func, *args): |
101 | | - ptr = ffi.new('char***') |
102 | | - cnt = ffi.new('int32_t*') |
103 | | - func(ptr, cnt, *args) |
104 | | - if not cnt[0]: |
105 | | - res = [] |
106 | | - else: |
107 | | - actual_ptr = ptr[0] |
108 | | - if actual_ptr == ffi.NULL: |
| 97 | + self.lib.DSS_Dispose_PByte(ptr) |
| 98 | + return res |
| 99 | + |
| 100 | + def get_string_array(self, func, *args): |
| 101 | + ptr = self.ffi.new('char***') |
| 102 | + cnt = self.ffi.new('int32_t*') |
| 103 | + func(ptr, cnt, *args) |
| 104 | + if not cnt[0]: |
109 | 105 | res = [] |
110 | 106 | else: |
111 | | - res = [(str(ffi.string(actual_ptr[i]).decode(codec)) if (actual_ptr[i] != ffi.NULL) else None) for i in range(cnt[0])] |
112 | | - |
113 | | - lib.DSS_Dispose_PPAnsiChar(ptr, cnt[0]) |
114 | | - return res |
115 | | - |
116 | | - |
117 | | - |
118 | | -def prepare_float64_array(value): |
119 | | - if type(value) is not np.ndarray or value.dtype != np.float64: |
120 | | - value = np.array(value, dtype=np.float64) |
121 | | - |
122 | | - ptr = ffi.cast('double*', ffi.from_buffer(data.data)) |
123 | | - cnt = data.size |
124 | | - return value, ptr, cnt |
125 | | - |
126 | | -def prepare_int32_array(value): |
127 | | - if type(value) is not np.ndarray or value.dtype != np.int32: |
128 | | - value = np.array(value, dtype=np.int32) |
129 | | - |
130 | | - ptr = ffi.cast('int32_t*', ffi.from_buffer(data.data)) |
131 | | - cnt = data.size |
132 | | - return value, ptr, cnt |
133 | | - |
| 107 | + actual_ptr = ptr[0] |
| 108 | + if actual_ptr == self.ffi.NULL: |
| 109 | + res = [] |
| 110 | + else: |
| 111 | + res = [(str(self.ffi.string(actual_ptr[i]).decode(codec)) if (actual_ptr[i] != self.ffi.NULL) else None) for i in range(cnt[0])] |
| 112 | + |
| 113 | + self.lib.DSS_Dispose_PPAnsiChar(ptr, cnt[0]) |
| 114 | + return res |
| 115 | + |
| 116 | + def prepare_float64_array(self, value): |
| 117 | + if type(value) is not np.ndarray or value.dtype != np.float64: |
| 118 | + value = np.array(value, dtype=np.float64) |
| 119 | + |
| 120 | + ptr = self.ffi.cast('double*', self.ffi.from_buffer(data.data)) |
| 121 | + cnt = data.size |
| 122 | + return value, ptr, cnt |
| 123 | + |
| 124 | + def prepare_int32_array(self, value): |
| 125 | + if type(value) is not np.ndarray or value.dtype != np.int32: |
| 126 | + value = np.array(value, dtype=np.int32) |
| 127 | + |
| 128 | + ptr = self.ffi.cast('int32_t*', self.ffi.from_buffer(data.data)) |
| 129 | + cnt = data.size |
| 130 | + return value, ptr, cnt |
134 | 131 |
|
135 | | -def prepare_string_array(value): |
136 | | - raise NotImplementedError |
| 132 | + def prepare_string_array(self, value): |
| 133 | + raise NotImplementedError |
137 | 134 |
|
138 | 135 |
|
139 | 136 | # This might be useful for methods like Get_Channel that are exposed as Channel[] and Channel() |
|
0 commit comments