|
Boost : |
From: Niels Dekker - mail address until 2008-12-31 (nd_mail_address_valid_until_2008-12-31_at_[hidden])
Date: 2008-06-21 11:54:11
>> Would it be okay to you if we would add support for array types to
>> the Boost.Swap utility that is located in the sandbox?
David Abrahams wrote:
> Whether or not this is a good idea depends on whether you think swap
> is fundamentally an O(1) and/or nonthrowing operation.
The array support I would like to add to boost::swap is non-throwing, as
long as the array element type has a non-throwing swap. Because it would
do an elementwise swap of its two (array) arguments. The addition is
needed to implement swap functions for wrappers like value_initialized.
Suppose you have two value_initialized arrays of vectors:
value_initialized<std::vector<int>[42]> v1, v2;
Swapping such value_initialized objects is currently quite expensive
(and throwing), doing three std::vector copy operations for each of the
42 array elements, even when using boost::swap (from the sandbox).
Basically that's just because value_initialized doesn't yet have a
custom swap function. Which could typically be implemented as follows:
namespace boost {
template <typename T> void swap(
value_initialized<T>& lhs,
value_initialized<T>& rhs)
{
// Assuming that sandbox/swap is available:
boost::swap( get(lhs), get(rhs) );
}
}
But such an overload would need boost::swap to support arrays! Otherwise
it simply wouldn't compile, when trying to swap
value_initialized<std::vector<int>[42]> objects.
What do you think?
See also www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#809 (now
having status Ready).
Kind regards,
Niels
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk