diff options
Diffstat (limited to 'Examples/tcl/std_vector')
| -rw-r--r-- | Examples/tcl/std_vector/Makefile | 20 | ||||
| -rw-r--r-- | Examples/tcl/std_vector/example.h | 25 | ||||
| -rw-r--r-- | Examples/tcl/std_vector/example.i | 17 | ||||
| -rw-r--r-- | Examples/tcl/std_vector/runme.tcl | 40 |
4 files changed, 102 insertions, 0 deletions
diff --git a/Examples/tcl/std_vector/Makefile b/Examples/tcl/std_vector/Makefile new file mode 100644 index 0000000..ce6a3c7 --- /dev/null +++ b/Examples/tcl/std_vector/Makefile @@ -0,0 +1,20 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +CXXSRCS = +TARGET = my_tclsh +DLTARGET = example +INTERFACE = example.i +LIBS = -lm + +all:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='$(DLTARGET)' INTERFACE='$(INTERFACE)' tcl_cpp + +static:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' tclsh_cpp_static + +clean:: + $(MAKE) -f $(TOP)/Makefile tcl_clean + +check: all diff --git a/Examples/tcl/std_vector/example.h b/Examples/tcl/std_vector/example.h new file mode 100644 index 0000000..4f0dac7 --- /dev/null +++ b/Examples/tcl/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/tcl/std_vector/example.i b/Examples/tcl/std_vector/example.i new file mode 100644 index 0000000..aa58b66 --- /dev/null +++ b/Examples/tcl/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/tcl/std_vector/runme.tcl b/Examples/tcl/std_vector/runme.tcl new file mode 100644 index 0000000..2cece96 --- /dev/null +++ b/Examples/tcl/std_vector/runme.tcl @@ -0,0 +1,40 @@ +# file: runme.tcl + +catch { load ./example[info sharedlibextension] example} + +# Exercise IntVector + +set iv [IntVector] +$iv push 1 +$iv push 3 +$iv push 5 + +puts "IntVector size: [$iv size] (should be 3)" +puts "IntVector average: [average $iv] (should be 3.0)" +puts "IntVector pop: [$iv pop] (should be 5)" +puts "IntVector pop: [$iv pop] (should be 3)" +puts "IntVector get 0: [$iv get 0] (should be 1)" +puts "" + +# Exercise DoubleVector + +set dv [DoubleVector] +$dv push 2 +$dv push 4 +$dv push 6 + +puts "DoubleVector size: [$dv size] (should be 3)" +puts "DoubleVector data: [$dv get 0] [$dv get 1] [$dv get 2] (should be 2.0 4.0 6.0)" +halve_in_place $dv +puts "DoubleVector halved: [$dv get 0] [$dv get 1] [$dv get 2] (should be 1.0 2.0 3.0)" +puts "" + +# Complain if unknown is called +rename unknown unknown_orig +proc unknown {args} { + puts "ERROR: unknown called with: $args" + uplevel 1 unknown_orig $args +} + +puts "average \"1 2 3\": [average [list 1 2 3]]" + |
