diff options
Diffstat (limited to 'boost/container/detail/pair.hpp')
-rw-r--r-- | boost/container/detail/pair.hpp | 121 |
1 files changed, 77 insertions, 44 deletions
diff --git a/boost/container/detail/pair.hpp b/boost/container/detail/pair.hpp index 1aeff91137..2a20ed13ec 100644 --- a/boost/container/detail/pair.hpp +++ b/boost/container/detail/pair.hpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // -// (C) Copyright Ion Gaztanaga 2005-2011. +// (C) Copyright Ion Gaztanaga 2005-2012. // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at @@ -22,6 +22,8 @@ #include <boost/container/detail/mpl.hpp> #include <boost/container/detail/type_traits.hpp> +#include <boost/container/detail/mpl.hpp> +#include <boost/container/detail/type_traits.hpp> #include <utility> //std::pair @@ -33,7 +35,7 @@ #endif namespace boost { -namespace container { +namespace container { namespace container_detail { template <class T1, class T2> @@ -62,6 +64,33 @@ struct pair_nat; struct piecewise_construct_t { }; static const piecewise_construct_t piecewise_construct = piecewise_construct_t(); +/* +template <class T1, class T2> +struct pair +{ + template <class U, class V> pair(pair<U, V>&& p); + template <class... Args1, class... Args2> + pair(piecewise_construct_t, tuple<Args1...> first_args, + tuple<Args2...> second_args); + + template <class U, class V> pair& operator=(const pair<U, V>& p); + pair& operator=(pair&& p) noexcept(is_nothrow_move_assignable<T1>::value && + is_nothrow_move_assignable<T2>::value); + template <class U, class V> pair& operator=(pair<U, V>&& p); + + void swap(pair& p) noexcept(noexcept(swap(first, p.first)) && + noexcept(swap(second, p.second))); +}; + +template <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); +*/ + + template <class T1, class T2> struct pair { @@ -79,47 +108,40 @@ struct pair pair() : first(), second() {} -/* - //pair from two values - pair(const T1 &t1, const T2 &t2) - : first(t1) - , second(t2) - {} - - - //pair from two values - pair(BOOST_RV_REF(T1) t1, BOOST_RV_REF(T2) t2) - : first(::boost::move(t1)) - , second(::boost::move(t2)) - {} -*/ - template<class U, class V> - pair(BOOST_FWD_REF(U) u, BOOST_FWD_REF(V) v) - : first(::boost::forward<U>(u)) - , second(::boost::forward<V>(v)) - {} //pair copy assignment pair(const pair& x) : first(x.first), second(x.second) {} + //pair move constructor + pair(BOOST_RV_REF(pair) p) + : first(::boost::move(p.first)), second(::boost::move(p.second)) + {} + template <class D, class S> pair(const pair<D, S> &p) : first(p.first), second(p.second) {} - //pair move constructor - pair(BOOST_RV_REF(pair) p) + template <class D, class S> + pair(BOOST_RV_REF_BEG pair<D, S> BOOST_RV_REF_END p) : first(::boost::move(p.first)), second(::boost::move(p.second)) {} - template <class D, class S> - pair(BOOST_RV_REF_2_TEMPL_ARGS(pair, D, S) p) - : first(::boost::move(p.first)), second(::boost::move(p.second)) + //pair from two values + pair(const T1 &t1, const T2 &t2) + : first(t1) + , second(t2) + {} + + template<class U, class V> + pair(BOOST_FWD_REF(U) u, BOOST_FWD_REF(V) v) + : first(::boost::forward<U>(u)) + , second(::boost::forward<V>(v)) {} - //std::pair copy constructor + //And now compatibility with std::pair pair(const std::pair<T1, T2>& x) : first(x.first), second(x.second) {} @@ -129,17 +151,20 @@ struct pair : first(p.first), second(p.second) {} - //std::pair move constructor - template <class D, class S> - pair(BOOST_RV_REF_2_TEMPL_ARGS(std::pair, D, S) p) + pair(BOOST_RV_REF_BEG std::pair<T1, T2> BOOST_RV_REF_END p) : first(::boost::move(p.first)), second(::boost::move(p.second)) {} - pair(BOOST_RV_REF_2_TEMPL_ARGS(std::pair, T1, T2) p) + template <class D, class S> + pair(BOOST_RV_REF_BEG std::pair<D, S> BOOST_RV_REF_END p) : first(::boost::move(p.first)), second(::boost::move(p.second)) {} //piecewise_construct missing + //template <class U, class V> pair(pair<U, V>&& p); + //template <class... Args1, class... Args2> + // pair(piecewise_construct_t, tuple<Args1...> first_args, + // tuple<Args2...> second_args); /* //Variadic versions template<class U> @@ -179,14 +204,6 @@ struct pair return *this; } - template <class D, class S> - pair& operator=(const pair<D, S>&p) - { - first = p.first; - second = p.second; - return *this; - } - //pair move assignment pair& operator=(BOOST_RV_REF(pair) p) { @@ -196,7 +213,23 @@ struct pair } template <class D, class S> - pair& operator=(BOOST_RV_REF_2_TEMPL_ARGS(pair, D, S) p) + typename ::boost::container::container_detail::enable_if_c + < !(::boost::container::container_detail::is_same<T1, D>::value && + ::boost::container::container_detail::is_same<T2, S>::value) + , pair &>::type + operator=(const pair<D, S>&p) + { + first = p.first; + second = p.second; + return *this; + } + + template <class D, class S> + typename ::boost::container::container_detail::enable_if_c + < !(::boost::container::container_detail::is_same<T1, D>::value && + ::boost::container::container_detail::is_same<T2, S>::value) + , pair &>::type + operator=(BOOST_RV_REF_BEG pair<D, S> BOOST_RV_REF_END p) { first = ::boost::move(p.first); second = ::boost::move(p.second); @@ -220,7 +253,7 @@ struct pair } //std::pair move assignment - pair& operator=(BOOST_RV_REF_2_TEMPL_ARGS(std::pair, T1, T2) p) + pair& operator=(BOOST_RV_REF_BEG std::pair<T1, T2> BOOST_RV_REF_END p) { first = ::boost::move(p.first); second = ::boost::move(p.second); @@ -228,7 +261,7 @@ struct pair } template <class D, class S> - pair& operator=(BOOST_RV_REF_2_TEMPL_ARGS(std::pair, D, S) p) + pair& operator=(BOOST_RV_REF_BEG std::pair<D, S> BOOST_RV_REF_END p) { first = ::boost::move(p.first); second = ::boost::move(p.second); @@ -280,8 +313,8 @@ inline void swap(pair<T1, T2>& x, pair<T1, T2>& y) swap(x.second, y.second); } -} //namespace container_detail { -} //namespace container { +} //namespace container_detail { +} //namespace container { //Without this specialization recursive flat_(multi)map instantiation fails |