$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r77687 - in trunk: boost/thread boost/thread/detail libs/thread/test/sync/futures/future libs/thread/test/sync/futures/promise
From: vicente.botet_at_[hidden]
Date: 2012-04-01 11:51:20
Author: viboes
Date: 2012-04-01 11:51:18 EDT (Sun, 01 Apr 2012)
New Revision: 77687
URL: http://svn.boost.org/trac/boost/changeset/77687
Log:
Thread: Added specific macros for futures and importing container specific into boost
Text files modified: 
   trunk/boost/thread/detail/config.hpp                             |    47 ++++++++++++++++++++++++----            
   trunk/boost/thread/detail/memory.hpp                             |    65 ++++++++++++++++++++++++--------------- 
   trunk/boost/thread/future.hpp                                    |    27 ++++++----------                        
   trunk/libs/thread/test/sync/futures/future/default_pass.cpp      |    22 +++++--------                           
   trunk/libs/thread/test/sync/futures/future/dtor_pass.cpp         |     6 +-                                      
   trunk/libs/thread/test/sync/futures/promise/alloc_ctor_pass.cpp  |     6 +-                                      
   trunk/libs/thread/test/sync/futures/promise/move_assign_pass.cpp |    12 +++---                                  
   trunk/libs/thread/test/sync/futures/promise/move_ctor_pass.cpp   |     6 +-                                      
   8 files changed, 113 insertions(+), 78 deletions(-)
Modified: trunk/boost/thread/detail/config.hpp
==============================================================================
--- trunk/boost/thread/detail/config.hpp	(original)
+++ trunk/boost/thread/detail/config.hpp	2012-04-01 11:51:18 EDT (Sun, 01 Apr 2012)
@@ -11,6 +11,17 @@
 #include <boost/config.hpp>
 #include <boost/detail/workaround.hpp>
 
+// This compiler doesn't support Boost.Chrono
+#if defined __IBMCPP__
+#define BOOST_THREAD_DONT_USE_CHRONO
+#endif
+
+// This compiler doesn't support Boost.Move
+#if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100)
+#define BOOST_THREAD_DONT_USE_MOVE
+#endif
+
+// Default version is 1
 #if !defined BOOST_THREAD_VERSION
 #define BOOST_THREAD_VERSION 1
 #else
@@ -19,25 +30,23 @@
 #endif
 #endif
 
+// Uses Boost.System by default if not stated the opposite defining BOOST_THREAD_DONT_USE_SYSTEM
 #if ! defined BOOST_THREAD_DONT_USE_SYSTEM
 #define BOOST_THREAD_USES_SYSTEM
 #endif
 
-#if defined __IBMCPP__
-#define BOOST_THREAD_DONT_USE_CHRONO
-#endif
-
+// Uses Boost.Chrono by default if not stated the opposite  defining BOOST_THREAD_DONT_USE_CHRONO or BOOST_THREAD_DONT_USE_SYSTEM
 #if ! defined BOOST_THREAD_DONT_USE_CHRONO && ! defined BOOST_THREAD_DONT_USE_SYSTEM
 #define BOOST_THREAD_USES_CHRONO
 #endif
 
-#if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100)
-#define BOOST_THREAD_DONT_USE_MOVE
+// BOOST_THREAD_SHARED_MUTEX_GENERIC is defined if BOOST_THREAD_SHARED_MUTEX_PROVIDES_UPWARDS_CONVERSION
+#if defined BOOST_THREAD_SHARED_MUTEX_PROVIDES_UPWARDS_CONVERSION
+#define BOOST_THREAD_SHARED_MUTEX_GENERIC
 #endif
 
-//#define BOOST_THREAD_SHARED_MUTEX_PROVIDES_UPWARDS_CONVERSION
-//#define BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
 
+// Don't provided by default in version 1.
 #if defined BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
 #define BOOST_THREAD_EXPLICIT_LOCK_CONVERSION explicit
 #else
@@ -45,10 +54,32 @@
 #endif
 
 
