$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r67307 - branches/release/boost/optional
From: andrey.semashev_at_[hidden]
Date: 2010-12-18 16:29:40
Author: andysem
Date: 2010-12-18 16:29:39 EST (Sat, 18 Dec 2010)
New Revision: 67307
URL: http://svn.boost.org/trac/boost/changeset/67307
Log:
Merged changes from trunk: add namespace scope swap forward declaration to fix member swap copmilation. Swap implementation now uses Boost.Utility.Swap. Fixes #4987.
Text files modified: 
   branches/release/boost/optional/optional.hpp |   143 ++++++++++++++++++--------------------- 
   1 files changed, 65 insertions(+), 78 deletions(-)
Modified: branches/release/boost/optional/optional.hpp
==============================================================================
--- branches/release/boost/optional/optional.hpp	(original)
+++ branches/release/boost/optional/optional.hpp	2010-12-18 16:29:39 EST (Sat, 18 Dec 2010)
@@ -18,24 +18,25 @@
 #include <new>
 #include <algorithm>
 
-#include "boost/config.hpp"
-#include "boost/assert.hpp"
-#include "boost/type.hpp"
-#include "boost/type_traits/alignment_of.hpp"
-#include "boost/type_traits/has_nothrow_constructor.hpp"
-#include "boost/type_traits/type_with_alignment.hpp"
-#include "boost/type_traits/remove_reference.hpp"
-#include "boost/type_traits/is_reference.hpp"
-#include "boost/mpl/if.hpp"
-#include "boost/mpl/bool.hpp"
-#include "boost/mpl/not.hpp"
-#include "boost/detail/reference_content.hpp"
-#include "boost/none.hpp"
-#include "boost/utility/addressof.hpp"
-#include "boost/utility/compare_pointees.hpp"
-#include "boost/utility/in_place_factory.hpp"
+#include <boost/config.hpp>
+#include <boost/assert.hpp>
+#include <boost/type.hpp>
+#include <boost/type_traits/alignment_of.hpp>
+#include <boost/type_traits/has_nothrow_constructor.hpp>
+#include <boost/type_traits/type_with_alignment.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/detail/reference_content.hpp>
+#include <boost/none.hpp>
+#include <boost/utility/swap.hpp>
+#include <boost/utility/addressof.hpp>
+#include <boost/utility/compare_pointees.hpp>
+#include <boost/utility/in_place_factory.hpp>
 
-#include "boost/optional/optional_fwd.hpp"
+#include <boost/optional/optional_fwd.hpp>
 
 #if BOOST_WORKAROUND(BOOST_MSVC, == 1200)
 // VC6.0 has the following bug:
@@ -98,7 +99,7 @@
 namespace boost_optional_detail
 {
   template <class T, class Factory>
-  void construct(Factory const& factory, void* address)
+  inline void construct(Factory const& factory, void* address)
   {
     factory.BOOST_NESTED_TEMPLATE apply<T>(address);
   }
@@ -110,6 +111,9 @@
 class in_place_factory_base ;
 class typed_in_place_factory_base ;
 
+// This forward is needed to refer to namespace scope swap from the member swap
+template<class T> void swap ( optional<T>& x, optional<T>& y );
+
 namespace optional_detail {
 
 // This local class is used instead of that in "aligned_storage.hpp"
@@ -615,7 +619,7 @@
     void swap( optional & arg )
       {
         // allow for Koenig lookup
-        using boost::swap ;
+        using boost::swap;
         swap(*this, arg);
       }
 
@@ -914,79 +918,63 @@
 bool operator >= ( none_t x, optional<T> const& y )
 { return !( x < y ) ; }
 
-//
-// The following swap implementation follows the GCC workaround as found in
-//  "boost/detail/compressed_pair.hpp"
-//
 namespace optional_detail {
 
-// GCC < 3.2 gets the using declaration at namespace scope (FLC, DWA)
-#if BOOST_WORKAROUND(__GNUC__, < 3)                             \
-    || BOOST_WORKAROUND(__GNUC__, == 3) && __GNUC_MINOR__ <= 2
-   using std::swap;
-#define BOOST_OPTIONAL_STD_SWAP_INTRODUCED_AT_NS_SCOPE
-#endif
-
-  template<bool use_default_constructor> struct swap_selector;
+template<bool use_default_constructor> struct swap_selector;
 
-  template<>
-  struct swap_selector<true>
-  {
+template<>
+struct swap_selector<true>
+{
     template<class T>
     static void optional_swap ( optional<T>& x, optional<T>& y )
     {
-     bool hasX = x;
-     bool hasY = y;
+        const bool hasX = !!x;
+        const bool hasY = !!y;
 
-     if ( !hasX && !hasY )
-       return;
+        if ( !hasX && !hasY )
+            return;
 
-     if( !hasX )
-         x = boost::in_place();
-     else if ( !hasY )
-         y = boost::in_place();
+        if( !hasX )
+            x = boost::in_place();
+        else if ( !hasY )
+            y = boost::in_place();
 
-   // GCC > 3.2 and all other compilers have the using declaration at function scope (FLC)
-#ifndef BOOST_OPTIONAL_STD_SWAP_INTRODUCED_AT_NS_SCOPE
-     // allow for Koenig lookup
-     using std::swap ;
-#endif
-     swap(*x,*y);
+        // Boost.Utility.Swap will take care of ADL and workarounds for broken compilers
+        boost::swap(x.get(),y.get());
 
-     if( !hasX )
-         y = boost::none ;
-     else if( !hasY )
-         x = boost::none ;
+        if( !hasX )
+            y = boost::none ;
+        else if( !hasY )
+            x = boost::none ;
     }
-  };
+};
 
-  template<>
-  struct swap_selector<false>
-  {
+template<>
+struct swap_selector<false>
+{
     template<class T>
     static void optional_swap ( optional<T>& x, optional<T>& y )
     {
-      if ( !x && !!y )
-      {
-        x = *y;
-        y = boost::none ;
-      }
-      else if ( !!x && !y )
-      {
-        y = *x ;
-        x = boost::none ;
-      }
-      else if ( !!x && !!y )
-      {
-    // GCC > 3.2 and all other compilers have the using declaration at function scope (FLC)
-    #ifndef BOOST_OPTIONAL_STD_SWAP_INTRODUCED_AT_NS_SCOPE
-        // allow for Koenig lookup
-        using std::swap ;
-    #endif
-        swap(*x,*y);
-      }
+        const bool hasX = !!x;
+        const bool hasY = !!y;
+
+        if ( !hasX && hasY )
+        {
+            x = y.get();
+            y = boost::none ;
+        }
+        else if ( hasX && !hasY )
+        {
+            y = x.get();
+            x = boost::none ;
+        }
+        else if ( hasX && hasY )
+        {
+            // Boost.Utility.Swap will take care of ADL and workarounds for broken compilers
+            boost::swap(x.get(),y.get());
+        }
     }
-  };
+};
 
 } // namespace optional_detail
 
@@ -995,10 +983,9 @@
 
 template<class T> inline void swap ( optional<T>& x, optional<T>& y )
 {
-  optional_detail::swap_selector<optional_swap_should_use_default_constructor<T>::value>::optional_swap(x, y);
+    optional_detail::swap_selector<optional_swap_should_use_default_constructor<T>::value>::optional_swap(x, y);
 }
 
 } // namespace boost
 
 #endif
-