|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r49967 - in branches/release: boost/utility libs/utility
From: nielsdekker_at_[hidden]
Date: 2008-11-27 14:37:40
Author: niels_dekker
Date: 2008-11-27 14:37:39 EST (Thu, 27 Nov 2008)
New Revision: 49967
URL: http://svn.boost.org/trac/boost/changeset/49967
Log:
Merged value_initialized::swap from trunk [48424] and [48425], according to ticket #2243, as was agreed with Fernando Cacciola.
Text files modified:
branches/release/boost/utility/value_init.hpp | 13 ++++++++++++
branches/release/libs/utility/value_init.htm | 12 +++++++---
branches/release/libs/utility/value_init_test.cpp | 43 +++++++++++++++++++++++++++++++++++++++
3 files changed, 63 insertions(+), 5 deletions(-)
Modified: branches/release/boost/utility/value_init.hpp
==============================================================================
--- branches/release/boost/utility/value_init.hpp (original)
+++ branches/release/boost/utility/value_init.hpp 2008-11-27 14:37:39 EST (Thu, 27 Nov 2008)
@@ -7,6 +7,7 @@
// 21 Ago 2002 (Created) Fernando Cacciola
// 24 Dec 2007 (Refactored and worked around various compiler bugs) Fernando Cacciola, Niels Dekker
// 23 May 2008 (Fixed operator= const issue, added initialized_value) Niels Dekker, Fernando Cacciola
+// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola
//
#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
@@ -22,6 +23,7 @@
#include <boost/static_assert.hpp>
#include <boost/type_traits/cv_traits.hpp>
#include <boost/type_traits/alignment_of.hpp>
+#include <boost/swap.hpp>
#include <cstring>
#include <new>
@@ -93,6 +95,11 @@
return wrapper_address()->data;
}
+ void swap(value_initialized & arg)
+ {
+ ::boost::swap( this->data(), arg.data() );
+ }
+
operator T&() const { return this->data(); }
} ;
@@ -110,6 +117,12 @@
return x.data() ;
}
+template<class T>
+void swap ( value_initialized<T> & lhs, value_initialized<T> & rhs )
+{
+ lhs.swap(rhs) ;
+}
+
class initialized_value_t
{
Modified: branches/release/libs/utility/value_init.htm
==============================================================================
--- branches/release/libs/utility/value_init.htm (original)
+++ branches/release/libs/utility/value_init.htm 2008-11-27 14:37:39 EST (Thu, 27 Nov 2008)
@@ -253,7 +253,7 @@
<h2><a name="val_init"><code>template class value_initialized<T></code></a></h2>
-<pre>namespace boost {<br><br>template<class T><br>class value_initialized<br>{<br> public :<br> value_initialized() : x() {}<br> operator T&() const { return x ; }<br> T& data() const { return x ; }<br><br> private :<br> <i>unspecified</i> x ;<br>} ;<br><br>template<class T><br>T const& get ( value_initialized<T> const& x )<br>{<br> return x.data() ;<br>}<br><br>template<class T><br>T& get ( value_initialized<T>& x )<br>{<br> return x.data() ;<br>}<br><br>} // namespace boost<br></pre>
+<pre>namespace boost {<br><br>template<class T><br>class value_initialized<br>{<br> public :<br> value_initialized() : x() {}<br> operator T&() const { return x ; }<br> T& data() const { return x ; }<br> void swap( value_initialized<T>& );<br><br> private :<br> <i>unspecified</i> x ;<br>} ;<br><br>template<class T><br>T const& get ( value_initialized<T> const& x )<br>{<br> return x.data() ;<br>}<br><br>template<class T><br>T& get ( value_initialized<T>& x )<br>{<br> return x.data() ;<br>}<br><br>} // namespace boost<br></pre>
<p>An object of this template class is a <code>T</code>-wrapper convertible
to <code>'T&'</code> whose wrapped object (data member of type <code>T</code>)
@@ -276,6 +276,10 @@
<p>Both <code>const</code> and non-<code>const</code> objects can be wrapped.
Mutable objects can be modified directly from within the wrapper but constant
objects cannot:</p>
+
+<p>When <code>T</code> is a <em>Swappable</em> type, <code>value_initialized<T></code>
+ is swappable as well, by calling its <code>swap</code> member function
+ as well as by calling <code>boost::swap</code>.</p>
<pre>value_initialized<int> x ; <br>static_cast<int&>(x) = 1 ; // OK<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> y ; <br>static_cast<int&>(y) = 1 ; // ERROR: cannot cast to int&<br>static_cast<int const&>(y) = 1 ; // ERROR: cannot modify a const value<br>get(y) = 1 ; // ERROR: cannot modify a const value</pre>
@@ -311,7 +315,7 @@
the wrapped object is always performed with the <code>get()</code> idiom:</p>
<pre>value_initialized<int> x ;<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> cx ;<br>get(x) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int> const x_c ;<br>get(x_c) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int const> const cx_c ;<br>get(cx_c) = 1 ; // ERROR: Cannot modify a const object<br></pre>
-
+
<h2><a name="initialized_value"><code>initialized_value</code></a></h2>
<pre>
@@ -379,7 +383,7 @@
</p>
<hr>
-<p>Revised 23 May 2008</p>
+<p>Revised 28 August 2008</p>
<p>© Copyright Fernando Cacciola, 2002, 2008.</p>
@@ -390,4 +394,4 @@
<br>
</body>
-</html>
+</html>
\ No newline at end of file
Modified: branches/release/libs/utility/value_init_test.cpp
==============================================================================
--- branches/release/libs/utility/value_init_test.cpp (original)
+++ branches/release/libs/utility/value_init_test.cpp 2008-11-27 14:37:39 EST (Thu, 27 Nov 2008)
@@ -9,6 +9,7 @@
// 21 Ago 2002 (Created) Fernando Cacciola
// 15 Jan 2008 (Added tests regarding compiler issues) Fernando Cacciola, Niels Dekker
// 23 May 2008 (Added tests regarding initialized_value) Niels Dekker
+// 21 Ago 2008 (Added swap test) Niels Dekker
#include <cstring> // For memcmp.
#include <iostream>
@@ -181,6 +182,35 @@
};
+//
+// A struct that allows testing whether its customized swap function is called.
+//
+struct SwapFunctionCallTester
+{
+ bool is_custom_swap_called;
+ int data;
+
+ SwapFunctionCallTester()
+ : is_custom_swap_called(false), data(0) {}
+
+ SwapFunctionCallTester(const SwapFunctionCallTester & arg)
+ : is_custom_swap_called(false), data(arg.data) {}
+
+ void swap(SwapFunctionCallTester & arg)
+ {
+ std::swap(data, arg.data);
+ is_custom_swap_called = true;
+ arg.is_custom_swap_called = true;
+ }
+};
+
+void swap(SwapFunctionCallTester & lhs, SwapFunctionCallTester & rhs)
+{
+ lhs.swap(rhs);
+}
+
+
+
template<class T>
void check_initialized_value ( T const& y )
{
@@ -196,7 +226,7 @@
// and this type (NonPOD), because the following statement
// won't compile on this particular compiler version:
// NonPOD initializedValue = boost::initialized_value() ;
-//
+ //
// This is caused by a compiler bug, that is fixed with a newer version
// of the Borland compiler. The Release Notes for Delphi(R) 2007 for
// Win32(R) and C++Builder(R) 2007 (http://dn.codegear.com/article/36575)
@@ -323,9 +353,20 @@
BOOST_CHECK ( ! get(copyFunctionCallTester3).is_copy_constructed);
BOOST_CHECK ( get(copyFunctionCallTester3).is_assignment_called);
+ boost::value_initialized<SwapFunctionCallTester> swapFunctionCallTester1;
+ boost::value_initialized<SwapFunctionCallTester> swapFunctionCallTester2;
+ get(swapFunctionCallTester1).data = 1;
+ get(swapFunctionCallTester2).data = 2;
+ boost::swap(swapFunctionCallTester1, swapFunctionCallTester2);
+ BOOST_CHECK( get(swapFunctionCallTester1).data == 2 );
+ BOOST_CHECK( get(swapFunctionCallTester2).data == 1 );
+ BOOST_CHECK( get(swapFunctionCallTester1).is_custom_swap_called );
+ BOOST_CHECK( get(swapFunctionCallTester2).is_custom_swap_called );
+
return 0;
}
unsigned int expected_failures = 0;
+
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk