epoc32/include/stdapis/boost/ptr_container/detail/move.hpp
branchSymbian2
changeset 3 e1b950c65cb4
parent 2 2fe1408b6811
child 4 837f303aceeb
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/epoc32/include/stdapis/boost/ptr_container/detail/move.hpp	Wed Mar 31 12:27:01 2010 +0100
     1.3 @@ -0,0 +1,166 @@
     1.4 +//-----------------------------------------------------------------------------
     1.5 +// boost variant/detail/move.hpp header file
     1.6 +// See http://www.boost.org for updates, documentation, and revision history.
     1.7 +//-----------------------------------------------------------------------------
     1.8 +//
     1.9 +//  Copyright (c) 2002-2003 Eric Friedman
    1.10 +//  Copyright (c) 2002 by Andrei Alexandrescu
    1.11 +//
    1.12 +//  Use, modification and distribution are subject to the
    1.13 +//  Boost Software License, Version 1.0. (See accompanying file
    1.14 +//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
    1.15 +//
    1.16 +//  This file derivative of MoJO. Much thanks to Andrei for his initial work.
    1.17 +//  See <http://www.cuj.com/experts/2102/alexandr.htm> for information on MOJO.
    1.18 +//  Re-issued here under the Boost Software License, with permission of the original
    1.19 +//  author (Andrei Alexandrescu).
    1.20 +
    1.21 +
    1.22 +#ifndef BOOST_VARIANT_DETAIL_MOVE_HPP
    1.23 +#define BOOST_VARIANT_DETAIL_MOVE_HPP
    1.24 +
    1.25 +#include <iterator> // for iterator_traits
    1.26 +#include <new> // for placement new
    1.27 +
    1.28 +#include "boost/config.hpp"
    1.29 +#include "boost/detail/workaround.hpp"
    1.30 +#include "boost/mpl/if.hpp"
    1.31 +#include "boost/type_traits/is_base_and_derived.hpp"
    1.32 +
    1.33 +namespace boost {
    1.34 +namespace detail { namespace variant {
    1.35 +
    1.36 +//////////////////////////////////////////////////////////////////////////
    1.37 +// forward declares
    1.38 +//
    1.39 +// NOTE: Incomplete until (if?) Boost.Move becomes part of Boost.
    1.40 +//
    1.41 +template <typename Deriving> class moveable;
    1.42 +template <typename T>        class move_source;
    1.43 +template <typename T>        class move_return;
    1.44 +
    1.45 +namespace detail {
    1.46 +
    1.47 +// (detail) moveable_tag
    1.48 +//
    1.49 +// Concrete type from which moveable<T> derives.
    1.50 +//
    1.51 +// TODO: Move into moveable_fwd.hpp and define has_move_constructor.
    1.52 +//
    1.53 +template <typename Deriving>
    1.54 +struct moveable_tag
    1.55 +{
    1.56 +};
    1.57 +
    1.58 +} // namespace detail
    1.59 +
    1.60 +//////////////////////////////////////////////////////////////////////////
    1.61 +// function template move
    1.62 +//
    1.63 +// Takes a T& and returns, if T derives moveable<T>, a move_source<T> for
    1.64 +// the object; else, returns the T&.
    1.65 +//
    1.66 +
    1.67 +namespace detail {
    1.68 +
    1.69 +// (detail) class template move_type
    1.70 +//
    1.71 +// Metafunction that, given moveable T, provides move_source<T>, else T&.
    1.72 +//
    1.73 +template <typename T>
    1.74 +struct move_type
    1.75 +{
    1.76 +public: // metafunction result
    1.77 +
    1.78 +    typedef typename mpl::if_<
    1.79 +          is_base_and_derived<detail::moveable_tag<T>, T>
    1.80 +        , move_source<T>
    1.81 +        , T&
    1.82 +        >::type type;
    1.83 +
    1.84 +};
    1.85 +
    1.86 +} // namespace detail
    1.87 +
    1.88 +template <typename T>
    1.89 +inline
    1.90 +    typename detail::move_type<T>::type
    1.91 +move(T& source)
    1.92 +{
    1.93 +    typedef typename detail::move_type<T>::type
    1.94 +        move_t;
    1.95 +
    1.96 +    return move_t(source);
    1.97 +}
    1.98 +
    1.99 +//////////////////////////////////////////////////////////////////////////
   1.100 +// class template return_t
   1.101 +//
   1.102 +// Metafunction that, given moveable T, provides move_return<T>, else T.
   1.103 +//
   1.104 +template <typename T>
   1.105 +struct return_t
   1.106 +{
   1.107 +public: // metafunction result
   1.108 +
   1.109 +    typedef typename mpl::if_<
   1.110 +          is_base_and_derived<moveable<T>, T>
   1.111 +        , move_return<T>
   1.112 +        , T
   1.113 +        >::type type;
   1.114 +
   1.115 +};
   1.116 +
   1.117 +//////////////////////////////////////////////////////////////////////////
   1.118 +// function template move_swap
   1.119 +//
   1.120 +// Swaps using Koenig lookup but falls back to move-swap for primitive
   1.121 +// types and on non-conforming compilers.
   1.122 +//
   1.123 +
   1.124 +#if   defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)   \
   1.125 + ||   BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(2))
   1.126 +
   1.127 +// [Indicate that move_swap by overload is disabled...]
   1.128 +#define BOOST_NO_MOVE_SWAP_BY_OVERLOAD
   1.129 +
   1.130 +// [...and provide straight swap-by-move implementation:]
   1.131 +template <typename T>
   1.132 +inline void move_swap(T& lhs, T& rhs)
   1.133 +{
   1.134 +    T tmp( boost::detail::variant::move(lhs) );
   1.135 +    lhs = boost::detail::variant::move(rhs);
   1.136 +    rhs = boost::detail::variant::move(tmp);
   1.137 +}
   1.138 +
   1.139 +#else// !workaround
   1.140 +
   1.141 +namespace detail { namespace move_swap {
   1.142 +
   1.143 +template <typename T>
   1.144 +inline void swap(T& lhs, T& rhs)
   1.145 +{
   1.146 +    T tmp( boost::detail::variant::move(lhs) );
   1.147 +    lhs = boost::detail::variant::move(rhs);
   1.148 +    rhs = boost::detail::variant::move(tmp);
   1.149 +}
   1.150 +
   1.151 +}} // namespace detail::move_swap
   1.152 +
   1.153 +template <typename T>
   1.154 +inline void move_swap(T& lhs, T& rhs)
   1.155 +{
   1.156 +    using detail::move_swap::swap;
   1.157 +
   1.158 +    swap(lhs, rhs);
   1.159 +}
   1.160 +
   1.161 +#endif // workaround
   1.162 +
   1.163 +}} // namespace detail::variant
   1.164 +} // namespace boost
   1.165 +
   1.166 +#endif // BOOST_VARIANT_DETAIL_MOVE_HPP
   1.167 +
   1.168 +
   1.169 +