+// Uses Boost.Move by default if not stated the opposite defining BOOST_THREAD_DONT_USE_MOVE
 #if ! defined BOOST_THREAD_DONT_USE_MOVE
 #define BOOST_THREAD_USES_MOVE
 #endif
 
+#if BOOST_THREAD_VERSION==1
+#define BOOST_THREAD_PROMISE_LAZY
+#endif
+
+#if BOOST_THREAD_VERSION==2
+#define BOOST_THREAD_USES_FUTURE
+#define BOOST_THREAD_FUTURE_USES_ALLOCATORS
+#define BOOST_THREAD_SHARED_MUTEX_PROVIDES_UPWARDS_CONVERSION
+#define BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
+#define BOOST_THREAD_SHARED_MUTEX_GENERIC
+#if ! defined BOOST_THREAD_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0
+#define BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0
+#endif
+#endif
+
+// BOOST_THREAD_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0 defined by default up to Boost 1.52
+// BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0 defined by default up to Boost 1.55
+#if ! defined BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0
+#define BOOST_THREAD_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0
+#endif
+
 #if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
 #  pragma warn -8008 // Condition always true/false
 #  pragma warn -8080 // Identifier declared but never used
Modified: trunk/boost/thread/detail/memory.hpp
==============================================================================
--- trunk/boost/thread/detail/memory.hpp	(original)
+++ trunk/boost/thread/detail/memory.hpp	2012-04-01 11:51:18 EDT (Sun, 01 Apr 2012)
@@ -17,36 +17,51 @@
 #ifndef BOOST_THREAD_DETAIL_MEMORY_HPP
 #define BOOST_THREAD_DETAIL_MEMORY_HPP
 
-
 #include <boost/container/allocator_traits.hpp>
 #include <boost/container/scoped_allocator.hpp>
+#include <boost/config.hpp>
 
-namespace boost {
-
-namespace thread_detail {
-
-template <class _Alloc>
-class allocator_destructor
+namespace boost
 {
-    typedef container::allocator_traits<_Alloc> alloc_traits;
-public:
-    typedef typename alloc_traits::pointer pointer;
-    typedef typename alloc_traits::size_type size_type;
-private:
-    _Alloc& alloc_;
-    size_type s_;
-public:
-    allocator_destructor(_Alloc& a, size_type s) BOOST_NOEXCEPT
-    : alloc_(a), s_(s)
-    {}
-    void operator()(pointer p) BOOST_NOEXCEPT
+  namespace thread_detail
+  {
+    template <class _Alloc>
+    class allocator_destructor
     {
-      alloc_traits::deallocate(alloc_, p, s_);
-    }
-};
-
-
-}  //namespace thread_detail {
+      typedef container::allocator_traits<_Alloc> alloc_traits;
+    public:
+      typedef typename alloc_traits::pointer pointer;
+      typedef typename alloc_traits::size_type size_type;
+    private:
+      _Alloc& alloc_;
+      size_type s_;
+    public:
+      allocator_destructor(_Alloc& a, size_type s)BOOST_NOEXCEPT
+      : alloc_(a), s_(s)
+      {}
+      void operator()(pointer p)BOOST_NOEXCEPT
+      {
+        alloc_traits::deallocate(alloc_, p, s_);
+      }
+    };
+  } //namespace thread_detail
+
+  typedef container::allocator_arg_t allocator_arg_t;
+  BOOST_CONSTEXPR allocator_arg_t allocator_arg = {};
+
+  template <class R>
+  class promise;
+  namespace container
+  {
+    template <class R, class Alloc>
+    struct uses_allocator<promise<R> , Alloc> : true_type
+    {
+    };
+  }
+  template <class T, class Alloc>
+  struct uses_allocator: public container::uses_allocator<T, Alloc>
+  {
+  };
 
 } // namespace boost
 
Modified: trunk/boost/thread/future.hpp
==============================================================================
--- trunk/boost/thread/future.hpp	(original)
+++ trunk/boost/thread/future.hpp	2012-04-01 11:51:18 EDT (Sun, 01 Apr 2012)
@@ -40,10 +40,10 @@
 #include <boost/thread/detail/memory.hpp>
 #endif
 
-#if BOOST_THREAD_VERSION==1
-#define BOOST_THREAD_FUTURE unique_future
-#else
+#if defined BOOST_THREAD_USES_FUTURE
 #define BOOST_THREAD_FUTURE future
+#else
+#define BOOST_THREAD_FUTURE unique_future
 #endif
 
 namespace boost
@@ -1262,7 +1262,7 @@
 
         void lazy_init()
         {
-#if BOOST_THREAD_VERSION==1
+#if defined BOOST_THREAD_PROMISE_LAZY
             if(!atomic_load(&future_))
             {
                 future_ptr blank;
@@ -1274,7 +1274,7 @@
     public:
 #if defined BOOST_THREAD_FUTURE_USES_ALLOCATORS
         template <class Allocator>
-        explicit promise(boost::container::allocator_arg_t, Allocator a)
+        explicit promise(boost::allocator_arg_t, Allocator a)
         {
           typedef typename Allocator::template rebind<detail::future_object<R> >::other A2;
           A2 a2(a);
@@ -1285,7 +1285,7 @@
         }
 #endif
         promise():
-#if BOOST_THREAD_VERSION==1
+#if defined BOOST_THREAD_PROMISE_LAZY
             future_(),
 #else
             future_(new detail::future_object<R>()),
@@ -1309,22 +1309,15 @@
         // Assignment
 #ifndef BOOST_NO_RVALUE_REFERENCES
         promise(promise && rhs) BOOST_NOEXCEPT:
-//#if ! BOOST_THREAD_VERSION==1
-        //            future_(rhs.future_),
-//#endif
             future_obtained(rhs.future_obtained)
         {
-//#if BOOST_THREAD_VERSION==1
             future_.swap(rhs.future_);
-//#else
-            // we need to release the future as shared_ptr doesn't implements move semantics
             rhs.future_.reset();
-//#endif
             rhs.future_obtained=false;
         }
         promise & operator=(promise&& rhs) BOOST_NOEXCEPT
         {
-#if BOOST_THREAD_VERSION==1
+#if defined BOOST_THREAD_PROMISE_LAZY
             future_.swap(rhs.future_);
             future_obtained=rhs.future_obtained;
             rhs.future_.reset();
@@ -1476,7 +1469,7 @@
 
         void lazy_init()
         {
-#if BOOST_THREAD_VERSION==1
+#if defined BOOST_THREAD_PROMISE_LAZY
             if(!atomic_load(&future_))
             {
                 future_ptr blank;
@@ -1487,7 +1480,7 @@
     public:
 #if defined BOOST_THREAD_FUTURE_USES_ALLOCATORS
         template <class Allocator>
-        explicit promise(boost::container::allocator_arg_t, Allocator a)
+        explicit promise(boost::allocator_arg_t, Allocator a)
         {
           typedef typename Allocator::template rebind<detail::future_object<void> >::other A2;
           A2 a2(a);
@@ -1498,7 +1491,7 @@
         }
 #endif
         promise():
-#if BOOST_THREAD_VERSION==1
+#if defined BOOST_THREAD_PROMISE_LAZY
             future_(),
 #else
             future_(new detail::future_object<void>),
Modified: trunk/libs/thread/test/sync/futures/future/default_pass.cpp
==============================================================================
--- trunk/libs/thread/test/sync/futures/future/default_pass.cpp	(original)
+++ trunk/libs/thread/test/sync/futures/future/default_pass.cpp	2012-04-01 11:51:18 EDT (Sun, 01 Apr 2012)
@@ -14,9 +14,9 @@
 
 // <boost/thread/future.hpp>
 
-// class promise<R>
+// class future<R>
 
-// promise();
+// future();
 
 #define BOOST_THREAD_VERSION 2
 
@@ -27,23 +27,19 @@
 {
 
   {
-      boost::promise<int> p;
-      boost::future<int> f = p.get_future();
-      BOOST_TEST(f.valid());
+      boost::future<int> f;
+      BOOST_TEST(!f.valid());
   }
   {
-      boost::promise<int&> p;
-      boost::future<int&> f = p.get_future();
-      BOOST_TEST(f.valid());
+      boost::future<int&> f;
+      BOOST_TEST(!f.valid());
   }
   {
-      boost::promise<void> p;
-      std::cout << __LINE__ << std::endl;
-      boost::future<void> f = p.get_future();
-      std::cout << __LINE__ << std::endl;
-      BOOST_TEST(f.valid());
+      boost::future<void> f;
+      BOOST_TEST(!f.valid());
   }
 
+
   return boost::report_errors();
 }
 
Modified: trunk/libs/thread/test/sync/futures/future/dtor_pass.cpp
==============================================================================
--- trunk/libs/thread/test/sync/futures/future/dtor_pass.cpp	(original)
+++ trunk/libs/thread/test/sync/futures/future/dtor_pass.cpp	2012-04-01 11:51:18 EDT (Sun, 01 Apr 2012)
@@ -35,7 +35,7 @@
       typedef int T;
       boost::future<T> f;
       {
-          boost::promise<T> p(boost::container::allocator_arg, test_allocator<T>());
+          boost::promise<T> p(boost::allocator_arg, test_allocator<T>());
           BOOST_TEST(test_alloc_base::count == 1);
           f = p.get_future();
           BOOST_TEST(test_alloc_base::count == 1);
@@ -49,7 +49,7 @@
       typedef int& T;
       boost::future<T> f;
       {
-          boost::promise<T> p(boost::container::allocator_arg, test_allocator<int>());
+          boost::promise<T> p(boost::allocator_arg, test_allocator<int>());
           BOOST_TEST(test_alloc_base::count == 1);
           f = p.get_future();
           BOOST_TEST(test_alloc_base::count == 1);
@@ -63,7 +63,7 @@
       typedef void T;
       boost::future<T> f;
       {
-          boost::promise<T> p(boost::container::allocator_arg, test_allocator<T>());
+          boost::promise<T> p(boost::allocator_arg, test_allocator<T>());
           BOOST_TEST(test_alloc_base::count == 1);
           f = p.get_future();
           BOOST_TEST(test_alloc_base::count == 1);
Modified: trunk/libs/thread/test/sync/futures/promise/alloc_ctor_pass.cpp
==============================================================================
--- trunk/libs/thread/test/sync/futures/promise/alloc_ctor_pass.cpp	(original)
+++ trunk/libs/thread/test/sync/futures/promise/alloc_ctor_pass.cpp	2012-04-01 11:51:18 EDT (Sun, 01 Apr 2012)
@@ -29,7 +29,7 @@
 {
   BOOST_TEST(test_alloc_base::count == 0);
   {
-      boost::promise<int> p(boost::container::allocator_arg, test_allocator<int>());
+      boost::promise<int> p(boost::allocator_arg, test_allocator<int>());
       BOOST_TEST(test_alloc_base::count == 1);
       boost::future<int> f = p.get_future();
       BOOST_TEST(test_alloc_base::count == 1);
@@ -37,7 +37,7 @@
   }
   BOOST_TEST(test_alloc_base::count == 0);
   {
-      boost::promise<int&> p(boost::container::allocator_arg, test_allocator<int>());
+      boost::promise<int&> p(boost::allocator_arg, test_allocator<int>());
       BOOST_TEST(test_alloc_base::count == 1);
       boost::future<int&> f = p.get_future();
       BOOST_TEST(test_alloc_base::count == 1);
@@ -45,7 +45,7 @@
   }
   BOOST_TEST(test_alloc_base::count == 0);
   {
-      boost::promise<void> p(boost::container::allocator_arg, test_allocator<void>());
+      boost::promise<void> p(boost::allocator_arg, test_allocator<void>());
       BOOST_TEST(test_alloc_base::count == 1);
       boost::future<void> f = p.get_future();
       BOOST_TEST(test_alloc_base::count == 1);
Modified: trunk/libs/thread/test/sync/futures/promise/move_assign_pass.cpp
==============================================================================
--- trunk/libs/thread/test/sync/futures/promise/move_assign_pass.cpp	(original)
+++ trunk/libs/thread/test/sync/futures/promise/move_assign_pass.cpp	2012-04-01 11:51:18 EDT (Sun, 01 Apr 2012)
@@ -35,8 +35,8 @@
 #if defined BOOST_THREAD_FUTURE_USES_ALLOCATORS
   BOOST_TEST(test_alloc_base::count == 0);
   {
-    boost::promise<int> p0(boost::container::allocator_arg, test_allocator<int>());
-    boost::promise<int> p(boost::container::allocator_arg, test_allocator<int>());
+    boost::promise<int> p0(boost::allocator_arg, test_allocator<int>());
+    boost::promise<int> p(boost::allocator_arg, test_allocator<int>());
     BOOST_TEST(test_alloc_base::count == 2);
     p = boost::move(p0);
     BOOST_TEST(test_alloc_base::count == 1);
@@ -57,8 +57,8 @@
   BOOST_TEST(test_alloc_base::count == 0);
 
   {
-    boost::promise<int&> p0(boost::container::allocator_arg, test_allocator<int>());
-    boost::promise<int&> p(boost::container::allocator_arg, test_allocator<int>());
+    boost::promise<int&> p0(boost::allocator_arg, test_allocator<int>());
+    boost::promise<int&> p(boost::allocator_arg, test_allocator<int>());
     BOOST_TEST(test_alloc_base::count == 2);
     p = boost::move(p0);
     BOOST_TEST(test_alloc_base::count == 1);
@@ -78,8 +78,8 @@
   }
   BOOST_TEST(test_alloc_base::count == 0);
   {
-    boost::promise<void> p0(boost::container::allocator_arg, test_allocator<void>());
-    boost::promise<void> p(boost::container::allocator_arg, test_allocator<void>());
+    boost::promise<void> p0(boost::allocator_arg, test_allocator<void>());
+    boost::promise<void> p(boost::allocator_arg, test_allocator<void>());
     BOOST_TEST(test_alloc_base::count == 2);
     p = boost::move(p0);
     BOOST_TEST(test_alloc_base::count == 1);
Modified: trunk/libs/thread/test/sync/futures/promise/move_ctor_pass.cpp
==============================================================================
--- trunk/libs/thread/test/sync/futures/promise/move_ctor_pass.cpp	(original)
+++ trunk/libs/thread/test/sync/futures/promise/move_ctor_pass.cpp	2012-04-01 11:51:18 EDT (Sun, 01 Apr 2012)
@@ -34,7 +34,7 @@
 #if defined BOOST_THREAD_FUTURE_USES_ALLOCATORS
   BOOST_TEST(test_alloc_base::count == 0);
   {
-    boost::promise<int> p0(boost::container::allocator_arg, test_allocator<int>());
+    boost::promise<int> p0(boost::allocator_arg, test_allocator<int>());
     boost::promise<int> p(boost::move(p0));
     BOOST_TEST(test_alloc_base::count == 1);
     std::cout << __LINE__ << std::endl;
@@ -58,7 +58,7 @@
   std::cout << __LINE__ << std::endl;
   BOOST_TEST(test_alloc_base::count == 0);
   {
-    boost::promise<int&> p0(boost::container::allocator_arg, test_allocator<int>());
+    boost::promise<int&> p0(boost::allocator_arg, test_allocator<int>());
     boost::promise<int&> p(boost::move(p0));
     BOOST_TEST(test_alloc_base::count == 1);
     boost::future<int&> f = p.get_future();
@@ -77,7 +77,7 @@
   }
   BOOST_TEST(test_alloc_base::count == 0);
   {
-    boost::promise<void> p0(boost::container::allocator_arg, test_allocator<void>());
+    boost::promise<void> p0(boost::allocator_arg, test_allocator<void>());
     boost::promise<void> p(boost::move(p0));
     BOOST_TEST(test_alloc_base::count == 1);
     boost::future<void> f = p.get_future();