$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r70361 - in branches/release: boost boost/bimap boost/function boost/gil boost/graph boost/icl boost/intrusive boost/iterator boost/msm boost/numeric/ublas boost/property_tree boost/signals boost/spirit boost/spirit/home boost/spirit/home/karma boost/spirit/home/support boost/typeof boost/uuid boost/variant boost/wave libs/function libs/function/test
From: dnljms_at_[hidden]
Date: 2011-03-21 17:32:40
Author: danieljames
Date: 2011-03-21 17:32:38 EDT (Mon, 21 Mar 2011)
New Revision: 70361
URL: http://svn.boost.org/trac/boost/changeset/70361
Log:
Function: Merge from trunk.
- Remove extra definition of operator(), since it's inline anyway.  Fixes
  #4765.
- Make sure that the cv flags are copied when we copy a reference to a function
  object.  Fixes #4325
- Fully qualified function calls to avoid ambiguity with new additions to
  standard. Thanks to Conrad Poelman. Fixes #4073
- Remove iterator workaround for newer versions of Visual Age C++. Thanks to
  'ccambly'. Fixes #3912
- Fix unused variable warning for Visual C++. Fixes #3618
- Testing flag for Visual C++.
- Removed all but one old-style cast, prevents GCC warnings, but breaks GCC
  2.95.3. Fixes #3410
- Fixed tab and newline issues from inspection report.
Properties modified: 
   branches/release/boost/   (props changed)
   branches/release/boost/bimap/   (props changed)
   branches/release/boost/concept_check.hpp   (props changed)
   branches/release/boost/config.hpp   (props changed)
   branches/release/boost/function/   (props changed)
   branches/release/boost/gil/   (props changed)
   branches/release/boost/graph/   (props changed)
   branches/release/boost/icl/   (props changed)
   branches/release/boost/intrusive/   (props changed)
   branches/release/boost/iterator/iterator_facade.hpp   (props changed)
   branches/release/boost/msm/   (props changed)
   branches/release/boost/numeric/ublas/   (props changed)
   branches/release/boost/property_tree/   (props changed)
   branches/release/boost/signals/   (props changed)
   branches/release/boost/spirit/   (props changed)
   branches/release/boost/spirit/home/   (props changed)
   branches/release/boost/spirit/home/karma/   (props changed)
   branches/release/boost/spirit/home/support/attributes.hpp   (props changed)
   branches/release/boost/token_functions.hpp   (props changed)
   branches/release/boost/typeof/register_functions.hpp   (props changed)
   branches/release/boost/typeof/register_functions_iterate.hpp   (props changed)
   branches/release/boost/typeof/typeof.hpp   (props changed)
   branches/release/boost/typeof/unsupported.hpp   (props changed)
   branches/release/boost/uuid/   (props changed)
   branches/release/boost/variant/   (props changed)
   branches/release/boost/wave/   (props changed)
   branches/release/libs/function/   (props changed)
Text files modified: 
   branches/release/boost/function.hpp                      |     4 ++--                                    
   branches/release/boost/function/function_base.hpp        |    24 +++++++++++++++---------                
   branches/release/boost/function/function_template.hpp    |    38 ++++++++------------------------------  
   branches/release/libs/function/test/Jamfile.v2           |     1 +                                       
   branches/release/libs/function/test/mem_fun_cxx98.cpp    |    16 +++++++++++-----                        
   branches/release/libs/function/test/mem_fun_portable.cpp |    16 +++++++++++-----                        
   6 files changed, 48 insertions(+), 51 deletions(-)
Modified: branches/release/boost/function.hpp
==============================================================================
--- branches/release/boost/function.hpp	(original)
+++ branches/release/boost/function.hpp	2011-03-21 17:32:38 EDT (Mon, 21 Mar 2011)
@@ -23,8 +23,8 @@
 // in anything that may be included by function_template.hpp doesn't break
 #include <boost/function/detail/prologue.hpp>
 
