Add an element-wise swap for Boost.Tuple. Fixes #1324

[SVN r62686]
This commit is contained in:
Steven Watanabe
2010-06-09 19:30:35 +00:00
parent 7b6203747a
commit 9d64187c34
3 changed files with 69 additions and 0 deletions

View File

@ -37,6 +37,7 @@
#include "boost/type_traits/cv_traits.hpp"
#include "boost/type_traits/function_traits.hpp"
#include "boost/utility/swap.hpp"
#include "boost/detail/workaround.hpp" // needed for BOOST_WORKAROUND
@ -947,6 +948,29 @@ tie(T0& t0, T1& t1, T2& t2, T3& t3,
return t(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9);
}
template <class T0, class T1, class T2, class T3, class T4,
class T5, class T6, class T7, class T8, class T9>
void swap(tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& lhs,
tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& rhs);
inline void swap(null_type&, null_type&) {}
template<class HH>
inline void swap(cons<HH, null_type>& lhs, cons<HH, null_type>& rhs) {
::boost::swap(lhs.head, rhs.head);
}
template<class HH, class TT>
inline void swap(cons<HH, TT>& lhs, cons<HH, TT>& rhs) {
::boost::swap(lhs.head, rhs.head);
::boost::tuples::swap(lhs.tail, rhs.tail);
}
template <class T0, class T1, class T2, class T3, class T4,
class T5, class T6, class T7, class T8, class T9>
inline void swap(tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& lhs,
tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& rhs) {
typedef tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> tuple_type;
typedef typename tuple_type::inherited base;
::boost::tuples::swap(static_cast<base&>(lhs), static_cast<base&>(rhs));
}
} // end of namespace tuples
} // end of namespace boost

View File

@ -27,6 +27,7 @@
#define BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP
#include "boost/type_traits.hpp"
#include "boost/utility/swap.hpp"
#include <utility>
#if defined BOOST_MSVC
@ -836,6 +837,29 @@ namespace tuples {
detail::swallow_assign const ignore = detail::swallow_assign();
template <class T0, class T1, class T2, class T3, class T4,
class T5, class T6, class T7, class T8, class T9>
void swap(tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& lhs,
tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& rhs);
inline void swap(null_type&, null_type&) {}
template<class HH>
inline void swap(cons<HH, null_type>& lhs, cons<HH, null_type>& rhs) {
::boost::swap(lhs.head, rhs.head);
}
template<class HH, class TT>
inline void swap(cons<HH, TT>& lhs, cons<HH, TT>& rhs) {
::boost::swap(lhs.head, rhs.head);
::boost::tuples::swap(lhs.tail, rhs.tail);
}
template <class T0, class T1, class T2, class T3, class T4,
class T5, class T6, class T7, class T8, class T9>
inline void swap(tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& lhs,
tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& rhs) {
typedef tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> tuple_type;
typedef typename tuple_type::inherited base;
::boost::tuples::swap(static_cast<base&>(lhs), static_cast<base&>(rhs));
}
} // namespace tuples
} // namespace boost
#endif // BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP

View File

@ -445,6 +445,26 @@ void tuple_length_test()
}
// ----------------------------------------------------------------------------
// - testing swap -----------------------------------------------------------
// ----------------------------------------------------------------------------
void tuple_swap_test()
{
tuple<int, float, double> t1(1, 2.0f, 3.0), t2(4, 5.0f, 6.0);
swap(t1, t2);
BOOST_CHECK(get<0>(t1) == 4);
BOOST_CHECK(get<1>(t1) == 5.0f);
BOOST_CHECK(get<2>(t1) == 6.0);
BOOST_CHECK(get<0>(t2) == 1);
BOOST_CHECK(get<1>(t2) == 2.0f);
BOOST_CHECK(get<2>(t2) == 3.0);
int i = 1,j = 2;
boost::tuple<int&> t3(i), t4(j);
swap(t3, t4);
BOOST_CHECK(i == 2);
BOOST_CHECK(j == 1);
}
@ -465,6 +485,7 @@ int test_main(int, char *[]) {
cons_test();
const_tuple_test();
tuple_length_test();
tuple_swap_test();
return 0;
}