12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- //////////////////////////////////////////////////////////////////////////////
- //
- // (C) Copyright Ion Gaztanaga 2014-2014.
- // 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)
- //
- // See http://www.boost.org/libs/move for documentation.
- //
- //////////////////////////////////////////////////////////////////////////////
- #include <boost/move/detail/config_begin.hpp>
- //[move_return_example
- #include "movable.hpp"
- #include "copymovable.hpp"
- #include <boost/move/core.hpp>
- template<class Type>
- struct factory_functor
- {
- typedef Type return_type;
- Type operator()() const
- { Type t; return BOOST_MOVE_RET(Type, t); }
- };
- struct return_reference
- {
- typedef non_copy_movable &return_type;
- non_copy_movable &operator()() const
- { return ncm; }
- static non_copy_movable ncm;
- };
- non_copy_movable return_reference::ncm;
- //A wrapper that locks a mutex while the
- //factory creates a new value.
- //It must generically move the return value
- //if possible both in C++03 and C++11
- template <class Factory>
- typename Factory::return_type lock_wrapper(Factory f)
- {
- typedef typename Factory::return_type return_type;
- //LOCK();
- return_type r = f();
- //UNLOCK();
- //In C++03: boost::move() if R is not a reference and
- //has move emulation enabled. In C++11: just return r.
- return BOOST_MOVE_RET(return_type, r);
- }
- int main()
- {
- movable m = lock_wrapper(factory_functor<movable> ());
- copy_movable cm = lock_wrapper(factory_functor<copy_movable>());
- copyable c = lock_wrapper(factory_functor<copyable> ());
- non_copy_movable &mr = lock_wrapper(return_reference ());
- //<-
- (void)m; (void)cm; (void)c; (void)mr;
- //->
- return 0;
- }
- //]
- #include <boost/move/detail/config_end.hpp>
|