-// Visual Age C++ doesn't handle the file iteration well
-#if BOOST_WORKAROUND(__IBMCPP__, >= 500)
+// Older Visual Age C++ version do not handle the file iteration well
+#if BOOST_WORKAROUND(__IBMCPP__, >= 500) && BOOST_WORKAROUND(__IBMCPP__, < 800)
 #  if BOOST_FUNCTION_MAX_ARGS >= 0
 #    include <boost/function/function0.hpp>
 #  endif
Modified: branches/release/boost/function/function_base.hpp
==============================================================================
--- branches/release/boost/function/function_base.hpp	(original)
+++ branches/release/boost/function/function_base.hpp	2011-03-21 17:32:38 EDT (Mon, 21 Mar 2011)
@@ -203,11 +203,11 @@
         {
           switch (op) {
           case clone_functor_tag: 
-            out_buffer.obj_ref.obj_ptr = in_buffer.obj_ref.obj_ptr;
+            out_buffer.obj_ref = in_buffer.obj_ref;
             return;
 
           case move_functor_tag:
-            out_buffer.obj_ref.obj_ptr = in_buffer.obj_ref.obj_ptr;
+            out_buffer.obj_ref = in_buffer.obj_ref;
             in_buffer.obj_ref.obj_ptr = 0;
             return;
 
@@ -315,14 +315,18 @@
           if (op == clone_functor_tag || op == move_functor_tag) {
             const functor_type* in_functor = 
               reinterpret_cast<const functor_type*>(&in_buffer.data);
-            new ((void*)&out_buffer.data) functor_type(*in_functor);
+            new (reinterpret_cast<void*>(&out_buffer.data)) functor_type(*in_functor);
 
             if (op == move_functor_tag) {
-              reinterpret_cast<functor_type*>(&in_buffer.data)->~Functor();
+              functor_type* f = reinterpret_cast<functor_type*>(&in_buffer.data);
+              (void)f; // suppress warning about the value of f not being used (MSVC)
+              f->~Functor();
             }
           } else if (op == destroy_functor_tag) {
             // Some compilers (Borland, vc6, ...) are unhappy with ~functor_type.
-            reinterpret_cast<functor_type*>(&out_buffer.data)->~Functor();
+             functor_type* f = reinterpret_cast<functor_type*>(&out_buffer.data);
+             (void)f; // suppress warning about the value of f not being used (MSVC)
+             f->~Functor();
           } else if (op == check_functor_type_tag) {
             const detail::sp_typeinfo& check_type 
               = *out_buffer.type.type;
@@ -369,8 +373,10 @@
             // Clone the functor
             // GCC 2.95.3 gets the CV qualifiers wrong here, so we
             // can't do the static_cast that we should do.
+            // jewillco: Changing this to static_cast because GCC 2.95.3 is
+            // obsolete.
             const functor_type* f =
-              (const functor_type*)(in_buffer.obj_ptr);
+              static_cast<const functor_type*>(in_buffer.obj_ptr);
             functor_type* new_f = new functor_type(*f);
             out_buffer.obj_ptr = new_f;
           } else if (op == move_functor_tag) {
@@ -474,7 +480,7 @@
             // GCC 2.95.3 gets the CV qualifiers wrong here, so we
             // can't do the static_cast that we should do.
             const functor_wrapper_type* f =
-              (const functor_wrapper_type*)(in_buffer.obj_ptr);
+              static_cast<const functor_wrapper_type*>(in_buffer.obj_ptr);
             wrapper_allocator_type wrapper_allocator(static_cast<Allocator const &>(*f));
             wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
             wrapper_allocator.construct(copy, *f);
@@ -671,7 +677,7 @@
                       detail::function::check_functor_type_tag);
       // GCC 2.95.3 gets the CV qualifiers wrong here, so we
       // can't do the static_cast that we should do.
-      return (const Functor*)(type_result.obj_ptr);
+      return static_cast<const Functor*>(type_result.obj_ptr);
     }
 
   template<typename F>
@@ -715,7 +721,7 @@
 public: // should be protected, but GCC 2.95.3 will fail to allow access
   detail::function::vtable_base* get_vtable() const {
     return reinterpret_cast<detail::function::vtable_base*>(
-             reinterpret_cast<std::size_t>(vtable) & ~(std::size_t)0x01);
+             reinterpret_cast<std::size_t>(vtable) & ~static_cast<std::size_t>(0x01));
   }
 
   bool has_trivial_copy_and_destroy() const {
Modified: branches/release/boost/function/function_template.hpp
==============================================================================
--- branches/release/boost/function/function_template.hpp	(original)
+++ branches/release/boost/function/function_template.hpp	2011-03-21 17:32:38 EDT (Mon, 21 Mar 2011)
@@ -514,7 +514,7 @@
           if (f) {
             // should be a reinterpret cast, but some compilers insist
             // on giving cv-qualifiers to free functions
-            functor.func_ptr = (void (*)())(f);
+            functor.func_ptr = reinterpret_cast<void (*)()>(f);
             return true;
           } else {
             return false;
@@ -536,7 +536,7 @@
           // objects, so we invoke through mem_fn() but we retain the
           // right target_type() values.
           if (f) {
-            this->assign_to(mem_fn(f), functor);
+            this->assign_to(boost::mem_fn(f), functor);
             return true;
           } else {
             return false;
@@ -549,7 +549,7 @@
           // objects, so we invoke through mem_fn() but we retain the
           // right target_type() values.
           if (f) {
-            this->assign_to_a(mem_fn(f), functor, a);
+            this->assign_to_a(boost::mem_fn(f), functor, a);
             return true;
           } else {
             return false;
@@ -563,7 +563,7 @@
         void 
         assign_functor(FunctionObj f, function_buffer& functor, mpl::true_)
         {
-          new ((void*)&functor.data) FunctionObj(f);
+          new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
         }
         template<typename FunctionObj,typename Allocator>
         void 
@@ -625,7 +625,7 @@
         assign_to(const reference_wrapper<FunctionObj>& f, 
                   function_buffer& functor, function_obj_ref_tag)
         {
-          functor.obj_ref.obj_ptr = (void *)f.get_pointer();
+          functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
           functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
           functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
           return true;
@@ -677,7 +677,7 @@
 
     vtable_type* get_vtable() const {
       return reinterpret_cast<vtable_type*>(
-               reinterpret_cast<std::size_t>(vtable) & ~(std::size_t)0x01);
+               reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
     }
 
     struct clear_type {};
@@ -751,9 +751,6 @@
 
     ~BOOST_FUNCTION_FUNCTION() { clear(); }
 
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-    // MSVC 6.0 and prior require all definitions to be inline, but
-    // these definitions can become very costly.
     result_type operator()(BOOST_FUNCTION_PARMS) const
     {
       if (this->empty())
@@ -762,9 +759,6 @@
       return get_vtable()->invoker
                (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
     }
-#else
-    result_type operator()(BOOST_FUNCTION_PARMS) const;
-#endif
 
     // The distinction between when to use BOOST_FUNCTION_FUNCTION and
     // when to use self_type is obnoxious. MSVC cannot handle self_type as
@@ -917,7 +911,7 @@
         if (boost::has_trivial_copy_constructor<Functor>::value &&
             boost::has_trivial_destructor<Functor>::value &&
             detail::function::function_allows_small_object_optimization<Functor>::value)
-          value |= (std::size_t)0x01;
+          value |= static_cast<size_t>(0x01);
         vtable = reinterpret_cast<detail::function::vtable_base *>(value);
       } else 
         vtable = 0;
@@ -951,7 +945,7 @@
         if (boost::has_trivial_copy_constructor<Functor>::value &&
             boost::has_trivial_destructor<Functor>::value &&
             detail::function::function_allows_small_object_optimization<Functor>::value)
-          value |= (std::size_t)0x01;
+          value |= static_cast<std::size_t>(0x01);
         vtable = reinterpret_cast<detail::function::vtable_base *>(value);
       } else 
         vtable = 0;
@@ -998,22 +992,6 @@
     f1.swap(f2);
   }
 
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-  template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS>
-  typename BOOST_FUNCTION_FUNCTION<
-      R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>::result_type
-  inline 
-  BOOST_FUNCTION_FUNCTION<R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>
-  ::operator()(BOOST_FUNCTION_PARMS) const
-  {
-    if (this->empty())
-      boost::throw_exception(bad_function_call());
-
-    return get_vtable()->invoker
-             (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
-  }
-#endif
-
 // Poison comparisons between boost::function objects of the same type.
 template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS>
   void operator==(const BOOST_FUNCTION_FUNCTION<
Modified: branches/release/libs/function/test/Jamfile.v2
==============================================================================
--- branches/release/libs/function/test/Jamfile.v2	(original)
+++ branches/release/libs/function/test/Jamfile.v2	2011-03-21 17:32:38 EDT (Mon, 21 Mar 2011)
@@ -8,6 +8,7 @@
 # For more information, see http://www.boost.org/
 
 project
+    : requirements <toolset>msvc:<asynch-exceptions>on
     : source-location $(BOOST_ROOT)
     ;
 
Modified: branches/release/libs/function/test/mem_fun_cxx98.cpp
==============================================================================
--- branches/release/libs/function/test/mem_fun_cxx98.cpp	(original)
+++ branches/release/libs/function/test/mem_fun_cxx98.cpp	2011-03-21 17:32:38 EDT (Mon, 21 Mar 2011)
@@ -10,22 +10,28 @@
 
     
 #include <boost/function.hpp>
+#include <boost/detail/lightweight_test.hpp>
 #include <iostream>
 #include <functional>
 
 struct X {
   int foo(int);
+  std::ostream& foo2(std::ostream&) const;
 };
 int X::foo(int x) { return -x; }
+std::ostream& X::foo2(std::ostream& x) const { return x; }
 
 int main()
 {
     boost::function<int (X*, int)> f;
+    boost::function<std::ostream& (X*, std::ostream&)> f2;
 
-f = &X::foo;
-  
-X x;
-f(&x, 5);
+    f = &X::foo;
+    f2 = &X::foo2;
 
-    return 0;
+    X x;
+    BOOST_TEST(f(&x, 5) == -5);
+    BOOST_TEST(f2(&x, boost::ref(std::cout)) == std::cout);
+
+    return ::boost::report_errors();
 }
Modified: branches/release/libs/function/test/mem_fun_portable.cpp
==============================================================================
--- branches/release/libs/function/test/mem_fun_portable.cpp	(original)
+++ branches/release/libs/function/test/mem_fun_portable.cpp	2011-03-21 17:32:38 EDT (Mon, 21 Mar 2011)
@@ -10,22 +10,28 @@
 
     
 #include <boost/function.hpp>
+#include <boost/detail/lightweight_test.hpp>
 #include <iostream>
 #include <functional>
 
 struct X {
   int foo(int);
+  std::ostream& foo2(std::ostream&) const;
 };
 int X::foo(int x) { return -x; }
+std::ostream& X::foo2(std::ostream& x) const { return x; }
 
 int main()
 {
     boost::function2<int, X*, int> f;
+    boost::function2<std::ostream&, X*, std::ostream&> f2;
 
-f = &X::foo;
-  
-X x;
-f(&x, 5);
+    f = &X::foo;
+    f2 = &X::foo2;
 
-    return 0;
+    X x;
+    BOOST_TEST(f(&x, 5) == -5);
+    BOOST_TEST(f2(&x, boost::ref(std::cout)) == std::cout);
+
+    return ::boost::report_errors();
 }