From a421cf45de8df1882bc04c537381b07d90b7d007 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 10 May 2014 02:14:38 +0200 Subject: [PATCH] adjust test spec: C++11 does indeed pass ref parameters even through function objects This is a notable difference to the boost or tr1-function objects we used up to now. Thus the behavour is now straight forward without any exception. If the function takes an argument by reference, this is replicated through bind and function expressions --- tests/40core.tests | 50 +++++++++++++++-------------- tests/library/util-foreach-test.cpp | 23 ++++++++----- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/tests/40core.tests b/tests/40core.tests index ebd97101d..4da9e1731 100644 --- a/tests/40core.tests +++ b/tests/40core.tests @@ -1386,20 +1386,21 @@ out: :50:49:48:47:46:45:44:43:42:41 out: :60 out: :70 out: :80:59:58:57:56:55:54:53:52:51 -out: :80$ +out: :90:69:68:67:66:65:64:63:62:61 +out: :100$ out: ---:assign_to_var -out: :60:99:137:174:210:245:279:312:344:375 -out: :435:474:512:549:585:620:654:687:719:750 -out: :810:789:788:787:786:785:784:783:782:781 -out: sum=750 -out: :60:99:137:174:210:245:279:312:344:375 -out: :435:474:512:549:585:620:654:687:719:750 -out: :810:789:788:787:786:785:784:783:782:781 -out: sum=750 -out: :60 -out: :120 +out: :90:149:207:264:320:375:429:482:534:585 +out: :675:734:792:849:905:960:1014:1067:1119:1170 +out: :1260:1319:1377:1434:1490:1545:1599:1652:1704:1755 +out: sum=1755 +out: :90:149:207:264:320:375:429:482:534:585 +out: :675:734:792:849:905:960:1014:1067:1119:1170 +out: :1260:1319:1377:1434:1490:1545:1599:1652:1704:1755 +out: sum=1755 +out: :90 out: :180 -out: sum=120 +out: :270 +out: sum=270 out: ---:assign_to_input out: :20:19:18:17:16:15:14:13:12:11 out: :30:29:28:27:26:25:24:23:22:21 @@ -1408,20 +1409,21 @@ out: :50:49:48:47:46:45:44:43:42:41 out: :60 out: :70 out: :80:59:58:57:56:55:54:53:52:51 -out: :80$ +out: :90:69:68:67:66:65:64:63:62:61 +out: :100$ out: ---:assign_to_var -out: :60:99:137:174:210:245:279:312:344:375 -out: :435:474:512:549:585:620:654:687:719:750 -out: :810:789:788:787:786:785:784:783:782:781 -out: sum=750 -out: :60:99:137:174:210:245:279:312:344:375 -out: :435:474:512:549:585:620:654:687:719:750 -out: :810:789:788:787:786:785:784:783:782:781 -out: sum=750 -out: :60 -out: :120 +out: :90:149:207:264:320:375:429:482:534:585 +out: :675:734:792:849:905:960:1014:1067:1119:1170 +out: :1260:1319:1377:1434:1490:1545:1599:1652:1704:1755 +out: sum=1755 +out: :90:149:207:264:320:375:429:482:534:585 +out: :675:734:792:849:905:960:1014:1067:1119:1170 +out: :1260:1319:1377:1434:1490:1545:1599:1652:1704:1755 +out: sum=1755 +out: :90 out: :180 -out: sum=120 +out: :270 +out: sum=270 out: ---:wrapped_container_passing out: :10:9:8:7:6:5:4:3:2:1 out: :-20:-21:-22:-23:-24:-25:-26:-27:-28:-29 diff --git a/tests/library/util-foreach-test.cpp b/tests/library/util-foreach-test.cpp index 601ea4615..6f8183264 100644 --- a/tests/library/util-foreach-test.cpp +++ b/tests/library/util-foreach-test.cpp @@ -156,7 +156,7 @@ namespace test { CHECK (int(NUM_ELMS) ==container[0]); check_ref_argument_bind (iterator); - CHECK (60+int(NUM_ELMS) ==container[0]); + CHECK (90+int(NUM_ELMS) ==container[0]); // changes got propagated through the iterator check_wrapped_container_passing(container); @@ -233,7 +233,11 @@ namespace test { /** @test under some circumstances, it is even possible * to take a ref to the data in the input sequence, - * or to a summation variable. + * or to a summation variable. In the example performed here, + * the function to be applied takes the 3rd argument by reference + * and assigns the sum of first and second argument to this parameter. + * If we us a bind variable at that position, we end up assigning + * by reference to the values contained in the collection. * @note in case of invoking this test with a Lumiera Forward Iterator, * the changes go through to the original container, in spite of * passing the iterator by value. This behaviour is correct, as @@ -256,13 +260,16 @@ namespace test { has_any (coll, function2, 5, 5, _1 ); _NL_ has_any (coll, &function2, 5, 5, _1 ); _NL_ - // note: when using a function object, - // instead of directly using a binder, - // the pass-by reference doesn't work + // note: in C++11, the reference parameters are passed through + // even when wrapping the function or function pointer into a function object, for_each (coll,fun2, 5, 5, _1 ); _NL_ and_all (coll, fun2, 5, 5, _1 ); _NL_ has_any (coll, fun2, 5, 5, _1 ); _NL_ + // at that point we have added 9 * (5+5) to the value at position zero. + // (note that the has_any only evaluates the function once) + + // the following test assigns the sum via the ref argument to a local variable. int sum=0; ANNOUNCE (assign_to_var); for_each (coll, function2, -10, _1, ref(sum) ); _NL_ @@ -417,7 +424,7 @@ namespace test { } - /** @test passing the collection to be iterated in various ways + /** @test pass the collection to be iterated in various ways * - anonymous temporary * - smart pointer * - pointer @@ -458,12 +465,12 @@ namespace test { CHECK (-2*int(NUM_ELMS) == counter); CHECK (bySmartPtr->back() == counter+1); - // passing by pointer is also possible + // passing the container by pointer is also possible const VecI * const passByConstPointer (&coll); for_each (passByConstPointer, _1_ = var(counter)-- ); SHOW_CONTAINER - // ...and influences the original container + // ...and does indeed influence the original container } };