forked from boostorg/function
Compare commits
93 Commits
boost-1.54
...
boost-1.60
Author | SHA1 | Date | |
---|---|---|---|
42f2a7c714 | |||
45ec47542c | |||
0c467707d9 | |||
f0ec326eb0 | |||
fde855afb0 | |||
73e4d02b00 | |||
001fcff9b8 | |||
8cc1be159b | |||
74c9cc9680 | |||
675d955364 | |||
854f2e8d5d | |||
157aaeaf23 | |||
df1db75294 | |||
27e9e1e372 | |||
8f8cdae988 | |||
02abccd686 | |||
c4aa569cf4 | |||
e38382d33e | |||
78f1bcc4b4 | |||
f3d01c47bb | |||
78eb6b1c8c | |||
a80ac7f5c5 | |||
e9fe0b6db3 | |||
9f06e35e8d | |||
250655ad6d | |||
ea19e9e745 | |||
8d5a27fb85 | |||
8760088d44 | |||
26d278733f | |||
95a1956397 | |||
74a61f0252 | |||
9e30736439 | |||
419f424959 | |||
bfde71273b | |||
775213a9e6 | |||
cbb9e7c4da | |||
7ee94c6975 | |||
8cde82a568 | |||
9ea95b071b | |||
09fc8792fa | |||
c0d4005441 | |||
6902f6f943 | |||
c4f1ce7cb1 | |||
820ad024fe | |||
2e19728cdb | |||
de3b8e7451 | |||
22c6592a40 | |||
a1f62de420 | |||
81c7876588 | |||
2020d39e2c | |||
8b63c146ea | |||
ae534d7342 | |||
e8247198fa | |||
ff3244d562 | |||
68128bfffa | |||
e10f4eaef9 | |||
a74e72cce9 | |||
6f8ec5c8c5 | |||
678fb133f0 | |||
821e6d34dd | |||
529dc74954 | |||
e8504c1777 | |||
07800455a8 | |||
f559986ae8 | |||
8ca7384121 | |||
75890fea53 | |||
da259e8dce | |||
2fe4cc253f | |||
f379ef8532 | |||
ea18f5777b | |||
d5a86a2d52 | |||
e3dfa7268a | |||
bacb5d6752 | |||
04040ae566 | |||
fe2d04e954 | |||
0936dbdd03 | |||
adb7b0a214 | |||
cead36cd5b | |||
81e558491b | |||
2378ba59e7 | |||
53b95c386d | |||
3312c7ffcd | |||
de27ae9697 | |||
a7b9940f15 | |||
e4f165a4e8 | |||
80a3f47099 | |||
2a85edbd31 | |||
5c514ebe35 | |||
6a3f0df553 | |||
64c8d10fa8 | |||
a2a810d2c1 | |||
d84481361f | |||
872f12efee |
@ -3,7 +3,7 @@
|
||||
# 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)
|
||||
project boost/doc ;
|
||||
project function/doc ;
|
||||
import boostbook : boostbook ;
|
||||
|
||||
boostbook function-doc
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <boost/type_traits/is_integral.hpp>
|
||||
#include <boost/type_traits/is_volatile.hpp>
|
||||
#include <boost/type_traits/composite_traits.hpp>
|
||||
#include <boost/type_traits/ice.hpp>
|
||||
#include <boost/ref.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
@ -56,7 +55,7 @@
|
||||
// need to use std::type_info::name to compare instead of operator==.
|
||||
#if defined( BOOST_NO_TYPEID )
|
||||
# define BOOST_FUNCTION_COMPARE_TYPE_ID(X,Y) ((X)==(Y))
|
||||
#elif (defined(__GNUC__) && __GNUC__ >= 3) \
|
||||
#elif defined(__GNUC__) \
|
||||
|| defined(_AIX) \
|
||||
|| ( defined(__sgi) && defined(__host_mips))
|
||||
# include <cstring>
|
||||
@ -66,25 +65,16 @@
|
||||
# define BOOST_FUNCTION_COMPARE_TYPE_ID(X,Y) ((X)==(Y))
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 || defined(__ICL) && __ICL <= 600 || defined(__MWERKS__) && __MWERKS__ < 0x2406 && !defined(BOOST_STRICT_CONFIG)
|
||||
#if defined(__ICL) && __ICL <= 600 || defined(__MWERKS__) && __MWERKS__ < 0x2406 && !defined(BOOST_STRICT_CONFIG)
|
||||
# define BOOST_FUNCTION_TARGET_FIX(x) x
|
||||
#else
|
||||
# define BOOST_FUNCTION_TARGET_FIX(x)
|
||||
#endif // not MSVC
|
||||
#endif // __ICL etc
|
||||
|
||||
#if !BOOST_WORKAROUND(__BORLANDC__, < 0x5A0)
|
||||
# define BOOST_FUNCTION_ENABLE_IF_NOT_INTEGRAL(Functor,Type) \
|
||||
typename ::boost::enable_if_c<(::boost::type_traits::ice_not< \
|
||||
(::boost::is_integral<Functor>::value)>::value), \
|
||||
typename ::boost::enable_if_c< \
|
||||
!(::boost::is_integral<Functor>::value), \
|
||||
Type>::type
|
||||
#else
|
||||
// BCC doesn't recognize this depends on a template argument and complains
|
||||
// about the use of 'typename'
|
||||
# define BOOST_FUNCTION_ENABLE_IF_NOT_INTEGRAL(Functor,Type) \
|
||||
::boost::enable_if_c<(::boost::type_traits::ice_not< \
|
||||
(::boost::is_integral<Functor>::value)>::value), \
|
||||
Type>::type
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
namespace detail {
|
||||
@ -294,7 +284,7 @@ namespace boost {
|
||||
} else if (op == destroy_functor_tag)
|
||||
out_buffer.func_ptr = 0;
|
||||
else if (op == check_functor_type_tag) {
|
||||
const detail::sp_typeinfo& check_type
|
||||
const boost::detail::sp_typeinfo& check_type
|
||||
= *out_buffer.type.type;
|
||||
if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(Functor)))
|
||||
out_buffer.obj_ptr = &in_buffer.func_ptr;
|
||||
@ -661,11 +651,7 @@ public:
|
||||
}
|
||||
|
||||
template<typename Functor>
|
||||
#if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
||||
const Functor* target( Functor * = 0 ) const
|
||||
#else
|
||||
const Functor* target() const
|
||||
#endif
|
||||
{
|
||||
if (!vtable) return 0;
|
||||
|
||||
@ -683,11 +669,7 @@ public:
|
||||
template<typename F>
|
||||
bool contains(const F& f) const
|
||||
{
|
||||
#if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
||||
if (const F* fp = this->target( (F*)0 ))
|
||||
#else
|
||||
if (const F* fp = this->template target<F>())
|
||||
#endif
|
||||
{
|
||||
return function_equal(*fp, f);
|
||||
} else {
|
||||
|
@ -19,8 +19,7 @@ namespace boost { namespace python { namespace objects {
|
||||
}}}
|
||||
#endif
|
||||
|
||||
#if defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
|
||||
|| defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG) \
|
||||
#if defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG) \
|
||||
|| !(defined(BOOST_STRICT_CONFIG) || !defined(__SUNPRO_CC) || __SUNPRO_CC > 0x540)
|
||||
# define BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX
|
||||
#endif
|
||||
|
@ -26,7 +26,13 @@
|
||||
|
||||
#define BOOST_FUNCTION_PARMS BOOST_PP_ENUM(BOOST_FUNCTION_NUM_ARGS,BOOST_FUNCTION_PARM,BOOST_PP_EMPTY)
|
||||
|
||||
#define BOOST_FUNCTION_ARGS BOOST_PP_ENUM_PARAMS(BOOST_FUNCTION_NUM_ARGS, a)
|
||||
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
|
||||
# define BOOST_FUNCTION_ARGS BOOST_PP_ENUM_PARAMS(BOOST_FUNCTION_NUM_ARGS, a)
|
||||
#else
|
||||
# include <boost/move/utility_core.hpp>
|
||||
# define BOOST_FUNCTION_ARG(J,I,D) ::boost::forward< BOOST_PP_CAT(T,I) >(BOOST_PP_CAT(a,I))
|
||||
# define BOOST_FUNCTION_ARGS BOOST_PP_ENUM(BOOST_FUNCTION_NUM_ARGS,BOOST_FUNCTION_ARG,BOOST_PP_EMPTY)
|
||||
#endif
|
||||
|
||||
#define BOOST_FUNCTION_ARG_TYPE(J,I,D) \
|
||||
typedef BOOST_PP_CAT(T,I) BOOST_PP_CAT(BOOST_PP_CAT(arg, BOOST_PP_INC(I)),_type);
|
||||
@ -711,9 +717,8 @@ namespace boost {
|
||||
template<typename Functor>
|
||||
BOOST_FUNCTION_FUNCTION(Functor BOOST_FUNCTION_TARGET_FIX(const &) f
|
||||
#ifndef BOOST_NO_SFINAE
|
||||
,typename enable_if_c<
|
||||
(boost::type_traits::ice_not<
|
||||
(is_integral<Functor>::value)>::value),
|
||||
,typename boost::enable_if_c<
|
||||
!(is_integral<Functor>::value),
|
||||
int>::type = 0
|
||||
#endif // BOOST_NO_SFINAE
|
||||
) :
|
||||
@ -724,9 +729,8 @@ namespace boost {
|
||||
template<typename Functor,typename Allocator>
|
||||
BOOST_FUNCTION_FUNCTION(Functor BOOST_FUNCTION_TARGET_FIX(const &) f, Allocator a
|
||||
#ifndef BOOST_NO_SFINAE
|
||||
,typename enable_if_c<
|
||||
(boost::type_traits::ice_not<
|
||||
(is_integral<Functor>::value)>::value),
|
||||
,typename boost::enable_if_c<
|
||||
!(is_integral<Functor>::value),
|
||||
int>::type = 0
|
||||
#endif // BOOST_NO_SFINAE
|
||||
) :
|
||||
@ -774,9 +778,8 @@ namespace boost {
|
||||
// construct.
|
||||
template<typename Functor>
|
||||
#ifndef BOOST_NO_SFINAE
|
||||
typename enable_if_c<
|
||||
(boost::type_traits::ice_not<
|
||||
(is_integral<Functor>::value)>::value),
|
||||
typename boost::enable_if_c<
|
||||
!(is_integral<Functor>::value),
|
||||
BOOST_FUNCTION_FUNCTION&>::type
|
||||
#else
|
||||
BOOST_FUNCTION_FUNCTION&
|
||||
@ -914,10 +917,10 @@ namespace boost {
|
||||
template<typename Functor>
|
||||
void assign_to(Functor f)
|
||||
{
|
||||
using detail::function::vtable_base;
|
||||
using boost::detail::function::vtable_base;
|
||||
|
||||
typedef typename detail::function::get_function_tag<Functor>::type tag;
|
||||
typedef detail::function::BOOST_FUNCTION_GET_INVOKER<tag> get_invoker;
|
||||
typedef typename boost::detail::function::get_function_tag<Functor>::type tag;
|
||||
typedef boost::detail::function::BOOST_FUNCTION_GET_INVOKER<tag> get_invoker;
|
||||
typedef typename get_invoker::
|
||||
template apply<Functor, R BOOST_FUNCTION_COMMA
|
||||
BOOST_FUNCTION_TEMPLATE_ARGS>
|
||||
@ -935,11 +938,12 @@ namespace boost {
|
||||
|
||||
if (stored_vtable.assign_to(f, functor)) {
|
||||
std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
|
||||
// coverity[pointless_expression]: suppress coverity warnings on apparant if(const).
|
||||
if (boost::has_trivial_copy_constructor<Functor>::value &&
|
||||
boost::has_trivial_destructor<Functor>::value &&
|
||||
detail::function::function_allows_small_object_optimization<Functor>::value)
|
||||
value |= static_cast<size_t>(0x01);
|
||||
vtable = reinterpret_cast<detail::function::vtable_base *>(value);
|
||||
boost::detail::function::function_allows_small_object_optimization<Functor>::value)
|
||||
value |= static_cast<std::size_t>(0x01);
|
||||
vtable = reinterpret_cast<boost::detail::function::vtable_base *>(value);
|
||||
} else
|
||||
vtable = 0;
|
||||
}
|
||||
@ -947,10 +951,10 @@ namespace boost {
|
||||
template<typename Functor,typename Allocator>
|
||||
void assign_to_a(Functor f,Allocator a)
|
||||
{
|
||||
using detail::function::vtable_base;
|
||||
using boost::detail::function::vtable_base;
|
||||
|
||||
typedef typename detail::function::get_function_tag<Functor>::type tag;
|
||||
typedef detail::function::BOOST_FUNCTION_GET_INVOKER<tag> get_invoker;
|
||||
typedef typename boost::detail::function::get_function_tag<Functor>::type tag;
|
||||
typedef boost::detail::function::BOOST_FUNCTION_GET_INVOKER<tag> get_invoker;
|
||||
typedef typename get_invoker::
|
||||
template apply_a<Functor, R BOOST_FUNCTION_COMMA
|
||||
BOOST_FUNCTION_TEMPLATE_ARGS,
|
||||
@ -969,11 +973,12 @@ namespace boost {
|
||||
|
||||
if (stored_vtable.assign_to_a(f, functor, a)) {
|
||||
std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
|
||||
// coverity[pointless_expression]: suppress coverity warnings on apparant if(const).
|
||||
if (boost::has_trivial_copy_constructor<Functor>::value &&
|
||||
boost::has_trivial_destructor<Functor>::value &&
|
||||
detail::function::function_allows_small_object_optimization<Functor>::value)
|
||||
boost::detail::function::function_allows_small_object_optimization<Functor>::value)
|
||||
value |= static_cast<std::size_t>(0x01);
|
||||
vtable = reinterpret_cast<detail::function::vtable_base *>(value);
|
||||
vtable = reinterpret_cast<boost::detail::function::vtable_base *>(value);
|
||||
} else
|
||||
vtable = 0;
|
||||
}
|
||||
@ -1060,9 +1065,8 @@ public:
|
||||
template<typename Functor>
|
||||
function(Functor f
|
||||
#ifndef BOOST_NO_SFINAE
|
||||
,typename enable_if_c<
|
||||
(boost::type_traits::ice_not<
|
||||
(is_integral<Functor>::value)>::value),
|
||||
,typename boost::enable_if_c<
|
||||
!(is_integral<Functor>::value),
|
||||
int>::type = 0
|
||||
#endif
|
||||
) :
|
||||
@ -1072,9 +1076,8 @@ public:
|
||||
template<typename Functor,typename Allocator>
|
||||
function(Functor f, Allocator a
|
||||
#ifndef BOOST_NO_SFINAE
|
||||
,typename enable_if_c<
|
||||
(boost::type_traits::ice_not<
|
||||
(is_integral<Functor>::value)>::value),
|
||||
,typename boost::enable_if_c<
|
||||
!(is_integral<Functor>::value),
|
||||
int>::type = 0
|
||||
#endif
|
||||
) :
|
||||
@ -1112,9 +1115,8 @@ public:
|
||||
|
||||
template<typename Functor>
|
||||
#ifndef BOOST_NO_SFINAE
|
||||
typename enable_if_c<
|
||||
(boost::type_traits::ice_not<
|
||||
(is_integral<Functor>::value)>::value),
|
||||
typename boost::enable_if_c<
|
||||
!(is_integral<Functor>::value),
|
||||
self_type&>::type
|
||||
#else
|
||||
self_type&
|
||||
@ -1174,6 +1176,9 @@ public:
|
||||
#undef BOOST_FUNCTION_TEMPLATE_ARGS
|
||||
#undef BOOST_FUNCTION_PARMS
|
||||
#undef BOOST_FUNCTION_PARM
|
||||
#ifdef BOOST_FUNCTION_ARG
|
||||
# undef BOOST_FUNCTION_ARG
|
||||
#endif
|
||||
#undef BOOST_FUNCTION_ARGS
|
||||
#undef BOOST_FUNCTION_ARG_TYPE
|
||||
#undef BOOST_FUNCTION_ARG_TYPES
|
||||
|
18
meta/libraries.json
Normal file
18
meta/libraries.json
Normal file
@ -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>"
|
||||
]
|
||||
}
|
@ -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 ]
|
||||
;
|
||||
}
|
||||
|
@ -14,24 +14,32 @@
|
||||
#include <iostream>
|
||||
#include <functional>
|
||||
|
||||
struct Y {
|
||||
Y(int y = 0) : y_(y) {}
|
||||
bool operator==(const Y& rhs) { return y_ == rhs.y_; }
|
||||
private:
|
||||
int y_;
|
||||
};
|
||||
|
||||
struct X {
|
||||
int foo(int);
|
||||
std::ostream& foo2(std::ostream&) const;
|
||||
Y& foo2(Y&) const;
|
||||
};
|
||||
int X::foo(int x) { return -x; }
|
||||
std::ostream& X::foo2(std::ostream& x) const { return x; }
|
||||
Y& X::foo2(Y& x) const { return x; }
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::function<int (X*, int)> f;
|
||||
boost::function<std::ostream& (X*, std::ostream&)> f2;
|
||||
|
||||
boost::function<Y& (X*, Y&)> f2;
|
||||
Y y1;
|
||||
|
||||
f = &X::foo;
|
||||
f2 = &X::foo2;
|
||||
|
||||
X x;
|
||||
BOOST_TEST(f(&x, 5) == -5);
|
||||
BOOST_TEST(f2(&x, boost::ref(std::cout)) == std::cout);
|
||||
BOOST_TEST(f2(&x, boost::ref(y1)) == y1);
|
||||
|
||||
return ::boost::report_errors();
|
||||
}
|
||||
|
@ -14,24 +14,32 @@
|
||||
#include <iostream>
|
||||
#include <functional>
|
||||
|
||||
struct Y {
|
||||
Y(int y = 0) : y_(y) {}
|
||||
bool operator==(const Y& rhs) { return y_ == rhs.y_; }
|
||||
private:
|
||||
int y_;
|
||||
};
|
||||
|
||||
struct X {
|
||||
int foo(int);
|
||||
std::ostream& foo2(std::ostream&) const;
|
||||
Y& foo2(Y&) const;
|
||||
};
|
||||
int X::foo(int x) { return -x; }
|
||||
std::ostream& X::foo2(std::ostream& x) const { return x; }
|
||||
Y& X::foo2(Y& x) const { return x; }
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::function2<int, X*, int> f;
|
||||
boost::function2<std::ostream&, X*, std::ostream&> f2;
|
||||
|
||||
boost::function2<Y&, X*, Y&> f2;
|
||||
Y y1;
|
||||
|
||||
f = &X::foo;
|
||||
f2 = &X::foo2;
|
||||
|
||||
X x;
|
||||
BOOST_TEST(f(&x, 5) == -5);
|
||||
BOOST_TEST(f2(&x, boost::ref(std::cout)) == std::cout);
|
||||
BOOST_TEST(f2(&x, boost::ref(y1)) == y1);
|
||||
|
||||
return ::boost::report_errors();
|
||||
}
|
||||
|
106
test/rvalues_test.cpp
Normal file
106
test/rvalues_test.cpp
Normal file
@ -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;
|
||||
}
|
Reference in New Issue
Block a user