summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2013-02-01 19:17:21 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2013-02-01 19:17:21 +0000
commita043b55b69d4587a1bd95b934b85acb683e415e6 (patch)
tree2e8237d18d53a7af4f24b0d7039322eca6c6bbef
parent2a90cc6a9807c2cd136befaada1ff91276e7d01c (diff)
downloadswig-a043b55b69d4587a1bd95b934b85acb683e415e6.tar.gz
Better clarification about polymorphic wrappers for function objects - std::function
-rw-r--r--Doc/Manual/Cpp0x.html24
-rw-r--r--Examples/test-suite/cpp0x_function_objects.i29
-rw-r--r--Examples/test-suite/python/cpp0x_function_objects_runme.py8
3 files changed, 48 insertions, 13 deletions
diff --git a/Doc/Manual/Cpp0x.html b/Doc/Manual/Cpp0x.html
index 0200fdf5c..aa8c41225 100644
--- a/Doc/Manual/Cpp0x.html
+++ b/Doc/Manual/Cpp0x.html
@@ -735,14 +735,32 @@ int main() {
<H3><a name="Cpp0x_Polymorphous_wrappers_for_function_objects"></a>7.3.7 Polymorphous wrappers for function objects</H3>
-<p>SWIG fully supports function template wrappers and function objects:</p>
+<p>
+SWIG supports functor classes in some languages in a very natural way.
+However nothing is provided yet for the new <tt>std::function</tt> template.
+SWIG will parse usage of the template like any other template.
+</p>
<div class="code"><pre>
-function&lt;int ( int, int )&gt; pF; // function template wrapper
+%rename(__call__) Test::operator(); // Default renaming used for Python
struct Test {
- bool operator()( short x, short y ); // function object
+ bool operator()(int x, int y); // function object
};
+
+#include &lt;functional&gt;
+std::function&lt;void (int, int)&gt; pF = Test; // function template wrapper
+
+</pre></div>
+
+<p>
+Example of supported usage of the plain functor from Python is shown below.
+It does not involve <tt>std::function</tt>.
+</p>
+
+<div class="targetlang">
+t = Test()
+b = t(1,2) # invoke C++ function object
</pre></div>
<H3><a name="Cpp0x_Type_traits_for_metaprogramming"></a>7.3.8 Type traits for metaprogramming</H3>
diff --git a/Examples/test-suite/cpp0x_function_objects.i b/Examples/test-suite/cpp0x_function_objects.i
index e864137c7..4b9895ca8 100644
--- a/Examples/test-suite/cpp0x_function_objects.i
+++ b/Examples/test-suite/cpp0x_function_objects.i
@@ -1,18 +1,35 @@
/* This testcase checks whether SWIG correctly parses function objects
and the templates for the functions (signature).
- Function objects are objects which overload the operator() function. */
+ Function objects are objects which overload the operator() function.
+ The std::function does not provide any seamless support in the target languages yet.
+*/
%module cpp0x_function_objects
-%inline %{
-//function<int ( int, int )> pF; // not supported yet by the compiler
+%rename(__call__) Test::operator();
+%inline %{
struct Test {
int value;
- void operator()(short x, short y) {
- value=10;
+ void operator()(int x, int y) {
+ value=x+y;
}
-
+ Test() : value(0) {}
} test;
+
+#include <functional>
+std::function<void ( int, int )> pF = test;
+
+int testit1(Test new_test, int a, int b) {
+ pF = new_test;
+ pF(a, b);
+ return new_test.value;
+}
+
+int testit2(int a, int b) {
+ test(a, b);
+ return test.value;
+}
+
%}
diff --git a/Examples/test-suite/python/cpp0x_function_objects_runme.py b/Examples/test-suite/python/cpp0x_function_objects_runme.py
index edbd88e1c..ed8f888b1 100644
--- a/Examples/test-suite/python/cpp0x_function_objects_runme.py
+++ b/Examples/test-suite/python/cpp0x_function_objects_runme.py
@@ -3,10 +3,10 @@ import sys
t = cpp0x_function_objects.Test()
if t.value != 0:
- raise RuntimeError,"Runtime cpp0x_function_objects failed. t.value should be 0, but is", t.value
+ raise RuntimeError("Runtime cpp0x_function_objects failed. t.value should be 0, but is " + str(t.value))
-t(1,2) # sets value
+t(1,2) # adds numbers and sets value
-if t.value != 10:
- raise RuntimeError,"Runtime cpp0x_function_objects failed. t.value not changed - should be 10, but is", t.value
+if t.value != 3:
+ raise RuntimeError("Runtime cpp0x_function_objects failed. t.value not changed - should be 3, but is " + str(t.value))