$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
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;
 
+