diff options
Diffstat (limited to 'Examples/python/std_vector')
-rw-r--r-- | Examples/python/std_vector/.cvsignore | 10 | ||||
-rw-r--r-- | Examples/python/std_vector/Makefile | 21 | ||||
-rw-r--r-- | Examples/python/std_vector/example.h | 25 | ||||
-rw-r--r-- | Examples/python/std_vector/example.i | 17 | ||||
-rw-r--r-- | Examples/python/std_vector/runme.py | 36 |
5 files changed, 109 insertions, 0 deletions
diff --git a/Examples/python/std_vector/.cvsignore b/Examples/python/std_vector/.cvsignore new file mode 100644 index 000000000..d29d3bb46 --- /dev/null +++ b/Examples/python/std_vector/.cvsignore @@ -0,0 +1,10 @@ +example.py +*_wrap.c +*_wrap.cxx +*.dll +*.dsw +*.ncb +*.opt +*.plg +Release +Debug diff --git a/Examples/python/std_vector/Makefile b/Examples/python/std_vector/Makefile new file mode 100644 index 000000000..f00af7dba --- /dev/null +++ b/Examples/python/std_vector/Makefile @@ -0,0 +1,21 @@ +TOP = ../.. +SWIG = $(TOP)/../swig +CXXSRCS = +TARGET = example +INTERFACE = example.i +LIBS = -lm +SWIGOPT = + +all:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' python_cpp + +static:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='mypython' INTERFACE='$(INTERFACE)' python_cpp_static + +clean:: + $(MAKE) -f $(TOP)/Makefile python_clean + rm -f $(TARGET).py + +check: all diff --git a/Examples/python/std_vector/example.h b/Examples/python/std_vector/example.h new file mode 100644 index 000000000..4f0dac70d --- /dev/null +++ b/Examples/python/std_vector/example.h @@ -0,0 +1,25 @@ +/* File : example.h */ + +#include <vector> +#include <algorithm> +#include <functional> +#include <numeric> + +double average(std::vector<int> v) { + return std::accumulate(v.begin(),v.end(),0.0)/v.size(); +} + +std::vector<double> half(const std::vector<double>& v) { + std::vector<double> w(v); + for (unsigned int i=0; i<w.size(); i++) + w[i] /= 2.0; + return w; +} + +void halve_in_place(std::vector<double>& v) { + // would you believe this is the same as the above? + std::transform(v.begin(),v.end(),v.begin(), + std::bind2nd(std::divides<double>(),2.0)); +} + + diff --git a/Examples/python/std_vector/example.i b/Examples/python/std_vector/example.i new file mode 100644 index 000000000..aa58b66e0 --- /dev/null +++ b/Examples/python/std_vector/example.i @@ -0,0 +1,17 @@ +/* File : example.i */ +%module example + +%{ +#include "example.h" +%} + +%include stl.i +/* instantiate the required template specializations */ +namespace std { + %template(IntVector) vector<int>; + %template(DoubleVector) vector<double>; +} + +/* Let's just grab the original header file here */ +%include "example.h" + diff --git a/Examples/python/std_vector/runme.py b/Examples/python/std_vector/runme.py new file mode 100644 index 000000000..d248ccbbb --- /dev/null +++ b/Examples/python/std_vector/runme.py @@ -0,0 +1,36 @@ +# file: runme.py + +import example + +# Call average with a Python list... + +print example.average([1,2,3,4]) + +# ... or a wrapped std::vector<int> + +v = example.IntVector(4) +for i in range(len(v)): + v[i] = i+1 +print example.average(v) + + +# half will return a Python list. +# Call it with a Python tuple... + +print example.half((1.0, 1.5, 2.0, 2.5, 3.0)) + +# ... or a wrapped std::vector<double> + +v = example.DoubleVector() +for i in [1,2,3,4]: + v.append(i) +print example.half(v) + + +# now halve a wrapped std::vector<double> in place + +example.halve_in_place(v) +for i in range(len(v)): + print v[i], "; ", +print + |