summaryrefslogtreecommitdiff
path: root/libs/function
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2015-04-08 03:09:47 +0000
committer <>2015-05-05 14:37:32 +0000
commitf2541bb90af059680aa7036f315f052175999355 (patch)
treea5b214744b256f07e1dc2bd7273035a7808c659f /libs/function
parented232fdd34968697a68783b3195b1da4226915b5 (diff)
downloadboost-tarball-master.tar.gz
Imported from /home/lorry/working-area/delta_boost-tarball/boost_1_58_0.tar.bz2.HEADboost_1_58_0master
Diffstat (limited to 'libs/function')
-rw-r--r--libs/function/meta/libraries.json18
-rw-r--r--libs/function/test/Jamfile.v22
-rw-r--r--libs/function/test/rvalues_test.cpp106
3 files changed, 126 insertions, 0 deletions
diff --git a/libs/function/meta/libraries.json b/libs/function/meta/libraries.json
new file mode 100644
index 000000000..92523197d
--- /dev/null
+++ b/libs/function/meta/libraries.json
@@ -0,0 +1,18 @@
+{
+ "key": "function",
+ "name": "Function",
+ "authors": [
+ "Doug Gregor"
+ ],
+ "description": "Function object wrappers for deferred calls or callbacks.",
+ "std": [
+ "tr1"
+ ],
+ "category": [
+ "Function-objects",
+ "Programming"
+ ],
+ "maintainers": [
+ "Douglas Gregor <dgregor -at- cs.indiana.edu>"
+ ]
+}
diff --git a/libs/function/test/Jamfile.v2 b/libs/function/test/Jamfile.v2
index 68895fa7a..5a2dbad31 100644
--- a/libs/function/test/Jamfile.v2
+++ b/libs/function/test/Jamfile.v2
@@ -61,6 +61,8 @@ import testing ;
[ run libs/function/test/nothrow_swap.cpp : : : : ]
+ [ run libs/function/test/rvalues_test.cpp : : : : ]
+
[ compile libs/function/test/function_typeof_test.cpp ]
;
}
diff --git a/libs/function/test/rvalues_test.cpp b/libs/function/test/rvalues_test.cpp
new file mode 100644
index 000000000..977f4ba7f
--- /dev/null
+++ b/libs/function/test/rvalues_test.cpp
@@ -0,0 +1,106 @@
+// Copyright 2014 Antony Polukhin.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// For more information, see http://www.boost.org
+
+#include <iostream>
+#include <cstdlib>
+
+#include <boost/test/minimal.hpp>
+#include <boost/function.hpp>
+#include <boost/move/move.hpp>
+
+class only_movable {
+private:
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(only_movable)
+ int value_;
+ bool moved_;
+
+public:
+ only_movable(BOOST_RV_REF(only_movable) x)
+ : value_(x.value_)
+ , moved_(false)
+ {
+ x.moved_ = true;
+ }
+
+ only_movable& operator=(BOOST_RV_REF(only_movable) x) {
+ value_ = x.value_;
+ x.moved_ = true;
+ moved_ = false;
+ return *this;
+ }
+
+ explicit only_movable(int value = 0) : value_(value), moved_(false) {}
+ int get_value() const { return value_; }
+ bool is_moved() const { return moved_; }
+};
+
+
+int one(BOOST_RV_REF(only_movable) v) { return v.get_value(); }
+only_movable two(BOOST_RV_REF(only_movable) t) {
+ only_movable t1 = boost::move(t);
+ return BOOST_MOVE_RET(only_movable, t1);
+}
+
+only_movable two_sum(BOOST_RV_REF(only_movable) t1, BOOST_RV_REF(only_movable) t2) {
+ only_movable ret(t1.get_value() + t2.get_value());
+ return BOOST_MOVE_RET(only_movable, ret);
+}
+
+struct sum_struct {
+ only_movable operator()(BOOST_RV_REF(only_movable) t1, BOOST_RV_REF(only_movable) t2) const {
+ only_movable ret(t1.get_value() + t2.get_value());
+ return BOOST_MOVE_RET(only_movable, ret);
+ }
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+int three(std::string&&) { return 1; }
+std::string&& four(std::string&& s) { return boost::move(s); }
+#endif
+
+int test_main(int, char*[])
+{
+ using boost::function;
+
+ function <int(BOOST_RV_REF(only_movable))> f1 = one;
+
+ only_movable om1(1);
+ BOOST_CHECK(f1(boost::move(om1)) == 1);
+
+ function <only_movable(BOOST_RV_REF(only_movable))> f2 = two;
+
+ only_movable om2(2);
+ only_movable om2_2 = f2(boost::move(om2));
+ BOOST_CHECK(om2_2.get_value() == 2);
+ BOOST_CHECK(om2.is_moved());
+
+ {
+ function <only_movable(BOOST_RV_REF(only_movable), BOOST_RV_REF(only_movable))> f2_sum = two_sum;
+ only_movable om1_sum(1), om2_sum(2);
+ only_movable om2_sum_2 = f2_sum(boost::move(om1_sum), boost::move(om2_sum));
+ BOOST_CHECK(om2_sum_2.get_value() == 3);
+ }
+
+ {
+ sum_struct s;
+ function <only_movable(BOOST_RV_REF(only_movable), BOOST_RV_REF(only_movable))> f2_sum = s;
+ only_movable om1_sum(1), om2_sum(2);
+ only_movable om2_sum_2 = f2_sum(boost::move(om1_sum), boost::move(om2_sum));
+ BOOST_CHECK(om2_sum_2.get_value() == 3);
+ }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ function <int(std::string&&)> f3 = three;
+ function <std::string&& (std::string&& s)> f4 = four;
+
+ f3(std::string("Hello"));
+ BOOST_CHECK(f4(std::string("world")) == "world");
+#endif
+
+ return 0;
+}