summaryrefslogtreecommitdiff
path: root/python/gras/GRAS_Block.i
diff options
context:
space:
mode:
Diffstat (limited to 'python/gras/GRAS_Block.i')
-rw-r--r--python/gras/GRAS_Block.i70
1 files changed, 65 insertions, 5 deletions
diff --git a/python/gras/GRAS_Block.i b/python/gras/GRAS_Block.i
index b6d8fa9..ccd3963 100644
--- a/python/gras/GRAS_Block.i
+++ b/python/gras/GRAS_Block.i
@@ -18,7 +18,7 @@
%module(directors="1") GRAS_Block
-%feature("director");
+%feature("director") BlockPython;
%{
#include <gras/block.hpp>
@@ -31,6 +31,63 @@
%include <gras/block.hpp>
%include <PMC/PMC.i>
+
+////////////////////////////////////////////////////////////////////////
+// Make a special block with safe overloads
+////////////////////////////////////////////////////////////////////////
+
+%inline %{
+
+namespace gras
+{
+
+struct BlockPython : Block
+{
+ BlockPython(const std::string &name):
+ Block(name)
+ {
+ //NOP
+ }
+
+ int work
+ (
+ const InputItems &input_items,
+ const OutputItems &output_items
+ )
+ {
+ PyGILState_STATE s;
+ s = PyGILState_Ensure();
+ int ret = 0;
+ try
+ {
+ ret = this->python_work(input_items, output_items);
+ }
+ catch(...)
+ {
+ PyGILState_Release(s);
+ throw;
+ }
+ PyGILState_Release(s);
+ return ret;
+ }
+
+ virtual int python_work
+ (
+ const InputItems &input_items,
+ const OutputItems &output_items
+ )
+ {
+ throw std::runtime_error("Error in BlockPython::python_work: SWIG directors issue?");
+ }
+};
+
+}
+
+%}
+
+////////////////////////////////////////////////////////////////////////
+// Python overload for adding pythonic interfaces
+////////////////////////////////////////////////////////////////////////
%pythoncode %{
import numpy
@@ -39,21 +96,24 @@ def sig_to_dtype_sig(sig):
if sig is None: sig = ()
return map(numpy.dtype, sig)
-class BlockPython(Block):
+class Block(BlockPython):
def __init__(self, name='Block', in_sig=None, out_sig=None):
- Block.__init__(self, name)
+ BlockPython.__init__(self, name)
self.set_input_signature(in_sig)
self.set_output_signature(in_sig)
def set_input_signature(self, sig):
self.__in_sig = sig_to_dtype_sig(sig)
- Block.set_input_signature(self, IOSignature([s.itemsize for s in self.__in_sig]))
+ BlockPython.set_input_signature(self, IOSignature([s.itemsize for s in self.__in_sig]))
def set_output_signature(self, sig):
self.__out_sig = sig_to_dtype_sig(sig)
- Block.set_output_signature(self, IOSignature([s.itemsize for s in self.__out_sig]))
+ BlockPython.set_output_signature(self, IOSignature([s.itemsize for s in self.__out_sig]))
def input_signature(self): return self.__in_sig
def output_signature(self): return self.__out_sig
+ def python_work(self, input_items, output_items):
+ print 'python work called'
+
%}