Boost logo

Boost-Commit :

From: eric_at_[hidden]
Date: 2008-05-08 17:42:02


Author: eric_niebler
Date: 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
New Revision: 45230
URL: http://svn.boost.org/trac/boost/changeset/45230

Log:
merged from trunk
Added:
   branches/proto/v4/boost/asio/detail/handler_base_from_member.hpp
      - copied unchanged from r45226, /trunk/boost/asio/detail/handler_base_from_member.hpp
   branches/proto/v4/boost/detail/sp_convertible.hpp
      - copied unchanged from r45226, /trunk/boost/detail/sp_convertible.hpp
   branches/proto/v4/boost/spirit/home/karma/binary/padding.hpp
      - copied unchanged from r45226, /trunk/boost/spirit/home/karma/binary/padding.hpp
   branches/proto/v4/libs/exception/test/throw_exception_fail.cpp
      - copied unchanged from r45226, /trunk/libs/exception/test/throw_exception_fail.cpp
   branches/proto/v4/libs/smart_ptr/test/allocate_shared_test.cpp
      - copied unchanged from r45226, /trunk/libs/smart_ptr/test/allocate_shared_test.cpp
   branches/proto/v4/libs/smart_ptr/test/ip_convertible_test.cpp
      - copied unchanged from r45226, /trunk/libs/smart_ptr/test/ip_convertible_test.cpp
   branches/proto/v4/libs/smart_ptr/test/sp_atomic_mt2_test.cpp
      - copied unchanged from r45226, /trunk/libs/smart_ptr/test/sp_atomic_mt2_test.cpp
   branches/proto/v4/libs/smart_ptr/test/sp_convertible_test.cpp
      - copied unchanged from r45226, /trunk/libs/smart_ptr/test/sp_convertible_test.cpp
   branches/proto/v4/libs/smart_ptr/test/wp_convertible_test.cpp
      - copied unchanged from r45226, /trunk/libs/smart_ptr/test/wp_convertible_test.cpp
   branches/proto/v4/libs/spirit/example/karma/calc2_ast_vm.cpp
      - copied unchanged from r45226, /trunk/libs/spirit/example/karma/calc2_ast_vm.cpp
   branches/proto/v4/libs/spirit/example/karma/calc2_ast_vm.hpp
      - copied unchanged from r45226, /trunk/libs/spirit/example/karma/calc2_ast_vm.hpp
   branches/proto/v4/libs/spirit/example/karma/mini_xml_karma.cpp
      - copied unchanged from r45226, /trunk/libs/spirit/example/karma/mini_xml_karma.cpp
   branches/proto/v4/libs/thread/test/no_implicit_assign_from_lvalue_thread.cpp
      - copied unchanged from r45226, /trunk/libs/thread/test/no_implicit_assign_from_lvalue_thread.cpp
   branches/proto/v4/libs/thread/test/no_implicit_move_from_lvalue_thread.cpp
      - copied unchanged from r45226, /trunk/libs/thread/test/no_implicit_move_from_lvalue_thread.cpp
   branches/proto/v4/tools/build/v2/test/file_name_handling.py
      - copied unchanged from r45226, /trunk/tools/build/v2/test/file_name_handling.py
   branches/proto/v4/tools/inspect/ascii_check.cpp
      - copied unchanged from r45226, /trunk/tools/inspect/ascii_check.cpp
   branches/proto/v4/tools/inspect/ascii_check.hpp
      - copied unchanged from r45226, /trunk/tools/inspect/ascii_check.hpp
   branches/proto/v4/tools/jam/test/builtin_normalize_path.jam
      - copied unchanged from r45226, /trunk/tools/jam/test/builtin_normalize_path.jam
Removed:
   branches/proto/v4/libs/spirit/example/qi/mini_xml_karma.cpp
Properties modified:
   branches/proto/v4/ (props changed)
Text files modified:
   branches/proto/v4/boost/any.hpp | 2
   branches/proto/v4/boost/asio/detail/dev_poll_reactor.hpp | 68
   branches/proto/v4/boost/asio/detail/epoll_reactor.hpp | 76
   branches/proto/v4/boost/asio/detail/hash_map.hpp | 34
   branches/proto/v4/boost/asio/detail/kqueue_reactor.hpp | 140 +
   branches/proto/v4/boost/asio/detail/reactive_descriptor_service.hpp | 87
   branches/proto/v4/boost/asio/detail/reactive_socket_service.hpp | 220 +
   branches/proto/v4/boost/asio/detail/reactor_op_queue.hpp | 199 +
   branches/proto/v4/boost/asio/detail/select_reactor.hpp | 53
   branches/proto/v4/boost/asio/detail/strand_service.hpp | 11
   branches/proto/v4/boost/asio/detail/win_iocp_socket_service.hpp | 56
   branches/proto/v4/boost/asio/detail/wrapped_handler.hpp | 48
   branches/proto/v4/boost/detail/shared_count.hpp | 1
   branches/proto/v4/boost/detail/spinlock_pool.hpp | 4
   branches/proto/v4/boost/enable_shared_from_this.hpp | 9
   branches/proto/v4/boost/exception/detail/cloning_base.hpp | 11
   branches/proto/v4/boost/exception/detail/counted_base.hpp | 11
   branches/proto/v4/boost/exception/exception.hpp | 76
   branches/proto/v4/boost/exception/info.hpp | 11
   branches/proto/v4/boost/intrusive_ptr.hpp | 33
   branches/proto/v4/boost/lexical_cast.hpp | 7
   branches/proto/v4/boost/parameter/preprocessor.hpp | 3
   branches/proto/v4/boost/pointer_cast.hpp | 2
   branches/proto/v4/boost/pointer_to_other.hpp | 2
   branches/proto/v4/boost/range/as_literal.hpp | 17
   branches/proto/v4/boost/range/detail/as_literal.hpp | 4
   branches/proto/v4/boost/shared_ptr.hpp | 54
   branches/proto/v4/boost/spirit/home/karma/action/action.hpp | 9
   branches/proto/v4/boost/spirit/home/karma/binary.hpp | 1
   branches/proto/v4/boost/spirit/home/karma/binary/meta_grammar.hpp | 5
   branches/proto/v4/boost/spirit/home/karma/detail/output_iterator.hpp | 46
   branches/proto/v4/boost/spirit/home/karma/generate.hpp | 114 +
   branches/proto/v4/boost/spirit/home/karma/nonterminal/nonterminal_director.hpp | 2
   branches/proto/v4/boost/spirit/home/karma/operator/detail/alternative.hpp | 32
   branches/proto/v4/boost/spirit/home/karma/operator/sequence.hpp | 2
   branches/proto/v4/boost/spirit/home/qi/action/action.hpp | 2
   branches/proto/v4/boost/spirit/home/support/algorithm/any_if.hpp | 2
   branches/proto/v4/boost/spirit/home/support/attribute_transform.hpp | 31
   branches/proto/v4/boost/spirit/home/support/detail/action_dispatch.hpp | 44
   branches/proto/v4/boost/spirit/home/support/placeholders.hpp | 9
   branches/proto/v4/boost/test/impl/execution_monitor.ipp | 439 ++--
   branches/proto/v4/boost/thread/detail/move.hpp | 17
   branches/proto/v4/boost/thread/locks.hpp | 63
   branches/proto/v4/boost/thread/pthread/mutex.hpp | 7
   branches/proto/v4/boost/thread/pthread/recursive_mutex.hpp | 14
   branches/proto/v4/boost/thread/pthread/thread.hpp | 10
   branches/proto/v4/boost/thread/win32/basic_timed_mutex.hpp | 56
   branches/proto/v4/boost/thread/win32/thread.hpp | 9
   branches/proto/v4/boost/thread/win32/thread_primitives.hpp | 109 +
   branches/proto/v4/boost/throw_exception.hpp | 37
   branches/proto/v4/boost/unordered/detail/config.hpp | 3
   branches/proto/v4/boost/wave/util/cpp_include_paths.hpp | 4
   branches/proto/v4/boost/weak_ptr.hpp | 22
   branches/proto/v4/libs/any/test.hpp | 11
   branches/proto/v4/libs/exception/doc/boost-exception.html | 4
   branches/proto/v4/libs/exception/doc/source/boost-exception.reno | 3886 ++++++++++++++++++++--------------------
   branches/proto/v4/libs/exception/doc/throw_exception.html | 4
   branches/proto/v4/libs/exception/test/Jamfile.v2 | 1
   branches/proto/v4/libs/exception/test/helper2.hpp | 1
   branches/proto/v4/libs/lambda/doc/lambda.xml | 2
   branches/proto/v4/libs/numeric/interval/doc/interval.htm | 2
   branches/proto/v4/libs/range/test/string.cpp | 34
   branches/proto/v4/libs/smart_ptr/intrusive_ptr.html | 6
   branches/proto/v4/libs/smart_ptr/test/Jamfile.v2 | 4
   branches/proto/v4/libs/smart_ptr/test/make_shared_test.cpp | 145 -
   branches/proto/v4/libs/smart_ptr/test/pointer_cast_test.cpp | 2
   branches/proto/v4/libs/smart_ptr/test/smart_ptr_test.cpp | 4
   branches/proto/v4/libs/smart_ptr/test/sp_atomic_mt_test.cpp | 7
   branches/proto/v4/libs/smart_ptr/test/sp_unary_addr_test.cpp | 5
   branches/proto/v4/libs/spirit/example/karma/Jamfile | 1
   branches/proto/v4/libs/spirit/example/karma/actions.cpp | 44
   branches/proto/v4/libs/spirit/example/karma/calc2_ast_dump.cpp | 10
   branches/proto/v4/libs/spirit/example/karma/calc2_ast_rpn.cpp | 16
   branches/proto/v4/libs/spirit/example/qi/actions.cpp | 4
   branches/proto/v4/libs/spirit/test/karma/binary.cpp | 20
   branches/proto/v4/libs/spirit/test/karma/test.hpp | 213 -
   branches/proto/v4/libs/spirit/test/qi/actions.cpp | 5
   branches/proto/v4/libs/thread/doc/mutex_concepts.qbk | 30
   branches/proto/v4/libs/thread/doc/mutexes.qbk | 77
   branches/proto/v4/libs/thread/doc/thread_ref.qbk | 16
   branches/proto/v4/libs/thread/test/Jamfile.v2 | 2
   branches/proto/v4/libs/thread/test/test_lock_concept.cpp | 12
   branches/proto/v4/libs/thread/test/test_move_function.cpp | 74
   branches/proto/v4/libs/wave/ChangeLog | 2
   branches/proto/v4/libs/wave/test/testwave/testwave_app.cpp | 7
   branches/proto/v4/tools/build/v2/build-system.jam | 52
   branches/proto/v4/tools/build/v2/build/alias.jam | 2
   branches/proto/v4/tools/build/v2/build/generators.jam | 75
   branches/proto/v4/tools/build/v2/build/targets.jam | 23
   branches/proto/v4/tools/build/v2/build/version.jam | 123 +
   branches/proto/v4/tools/build/v2/build/virtual-target.jam | 9
   branches/proto/v4/tools/build/v2/doc/src/advanced.xml | 402 ++--
   branches/proto/v4/tools/build/v2/doc/src/extending.xml | 133
   branches/proto/v4/tools/build/v2/kernel/bootstrap.jam | 6
   branches/proto/v4/tools/build/v2/kernel/modules.jam | 2
   branches/proto/v4/tools/build/v2/test/build_file.py | 178 +
   branches/proto/v4/tools/build/v2/test/test_all.py | 1
   branches/proto/v4/tools/build/v2/tools/common.jam | 2
   branches/proto/v4/tools/build/v2/tools/darwin.jam | 2
   branches/proto/v4/tools/build/v2/tools/qt3.jam | 85
   branches/proto/v4/tools/build/v2/tools/qt4.jam | 397 ++-
   branches/proto/v4/tools/build/v2/tools/stage.jam | 42
   branches/proto/v4/tools/build/v2/tools/testing.jam | 20
   branches/proto/v4/tools/build/v2/util/assert.jam | 54
   branches/proto/v4/tools/build/v2/util/numbers.jam | 119
   branches/proto/v4/tools/build/v2/util/os.jam | 3
   branches/proto/v4/tools/build/v2/util/path.jam | 126
   branches/proto/v4/tools/build/v2/util/sequence.jam | 75
   branches/proto/v4/tools/inspect/build/Jamfile.v2 | 2
   branches/proto/v4/tools/inspect/inspect.cpp | 8
   branches/proto/v4/tools/jam/src/builtins.c | 355 ++-
   branches/proto/v4/tools/jam/src/rules.c | 3
   branches/proto/v4/tools/jam/test/action_status.jam | 5
   branches/proto/v4/tools/jam/test/builtin_shell.jam | 16
   branches/proto/v4/tools/jam/test/option_l.jam | 1
   branches/proto/v4/tools/jam/test/parallel_multifile_actions.jam | 4
   branches/proto/v4/tools/jam/test/test.jam | 9
   branches/proto/v4/tools/regression/src/process_jam_log.py | 43
   branches/proto/v4/tools/regression/src/regression.py | 15
   119 files changed, 5341 insertions(+), 4030 deletions(-)

Modified: branches/proto/v4/boost/any.hpp
==============================================================================
--- branches/proto/v4/boost/any.hpp (original)
+++ branches/proto/v4/boost/any.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -127,6 +127,8 @@
 
             ValueType held;
 
+ private: // intentionally left unimplemented
+ holder & operator=(const holder &);
         };
 
 #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS

Modified: branches/proto/v4/boost/asio/detail/dev_poll_reactor.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/dev_poll_reactor.hpp (original)
+++ branches/proto/v4/boost/asio/detail/dev_poll_reactor.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -142,9 +142,18 @@
       return;
 
     if (allow_speculative_read)
+ {
       if (!read_op_queue_.has_operation(descriptor))
- if (handler(boost::system::error_code()))
+ {
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
           return;
+ }
+ }
+ }
 
     if (read_op_queue_.enqueue_operation(descriptor, handler))
     {
@@ -170,9 +179,18 @@
       return;
 
     if (allow_speculative_write)
+ {
       if (!write_op_queue_.has_operation(descriptor))
- if (handler(boost::system::error_code()))
+ {
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
           return;
+ }
+ }
+ }
 
     if (write_op_queue_.enqueue_operation(descriptor, handler))
     {
@@ -313,16 +331,16 @@
 
     // Dispatch any operation cancellations that were made while the select
     // loop was not running.
- read_op_queue_.dispatch_cancellations();
- write_op_queue_.dispatch_cancellations();
- except_op_queue_.dispatch_cancellations();
+ read_op_queue_.perform_cancellations();
+ write_op_queue_.perform_cancellations();
+ except_op_queue_.perform_cancellations();
     for (std::size_t i = 0; i < timer_queues_.size(); ++i)
       timer_queues_[i]->dispatch_cancellations();
 
     // Check if the thread is supposed to stop.
     if (stop_thread_)
     {
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
       return;
     }
 
@@ -331,7 +349,7 @@
     if (!block && read_op_queue_.empty() && write_op_queue_.empty()
         && except_op_queue_.empty() && all_timer_queues_are_empty())
     {
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
       return;
     }
 
@@ -347,9 +365,9 @@
         int descriptor = pending_event_changes_[i].fd;
         boost::system::error_code ec = boost::system::error_code(
             errno, boost::asio::error::get_system_category());
- read_op_queue_.dispatch_all_operations(descriptor, ec);
- write_op_queue_.dispatch_all_operations(descriptor, ec);
- except_op_queue_.dispatch_all_operations(descriptor, ec);
+ read_op_queue_.perform_all_operations(descriptor, ec);
+ write_op_queue_.perform_all_operations(descriptor, ec);
+ except_op_queue_.perform_all_operations(descriptor, ec);
       }
     }
     pending_event_changes_.clear();
@@ -370,7 +388,7 @@
     lock.lock();
     wait_in_progress_ = false;
 
- // Block signals while dispatching operations.
+ // Block signals while performing operations.
     boost::asio::detail::signal_blocker sb;
 
     // Dispatch the waiting events.
@@ -391,17 +409,17 @@
         // Exception operations must be processed first to ensure that any
         // out-of-band data is read before normal data.
         if (events[i].events & (POLLPRI | POLLERR | POLLHUP))
- more_except = except_op_queue_.dispatch_operation(descriptor, ec);
+ more_except = except_op_queue_.perform_operation(descriptor, ec);
         else
           more_except = except_op_queue_.has_operation(descriptor);
 
         if (events[i].events & (POLLIN | POLLERR | POLLHUP))
- more_reads = read_op_queue_.dispatch_operation(descriptor, ec);
+ more_reads = read_op_queue_.perform_operation(descriptor, ec);
         else
           more_reads = read_op_queue_.has_operation(descriptor);
 
         if (events[i].events & (POLLOUT | POLLERR | POLLHUP))
- more_writes = write_op_queue_.dispatch_operation(descriptor, ec);
+ more_writes = write_op_queue_.perform_operation(descriptor, ec);
         else
           more_writes = write_op_queue_.has_operation(descriptor);
 
@@ -436,16 +454,16 @@
           {
             ec = boost::system::error_code(errno,
                 boost::asio::error::get_system_category());
- read_op_queue_.dispatch_all_operations(descriptor, ec);
- write_op_queue_.dispatch_all_operations(descriptor, ec);
- except_op_queue_.dispatch_all_operations(descriptor, ec);
+ read_op_queue_.perform_all_operations(descriptor, ec);
+ write_op_queue_.perform_all_operations(descriptor, ec);
+ except_op_queue_.perform_all_operations(descriptor, ec);
           }
         }
       }
     }
- read_op_queue_.dispatch_cancellations();
- write_op_queue_.dispatch_cancellations();
- except_op_queue_.dispatch_cancellations();
+ read_op_queue_.perform_cancellations();
+ write_op_queue_.perform_cancellations();
+ except_op_queue_.perform_cancellations();
     for (std::size_t i = 0; i < timer_queues_.size(); ++i)
     {
       timer_queues_[i]->dispatch_timers();
@@ -457,7 +475,7 @@
       cancel_ops_unlocked(pending_cancellations_[i]);
     pending_cancellations_.clear();
 
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
   }
 
   // Run the select loop in the thread.
@@ -557,14 +575,14 @@
   // destructors may make calls back into this reactor. We make a copy of the
   // vector of timer queues since the original may be modified while the lock
   // is not held.
- void cleanup_operations_and_timers(
+ void complete_operations_and_cleanup_timers(
       boost::asio::detail::mutex::scoped_lock& lock)
   {
     timer_queues_for_cleanup_ = timer_queues_;
     lock.unlock();
- read_op_queue_.cleanup_operations();
- write_op_queue_.cleanup_operations();
- except_op_queue_.cleanup_operations();
+ read_op_queue_.complete_operations();
+ write_op_queue_.complete_operations();
+ except_op_queue_.complete_operations();
     for (std::size_t i = 0; i < timer_queues_for_cleanup_.size(); ++i)
       timer_queues_for_cleanup_[i]->cleanup_timers();
   }

Modified: branches/proto/v4/boost/asio/detail/epoll_reactor.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/epoll_reactor.hpp (original)
+++ branches/proto/v4/boost/asio/detail/epoll_reactor.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -152,8 +152,13 @@
   {
     if (allow_speculative_read && descriptor_data.allow_speculative_read)
     {
- if (handler(boost::system::error_code()))
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
         return;
+ }
 
       // We only get one shot at a speculative read in this function.
       allow_speculative_read = false;
@@ -171,8 +176,13 @@
       // Speculative reads are ok as there are no queued read operations.
       descriptor_data.allow_speculative_read = true;
 
- if (handler(boost::system::error_code()))
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
         return;
+ }
     }
 
     // Speculative reads are not ok as there will be queued read operations.
@@ -195,7 +205,7 @@
       {
         boost::system::error_code ec(errno,
             boost::asio::error::get_system_category());
- read_op_queue_.dispatch_all_operations(descriptor, ec);
+ read_op_queue_.perform_all_operations(descriptor, ec);
       }
     }
   }
@@ -209,8 +219,13 @@
   {
     if (allow_speculative_write && descriptor_data.allow_speculative_write)
     {
- if (handler(boost::system::error_code()))
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
         return;
+ }
 
       // We only get one shot at a speculative write in this function.
       allow_speculative_write = false;
@@ -228,8 +243,13 @@
       // Speculative writes are ok as there are no queued write operations.
       descriptor_data.allow_speculative_write = true;
 
- if (handler(boost::system::error_code()))
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
         return;
+ }
     }
 
     // Speculative writes are not ok as there will be queued write operations.
@@ -252,7 +272,7 @@
       {
         boost::system::error_code ec(errno,
             boost::asio::error::get_system_category());
- write_op_queue_.dispatch_all_operations(descriptor, ec);
+ write_op_queue_.perform_all_operations(descriptor, ec);
       }
     }
   }
@@ -285,7 +305,7 @@
       {
         boost::system::error_code ec(errno,
             boost::asio::error::get_system_category());
- except_op_queue_.dispatch_all_operations(descriptor, ec);
+ except_op_queue_.perform_all_operations(descriptor, ec);
       }
     }
   }
@@ -322,7 +342,7 @@
       {
         boost::system::error_code ec(errno,
             boost::asio::error::get_system_category());
- write_op_queue_.dispatch_all_operations(descriptor, ec);
+ write_op_queue_.perform_all_operations(descriptor, ec);
       }
     }
   }
@@ -407,16 +427,16 @@
 
     // Dispatch any operation cancellations that were made while the select
     // loop was not running.
- read_op_queue_.dispatch_cancellations();
- write_op_queue_.dispatch_cancellations();
- except_op_queue_.dispatch_cancellations();
+ read_op_queue_.perform_cancellations();
+ write_op_queue_.perform_cancellations();
+ except_op_queue_.perform_cancellations();
     for (std::size_t i = 0; i < timer_queues_.size(); ++i)
       timer_queues_[i]->dispatch_cancellations();
 
     // Check if the thread is supposed to stop.
     if (stop_thread_)
     {
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
       return;
     }
 
@@ -425,7 +445,7 @@
     if (!block && read_op_queue_.empty() && write_op_queue_.empty()
         && except_op_queue_.empty() && all_timer_queues_are_empty())
     {
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
       return;
     }
 
@@ -442,7 +462,7 @@
     lock.lock();
     wait_in_progress_ = false;
 
- // Block signals while dispatching operations.
+ // Block signals while performing operations.
     boost::asio::detail::signal_blocker sb;
 
     // Dispatch the waiting events.
@@ -463,17 +483,17 @@
         // Exception operations must be processed first to ensure that any
         // out-of-band data is read before normal data.
         if (events[i].events & (EPOLLPRI | EPOLLERR | EPOLLHUP))
- more_except = except_op_queue_.dispatch_operation(descriptor, ec);
+ more_except = except_op_queue_.perform_operation(descriptor, ec);
         else
           more_except = except_op_queue_.has_operation(descriptor);
 
         if (events[i].events & (EPOLLIN | EPOLLERR | EPOLLHUP))
- more_reads = read_op_queue_.dispatch_operation(descriptor, ec);
+ more_reads = read_op_queue_.perform_operation(descriptor, ec);
         else
           more_reads = read_op_queue_.has_operation(descriptor);
 
         if (events[i].events & (EPOLLOUT | EPOLLERR | EPOLLHUP))
- more_writes = write_op_queue_.dispatch_operation(descriptor, ec);
+ more_writes = write_op_queue_.perform_operation(descriptor, ec);
         else
           more_writes = write_op_queue_.has_operation(descriptor);
 
@@ -507,16 +527,16 @@
           {
             ec = boost::system::error_code(errno,
                 boost::asio::error::get_system_category());
- read_op_queue_.dispatch_all_operations(descriptor, ec);
- write_op_queue_.dispatch_all_operations(descriptor, ec);
- except_op_queue_.dispatch_all_operations(descriptor, ec);
+ read_op_queue_.perform_all_operations(descriptor, ec);
+ write_op_queue_.perform_all_operations(descriptor, ec);
+ except_op_queue_.perform_all_operations(descriptor, ec);
           }
         }
       }
     }
- read_op_queue_.dispatch_cancellations();
- write_op_queue_.dispatch_cancellations();
- except_op_queue_.dispatch_cancellations();
+ read_op_queue_.perform_cancellations();
+ write_op_queue_.perform_cancellations();
+ except_op_queue_.perform_cancellations();
     for (std::size_t i = 0; i < timer_queues_.size(); ++i)
     {
       timer_queues_[i]->dispatch_timers();
@@ -532,7 +552,7 @@
     need_epoll_wait_ = !read_op_queue_.empty()
       || !write_op_queue_.empty() || !except_op_queue_.empty();
 
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
   }
 
   // Run the select loop in the thread.
@@ -635,14 +655,14 @@
   // destructors may make calls back into this reactor. We make a copy of the
   // vector of timer queues since the original may be modified while the lock
   // is not held.
- void cleanup_operations_and_timers(
+ void complete_operations_and_cleanup_timers(
       boost::asio::detail::mutex::scoped_lock& lock)
   {
     timer_queues_for_cleanup_ = timer_queues_;
     lock.unlock();
- read_op_queue_.cleanup_operations();
- write_op_queue_.cleanup_operations();
- except_op_queue_.cleanup_operations();
+ read_op_queue_.complete_operations();
+ write_op_queue_.complete_operations();
+ except_op_queue_.complete_operations();
     for (std::size_t i = 0; i < timer_queues_for_cleanup_.size(); ++i)
       timer_queues_for_cleanup_[i]->cleanup_timers();
   }

Modified: branches/proto/v4/boost/asio/detail/hash_map.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/hash_map.hpp (original)
+++ branches/proto/v4/boost/asio/detail/hash_map.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -44,6 +44,7 @@
 }
 #endif // defined(_WIN64)
 
+// Note: assumes K and V are POD types.
 template <typename K, typename V>
 class hash_map
   : private noncopyable
@@ -140,7 +141,7 @@
     if (it == values_.end())
     {
       buckets_[bucket].first = buckets_[bucket].last =
- values_.insert(values_.end(), v);
+ values_insert(values_.end(), v);
       return std::pair<iterator, bool>(buckets_[bucket].last, true);
     }
     iterator end = buckets_[bucket].last;
@@ -151,7 +152,7 @@
         return std::pair<iterator, bool>(it, false);
       ++it;
     }
- buckets_[bucket].last = values_.insert(end, v);
+ buckets_[bucket].last = values_insert(end, v);
     return std::pair<iterator, bool>(buckets_[bucket].last, true);
   }
 
@@ -170,7 +171,7 @@
     else if (is_last)
       --buckets_[bucket].last;
 
- values_.erase(it);
+ values_erase(it);
   }
 
   // Remove all entries from the map.
@@ -185,9 +186,36 @@
   }
 
 private:
+ // Insert an element into the values list by splicing from the spares list,
+ // if a spare is available, and otherwise by inserting a new element.
+ iterator values_insert(iterator it, const value_type& v)
+ {
+ if (spares_.empty())
+ {
+ return values_.insert(it, v);
+ }
+ else
+ {
+ spares_.front() = v;
+ values_.splice(it, spares_, spares_.begin());
+ return --it;
+ }
+ }
+
+ // Erase an element from the values list by splicing it to the spares list.
+ void values_erase(iterator it)
+ {
+ *it = value_type();
+ spares_.splice(spares_.begin(), values_, it);
+ }
+
   // The list of all values in the hash map.
   std::list<value_type> values_;
 
+ // The list of spare nodes waiting to be recycled. Assumes that POD types only
+ // are stored in the hash map.
+ std::list<value_type> spares_;
+
   // The type for a bucket in the hash table.
   struct bucket_type
   {

Modified: branches/proto/v4/boost/asio/detail/kqueue_reactor.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/kqueue_reactor.hpp (original)
+++ branches/proto/v4/boost/asio/detail/kqueue_reactor.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -64,6 +64,8 @@
   // Per-descriptor data.
   struct per_descriptor_data
   {
+ bool allow_speculative_read;
+ bool allow_speculative_write;
   };
 
   // Constructor.
@@ -132,17 +134,35 @@
 
   // Register a socket with the reactor. Returns 0 on success, system error
   // code on failure.
- int register_descriptor(socket_type, per_descriptor_data&)
+ int register_descriptor(socket_type, per_descriptor_data& descriptor_data)
   {
+ descriptor_data.allow_speculative_read = true;
+ descriptor_data.allow_speculative_write = true;
+
     return 0;
   }
 
   // Start a new read operation. The handler object will be invoked when the
   // given descriptor is ready to be read, or an error has occurred.
   template <typename Handler>
- void start_read_op(socket_type descriptor, per_descriptor_data&,
- Handler handler, bool allow_speculative_read = true)
- {
+ void start_read_op(socket_type descriptor,
+ per_descriptor_data& descriptor_data, Handler handler,
+ bool allow_speculative_read = true)
+ {
+ if (allow_speculative_read && descriptor_data.allow_speculative_read)
+ {
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
+ return;
+ }
+
+ // We only get one shot at a speculative read in this function.
+ allow_speculative_read = false;
+ }
+
     boost::asio::detail::mutex::scoped_lock lock(mutex_);
 
     if (shutdown_)
@@ -151,8 +171,21 @@
     if (!allow_speculative_read)
       need_kqueue_wait_ = true;
     else if (!read_op_queue_.has_operation(descriptor))
- if (handler(boost::system::error_code()))
+ {
+ // Speculative reads are ok as there are no queued read operations.
+ descriptor_data.allow_speculative_read = true;
+
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
         return;
+ }
+ }
+
+ // Speculative reads are not ok as there will be queued read operations.
+ descriptor_data.allow_speculative_read = false;
 
     if (read_op_queue_.enqueue_operation(descriptor, handler))
     {
@@ -162,7 +195,7 @@
       {
         boost::system::error_code ec(errno,
             boost::asio::error::get_system_category());
- read_op_queue_.dispatch_all_operations(descriptor, ec);
+ read_op_queue_.perform_all_operations(descriptor, ec);
       }
     }
   }
@@ -170,9 +203,24 @@
   // Start a new write operation. The handler object will be invoked when the
   // given descriptor is ready to be written, or an error has occurred.
   template <typename Handler>
- void start_write_op(socket_type descriptor, per_descriptor_data&,
- Handler handler, bool allow_speculative_write = true)
- {
+ void start_write_op(socket_type descriptor,
+ per_descriptor_data& descriptor_data, Handler handler,
+ bool allow_speculative_write = true)
+ {
+ if (allow_speculative_write && descriptor_data.allow_speculative_write)
+ {
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
+ return;
+ }
+
+ // We only get one shot at a speculative write in this function.
+ allow_speculative_write = false;
+ }
+
     boost::asio::detail::mutex::scoped_lock lock(mutex_);
 
     if (shutdown_)
@@ -181,8 +229,21 @@
     if (!allow_speculative_write)
       need_kqueue_wait_ = true;
     else if (!write_op_queue_.has_operation(descriptor))
- if (handler(boost::system::error_code()))
+ {
+ // Speculative writes are ok as there are no queued write operations.
+ descriptor_data.allow_speculative_write = true;
+
+ boost::system::error_code ec;
+ std::size_t bytes_transferred = 0;
+ if (handler.perform(ec, bytes_transferred))
+ {
+ handler.complete(ec, bytes_transferred);
         return;
+ }
+ }
+
+ // Speculative writes are not ok as there will be queued write operations.
+ descriptor_data.allow_speculative_write = false;
 
     if (write_op_queue_.enqueue_operation(descriptor, handler))
     {
@@ -192,7 +253,7 @@
       {
         boost::system::error_code ec(errno,
             boost::asio::error::get_system_category());
- write_op_queue_.dispatch_all_operations(descriptor, ec);
+ write_op_queue_.perform_all_operations(descriptor, ec);
       }
     }
   }
@@ -219,7 +280,7 @@
       {
         boost::system::error_code ec(errno,
             boost::asio::error::get_system_category());
- except_op_queue_.dispatch_all_operations(descriptor, ec);
+ except_op_queue_.perform_all_operations(descriptor, ec);
       }
     }
   }
@@ -228,13 +289,16 @@
   // given descriptor is ready to be written, or an error has occurred.
   template <typename Handler>
   void start_connect_op(socket_type descriptor,
- per_descriptor_data&, Handler handler)
+ per_descriptor_data& descriptor_data, Handler handler)
   {
     boost::asio::detail::mutex::scoped_lock lock(mutex_);
 
     if (shutdown_)
       return;
 
+ // Speculative writes are not ok as there will be queued write operations.
+ descriptor_data.allow_speculative_write = false;
+
     if (write_op_queue_.enqueue_operation(descriptor, handler))
     {
       struct kevent event;
@@ -243,7 +307,7 @@
       {
         boost::system::error_code ec(errno,
             boost::asio::error::get_system_category());
- write_op_queue_.dispatch_all_operations(descriptor, ec);
+ write_op_queue_.perform_all_operations(descriptor, ec);
       }
     }
   }
@@ -330,16 +394,16 @@
 
     // Dispatch any operation cancellations that were made while the select
     // loop was not running.
- read_op_queue_.dispatch_cancellations();
- write_op_queue_.dispatch_cancellations();
- except_op_queue_.dispatch_cancellations();
+ read_op_queue_.perform_cancellations();
+ write_op_queue_.perform_cancellations();
+ except_op_queue_.perform_cancellations();
     for (std::size_t i = 0; i < timer_queues_.size(); ++i)
       timer_queues_[i]->dispatch_cancellations();
 
     // Check if the thread is supposed to stop.
     if (stop_thread_)
     {
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
       return;
     }
 
@@ -348,7 +412,7 @@
     if (!block && read_op_queue_.empty() && write_op_queue_.empty()
         && except_op_queue_.empty() && all_timer_queues_are_empty())
     {
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
       return;
     }
 
@@ -368,7 +432,7 @@
     lock.lock();
     wait_in_progress_ = false;
 
- // Block signals while dispatching operations.
+ // Block signals while performing operations.
     boost::asio::detail::signal_blocker sb;
 
     // Dispatch the waiting events.
@@ -388,22 +452,22 @@
         {
           boost::system::error_code error(
               events[i].data, boost::asio::error::get_system_category());
- except_op_queue_.dispatch_all_operations(descriptor, error);
- read_op_queue_.dispatch_all_operations(descriptor, error);
+ except_op_queue_.perform_all_operations(descriptor, error);
+ read_op_queue_.perform_all_operations(descriptor, error);
         }
         else if (events[i].flags & EV_OOBAND)
         {
           boost::system::error_code error;
- more_except = except_op_queue_.dispatch_operation(descriptor, error);
+ more_except = except_op_queue_.perform_operation(descriptor, error);
           if (events[i].data > 0)
- more_reads = read_op_queue_.dispatch_operation(descriptor, error);
+ more_reads = read_op_queue_.perform_operation(descriptor, error);
           else
             more_reads = read_op_queue_.has_operation(descriptor);
         }
         else
         {
           boost::system::error_code error;
- more_reads = read_op_queue_.dispatch_operation(descriptor, error);
+ more_reads = read_op_queue_.perform_operation(descriptor, error);
           more_except = except_op_queue_.has_operation(descriptor);
         }
 
@@ -419,8 +483,8 @@
         {
           boost::system::error_code error(errno,
               boost::asio::error::get_system_category());
- except_op_queue_.dispatch_all_operations(descriptor, error);
- read_op_queue_.dispatch_all_operations(descriptor, error);
+ except_op_queue_.perform_all_operations(descriptor, error);
+ read_op_queue_.perform_all_operations(descriptor, error);
         }
       }
       else if (events[i].filter == EVFILT_WRITE)
@@ -431,12 +495,12 @@
         {
           boost::system::error_code error(
               events[i].data, boost::asio::error::get_system_category());
- write_op_queue_.dispatch_all_operations(descriptor, error);
+ write_op_queue_.perform_all_operations(descriptor, error);
         }
         else
         {
           boost::system::error_code error;
- more_writes = write_op_queue_.dispatch_operation(descriptor, error);
+ more_writes = write_op_queue_.perform_operation(descriptor, error);
         }
 
         // Update the descriptor in the kqueue.
@@ -449,14 +513,14 @@
         {
           boost::system::error_code error(errno,
               boost::asio::error::get_system_category());
- write_op_queue_.dispatch_all_operations(descriptor, error);
+ write_op_queue_.perform_all_operations(descriptor, error);
         }
       }
     }
 
- read_op_queue_.dispatch_cancellations();
- write_op_queue_.dispatch_cancellations();
- except_op_queue_.dispatch_cancellations();
+ read_op_queue_.perform_cancellations();
+ write_op_queue_.perform_cancellations();
+ except_op_queue_.perform_cancellations();
     for (std::size_t i = 0; i < timer_queues_.size(); ++i)
     {
       timer_queues_[i]->dispatch_timers();
@@ -472,7 +536,7 @@
     need_kqueue_wait_ = !read_op_queue_.empty()
       || !write_op_queue_.empty() || !except_op_queue_.empty();
 
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
   }
 
   // Run the select loop in the thread.
@@ -573,14 +637,14 @@
   // destructors may make calls back into this reactor. We make a copy of the
   // vector of timer queues since the original may be modified while the lock
   // is not held.
- void cleanup_operations_and_timers(
+ void complete_operations_and_cleanup_timers(
       boost::asio::detail::mutex::scoped_lock& lock)
   {
     timer_queues_for_cleanup_ = timer_queues_;
     lock.unlock();
- read_op_queue_.cleanup_operations();
- write_op_queue_.cleanup_operations();
- except_op_queue_.cleanup_operations();
+ read_op_queue_.complete_operations();
+ write_op_queue_.complete_operations();
+ except_op_queue_.complete_operations();
     for (std::size_t i = 0; i < timer_queues_for_cleanup_.size(); ++i)
       timer_queues_for_cleanup_[i]->cleanup_timers();
   }

Modified: branches/proto/v4/boost/asio/detail/reactive_descriptor_service.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/reactive_descriptor_service.hpp (original)
+++ branches/proto/v4/boost/asio/detail/reactive_descriptor_service.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -21,6 +21,7 @@
 #include <boost/asio/error.hpp>
 #include <boost/asio/io_service.hpp>
 #include <boost/asio/detail/bind_handler.hpp>
+#include <boost/asio/detail/handler_base_from_member.hpp>
 #include <boost/asio/detail/noncopyable.hpp>
 #include <boost/asio/detail/service_base.hpp>
 #include <boost/asio/detail/descriptor_ops.hpp>
@@ -309,25 +310,27 @@
   }
 
   template <typename ConstBufferSequence, typename Handler>
- class write_handler
+ class write_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- write_handler(int descriptor, boost::asio::io_service& io_service,
+ write_operation(int descriptor, boost::asio::io_service& io_service,
         const ConstBufferSequence& buffers, Handler handler)
- : descriptor_(descriptor),
+ : handler_base_from_member<Handler>(handler),
+ descriptor_(descriptor),
         io_service_(io_service),
         work_(io_service),
- buffers_(buffers),
- handler_(handler)
+ buffers_(buffers)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec,
+ std::size_t& bytes_transferred)
     {
       // Check whether the operation was successful.
- if (result)
+ if (ec)
       {
- io_service_.post(bind_handler(handler_, result, 0));
+ bytes_transferred = 0;
         return true;
       }
 
@@ -345,7 +348,6 @@
       }
 
       // Write the data.
- boost::system::error_code ec;
       int bytes = descriptor_ops::gather_write(descriptor_, bufs, i, ec);
 
       // Check if we need to run the operation again.
@@ -353,16 +355,21 @@
           || ec == boost::asio::error::try_again)
         return false;
 
- io_service_.post(bind_handler(handler_, ec, bytes < 0 ? 0 : bytes));
+ bytes_transferred = (bytes < 0 ? 0 : bytes);
       return true;
     }
 
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ io_service_.post(bind_handler(this->handler_, ec, bytes_transferred));
+ }
+
   private:
     int descriptor_;
     boost::asio::io_service& io_service_;
     boost::asio::io_service::work work_;
     ConstBufferSequence buffers_;
- Handler handler_;
   };
 
   // Start an asynchronous write. The data being sent must be valid for the
@@ -411,30 +418,38 @@
       }
 
       reactor_.start_write_op(impl.descriptor_, impl.reactor_data_,
- write_handler<ConstBufferSequence, Handler>(
+ write_operation<ConstBufferSequence, Handler>(
             impl.descriptor_, this->get_io_service(), buffers, handler));
     }
   }
 
   template <typename Handler>
- class null_buffers_handler
+ class null_buffers_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- null_buffers_handler(boost::asio::io_service& io_service, Handler handler)
- : work_(io_service),
- handler_(handler)
+ null_buffers_operation(boost::asio::io_service& io_service, Handler handler)
+ : handler_base_from_member<Handler>(handler),
+ work_(io_service)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code&,
+ std::size_t& bytes_transferred)
     {
- work_.get_io_service().post(bind_handler(handler_, result, 0));
+ bytes_transferred = 0;
       return true;
     }
 
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ work_.get_io_service().post(bind_handler(
+ this->handler_, ec, bytes_transferred));
+ }
+
   private:
     boost::asio::io_service::work work_;
- Handler handler_;
   };
 
   // Start an asynchronous wait until data can be written without blocking.
@@ -450,7 +465,7 @@
     else
     {
       reactor_.start_write_op(impl.descriptor_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
           false);
     }
   }
@@ -547,25 +562,27 @@
   }
 
   template <typename MutableBufferSequence, typename Handler>
- class read_handler
+ class read_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- read_handler(int descriptor, boost::asio::io_service& io_service,
+ read_operation(int descriptor, boost::asio::io_service& io_service,
         const MutableBufferSequence& buffers, Handler handler)
- : descriptor_(descriptor),
+ : handler_base_from_member<Handler>(handler),
+ descriptor_(descriptor),
         io_service_(io_service),
         work_(io_service),
- buffers_(buffers),
- handler_(handler)
+ buffers_(buffers)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec,
+ std::size_t& bytes_transferred)
     {
       // Check whether the operation was successful.
- if (result)
+ if (ec)
       {
- io_service_.post(bind_handler(handler_, result, 0));
+ bytes_transferred = 0;
         return true;
       }
 
@@ -583,7 +600,6 @@
       }
 
       // Read some data.
- boost::system::error_code ec;
       int bytes = descriptor_ops::scatter_read(descriptor_, bufs, i, ec);
       if (bytes == 0)
         ec = boost::asio::error::eof;
@@ -593,16 +609,21 @@
           || ec == boost::asio::error::try_again)
         return false;
 
- io_service_.post(bind_handler(handler_, ec, bytes < 0 ? 0 : bytes));
+ bytes_transferred = (bytes < 0 ? 0 : bytes);
       return true;
     }
 
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ io_service_.post(bind_handler(this->handler_, ec, bytes_transferred));
+ }
+
   private:
     int descriptor_;
     boost::asio::io_service& io_service_;
     boost::asio::io_service::work work_;
     MutableBufferSequence buffers_;
- Handler handler_;
   };
 
   // Start an asynchronous read. The buffer for the data being read must be
@@ -651,7 +672,7 @@
       }
 
       reactor_.start_read_op(impl.descriptor_, impl.reactor_data_,
- read_handler<MutableBufferSequence, Handler>(
+ read_operation<MutableBufferSequence, Handler>(
             impl.descriptor_, this->get_io_service(), buffers, handler));
     }
   }
@@ -669,7 +690,7 @@
     else
     {
       reactor_.start_read_op(impl.descriptor_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
           false);
     }
   }

Modified: branches/proto/v4/boost/asio/detail/reactive_socket_service.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/reactive_socket_service.hpp (original)
+++ branches/proto/v4/boost/asio/detail/reactive_socket_service.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -26,6 +26,7 @@
 #include <boost/asio/io_service.hpp>
 #include <boost/asio/socket_base.hpp>
 #include <boost/asio/detail/bind_handler.hpp>
+#include <boost/asio/detail/handler_base_from_member.hpp>
 #include <boost/asio/detail/noncopyable.hpp>
 #include <boost/asio/detail/service_base.hpp>
 #include <boost/asio/detail/socket_holder.hpp>
@@ -580,27 +581,29 @@
   }
 
   template <typename ConstBufferSequence, typename Handler>
- class send_handler
+ class send_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- send_handler(socket_type socket, boost::asio::io_service& io_service,
+ send_operation(socket_type socket, boost::asio::io_service& io_service,
         const ConstBufferSequence& buffers, socket_base::message_flags flags,
         Handler handler)
- : socket_(socket),
+ : handler_base_from_member<Handler>(handler),
+ socket_(socket),
         io_service_(io_service),
         work_(io_service),
         buffers_(buffers),
- flags_(flags),
- handler_(handler)
+ flags_(flags)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec,
+ std::size_t& bytes_transferred)
     {
       // Check whether the operation was successful.
- if (result)
+ if (ec)
       {
- io_service_.post(bind_handler(handler_, result, 0));
+ bytes_transferred = 0;
         return true;
       }
 
@@ -618,7 +621,6 @@
       }
 
       // Send the data.
- boost::system::error_code ec;
       int bytes = socket_ops::send(socket_, bufs, i, flags_, ec);
 
       // Check if we need to run the operation again.
@@ -626,17 +628,22 @@
           || ec == boost::asio::error::try_again)
         return false;
 
- io_service_.post(bind_handler(handler_, ec, bytes < 0 ? 0 : bytes));
+ bytes_transferred = (bytes < 0 ? 0 : bytes);
       return true;
     }
 
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ io_service_.post(bind_handler(this->handler_, ec, bytes_transferred));
+ }
+
   private:
     socket_type socket_;
     boost::asio::io_service& io_service_;
     boost::asio::io_service::work work_;
     ConstBufferSequence buffers_;
     socket_base::message_flags flags_;
- Handler handler_;
   };
 
   // Start an asynchronous send. The data being sent must be valid for the
@@ -688,30 +695,38 @@
       }
 
       reactor_.start_write_op(impl.socket_, impl.reactor_data_,
- send_handler<ConstBufferSequence, Handler>(
+ send_operation<ConstBufferSequence, Handler>(
             impl.socket_, this->get_io_service(), buffers, flags, handler));
     }
   }
 
   template <typename Handler>
- class null_buffers_handler
+ class null_buffers_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- null_buffers_handler(boost::asio::io_service& io_service, Handler handler)
- : work_(io_service),
- handler_(handler)
+ null_buffers_operation(boost::asio::io_service& io_service, Handler handler)
+ : handler_base_from_member<Handler>(handler),
+ work_(io_service)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code&,
+ std::size_t& bytes_transferred)
     {
- work_.get_io_service().post(bind_handler(handler_, result, 0));
+ bytes_transferred = 0;
       return true;
     }
 
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ work_.get_io_service().post(bind_handler(
+ this->handler_, ec, bytes_transferred));
+ }
+
   private:
     boost::asio::io_service::work work_;
- Handler handler_;
   };
 
   // Start an asynchronous wait until data can be sent without blocking.
@@ -727,7 +742,7 @@
     else
     {
       reactor_.start_write_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
           false);
     }
   }
@@ -811,28 +826,30 @@
   }
 
   template <typename ConstBufferSequence, typename Handler>
- class send_to_handler
+ class send_to_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- send_to_handler(socket_type socket, boost::asio::io_service& io_service,
+ send_to_operation(socket_type socket, boost::asio::io_service& io_service,
         const ConstBufferSequence& buffers, const endpoint_type& endpoint,
         socket_base::message_flags flags, Handler handler)
- : socket_(socket),
+ : handler_base_from_member<Handler>(handler),
+ socket_(socket),
         io_service_(io_service),
         work_(io_service),
         buffers_(buffers),
         destination_(endpoint),
- flags_(flags),
- handler_(handler)
+ flags_(flags)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec,
+ std::size_t& bytes_transferred)
     {
       // Check whether the operation was successful.
- if (result)
+ if (ec)
       {
- io_service_.post(bind_handler(handler_, result, 0));
+ bytes_transferred = 0;
         return true;
       }
 
@@ -850,7 +867,6 @@
       }
 
       // Send the data.
- boost::system::error_code ec;
       int bytes = socket_ops::sendto(socket_, bufs, i, flags_,
           destination_.data(), destination_.size(), ec);
 
@@ -859,10 +875,16 @@
           || ec == boost::asio::error::try_again)
         return false;
 
- io_service_.post(bind_handler(handler_, ec, bytes < 0 ? 0 : bytes));
+ bytes_transferred = (bytes < 0 ? 0 : bytes);
       return true;
     }
 
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ io_service_.post(bind_handler(this->handler_, ec, bytes_transferred));
+ }
+
   private:
     socket_type socket_;
     boost::asio::io_service& io_service_;
@@ -870,7 +892,6 @@
     ConstBufferSequence buffers_;
     endpoint_type destination_;
     socket_base::message_flags flags_;
- Handler handler_;
   };
 
   // Start an asynchronous send. The data being sent must be valid for the
@@ -902,7 +923,7 @@
       }
 
       reactor_.start_write_op(impl.socket_, impl.reactor_data_,
- send_to_handler<ConstBufferSequence, Handler>(
+ send_to_operation<ConstBufferSequence, Handler>(
             impl.socket_, this->get_io_service(), buffers,
             destination, flags, handler));
     }
@@ -921,7 +942,7 @@
     else
     {
       reactor_.start_write_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
           false);
     }
   }
@@ -1018,27 +1039,29 @@
   }
 
   template <typename MutableBufferSequence, typename Handler>
- class receive_handler
+ class receive_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- receive_handler(socket_type socket, boost::asio::io_service& io_service,
+ receive_operation(socket_type socket, boost::asio::io_service& io_service,
         const MutableBufferSequence& buffers, socket_base::message_flags flags,
         Handler handler)
- : socket_(socket),
+ : handler_base_from_member<Handler>(handler),
+ socket_(socket),
         io_service_(io_service),
         work_(io_service),
         buffers_(buffers),
- flags_(flags),
- handler_(handler)
+ flags_(flags)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec,
+ std::size_t& bytes_transferred)
     {
       // Check whether the operation was successful.
- if (result)
+ if (ec)
       {
- io_service_.post(bind_handler(handler_, result, 0));
+ bytes_transferred = 0;
         return true;
       }
 
@@ -1056,7 +1079,6 @@
       }
 
       // Receive some data.
- boost::system::error_code ec;
       int bytes = socket_ops::recv(socket_, bufs, i, flags_, ec);
       if (bytes == 0)
         ec = boost::asio::error::eof;
@@ -1066,17 +1088,22 @@
           || ec == boost::asio::error::try_again)
         return false;
 
- io_service_.post(bind_handler(handler_, ec, bytes < 0 ? 0 : bytes));
+ bytes_transferred = (bytes < 0 ? 0 : bytes);
       return true;
     }
 
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ io_service_.post(bind_handler(this->handler_, ec, bytes_transferred));
+ }
+
   private:
     socket_type socket_;
     boost::asio::io_service& io_service_;
     boost::asio::io_service::work work_;
     MutableBufferSequence buffers_;
     socket_base::message_flags flags_;
- Handler handler_;
   };
 
   // Start an asynchronous receive. The buffer for the data being received
@@ -1131,13 +1158,13 @@
       if (flags & socket_base::message_out_of_band)
       {
         reactor_.start_except_op(impl.socket_, impl.reactor_data_,
- receive_handler<MutableBufferSequence, Handler>(
+ receive_operation<MutableBufferSequence, Handler>(
               impl.socket_, this->get_io_service(), buffers, flags, handler));
       }
       else
       {
         reactor_.start_read_op(impl.socket_, impl.reactor_data_,
- receive_handler<MutableBufferSequence, Handler>(
+ receive_operation<MutableBufferSequence, Handler>(
               impl.socket_, this->get_io_service(), buffers, flags, handler));
       }
     }
@@ -1156,12 +1183,12 @@
     else if (flags & socket_base::message_out_of_band)
     {
       reactor_.start_except_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler));
+ null_buffers_operation<Handler>(this->get_io_service(), handler));
     }
     else
     {
       reactor_.start_read_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
           false);
     }
   }
@@ -1260,29 +1287,31 @@
   }
 
   template <typename MutableBufferSequence, typename Handler>
- class receive_from_handler
+ class receive_from_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- receive_from_handler(socket_type socket,
+ receive_from_operation(socket_type socket,
         boost::asio::io_service& io_service,
         const MutableBufferSequence& buffers, endpoint_type& endpoint,
         socket_base::message_flags flags, Handler handler)
- : socket_(socket),
+ : handler_base_from_member<Handler>(handler),
+ socket_(socket),
         io_service_(io_service),
         work_(io_service),
         buffers_(buffers),
         sender_endpoint_(endpoint),
- flags_(flags),
- handler_(handler)
+ flags_(flags)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec,
+ std::size_t& bytes_transferred)
     {
       // Check whether the operation was successful.
- if (result)
+ if (ec)
       {
- io_service_.post(bind_handler(handler_, result, 0));
+ bytes_transferred = 0;
         return true;
       }
 
@@ -1301,7 +1330,6 @@
 
       // Receive some data.
       std::size_t addr_len = sender_endpoint_.capacity();
- boost::system::error_code ec;
       int bytes = socket_ops::recvfrom(socket_, bufs, i, flags_,
           sender_endpoint_.data(), &addr_len, ec);
       if (bytes == 0)
@@ -1313,10 +1341,16 @@
         return false;
 
       sender_endpoint_.resize(addr_len);
- io_service_.post(bind_handler(handler_, ec, bytes < 0 ? 0 : bytes));
+ bytes_transferred = (bytes < 0 ? 0 : bytes);
       return true;
     }
 
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ io_service_.post(bind_handler(this->handler_, ec, bytes_transferred));
+ }
+
   private:
     socket_type socket_;
     boost::asio::io_service& io_service_;
@@ -1324,7 +1358,6 @@
     MutableBufferSequence buffers_;
     endpoint_type& sender_endpoint_;
     socket_base::message_flags flags_;
- Handler handler_;
   };
 
   // Start an asynchronous receive. The buffer for the data being received and
@@ -1356,7 +1389,7 @@
       }
 
       reactor_.start_read_op(impl.socket_, impl.reactor_data_,
- receive_from_handler<MutableBufferSequence, Handler>(
+ receive_from_operation<MutableBufferSequence, Handler>(
             impl.socket_, this->get_io_service(), buffers,
             sender_endpoint, flags, handler));
     }
@@ -1381,12 +1414,12 @@
       if (flags & socket_base::message_out_of_band)
       {
         reactor_.start_except_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler));
+ null_buffers_operation<Handler>(this->get_io_service(), handler));
       }
       else
       {
         reactor_.start_read_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
             false);
       }
     }
@@ -1483,35 +1516,32 @@
   }
 
   template <typename Socket, typename Handler>
- class accept_handler
+ class accept_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- accept_handler(socket_type socket, boost::asio::io_service& io_service,
+ accept_operation(socket_type socket, boost::asio::io_service& io_service,
         Socket& peer, const protocol_type& protocol,
         endpoint_type* peer_endpoint, bool enable_connection_aborted,
         Handler handler)
- : socket_(socket),
+ : handler_base_from_member<Handler>(handler),
+ socket_(socket),
         io_service_(io_service),
         work_(io_service),
         peer_(peer),
         protocol_(protocol),
         peer_endpoint_(peer_endpoint),
- enable_connection_aborted_(enable_connection_aborted),
- handler_(handler)
+ enable_connection_aborted_(enable_connection_aborted)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec, std::size_t&)
     {
       // Check whether the operation was successful.
- if (result)
- {
- io_service_.post(bind_handler(handler_, result));
+ if (ec)
         return true;
- }
 
       // Accept the waiting connection.
- boost::system::error_code ec;
       socket_holder new_socket;
       std::size_t addr_len = 0;
       if (peer_endpoint_)
@@ -1547,10 +1577,14 @@
           new_socket.release();
       }
 
- io_service_.post(bind_handler(handler_, ec));
       return true;
     }
 
+ void complete(const boost::system::error_code& ec, std::size_t)
+ {
+ io_service_.post(bind_handler(this->handler_, ec));
+ }
+
   private:
     socket_type socket_;
     boost::asio::io_service& io_service_;
@@ -1559,7 +1593,6 @@
     protocol_type protocol_;
     endpoint_type* peer_endpoint_;
     bool enable_connection_aborted_;
- Handler handler_;
   };
 
   // Start an asynchronous accept. The peer and peer_endpoint objects
@@ -1594,7 +1627,7 @@
       }
 
       reactor_.start_read_op(impl.socket_, impl.reactor_data_,
- accept_handler<Socket, Handler>(
+ accept_operation<Socket, Handler>(
             impl.socket_, this->get_io_service(),
             peer, impl.protocol_, peer_endpoint,
             (impl.flags_ & implementation_type::enable_connection_aborted) != 0,
@@ -1628,57 +1661,52 @@
   }
 
   template <typename Handler>
- class connect_handler
+ class connect_operation :
+ public handler_base_from_member<Handler>
   {
   public:
- connect_handler(socket_type socket,
+ connect_operation(socket_type socket,
         boost::asio::io_service& io_service, Handler handler)
- : socket_(socket),
+ : handler_base_from_member<Handler>(handler),
+ socket_(socket),
         io_service_(io_service),
- work_(io_service),
- handler_(handler)
+ work_(io_service)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec, std::size_t&)
     {
       // Check whether the operation was successful.
- if (result)
- {
- io_service_.post(bind_handler(handler_, result));
+ if (ec)
         return true;
- }
 
       // Get the error code from the connect operation.
       int connect_error = 0;
       size_t connect_error_len = sizeof(connect_error);
- boost::system::error_code ec;
       if (socket_ops::getsockopt(socket_, SOL_SOCKET, SO_ERROR,
             &connect_error, &connect_error_len, ec) == socket_error_retval)
- {
- io_service_.post(bind_handler(handler_, ec));
         return true;
- }
 
- // If connection failed then post the handler with the error code.
+ // The connection failed so the handler will be posted with an error code.
       if (connect_error)
       {
         ec = boost::system::error_code(connect_error,
             boost::asio::error::get_system_category());
- io_service_.post(bind_handler(handler_, ec));
         return true;
       }
 
- // Post the result of the successful connection operation.
- io_service_.post(bind_handler(handler_, ec));
       return true;
     }
 
+ void complete(const boost::system::error_code& ec, std::size_t)
+ {
+ io_service_.post(bind_handler(this->handler_, ec));
+ }
+
   private:
     socket_type socket_;
     boost::asio::io_service& io_service_;
     boost::asio::io_service::work work_;
- Handler handler_;
   };
 
   // Start an asynchronous connect.
@@ -1723,7 +1751,7 @@
       // The connection is happening in the background, and we need to wait
       // until the socket becomes writeable.
       reactor_.start_connect_op(impl.socket_, impl.reactor_data_,
- connect_handler<Handler>(impl.socket_,
+ connect_operation<Handler>(impl.socket_,
             this->get_io_service(), handler));
     }
     else

Modified: branches/proto/v4/boost/asio/detail/reactor_op_queue.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/reactor_op_queue.hpp (original)
+++ branches/proto/v4/boost/asio/detail/reactor_op_queue.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -22,6 +22,7 @@
 #include <boost/asio/detail/pop_options.hpp>
 
 #include <boost/asio/error.hpp>
+#include <boost/asio/detail/handler_alloc_helpers.hpp>
 #include <boost/asio/detail/hash_map.hpp>
 #include <boost/asio/detail/noncopyable.hpp>
 
@@ -38,36 +39,42 @@
   reactor_op_queue()
     : operations_(),
       cancelled_operations_(0),
- cleanup_operations_(0)
+ complete_operations_(0)
   {
   }
 
   // Add a new operation to the queue. Returns true if this is the only
   // operation for the given descriptor, in which case the reactor's event
   // demultiplexing function call may need to be interrupted and restarted.
- template <typename Handler>
- bool enqueue_operation(Descriptor descriptor, Handler handler)
+ template <typename Operation>
+ bool enqueue_operation(Descriptor descriptor, Operation operation)
   {
- op_base* new_op = new op<Handler>(descriptor, handler);
+ // Allocate and construct an object to wrap the handler.
+ typedef handler_alloc_traits<Operation, op<Operation> > alloc_traits;
+ raw_handler_ptr<alloc_traits> raw_ptr(operation);
+ handler_ptr<alloc_traits> ptr(raw_ptr, descriptor, operation);
 
     typedef typename operation_map::iterator iterator;
     typedef typename operation_map::value_type value_type;
     std::pair<iterator, bool> entry =
- operations_.insert(value_type(descriptor, new_op));
+ operations_.insert(value_type(descriptor, ptr.get()));
     if (entry.second)
+ {
+ ptr.release();
       return true;
+ }
 
     op_base* current_op = entry.first->second;
     while (current_op->next_)
       current_op = current_op->next_;
- current_op->next_ = new_op;
+ current_op->next_ = ptr.release();
 
     return false;
   }
 
   // Cancel all operations associated with the descriptor. Any operations
   // pending for the descriptor will be notified that they have been cancelled
- // next time dispatch_cancellations is called. Returns true if any operations
+ // next time perform_cancellations is called. Returns true if any operations
   // were cancelled, in which case the reactor's event demultiplexing function
   // may need to be interrupted and restarted.
   bool cancel_operations(Descriptor descriptor)
@@ -99,9 +106,9 @@
     return operations_.find(descriptor) != operations_.end();
   }
 
- // Dispatch the first operation corresponding to the descriptor. Returns true
+ // Perform the first operation corresponding to the descriptor. Returns true
   // if there are more operations queued for the descriptor.
- bool dispatch_operation(Descriptor descriptor,
+ bool perform_operation(Descriptor descriptor,
       const boost::system::error_code& result)
   {
     typename operation_map::iterator i = operations_.find(descriptor);
@@ -109,9 +116,9 @@
     {
       op_base* this_op = i->second;
       i->second = this_op->next_;
- this_op->next_ = cleanup_operations_;
- cleanup_operations_ = this_op;
- bool done = this_op->invoke(result);
+ this_op->next_ = complete_operations_;
+ complete_operations_ = this_op;
+ bool done = this_op->perform(result);
       if (done)
       {
         // Operation has finished.
@@ -128,8 +135,8 @@
       else
       {
         // Operation wants to be called again. Leave it at the front of the
- // queue for this descriptor, and remove from the cleanup list.
- cleanup_operations_ = this_op->next_;
+ // queue for this descriptor, and remove from the completed list.
+ complete_operations_ = this_op->next_;
         this_op->next_ = i->second;
         i->second = this_op;
         return true;
@@ -138,8 +145,8 @@
     return false;
   }
 
- // Dispatch all operations corresponding to the descriptor.
- void dispatch_all_operations(Descriptor descriptor,
+ // Perform all operations corresponding to the descriptor.
+ void perform_all_operations(Descriptor descriptor,
       const boost::system::error_code& result)
   {
     typename operation_map::iterator i = operations_.find(descriptor);
@@ -149,14 +156,14 @@
       {
         op_base* this_op = i->second;
         i->second = this_op->next_;
- this_op->next_ = cleanup_operations_;
- cleanup_operations_ = this_op;
- bool done = this_op->invoke(result);
+ this_op->next_ = complete_operations_;
+ complete_operations_ = this_op;
+ bool done = this_op->perform(result);
         if (!done)
         {
           // Operation has not finished yet, so leave at front of queue, and
- // remove from the cleanup list.
- cleanup_operations_ = this_op->next_;
+ // remove from the completed list.
+ complete_operations_ = this_op->next_;
           this_op->next_ = i->second;
           i->second = this_op;
           return;
@@ -179,15 +186,15 @@
       if (!descriptors.set(descriptor))
       {
         boost::system::error_code ec(error::fd_set_failure);
- dispatch_all_operations(descriptor, ec);
+ perform_all_operations(descriptor, ec);
       }
     }
   }
 
- // Dispatch the operations corresponding to the ready file descriptors
+ // Perform the operations corresponding to the ready file descriptors
   // contained in the given descriptor set.
   template <typename Descriptor_Set>
- void dispatch_descriptors(const Descriptor_Set& descriptors,
+ void perform_operations_for_descriptors(const Descriptor_Set& descriptors,
       const boost::system::error_code& result)
   {
     typename operation_map::iterator i = operations_.begin();
@@ -198,9 +205,9 @@
       {
         op_base* this_op = op_iter->second;
         op_iter->second = this_op->next_;
- this_op->next_ = cleanup_operations_;
- cleanup_operations_ = this_op;
- bool done = this_op->invoke(result);
+ this_op->next_ = complete_operations_;
+ complete_operations_ = this_op;
+ bool done = this_op->perform(result);
         if (done)
         {
           if (!op_iter->second)
@@ -209,8 +216,8 @@
         else
         {
           // Operation has not finished yet, so leave at front of queue, and
- // remove from the cleanup list.
- cleanup_operations_ = this_op->next_;
+ // remove from the completed list.
+ complete_operations_ = this_op->next_;
           this_op->next_ = op_iter->second;
           op_iter->second = this_op;
         }
@@ -218,28 +225,28 @@
     }
   }
 
- // Dispatch any pending cancels for operations.
- void dispatch_cancellations()
+ // Perform any pending cancels for operations.
+ void perform_cancellations()
   {
     while (cancelled_operations_)
     {
       op_base* this_op = cancelled_operations_;
       cancelled_operations_ = this_op->next_;
- this_op->next_ = cleanup_operations_;
- cleanup_operations_ = this_op;
- this_op->invoke(boost::asio::error::operation_aborted);
+ this_op->next_ = complete_operations_;
+ complete_operations_ = this_op;
+ this_op->perform(boost::asio::error::operation_aborted);
     }
   }
 
- // Destroy operations that are waiting to be cleaned up.
- void cleanup_operations()
+ // Complete all operations that are waiting to be completed.
+ void complete_operations()
   {
- while (cleanup_operations_)
+ while (complete_operations_)
     {
- op_base* next_op = cleanup_operations_->next_;
- cleanup_operations_->next_ = 0;
- cleanup_operations_->destroy();
- cleanup_operations_ = next_op;
+ op_base* next_op = complete_operations_->next_;
+ complete_operations_->next_ = 0;
+ complete_operations_->complete();
+ complete_operations_ = next_op;
     }
   }
 
@@ -254,12 +261,12 @@
       cancelled_operations_ = next_op;
     }
 
- while (cleanup_operations_)
+ while (complete_operations_)
     {
- op_base* next_op = cleanup_operations_->next_;
- cleanup_operations_->next_ = 0;
- cleanup_operations_->destroy();
- cleanup_operations_ = next_op;
+ op_base* next_op = complete_operations_->next_;
+ complete_operations_->next_ = 0;
+ complete_operations_->destroy();
+ complete_operations_ = next_op;
     }
 
     typename operation_map::iterator i = operations_.begin();
@@ -291,28 +298,40 @@
     }
 
     // Perform the operation.
- bool invoke(const boost::system::error_code& result)
+ bool perform(const boost::system::error_code& result)
+ {
+ result_ = result;
+ return perform_func_(this, result_, bytes_transferred_);
+ }
+
+ // Destroy the operation and post the handler.
+ void complete()
     {
- return invoke_func_(this, result);
+ complete_func_(this, result_, bytes_transferred_);
     }
 
     // Destroy the operation.
     void destroy()
     {
- return destroy_func_(this);
+ destroy_func_(this);
     }
 
   protected:
- typedef bool (*invoke_func_type)(op_base*,
- const boost::system::error_code&);
+ typedef bool (*perform_func_type)(op_base*,
+ boost::system::error_code&, std::size_t&);
+ typedef void (*complete_func_type)(op_base*,
+ const boost::system::error_code&, std::size_t);
     typedef void (*destroy_func_type)(op_base*);
 
     // Construct an operation for the given descriptor.
- op_base(invoke_func_type invoke_func,
+ op_base(perform_func_type perform_func, complete_func_type complete_func,
         destroy_func_type destroy_func, Descriptor descriptor)
- : invoke_func_(invoke_func),
+ : perform_func_(perform_func),
+ complete_func_(complete_func),
         destroy_func_(destroy_func),
         descriptor_(descriptor),
+ result_(),
+ bytes_transferred_(0),
         next_(0)
     {
     }
@@ -325,48 +344,84 @@
   private:
     friend class reactor_op_queue<Descriptor>;
 
- // The function to be called to dispatch the handler.
- invoke_func_type invoke_func_;
+ // The function to be called to perform the operation.
+ perform_func_type perform_func_;
+
+ // The function to be called to delete the operation and post the handler.
+ complete_func_type complete_func_;
 
- // The function to be called to delete the handler.
+ // The function to be called to delete the operation.
     destroy_func_type destroy_func_;
 
     // The descriptor associated with the operation.
     Descriptor descriptor_;
 
+ // The result of the operation.
+ boost::system::error_code result_;
+
+ // The number of bytes transferred in the operation.
+ std::size_t bytes_transferred_;
+
     // The next operation for the same file descriptor.
     op_base* next_;
   };
 
- // Adaptor class template for using handlers in operations.
- template <typename Handler>
+ // Adaptor class template for operations.
+ template <typename Operation>
   class op
     : public op_base
   {
   public:
     // Constructor.
- op(Descriptor descriptor, Handler handler)
- : op_base(&op<Handler>::invoke_handler,
- &op<Handler>::destroy_handler, descriptor),
- handler_(handler)
+ op(Descriptor descriptor, Operation operation)
+ : op_base(&op<Operation>::do_perform, &op<Operation>::do_complete,
+ &op<Operation>::do_destroy, descriptor),
+ operation_(operation)
     {
     }
 
- // Invoke the handler.
- static bool invoke_handler(op_base* base,
- const boost::system::error_code& result)
+ // Perform the operation.
+ static bool do_perform(op_base* base,
+ boost::system::error_code& result, std::size_t& bytes_transferred)
+ {
+ return static_cast<op<Operation>*>(base)->operation_.perform(
+ result, bytes_transferred);
+ }
+
+ // Destroy the operation and post the handler.
+ static void do_complete(op_base* base,
+ const boost::system::error_code& result, std::size_t bytes_transferred)
     {
- return static_cast<op<Handler>*>(base)->handler_(result);
+ // Take ownership of the operation object.
+ typedef op<Operation> this_type;
+ this_type* this_op(static_cast<this_type*>(base));
+ typedef handler_alloc_traits<Operation, this_type> alloc_traits;
+ handler_ptr<alloc_traits> ptr(this_op->operation_, this_op);
+
+ // Make a copy of the error_code and the operation so that the memory can
+ // be deallocated before the upcall is made.
+ boost::system::error_code ec(result);
+ Operation operation(this_op->operation_);
+
+ // Free the memory associated with the operation.
+ ptr.reset();
+
+ // Make the upcall.
+ operation.complete(ec, bytes_transferred);
     }
 
- // Delete the handler.
- static void destroy_handler(op_base* base)
+ // Destroy the operation.
+ static void do_destroy(op_base* base)
     {
- delete static_cast<op<Handler>*>(base);
+ // Take ownership of the operation object.
+ typedef op<Operation> this_type;
+ this_type* this_op(static_cast<this_type*>(base));
+ typedef handler_alloc_traits<Operation, this_type> alloc_traits;
+ handler_ptr<alloc_traits> ptr(this_op->operation_, this_op);
     }
 
   private:
- Handler handler_;
+ Operation operation_;
   };
 
   // The type for a map of operations.
@@ -378,8 +433,8 @@
   // The list of operations that have been cancelled.
   op_base* cancelled_operations_;
 
- // The list of operations to be destroyed.
- op_base* cleanup_operations_;
+ // The list of operations waiting to be completed.
+ op_base* complete_operations_;
 };
 
 } // namespace detail

Modified: branches/proto/v4/boost/asio/detail/select_reactor.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/select_reactor.hpp (original)
+++ branches/proto/v4/boost/asio/detail/select_reactor.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -171,19 +171,30 @@
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec,
+ std::size_t& bytes_transferred)
     {
       // Check whether one of the handlers has already been called. If it has,
       // then we don't want to do anything in this handler.
       if (*completed_)
+ {
+ completed_.reset(); // Indicate that this handler should not complete.
         return true;
+ }
 
       // Cancel the other reactor operation for the connection.
       *completed_ = true;
       reactor_.enqueue_cancel_ops_unlocked(descriptor_);
 
       // Call the contained handler.
- return handler_(result);
+ return handler_.perform(ec, bytes_transferred);
+ }
+
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ if (completed_.get())
+ handler_.complete(ec, bytes_transferred);
     }
 
   private:
@@ -300,16 +311,16 @@
 
     // Dispatch any operation cancellations that were made while the select
     // loop was not running.
- read_op_queue_.dispatch_cancellations();
- write_op_queue_.dispatch_cancellations();
- except_op_queue_.dispatch_cancellations();
+ read_op_queue_.perform_cancellations();
+ write_op_queue_.perform_cancellations();
+ except_op_queue_.perform_cancellations();
     for (std::size_t i = 0; i < timer_queues_.size(); ++i)
       timer_queues_[i]->dispatch_cancellations();
 
     // Check if the thread is supposed to stop.
     if (stop_thread_)
     {
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
       return;
     }
 
@@ -318,7 +329,7 @@
     if (!block && read_op_queue_.empty() && write_op_queue_.empty()
         && except_op_queue_.empty() && all_timer_queues_are_empty())
     {
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
       return;
     }
 
@@ -360,15 +371,15 @@
     {
       // Exception operations must be processed first to ensure that any
       // out-of-band data is read before normal data.
- except_op_queue_.dispatch_descriptors(except_fds,
- boost::system::error_code());
- read_op_queue_.dispatch_descriptors(read_fds,
- boost::system::error_code());
- write_op_queue_.dispatch_descriptors(write_fds,
- boost::system::error_code());
- except_op_queue_.dispatch_cancellations();
- read_op_queue_.dispatch_cancellations();
- write_op_queue_.dispatch_cancellations();
+ except_op_queue_.perform_operations_for_descriptors(
+ except_fds, boost::system::error_code());
+ read_op_queue_.perform_operations_for_descriptors(
+ read_fds, boost::system::error_code());
+ write_op_queue_.perform_operations_for_descriptors(
+ write_fds, boost::system::error_code());
+ except_op_queue_.perform_cancellations();
+ read_op_queue_.perform_cancellations();
+ write_op_queue_.perform_cancellations();
     }
     for (std::size_t i = 0; i < timer_queues_.size(); ++i)
     {
@@ -381,7 +392,7 @@
       cancel_ops_unlocked(pending_cancellations_[i]);
     pending_cancellations_.clear();
 
- cleanup_operations_and_timers(lock);
+ complete_operations_and_cleanup_timers(lock);
   }
 
   // Run the select loop in the thread.
@@ -466,14 +477,14 @@
   // destructors may make calls back into this reactor. We make a copy of the
   // vector of timer queues since the original may be modified while the lock
   // is not held.
- void cleanup_operations_and_timers(
+ void complete_operations_and_cleanup_timers(
       boost::asio::detail::mutex::scoped_lock& lock)
   {
     timer_queues_for_cleanup_ = timer_queues_;
     lock.unlock();
- read_op_queue_.cleanup_operations();
- write_op_queue_.cleanup_operations();
- except_op_queue_.cleanup_operations();
+ read_op_queue_.complete_operations();
+ write_op_queue_.complete_operations();
+ except_op_queue_.complete_operations();
     for (std::size_t i = 0; i < timer_queues_for_cleanup_.size(); ++i)
       timer_queues_for_cleanup_[i]->cleanup_timers();
   }

Modified: branches/proto/v4/boost/asio/detail/strand_service.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/strand_service.hpp (original)
+++ branches/proto/v4/boost/asio/detail/strand_service.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -20,6 +20,7 @@
 #include <boost/asio/detail/push_options.hpp>
 #include <boost/aligned_storage.hpp>
 #include <boost/assert.hpp>
+#include <boost/detail/atomic_count.hpp>
 #include <boost/intrusive_ptr.hpp>
 #include <boost/asio/detail/pop_options.hpp>
 
@@ -55,19 +56,13 @@
 #endif
     void add_ref()
     {
- boost::asio::detail::mutex::scoped_lock lock(mutex_);
       ++ref_count_;
     }
 
     void release()
     {
- boost::asio::detail::mutex::scoped_lock lock(mutex_);
- --ref_count_;
- if (ref_count_ == 0)
- {
- lock.unlock();
+ if (--ref_count_ == 0)
         delete this;
- }
     }
 
   private:
@@ -148,7 +143,7 @@
     strand_impl* prev_;
 
     // The reference count on the strand implementation.
- size_t ref_count_;
+ boost::detail::atomic_count ref_count_;
 
 #if !defined(__BORLANDC__)
     friend void intrusive_ptr_add_ref(strand_impl* p)

Modified: branches/proto/v4/boost/asio/detail/win_iocp_socket_service.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/win_iocp_socket_service.hpp (original)
+++ branches/proto/v4/boost/asio/detail/win_iocp_socket_service.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -885,21 +885,29 @@
   }
 
   template <typename Handler>
- class null_buffers_handler
+ class null_buffers_operation
   {
   public:
- null_buffers_handler(boost::asio::io_service& io_service, Handler handler)
+ null_buffers_operation(boost::asio::io_service& io_service, Handler handler)
       : work_(io_service),
         handler_(handler)
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code&,
+ std::size_t& bytes_transferred)
     {
- work_.get_io_service().post(bind_handler(handler_, result, 0));
+ bytes_transferred = 0;
       return true;
     }
 
+ void complete(const boost::system::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ work_.get_io_service().post(bind_handler(
+ handler_, ec, bytes_transferred));
+ }
+
   private:
     boost::asio::io_service::work work_;
     Handler handler_;
@@ -930,7 +938,7 @@
       }
 
       reactor->start_write_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
           false);
     }
   }
@@ -1157,7 +1165,7 @@
       }
 
       reactor->start_write_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
           false);
     }
   }
@@ -1470,12 +1478,12 @@
       if (flags & socket_base::message_out_of_band)
       {
         reactor->start_except_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler));
+ null_buffers_operation<Handler>(this->get_io_service(), handler));
       }
       else
       {
         reactor->start_read_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
             false);
       }
     }
@@ -1743,12 +1751,12 @@
       if (flags & socket_base::message_out_of_band)
       {
         reactor->start_except_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler));
+ null_buffers_operation<Handler>(this->get_io_service(), handler));
       }
       else
       {
         reactor->start_read_op(impl.socket_, impl.reactor_data_,
- null_buffers_handler<Handler>(this->get_io_service(), handler),
+ null_buffers_operation<Handler>(this->get_io_service(), handler),
             false);
       }
     }
@@ -2112,10 +2120,10 @@
   }
 
   template <typename Handler>
- class connect_handler
+ class connect_operation
   {
   public:
- connect_handler(socket_type socket, bool user_set_non_blocking,
+ connect_operation(socket_type socket, bool user_set_non_blocking,
         boost::asio::io_service& io_service, Handler handler)
       : socket_(socket),
         user_set_non_blocking_(user_set_non_blocking),
@@ -2125,32 +2133,25 @@
     {
     }
 
- bool operator()(const boost::system::error_code& result)
+ bool perform(boost::system::error_code& ec,
+ std::size_t& bytes_transferred)
     {
       // Check whether the operation was successful.
- if (result)
- {
- io_service_.post(bind_handler(handler_, result));
+ if (ec)
         return true;
- }
 
       // Get the error code from the connect operation.
       int connect_error = 0;
       size_t connect_error_len = sizeof(connect_error);
- boost::system::error_code ec;
       if (socket_ops::getsockopt(socket_, SOL_SOCKET, SO_ERROR,
             &connect_error, &connect_error_len, ec) == socket_error_retval)
- {
- io_service_.post(bind_handler(handler_, ec));
         return true;
- }
 
       // If connection failed then post the handler with the error code.
       if (connect_error)
       {
         ec = boost::system::error_code(connect_error,
             boost::asio::error::get_system_category());
- io_service_.post(bind_handler(handler_, ec));
         return true;
       }
 
@@ -2159,18 +2160,19 @@
       {
         ioctl_arg_type non_blocking = 0;
         if (socket_ops::ioctl(socket_, FIONBIO, &non_blocking, ec))
- {
- io_service_.post(bind_handler(handler_, ec));
           return true;
- }
       }
 
       // Post the result of the successful connection operation.
       ec = boost::system::error_code();
- io_service_.post(bind_handler(handler_, ec));
       return true;
     }
 
+ void complete(const boost::system::error_code& ec, std::size_t)
+ {
+ io_service_.post(bind_handler(handler_, ec));
+ }
+
   private:
     socket_type socket_;
     bool user_set_non_blocking_;
@@ -2243,7 +2245,7 @@
       // until the socket becomes writeable.
       boost::shared_ptr<bool> completed(new bool(false));
       reactor->start_connect_op(impl.socket_, impl.reactor_data_,
- connect_handler<Handler>(
+ connect_operation<Handler>(
             impl.socket_,
             (impl.flags_ & implementation_type::user_set_non_blocking) != 0,
             this->get_io_service(), handler));

Modified: branches/proto/v4/boost/asio/detail/wrapped_handler.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/wrapped_handler.hpp (original)
+++ branches/proto/v4/boost/asio/detail/wrapped_handler.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -128,22 +128,6 @@
   Handler handler_;
 };
 
-template <typename Dispatcher, typename Handler>
-inline void* asio_handler_allocate(std::size_t size,
- wrapped_handler<Dispatcher, Handler>* this_handler)
-{
- return boost_asio_handler_alloc_helpers::allocate(
- size, &this_handler->handler_);
-}
-
-template <typename Dispatcher, typename Handler>
-inline void asio_handler_deallocate(void* pointer, std::size_t size,
- wrapped_handler<Dispatcher, Handler>* this_handler)
-{
- boost_asio_handler_alloc_helpers::deallocate(
- pointer, size, &this_handler->handler_);
-}
-
 template <typename Handler, typename Context>
 class rewrapped_handler
 {
@@ -169,6 +153,22 @@
   Context context_;
 };
 
+template <typename Dispatcher, typename Handler>
+inline void* asio_handler_allocate(std::size_t size,
+ wrapped_handler<Dispatcher, Handler>* this_handler)
+{
+ return boost_asio_handler_alloc_helpers::allocate(
+ size, &this_handler->handler_);
+}
+
+template <typename Dispatcher, typename Handler>
+inline void asio_handler_deallocate(void* pointer, std::size_t size,
+ wrapped_handler<Dispatcher, Handler>* this_handler)
+{
+ boost_asio_handler_alloc_helpers::deallocate(
+ pointer, size, &this_handler->handler_);
+}
+
 template <typename Function, typename Dispatcher, typename Handler>
 inline void asio_handler_invoke(const Function& function,
     wrapped_handler<Dispatcher, Handler>* this_handler)
@@ -178,6 +178,22 @@
         function, this_handler->handler_));
 }
 
+template <typename Handler, typename Context>
+inline void* asio_handler_allocate(std::size_t size,
+ rewrapped_handler<Handler, Context>* this_handler)
+{
+ return boost_asio_handler_alloc_helpers::allocate(
+ size, &this_handler->context_);
+}
+
+template <typename Handler, typename Context>
+inline void asio_handler_deallocate(void* pointer, std::size_t size,
+ rewrapped_handler<Handler, Context>* this_handler)
+{
+ boost_asio_handler_alloc_helpers::deallocate(
+ pointer, size, &this_handler->context_);
+}
+
 template <typename Function, typename Handler, typename Context>
 inline void asio_handler_invoke(const Function& function,
     rewrapped_handler<Handler, Context>* this_handler)

Modified: branches/proto/v4/boost/detail/shared_count.hpp
==============================================================================
--- branches/proto/v4/boost/detail/shared_count.hpp (original)
+++ branches/proto/v4/boost/detail/shared_count.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -28,6 +28,7 @@
 #include <boost/detail/bad_weak_ptr.hpp>
 #include <boost/detail/sp_counted_base.hpp>
 #include <boost/detail/sp_counted_impl.hpp>
+#include <boost/detail/workaround.hpp>
 // In order to avoid circular dependencies with Boost.TR1
 // we make sure that our include of <memory> doesn't try to
 // pull in the TR1 headers: that's why we use this header

Modified: branches/proto/v4/boost/detail/spinlock_pool.hpp
==============================================================================
--- branches/proto/v4/boost/detail/spinlock_pool.hpp (original)
+++ branches/proto/v4/boost/detail/spinlock_pool.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -21,7 +21,9 @@
 // spinlock_pool<2> is reserved for shared_ptr atomic access
 //
 
+#include <boost/config.hpp>
 #include <boost/detail/spinlock.hpp>
+#include <cstddef>
 
 namespace boost
 {
@@ -39,7 +41,7 @@
 
     static spinlock & spinlock_for( void const * pv )
     {
- size_t i = reinterpret_cast< size_t >( pv ) % 41;
+ std::size_t i = reinterpret_cast< std::size_t >( pv ) % 41;
         return pool_[ i ];
     }
 

Modified: branches/proto/v4/boost/enable_shared_from_this.hpp
==============================================================================
--- branches/proto/v4/boost/enable_shared_from_this.hpp (original)
+++ branches/proto/v4/boost/enable_shared_from_this.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -13,9 +13,10 @@
 // http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
 //
 
+#include <boost/config.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/assert.hpp>
-#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
 
 namespace boost
 {
@@ -77,6 +78,12 @@
         }
     }
 
+#if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, <= 0x551 )
+
+public:
+
+#endif
+
     template<typename U>
     void sp_accept_owner( shared_ptr<U> & owner ) const
     {

Modified: branches/proto/v4/boost/exception/detail/cloning_base.hpp
==============================================================================
--- branches/proto/v4/boost/exception/detail/cloning_base.hpp (original)
+++ branches/proto/v4/boost/exception/detail/cloning_base.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -6,6 +6,8 @@
 #ifndef UUID_F7D5662CCB0F11DCA353CAC656D89593
 #define UUID_F7D5662CCB0F11DCA353CAC656D89593
 
+#include <boost/detail/workaround.hpp>
+
 namespace
 boost
     {
@@ -20,6 +22,15 @@
             public:
 
             virtual clone_base const * clone() const = 0;
+
+ protected:
+
+#if BOOST_WORKAROUND( __GNUC__, BOOST_TESTED_AT(4) )
+virtual //Disable bogus GCC warning.
+#endif
+ ~cloning_base() throw()
+ {
+ }
             };
         }
     }

Modified: branches/proto/v4/boost/exception/detail/counted_base.hpp
==============================================================================
--- branches/proto/v4/boost/exception/detail/counted_base.hpp (original)
+++ branches/proto/v4/boost/exception/detail/counted_base.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -6,6 +6,8 @@
 #ifndef UUID_DBA0D90C930911DCBA7B675A56D89593
 #define UUID_DBA0D90C930911DCBA7B675A56D89593
 
+#include <boost/detail/workaround.hpp>
+
 namespace
 boost
     {
@@ -31,6 +33,15 @@
 
             virtual void add_ref() const=0;
             virtual void release() const=0;
+
+ protected:
+
+#if BOOST_WORKAROUND( __GNUC__, BOOST_TESTED_AT(4) )
+virtual //Disable bogus GCC warning.
+#endif
+ ~counted_base() throw()
+ {
+ }
             };
         }
     }

Modified: branches/proto/v4/boost/exception/exception.hpp
==============================================================================
--- branches/proto/v4/boost/exception/exception.hpp (original)
+++ branches/proto/v4/boost/exception/exception.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -6,6 +6,8 @@
 #ifndef UUID_274DA366004E11DCB1DDFE2E56D89593
 #define UUID_274DA366004E11DCB1DDFE2E56D89593
 
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
 #include <boost/exception/detail/counted_base.hpp>
 #include <boost/intrusive_ptr.hpp>
 #include <typeinfo>
@@ -45,8 +47,46 @@
         {
         public:
 
- virtual ~exception() throw()=0;
- virtual char const * what() const throw();
+ virtual
+ char const *
+ what() const throw()
+ {
+ if( data_ )
+ try
+ {
+ char const * w = data_->what(typeid(*this));
+ BOOST_ASSERT(0!=w);
+ return w;
+ }
+ catch(...)
+ {
+ }
+ return typeid(*this).name();
+ }
+
+ protected:
+
+ exception()
+ {
+ }
+
+ exception( exception const & e ):
+ data_(e.data_)
+ {
+ }
+
+#if BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1500) )
+ //Force class exception to be abstract.
+ //Otherwise, MSVC bug allows throw exception(), even though the copy constructor is protected.
+ virtual ~exception() throw()=0;
+#else
+#if BOOST_WORKAROUND( __GNUC__, BOOST_TESTED_AT(4) )
+ virtual //Disable bogus GCC warning.
+#endif
+ ~exception() throw()
+ {
+ }
+#endif
 
         private:
 
@@ -62,29 +102,13 @@
         intrusive_ptr<exception_detail::error_info_container> mutable data_;
         };
 
- inline
- exception::
- ~exception() throw()
- {
- }
-
- inline
- char const *
- exception::
- what() const throw()
- {
- if( data_ )
- try
- {
- char const * w = data_->what(typeid(*this));
- BOOST_ASSERT(0!=w);
- return w;
- }
- catch(...)
- {
- }
- return typeid(*this).name();
- }
- }
+#if BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1500) ) //See above.
+ inline
+ exception::
+ ~exception() throw()
+ {
+ }
+#endif
+ }
 
 #endif

Modified: branches/proto/v4/boost/exception/info.hpp
==============================================================================
--- branches/proto/v4/boost/exception/info.hpp (original)
+++ branches/proto/v4/boost/exception/info.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -37,11 +37,14 @@
             virtual std::type_info const & tag_typeid() const = 0;
             virtual std::string value_as_string() const = 0;
 
- protected:
+ protected:
 
- ~error_info_base()
- {
- }
+#if BOOST_WORKAROUND( __GNUC__, BOOST_TESTED_AT(4) )
+virtual //Disable bogus GCC warning.
+#endif
+ ~error_info_base()
+ {
+ }
             };
         }
 

Modified: branches/proto/v4/boost/intrusive_ptr.hpp
==============================================================================
--- branches/proto/v4/boost/intrusive_ptr.hpp (original)
+++ branches/proto/v4/boost/intrusive_ptr.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -22,9 +22,17 @@
 
 #include <boost/assert.hpp>
 #include <boost/detail/workaround.hpp>
+#include <boost/detail/sp_convertible.hpp>
 
 #include <functional> // for std::less
+
+#if !defined(BOOST_NO_IOSTREAM)
+#if !defined(BOOST_NO_IOSFWD)
 #include <iosfwd> // for std::basic_ostream
+#else
+#include <ostream>
+#endif
+#endif
 
 
 namespace boost
@@ -66,9 +74,19 @@
 
 #if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 
- template<class U> intrusive_ptr(intrusive_ptr<U> const & rhs): p_(rhs.get())
+ template<class U>
+#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
+
+ intrusive_ptr( intrusive_ptr<U> const & rhs, typename detail::sp_enable_if_convertible<U,T>::type = detail::sp_empty() )
+
+#else
+
+ intrusive_ptr( intrusive_ptr<U> const & rhs )
+
+#endif
+ : p_( rhs.get() )
     {
- if(p_ != 0) intrusive_ptr_add_ref(p_);
+ if( p_ != 0 ) intrusive_ptr_add_ref( p_ );
     }
 
 #endif
@@ -105,6 +123,11 @@
         return *this;
     }
 
+ void reset()
+ {
+ this_type().swap( *this );
+ }
+
     void reset( T * rhs )
     {
         this_type( rhs ).swap( *this );
@@ -246,7 +269,9 @@
 
 // operator<<
 
-#if defined(__GNUC__) && (__GNUC__ < 3)
+#if !defined(BOOST_NO_IOSTREAM)
+
+#if defined(BOOST_NO_TEMPLATED_IOSTREAMS) || ( defined(__GNUC__) && (__GNUC__ < 3) )
 
 template<class Y> std::ostream & operator<< (std::ostream & os, intrusive_ptr<Y> const & p)
 {
@@ -275,6 +300,8 @@
 
 #endif // __GNUC__ < 3
 
+#endif // !defined(BOOST_NO_IOSTREAM)
+
 } // namespace boost
 
 #ifdef BOOST_MSVC

Modified: branches/proto/v4/boost/lexical_cast.hpp
==============================================================================
--- branches/proto/v4/boost/lexical_cast.hpp (original)
+++ branches/proto/v4/boost/lexical_cast.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -17,7 +17,6 @@
 #include <climits>
 #include <cstddef>
 #include <istream>
-#include <locale>
 #include <string>
 #include <typeinfo>
 #include <boost/config.hpp>
@@ -30,6 +29,10 @@
 #include <boost/static_assert.hpp>
 #include <boost/detail/lcast_precision.hpp>
 
+#ifndef BOOST_NO_STD_LOCALE
+#include <locale>
+#endif
+
 #ifdef BOOST_NO_STRINGSTREAM
 #include <strstream>
 #else
@@ -485,6 +488,7 @@
 #endif
 
 #ifndef BOOST_LEXICAL_CAST_ASSUME_C_LOCALE
+ // TODO: use BOOST_NO_STD_LOCALE
             std::locale loc;
             typedef std::numpunct<CharT> numpunct;
             numpunct const& np = BOOST_USE_FACET(numpunct, loc);
@@ -651,6 +655,7 @@
 #ifndef DISABLE_WIDE_CHAR_SUPPORT
             static void widen_and_assign(wchar_t* p, char ch)
             {
+ // TODO: use BOOST_NO_STD_LOCALE
                 std::locale loc;
                 wchar_t w = BOOST_USE_FACET(std::ctype<wchar_t>, loc).widen(ch);
                 Traits::assign(*p, w);

Modified: branches/proto/v4/boost/parameter/preprocessor.hpp
==============================================================================
--- branches/proto/v4/boost/parameter/preprocessor.hpp (original)
+++ branches/proto/v4/boost/parameter/preprocessor.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -152,7 +152,8 @@
       , typename Parameters::deduced_list
       , tag_keyword_arg
       , mpl::false_
- >::type type;
+ >::type result;
+ typedef typename mpl::first<result>::type type;
 };
 
 # if 1 //BOOST_WORKAROUND(BOOST_MSVC, < 1300)

Modified: branches/proto/v4/boost/pointer_cast.hpp
==============================================================================
--- branches/proto/v4/boost/pointer_cast.hpp (original)
+++ branches/proto/v4/boost/pointer_cast.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -1,6 +1,6 @@
 //////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztañaga 2005.
+// (C) Copyright Ion Gaztanaga 2005.
 // Distributed under the Boost Software License, Version 1.0.
 // (See accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)

Modified: branches/proto/v4/boost/pointer_to_other.hpp
==============================================================================
--- branches/proto/v4/boost/pointer_to_other.hpp (original)
+++ branches/proto/v4/boost/pointer_to_other.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -4,7 +4,7 @@
 //
 // pointer_to_other.hpp
 //
-// (C) Copyright Ion Gaztañaga 2005.
+// (C) Copyright Ion Gaztanaga 2005.
 // Copyright (c) 2005 Peter Dimov.
 //
 // Distributed under the Boost Software License, Version 1.0.

Modified: branches/proto/v4/boost/range/as_literal.hpp
==============================================================================
--- branches/proto/v4/boost/range/as_literal.hpp (original)
+++ branches/proto/v4/boost/range/as_literal.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -8,8 +8,8 @@
 // For more information, see http://www.boost.org/libs/range/
 //
 
-#ifndef BOOST_RANGE_DETAIL_AS_LITERAL_HPP
-#define BOOST_RANGE_DETAIL_AS_LITERAL_HPP
+#ifndef BOOST_RANGE_AS_LITERAL_HPP
+#define BOOST_RANGE_AS_LITERAL_HPP
 
 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 # pragma once
@@ -107,22 +107,13 @@
     template< class Char, std::size_t sz >
     inline iterator_range<Char*> as_literal( Char (&arr)[sz] )
     {
-#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x590)) && __BORLANDC__ >= 0x590
- return boost::make_iterator_range<Char*>( arr, arr + sz - 1 );
-#else
- return boost::make_iterator_range( arr, arr + sz - 1 );
-#endif
+ return range_detail::make_range( arr, range_detail::is_char_ptr(arr) );
     }
-
     
     template< class Char, std::size_t sz >
     inline iterator_range<const Char*> as_literal( const Char (&arr)[sz] )
     {
-#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x590)) && __BORLANDC__ >= 0x590
- return boost::make_iterator_range<const Char*>( arr, arr + sz - 1 );
-#else
- return boost::make_iterator_range( arr, arr + sz - 1 );
-#endif
+ return range_detail::make_range( arr, range_detail::is_char_ptr(arr) );
     }
 }
 

Modified: branches/proto/v4/boost/range/detail/as_literal.hpp
==============================================================================
--- branches/proto/v4/boost/range/detail/as_literal.hpp (original)
+++ branches/proto/v4/boost/range/detail/as_literal.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -8,8 +8,8 @@
 // For more information, see http://www.boost.org/libs/range/
 //
 
-#ifndef BOOST_RANGE_AS_LITERAL_HPP
-#define BOOST_RANGE_AS_LITERAL_HPP
+#ifndef BOOST_RANGE_DETAIL_AS_LITERAL_HPP
+#define BOOST_RANGE_DETAIL_AS_LITERAL_HPP
 
 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 # pragma once

Modified: branches/proto/v4/boost/shared_ptr.hpp
==============================================================================
--- branches/proto/v4/boost/shared_ptr.hpp (original)
+++ branches/proto/v4/boost/shared_ptr.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -31,6 +31,7 @@
 #include <boost/throw_exception.hpp>
 #include <boost/detail/shared_count.hpp>
 #include <boost/detail/workaround.hpp>
+#include <boost/detail/sp_convertible.hpp>
 
 #if !defined(BOOST_SP_NO_ATOMIC_ACCESS)
 #include <boost/detail/spinlock_pool.hpp>
@@ -224,11 +225,20 @@
     }
 
     template<class Y>
- shared_ptr(shared_ptr<Y> const & r): px(r.px), pn(r.pn) // never throws
+#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
+
+ shared_ptr( shared_ptr<Y> const & r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() )
+
+#else
+
+ shared_ptr( shared_ptr<Y> const & r )
+
+#endif
+ : px( r.px ), pn( r.pn ) // never throws
     {
     }
 
- shared_ptr(detail::shared_count const & c, T * p): px(p), pn(c) // never throws
+ shared_ptr( detail::shared_count const & c, T * p ): px( p ), pn( c ) // never throws
     {
     }
 
@@ -339,7 +349,16 @@
     }
 
     template<class Y>
- shared_ptr( shared_ptr<Y> && r ): px( r.px ), pn() // never throws
+#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
+
+ shared_ptr( shared_ptr<Y> && r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() )
+
+#else
+
+ shared_ptr( shared_ptr<Y> && r )
+
+#endif
+ : px( r.px ), pn() // never throws
     {
         pn.swap( r.pn );
         r.px = 0;
@@ -727,7 +746,11 @@
         detail::shared_count().swap( _deleter );
     }
     template<typename D>
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1300 )
+ D* get_deleter( D* ) const
+#else
     D* get_deleter() const
+#endif
     {
         return boost::detail::basic_get_deleter<D>(_deleter);
     }
@@ -735,16 +758,29 @@
 
 } // namespace detail
 
-template<class D, class T> D * get_deleter(shared_ptr<T> const & p)
+template<class D, class T> D * get_deleter( shared_ptr<T> const & p )
 {
- D *del = detail::basic_get_deleter<D>(p.get_shared_count());
- if(del == 0)
+ D *del = detail::basic_get_deleter<D>( p.get_shared_count() );
+
+ if( del == 0 )
     {
         detail::sp_deleter_wrapper *del_wrapper = detail::basic_get_deleter<detail::sp_deleter_wrapper>(p.get_shared_count());
-// The following get_deleter method call is fully qualified because
-// older versions of gcc (2.95, 3.2.3) fail to compile it when written del_wrapper->get_deleter<D>()
- if(del_wrapper) del = del_wrapper->::boost::detail::sp_deleter_wrapper::get_deleter<D>();
+
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1300 )
+
+ if( del_wrapper ) del = del_wrapper->get_deleter( (D*)0 );
+
+#elif defined( __GNUC__ ) && BOOST_WORKAROUND( __GNUC__, < 4 )
+
+ if( del_wrapper ) del = del_wrapper->::boost::detail::sp_deleter_wrapper::get_deleter<D>();
+
+#else
+
+ if( del_wrapper ) del = del_wrapper->get_deleter<D>();
+
+#endif
     }
+
     return del;
 }
 

Modified: branches/proto/v4/boost/spirit/home/karma/action/action.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/karma/action/action.hpp (original)
+++ branches/proto/v4/boost/spirit/home/karma/action/action.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -23,6 +23,10 @@
 
 namespace boost { namespace spirit { namespace karma
 {
+ ///////////////////////////////////////////////////////////////////////////
+ struct sequence; // forward declaration only
+
+ ///////////////////////////////////////////////////////////////////////////
     struct action
     {
         template <typename Component, typename Context, typename Unused>
@@ -44,7 +48,8 @@
             typedef typename
                 result_of::left<Component>::type::director
             director;
-
+ typedef typename is_same<director, sequence>::type is_sequence;
+
             typedef typename
                 attribute<Component, Context, unused_type>::type
             param_type;
@@ -63,7 +68,7 @@
             // fail parsing.
             // call the function, passing the attribute, the context.
             // The client can return false to fail parsing.
- bool pass = spirit::detail::action_dispatch(
+ bool pass = spirit::detail::action_dispatch<is_sequence>(
                 spirit::right(component), p, ctx);
 
             return pass &&

Modified: branches/proto/v4/boost/spirit/home/karma/binary.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/karma/binary.hpp (original)
+++ branches/proto/v4/boost/spirit/home/karma/binary.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -11,6 +11,7 @@
 #endif
 
 #include <boost/spirit/home/karma/binary/binary.hpp>
+#include <boost/spirit/home/karma/binary/padding.hpp>
 #include <boost/spirit/home/karma/binary/meta_grammar.hpp>
 
 #endif

Modified: branches/proto/v4/boost/spirit/home/karma/binary/meta_grammar.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/karma/binary/meta_grammar.hpp (original)
+++ branches/proto/v4/boost/spirit/home/karma/binary/meta_grammar.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -29,6 +29,8 @@
     template <integer::endianness endian, int bits>
     struct binary_lit_director;
 
+ struct binary_padding_director;
+
     struct main_meta_grammar;
 
     template <typename Expr, typename Enable>
@@ -223,6 +225,9 @@
>,
                 karma::domain,
                 mpl::identity<extract_binary_lit_director<mpl::_, mpl::_> >
+ >,
+ meta_grammar::function1_rule<
+ karma::domain, tag::pad, binary_padding_director
>
>
     {

Modified: branches/proto/v4/boost/spirit/home/karma/detail/output_iterator.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/karma/detail/output_iterator.hpp (original)
+++ branches/proto/v4/boost/spirit/home/karma/detail/output_iterator.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -20,6 +20,37 @@
 namespace boost { namespace spirit { namespace karma { namespace detail
 {
     ///////////////////////////////////////////////////////////////////////////
+ // This class is used to keep track of the current position in the output.
+ ///////////////////////////////////////////////////////////////////////////
+ class position_sink
+ {
+ public:
+ position_sink() : count(0), line(1), column(0) {}
+ void tidy() { count = 0; line = 1; column = 0; }
+
+ template <typename T>
+ void output(T const& value)
+ {
+ ++count;
+ if (value == '\n') {
+ ++line;
+ column = 1;
+ }
+ else {
+ ++column;
+ }
+ }
+ std::size_t get_count() const { return count; }
+ std::size_t get_line() const { return line; }
+ std::size_t get_column() const { return column; }
+
+ private:
+ std::size_t count;
+ std::size_t line;
+ std::size_t column;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
     // This class is used to count the umber of characters streamed into the
     // output.
     ///////////////////////////////////////////////////////////////////////////
@@ -233,6 +264,10 @@
             if (mode & count_characters) // count characters, if appropriate
                 count_data.output();
 
+ // always track position in the output (this is needed by different
+ // generators, such as indent, pad, etc.)
+ track_position_data.output(value);
+
             if (mode & buffer_characters) // buffer output, if appropriate
                 buffer_data.output(value);
             else
@@ -255,6 +290,12 @@
             buffer_data.copy(sink);
         }
         
+ // return the current count in the output
+ std::size_t get_out_count() const
+ {
+ return track_position_data.get_count();
+ }
+
     protected:
         // this is the wrapped user supplied output iterator
         OutputIterator& sink;
@@ -263,8 +304,9 @@
         // these are the hooks providing optional functionality
         counting_sink count_data; // for counting
         buffer_sink<OutputIterator> buffer_data; // for buffering
- output_mode mode;
-
+ position_sink track_position_data; // for position tracking
+ int mode;
+
         // suppress warning about assignment operator not being generated
         output_iterator& operator=(output_iterator const&);
     };

Modified: branches/proto/v4/boost/spirit/home/karma/generate.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/karma/generate.hpp (original)
+++ branches/proto/v4/boost/spirit/home/karma/generate.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -45,6 +45,27 @@
     }
 
     ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Expr>
+ inline bool
+ generate(detail::output_iterator<OutputIterator>& sink, Expr const& xpr)
+ {
+ typedef spirit::traits::is_component<karma::domain, Expr> is_component;
+
+ // report invalid expression error as early as possible
+ BOOST_MPL_ASSERT_MSG(is_component::value,
+ xpr_is_not_convertible_to_a_generator,
+ (OutputIterator, Expr));
+
+ typedef
+ typename result_of::as_component<karma::domain, Expr>::type
+ component;
+ typedef typename component::director director;
+
+ component c = spirit::as_component(karma::domain(), xpr);
+ return director::generate(c, sink, unused, unused, unused);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
     template <typename OutputIterator, typename Expr, typename Parameter>
     inline bool
     generate(OutputIterator target_sink, Expr const& xpr, Parameter const& param)
@@ -69,6 +90,28 @@
     }
 
     ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Expr, typename Parameter>
+ inline bool
+ generate(detail::output_iterator<OutputIterator>& sink, Expr const& xpr,
+ Parameter const& param)
+ {
+ typedef spirit::traits::is_component<karma::domain, Expr> is_component;
+
+ // report invalid expression error as early as possible
+ BOOST_MPL_ASSERT_MSG(is_component::value,
+ xpr_is_not_convertible_to_a_generator,
+ (OutputIterator, Expr, Parameter));
+
+ typedef
+ typename result_of::as_component<karma::domain, Expr>::type
+ component;
+ typedef typename component::director director;
+
+ component c = spirit::as_component(karma::domain(), xpr);
+ return director::generate(c, sink, unused, unused, param);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
     template <typename OutputIterator, typename Expr, typename Delimiter>
     inline bool
     generate_delimited(OutputIterator target_sink, Expr const& xpr,
@@ -107,6 +150,41 @@
     }
 
     ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Expr, typename Delimiter>
+ inline bool
+ generate_delimited(detail::output_iterator<OutputIterator>& sink,
+ Expr const& xpr, Delimiter const& delimiter)
+ {
+ typedef
+ spirit::traits::is_component<karma::domain, Expr>
+ expr_is_component;
+ typedef
+ spirit::traits::is_component<karma::domain, Delimiter>
+ delimiter_is_component;
+
+ // report invalid expression errors as early as possible
+ BOOST_MPL_ASSERT_MSG(expr_is_component::value,
+ xpr_is_not_convertible_to_a_generator,
+ (OutputIterator, Expr, Delimiter));
+
+ BOOST_MPL_ASSERT_MSG(delimiter_is_component::value,
+ delimiter_is_not_convertible_to_a_generator,
+ (OutputIterator, Expr, Delimiter));
+
+ typedef
+ typename result_of::as_component<karma::domain, Expr>::type
+ component;
+ typedef typename component::director director;
+ typedef
+ typename result_of::as_component<karma::domain, Delimiter>::type
+ delim_component;
+
+ component c = spirit::as_component(karma::domain(), xpr);
+ delim_component d = spirit::as_component(karma::domain(), delimiter);
+ return director::generate(c, sink, unused, d, unused);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
     template <typename OutputIterator, typename Expr, typename Parameter,
         typename Delimiter>
     inline bool
@@ -145,6 +223,42 @@
         return director::generate(c, sink, unused, d, param);
     }
 
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename OutputIterator, typename Expr, typename Parameter,
+ typename Delimiter>
+ inline bool
+ generate_delimited(detail::output_iterator<OutputIterator>& sink,
+ Expr const& xpr, Parameter const& param, Delimiter const& delimiter)
+ {
+ typedef
+ spirit::traits::is_component<karma::domain, Expr>
+ expr_is_component;
+ typedef
+ spirit::traits::is_component<karma::domain, Delimiter>
+ delimiter_is_component;
+
+ // report invalid expression errors as early as possible
+ BOOST_MPL_ASSERT_MSG(expr_is_component::value,
+ xpr_is_not_convertible_to_a_generator,
+ (OutputIterator, Expr, Parameter, Delimiter));
+
+ BOOST_MPL_ASSERT_MSG(delimiter_is_component::value,
+ delimiter_is_not_convertible_to_a_generator,
+ (OutputIterator, Expr, Parameter, Delimiter));
+
+ typedef
+ typename result_of::as_component<karma::domain, Expr>::type
+ component;
+ typedef typename component::director director;
+ typedef
+ typename result_of::as_component<karma::domain, Delimiter>::type
+ delim_component;
+
+ component c = spirit::as_component(karma::domain(), xpr);
+ delim_component d = spirit::as_component(karma::domain(), delimiter);
+ return director::generate(c, sink, unused, d, param);
+ }
+
 }}}
 
 #endif

Modified: branches/proto/v4/boost/spirit/home/karma/nonterminal/nonterminal_director.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/karma/nonterminal/nonterminal_director.hpp (original)
+++ branches/proto/v4/boost/spirit/home/karma/nonterminal/nonterminal_director.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -85,7 +85,7 @@
             Parameter const& param)
         {
             typedef typename Nonterminal::locals_type locals_type;
- fusion::vector<Parameter const&> front(param);
+ fusion::single_view<Parameter const&> front(param);
             NonterminalContext context(
                 fusion::join(
                     front,

Modified: branches/proto/v4/boost/spirit/home/karma/operator/detail/alternative.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/karma/operator/detail/alternative.hpp (original)
+++ branches/proto/v4/boost/spirit/home/karma/operator/detail/alternative.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -22,7 +22,12 @@
 #include <boost/type_traits/is_convertible.hpp>
 #include <boost/variant.hpp>
 
-namespace boost { namespace spirit { namespace karma { namespace detail
+namespace boost { namespace spirit { namespace karma
+{
+ ///////////////////////////////////////////////////////////////////////////
+ struct sequence; // forward declaration only
+
+namespace detail
 {
     ///////////////////////////////////////////////////////////////////////////
     // A component is compatible to a given parameter type if the parameter
@@ -38,12 +43,14 @@
         typedef typename
             mpl::find_if<
                 types,
- is_same<mpl::_1, Expected>
+ is_convertible<mpl::_1, Expected>
>::type
         iter;
 
         typedef typename mpl::not_<is_same<iter, end> >::type type;
         enum { value = type::value };
+
+
     };
 
     template <typename Expected>
@@ -108,6 +115,24 @@
>::type
>
     {
+ // If this alternative is a sequence, we wrap the attribute into a
+ // fusion sequence.
+ template <typename Parameter>
+ static fusion::vector<Parameter const&>
+ wrap_attribute(Parameter const& param, mpl::true_)
+ {
+ return fusion::vector<Parameter const&>(param);
+ }
+
+ // If this alternative is not a sequence the parameter is passed
+ // through unchanged.
+ template <typename Parameter>
+ static Parameter const&
+ wrap_attribute(Parameter const& param, mpl::false_)
+ {
+ return param;
+ }
+
         template <typename OutputIterator, typename Context, typename Delimiter>
         static bool
         call(Component const& component, OutputIterator& sink,
@@ -137,8 +162,9 @@
             compatible_type;
 
             typedef typename Component::director director;
+ typedef typename is_same<director, sequence>::type is_sequence;
             return director::generate(component, sink, ctx, delim,
- get<compatible_type>(param));
+ wrap_attribute(get<compatible_type>(param), is_sequence()));
         }
     };
 

Modified: branches/proto/v4/boost/spirit/home/karma/operator/sequence.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/karma/operator/sequence.hpp (original)
+++ branches/proto/v4/boost/spirit/home/karma/operator/sequence.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -43,7 +43,7 @@
         template <typename Component, typename Context, typename Iterator>
         struct attribute :
             build_fusion_sequence<
- sequence, Component, Iterator, Context
+ sequence, Component, Iterator, Context, mpl::true_
>
         {
         };

Modified: branches/proto/v4/boost/spirit/home/qi/action/action.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/qi/action/action.hpp (original)
+++ branches/proto/v4/boost/spirit/home/qi/action/action.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -40,7 +40,7 @@
             // before calling detail::action_dispatch whereby
             // disallowing mutability of the attribute in semantic
             // actions.
- return spirit::detail::action_dispatch(f, attr, context);
+ return spirit::detail::action_dispatch<mpl::true_>(f, attr, context);
         }
 
         template <

Modified: branches/proto/v4/boost/spirit/home/support/algorithm/any_if.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/algorithm/any_if.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/algorithm/any_if.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -31,6 +31,8 @@
     // used to decide, whether to advance the second iterator or not.
     // This is needed for sequences containing components with unused
     // attributes.
+ // The second iterator is advanced only if the attribute of the
+ // corresponding component iterator is not unused.
     ///////////////////////////////////////////////////////////////////////////
     namespace detail
     {

Modified: branches/proto/v4/boost/spirit/home/support/attribute_transform.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/attribute_transform.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/attribute_transform.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -12,6 +12,7 @@
 #include <boost/spirit/home/support/component.hpp>
 #include <boost/spirit/home/support/attribute_of.hpp>
 #include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
 #include <boost/variant/variant_fwd.hpp>
 #include <boost/fusion/include/transform.hpp>
 #include <boost/fusion/include/filter_if.hpp>
@@ -26,23 +27,40 @@
     {
         // Here, we provide policies for stripping single element fusion
         // sequences. Add more specializations as needed.
- template <typename T>
+ template <typename T, typename IsSequence>
         struct strip_single_element_sequence
         {
             typedef T type;
         };
 
         template <typename T>
- struct strip_single_element_sequence<fusion::vector<T> >
+ struct strip_single_element_sequence<fusion::vector<T>, mpl::false_>
         {
             // Strips single element fusion vectors into its 'naked'
             // form: vector<T> --> T
             typedef T type;
         };
 
- template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+ template <typename T>
+ struct strip_single_element_sequence<fusion::vector<T>, mpl::true_>
+ {
+ // Strips single element fusion vectors into its 'naked'
+ // form: vector<T> --> T, but does so only if T is not a fusion
+ // sequence itself
+ typedef typename
+ mpl::if_<
+ fusion::traits::is_sequence<T>,
+ fusion::vector<T>,
+ T
+ >::type
+ type;
+ };
+
+ template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename IsSequence>
         struct strip_single_element_sequence<
- fusion::vector<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> > >
+ fusion::vector<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+ , IsSequence
+ >
         {
             // Exception: Single element variants are not stripped!
             typedef fusion::vector<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> > type;
@@ -65,7 +83,8 @@
     //
     template <
         typename Director, typename Component
- , typename Iterator, typename Context>
+ , typename Iterator, typename Context
+ , typename IsSequence = mpl::false_>
     struct build_fusion_sequence
     {
         template <
@@ -121,7 +140,7 @@
         // Finally, strip single element sequences into its
         // naked form (e.g. vector<T> --> T)
         typedef typename
- traits::strip_single_element_sequence<attribute_sequence>::type
+ traits::strip_single_element_sequence<attribute_sequence, IsSequence>::type
         type;
     };
 

Modified: branches/proto/v4/boost/spirit/home/support/detail/action_dispatch.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/detail/action_dispatch.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/detail/action_dispatch.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -14,7 +14,8 @@
 
 namespace boost { namespace spirit { namespace detail
 {
- template <typename F, typename Attribute, typename Context>
+ // general handler for everything not explicitly specialized below
+ template <typename Pass, typename F, typename Attribute, typename Context>
     bool action_dispatch(F const& f, Attribute& attr, Context& context)
     {
         bool pass = true;
@@ -22,16 +23,44 @@
         return pass;
     }
 
+ // handler for phoenix actors
+
+ // If the component this action has to be invoked for is a sequence, we
+ // wrap any non-fusion sequence into a fusion sequence (done by pass_value)
+ // and pass through any fusion sequence.
     template <typename Eval, typename Attribute, typename Context>
     bool action_dispatch(phoenix::actor<Eval> const& f
- , Attribute& attr, Context& context)
+ , Attribute& attr, Context& context, mpl::true_)
     {
         bool pass = true;
- f(pass_value<Attribute>::call(attr), context, pass);
+ f (pass_value<Attribute>::call(attr), context, pass);
         return pass;
     }
 
- template <typename RT, typename A0, typename A1, typename A2
+ // If this action has to be invoked for anything but a sequence, we always
+ // need to wrap the attribute into a fusion sequence, because the attribute
+ // has to be treated as being a single value in any case (even if it
+ // actually already is a fusion sequence on its own).
+ template <typename Eval, typename Attribute, typename Context>
+ bool action_dispatch(phoenix::actor<Eval> const& f
+ , Attribute& attr, Context& context, mpl::false_)
+ {
+ bool pass = true;
+ f (fusion::vector<Attribute&>(attr), context, pass);
+ return pass;
+ }
+
+ template <typename IsSequence
+ , typename Eval, typename Attribute, typename Context>
+ bool action_dispatch(phoenix::actor<Eval> const& f
+ , Attribute& attr, Context& context)
+ {
+ return action_dispatch(f, attr, context, IsSequence());
+ }
+
+ // specializations for plain function pointers taking a different number of
+ // arguments
+ template <typename Pass, typename RT, typename A0, typename A1, typename A2
       , typename Attribute, typename Context>
     bool action_dispatch(RT(*f)(A0, A1, A2)
       , Attribute& attr, Context& context)
@@ -41,7 +70,7 @@
         return pass;
     }
 
- template <typename RT, typename A0, typename A1
+ template <typename Pass, typename RT, typename A0, typename A1
       , typename Attribute, typename Context>
     bool action_dispatch(RT(*f)(A0, A1)
       , Attribute& attr, Context& context)
@@ -50,7 +79,7 @@
         return true;
     }
 
- template <typename RT, typename A0
+ template <typename Pass, typename RT, typename A0
       , typename Attribute, typename Context>
     bool action_dispatch(RT(*f)(A0)
       , Attribute& attr, Context&)
@@ -59,13 +88,14 @@
         return true;
     }
 
- template <typename RT, typename Attribute, typename Context>
+ template <typename Pass, typename RT, typename Attribute, typename Context>
     bool action_dispatch(RT(*f)()
       , Attribute&, Context&)
     {
         f();
         return true;
     }
+
 }}}
 
 #endif

Modified: branches/proto/v4/boost/spirit/home/support/placeholders.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/placeholders.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/placeholders.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -10,6 +10,7 @@
 
 #include <boost/xpressive/proto/proto.hpp>
 #include <boost/mpl/bool.hpp>
+#include <boost/type_traits/is_enum.hpp>
 
 namespace boost { namespace spirit
 {
@@ -42,7 +43,8 @@
         struct big_qword {};
         struct little_qword {};
 #endif
-
+ struct pad {};
+
         struct ushort {};
         struct ulong {};
         struct uint {};
@@ -101,6 +103,7 @@
     typedef proto::terminal<tag::big_qword>::type big_qword_type;
     typedef proto::terminal<tag::little_qword>::type little_qword_type;
 #endif
+ typedef proto::terminal<tag::pad>::type pad_type;
 
     typedef proto::terminal<tag::ushort>::type ushort_type;
     typedef proto::terminal<tag::ulong>::type ulong_type;
@@ -159,6 +162,7 @@
     proto::terminal<tag::big_qword>::type const big_qword = {{}};
     proto::terminal<tag::little_qword>::type const little_qword = {{}};
 #endif
+ proto::terminal<tag::pad>::type const pad = {{}};
 
     proto::terminal<tag::ushort>::type const ushort = {{}};
     proto::terminal<tag::ulong>::type const ulong = {{}};
@@ -214,6 +218,7 @@
         (void) qword; (void) little_qword; (void) big_qword;
         (void) ulong_long; (void) long_long;
 #endif
+ (void) pad;
         (void) float_; (void) double_; (void) long_double;
         (void) left_align; (void) right_align; (void) center;
         (void) delimit; (void) verbatim;
@@ -270,7 +275,7 @@
     // test if a tag is an integer type
     ///////////////////////////////////////////////////////////////////////////
     template <typename T, typename Domain>
- struct is_int_lit_tag : mpl::false_ {};
+ struct is_int_lit_tag : is_enum<T> {};
 
     template <typename Domain>
     struct is_int_lit_tag<short, Domain> : mpl::true_ {};

Modified: branches/proto/v4/boost/test/impl/execution_monitor.ipp
==============================================================================
--- branches/proto/v4/boost/test/impl/execution_monitor.ipp (original)
+++ branches/proto/v4/boost/test/impl/execution_monitor.ipp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -139,7 +139,9 @@
 # define BOOST_TEST_USE_ALT_STACK
 # endif
 
-# if !defined(__CYGWIN__) && !(defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__))
+# if !defined(__CYGWIN__) && \
+ !(defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) && \
+ !defined(__NetBSD__)
 # define BOOST_TEST_CATCH_SIGPOLL
 # endif
 
@@ -249,245 +251,244 @@
     if( !m_sig_info )
         return; // no error actually occur?
 
- if( m_sig_info->si_code <= 0 ) {
+ switch( m_sig_info->si_code ) {
+ case SI_USER:
+ report_error( execution_exception::system_error,
+ "signal: generated by kill() (or family); uid=%d; pid=%d",
+ (int)m_sig_info->si_uid, (int)m_sig_info->si_pid );
+ break;
+ case SI_QUEUE:
+ report_error( execution_exception::system_error,
+ "signal: sent by sigqueue()" );
+ break;
+ case SI_TIMER:
+ report_error( execution_exception::system_error,
+ "signal: the expiration of a timer set by timer_settimer()" );
+ break;
+ case SI_ASYNCIO:
+ report_error( execution_exception::system_error,
+ "signal: generated by the completion of an asynchronous I/O request" );
+ break;
+ case SI_MESGQ:
+ report_error( execution_exception::system_error,
+ "signal: generated by the the arrival of a message on an empty message queue" );
+ break;
+ default:
+ break;
+ }
+
+ switch( m_sig_info->si_signo ) {
+ case SIGILL:
+ switch( m_sig_info->si_code ) {
+ case ILL_ILLOPC:
+ report_error( execution_exception::system_fatal_error,
+ "signal: illegal opcode; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case ILL_ILLOPN:
+ report_error( execution_exception::system_fatal_error,
+ "signal: illegal operand; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case ILL_ILLADR:
+ report_error( execution_exception::system_fatal_error,
+ "signal: illegal addressing mode; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case ILL_ILLTRP:
+ report_error( execution_exception::system_fatal_error,
+ "signal: illegal trap; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case ILL_PRVOPC:
+ report_error( execution_exception::system_fatal_error,
+ "signal: privileged opcode; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case ILL_PRVREG:
+ report_error( execution_exception::system_fatal_error,
+ "signal: privileged register; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case ILL_COPROC:
+ report_error( execution_exception::system_fatal_error,
+ "signal: co-processor error; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case ILL_BADSTK:
+ report_error( execution_exception::system_fatal_error,
+ "signal: internal stack error; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ }
+ break;
+
+ case SIGFPE:
         switch( m_sig_info->si_code ) {
- case SI_USER:
+ case FPE_INTDIV:
+ report_error( execution_exception::system_error,
+ "signal: integer divide by zero; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case FPE_INTOVF:
+ report_error( execution_exception::system_error,
+ "signal: integer overflow; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case FPE_FLTDIV:
+ report_error( execution_exception::system_error,
+ "signal: floating point divide by zero; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
+ break;
+ case FPE_FLTOVF:
             report_error( execution_exception::system_error,
- "signal: generated by kill() (or family); uid=%d; pid=%d",
- (int)m_sig_info->si_uid, (int)m_sig_info->si_pid );
+ "signal: floating point overflow; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
             break;
- case SI_QUEUE:
+ case FPE_FLTUND:
             report_error( execution_exception::system_error,
- "signal: sent by sigqueue()" );
+ "signal: floating point underflow; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
             break;
- case SI_TIMER:
+ case FPE_FLTRES:
             report_error( execution_exception::system_error,
- "signal: the expiration of a timer set by timer_settimer()" );
+ "signal: floating point inexact result; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
             break;
- case SI_ASYNCIO:
+ case FPE_FLTINV:
             report_error( execution_exception::system_error,
- "signal: generated by the completion of an asynchronous I/O request" );
+ "signal: invalid floating point operation; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
             break;
- case SI_MESGQ:
+ case FPE_FLTSUB:
             report_error( execution_exception::system_error,
- "signal: generated by the the arrival of a message on an empty message queue" );
+ "signal: subscript out of range; address of failing instruction: 0x%08lx",
+ m_sig_info->si_addr );
             break;
         }
- }
- else {
- switch( m_sig_info->si_signo ) {
- case SIGILL:
- switch( m_sig_info->si_code ) {
- case ILL_ILLOPC:
- report_error( execution_exception::system_fatal_error,
- "signal: illegal opcode; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case ILL_ILLOPN:
- report_error( execution_exception::system_fatal_error,
- "signal: illegal operand; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case ILL_ILLADR:
- report_error( execution_exception::system_fatal_error,
- "signal: illegal addressing mode; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case ILL_ILLTRP:
- report_error( execution_exception::system_fatal_error,
- "signal: illegal trap; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case ILL_PRVOPC:
- report_error( execution_exception::system_fatal_error,
- "signal: privileged opcode; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case ILL_PRVREG:
- report_error( execution_exception::system_fatal_error,
- "signal: privileged register; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case ILL_COPROC:
- report_error( execution_exception::system_fatal_error,
- "signal: co-processor error; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case ILL_BADSTK:
- report_error( execution_exception::system_fatal_error,
- "signal: internal stack error; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- }
- break;
-
- case SIGFPE:
- switch( m_sig_info->si_code ) {
- case FPE_INTDIV:
- report_error( execution_exception::system_error,
- "signal: integer divide by zero; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case FPE_INTOVF:
- report_error( execution_exception::system_error,
- "signal: integer overflow; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case FPE_FLTDIV:
- report_error( execution_exception::system_error,
- "signal: floating point divide by zero; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case FPE_FLTOVF:
- report_error( execution_exception::system_error,
- "signal: floating point overflow; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case FPE_FLTUND:
- report_error( execution_exception::system_error,
- "signal: floating point underflow; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case FPE_FLTRES:
- report_error( execution_exception::system_error,
- "signal: floating point inexact result; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case FPE_FLTINV:
- report_error( execution_exception::system_error,
- "signal: invalid floating point operation; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- case FPE_FLTSUB:
- report_error( execution_exception::system_error,
- "signal: subscript out of range; address of failing instruction: 0x%08lx",
- m_sig_info->si_addr );
- break;
- }
- break;
-
- case SIGSEGV:
- switch( m_sig_info->si_code ) {
- case SEGV_MAPERR:
- report_error( execution_exception::system_fatal_error,
- "memory access violation at address: 0x%08lx: no mapping at fault address",
- m_sig_info->si_addr );
- break;
- case SEGV_ACCERR:
- report_error( execution_exception::system_fatal_error,
- "memory access violation at address: 0x%08lx: invalid permissions",
- m_sig_info->si_addr );
- break;
- }
- break;
-
- case SIGBUS:
- switch( m_sig_info->si_code ) {
- case BUS_ADRALN:
- report_error( execution_exception::system_fatal_error,
- "memory access violation at address: 0x%08lx: invalid address alignment",
- m_sig_info->si_addr );
- break;
- case BUS_ADRERR:
- report_error( execution_exception::system_fatal_error,
- "memory access violation at address: 0x%08lx: non-existent physical address",
- m_sig_info->si_addr );
- break;
- case BUS_OBJERR:
- report_error( execution_exception::system_fatal_error,
- "memory access violation at address: 0x%08lx: object specific hardware error",
- m_sig_info->si_addr );
- break;
- }
- break;
-
- case SIGCHLD:
- switch( m_sig_info->si_code ) {
- case CLD_EXITED:
- report_error( execution_exception::system_error,
- "child has exited; pid: %d; uid: %d; exit value: %d",
- (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
- break;
- case CLD_KILLED:
- report_error( execution_exception::system_error,
- "child was killed; pid: %d; uid: %d; exit value: %d",
- (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
- break;
- case CLD_DUMPED:
- report_error( execution_exception::system_error,
- "child terminated abnormally; pid: %d; uid: %d; exit value: %d",
- (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
- break;
- case CLD_TRAPPED:
- report_error( execution_exception::system_error,
- "traced child has trapped; pid: %d; uid: %d; exit value: %d",
- (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
- break;
- case CLD_STOPPED:
- report_error( execution_exception::system_error,
- "child has stopped; pid: %d; uid: %d; exit value: %d",
- (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
- break;
- case CLD_CONTINUED:
- report_error( execution_exception::system_error,
- "stopped child had continued; pid: %d; uid: %d; exit value: %d",
- (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
- break;
- }
+ break;
+
+ case SIGSEGV:
+ switch( m_sig_info->si_code ) {
+ case SEGV_MAPERR:
+ report_error( execution_exception::system_fatal_error,
+ "memory access violation at address: 0x%08lx: no mapping at fault address",
+ m_sig_info->si_addr );
+ break;
+ case SEGV_ACCERR:
+ report_error( execution_exception::system_fatal_error,
+ "memory access violation at address: 0x%08lx: invalid permissions",
+ m_sig_info->si_addr );
+ break;
+ }
+ break;
+
+ case SIGBUS:
+ switch( m_sig_info->si_code ) {
+ case BUS_ADRALN:
+ report_error( execution_exception::system_fatal_error,
+ "memory access violation at address: 0x%08lx: invalid address alignment",
+ m_sig_info->si_addr );
+ break;
+ case BUS_ADRERR:
+ report_error( execution_exception::system_fatal_error,
+ "memory access violation at address: 0x%08lx: non-existent physical address",
+ m_sig_info->si_addr );
+ break;
+ case BUS_OBJERR:
+ report_error( execution_exception::system_fatal_error,
+ "memory access violation at address: 0x%08lx: object specific hardware error",
+ m_sig_info->si_addr );
+ break;
+ }
+ break;
+
+ case SIGCHLD:
+ switch( m_sig_info->si_code ) {
+ case CLD_EXITED:
+ report_error( execution_exception::system_error,
+ "child has exited; pid: %d; uid: %d; exit value: %d",
+ (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
             break;
+ case CLD_KILLED:
+ report_error( execution_exception::system_error,
+ "child was killed; pid: %d; uid: %d; exit value: %d",
+ (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
+ break;
+ case CLD_DUMPED:
+ report_error( execution_exception::system_error,
+ "child terminated abnormally; pid: %d; uid: %d; exit value: %d",
+ (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
+ break;
+ case CLD_TRAPPED:
+ report_error( execution_exception::system_error,
+ "traced child has trapped; pid: %d; uid: %d; exit value: %d",
+ (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
+ break;
+ case CLD_STOPPED:
+ report_error( execution_exception::system_error,
+ "child has stopped; pid: %d; uid: %d; exit value: %d",
+ (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
+ break;
+ case CLD_CONTINUED:
+ report_error( execution_exception::system_error,
+ "stopped child had continued; pid: %d; uid: %d; exit value: %d",
+ (int)m_sig_info->si_uid, (int)m_sig_info->si_pid, (int)m_sig_info->si_status );
+ break;
+ }
+ break;
 
 #if defined(BOOST_TEST_CATCH_SIGPOLL)
 
- case SIGPOLL:
- switch( m_sig_info->si_code ) {
- case POLL_IN:
- report_error( execution_exception::system_error,
- "data input available; band event %d",
- (int)m_sig_info->si_band );
- break;
- case POLL_OUT:
- report_error( execution_exception::system_error,
- "output buffers available; band event %d",
- (int)m_sig_info->si_band );
- break;
- case POLL_MSG:
- report_error( execution_exception::system_error,
- "input message available; band event %d",
- (int)m_sig_info->si_band );
- break;
- case POLL_ERR:
- report_error( execution_exception::system_error,
- "i/o error; band event %d",
- (int)m_sig_info->si_band );
- break;
- case POLL_PRI:
- report_error( execution_exception::system_error,
- "high priority input available; band event %d",
- (int)m_sig_info->si_band );
- break;
- case POLL_HUP:
- report_error( execution_exception::system_error,
- "device disconnected; band event %d",
- (int)m_sig_info->si_band );
- break;
- }
+ case SIGPOLL:
+ switch( m_sig_info->si_code ) {
+ case POLL_IN:
+ report_error( execution_exception::system_error,
+ "data input available; band event %d",
+ (int)m_sig_info->si_band );
+ break;
+ case POLL_OUT:
+ report_error( execution_exception::system_error,
+ "output buffers available; band event %d",
+ (int)m_sig_info->si_band );
             break;
+ case POLL_MSG:
+ report_error( execution_exception::system_error,
+ "input message available; band event %d",
+ (int)m_sig_info->si_band );
+ break;
+ case POLL_ERR:
+ report_error( execution_exception::system_error,
+ "i/o error; band event %d",
+ (int)m_sig_info->si_band );
+ break;
+ case POLL_PRI:
+ report_error( execution_exception::system_error,
+ "high priority input available; band event %d",
+ (int)m_sig_info->si_band );
+ break;
+ case POLL_HUP:
+ report_error( execution_exception::system_error,
+ "device disconnected; band event %d",
+ (int)m_sig_info->si_band );
+ break;
+ }
+ break;
 
 #endif
 
- case SIGABRT:
- report_error( execution_exception::system_error,
- "signal: SIGABRT (application abort requested)" );
- break;
-
- case SIGALRM:
- report_error( execution_exception::timeout_error,
- "signal: SIGALRM (timeout while executing function)" );
- break;
+ case SIGABRT:
+ report_error( execution_exception::system_error,
+ "signal: SIGABRT (application abort requested)" );
+ break;
 
- default:
- report_error( execution_exception::system_error, "unrecognized signal" );
- }
+ case SIGALRM:
+ report_error( execution_exception::timeout_error,
+ "signal: SIGALRM (timeout while executing function)" );
+ break;
+
+ default:
+ report_error( execution_exception::system_error, "unrecognized signal" );
     }
 }
 

Modified: branches/proto/v4/boost/thread/detail/move.hpp
==============================================================================
--- branches/proto/v4/boost/thread/detail/move.hpp (original)
+++ branches/proto/v4/boost/thread/detail/move.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -6,6 +6,9 @@
 #ifndef BOOST_THREAD_MOVE_HPP
 #define BOOST_THREAD_MOVE_HPP
 
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
 namespace boost
 {
     namespace detail
@@ -14,7 +17,7 @@
         struct thread_move_t
         {
             T& t;
- thread_move_t(T& t_):
+ explicit thread_move_t(T& t_):
                 t(t_)
             {}
 
@@ -31,6 +34,18 @@
             void operator=(thread_move_t&);
         };
     }
+
+ template<typename T>
+ typename enable_if<boost::is_convertible<T&,detail::thread_move_t<T> >, detail::thread_move_t<T> >::type move(T& t)
+ {
+ return t;
+ }
+
+ template<typename T>
+ detail::thread_move_t<T> move(detail::thread_move_t<T> t)
+ {
+ return t;
+ }
     
 }
 

Modified: branches/proto/v4/boost/thread/locks.hpp
==============================================================================
--- branches/proto/v4/boost/thread/locks.hpp (original)
+++ branches/proto/v4/boost/thread/locks.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -62,6 +62,10 @@
         explicit unique_lock(unique_lock&);
         unique_lock& operator=(unique_lock&);
     public:
+ unique_lock():
+ m(0),is_locked(false)
+ {}
+
         explicit unique_lock(Mutex& m_):
             m(&m_),is_locked(false)
         {
@@ -205,18 +209,6 @@
     };
 
     template<typename Mutex>
- inline detail::thread_move_t<unique_lock<Mutex> > move(unique_lock<Mutex> & x)
- {
- return x.move();
- }
-
- template<typename Mutex>
- inline detail::thread_move_t<unique_lock<Mutex> > move(detail::thread_move_t<unique_lock<Mutex> > x)
- {
- return x;
- }
-
- template<typename Mutex>
     class shared_lock
     {
     protected:
@@ -226,6 +218,10 @@
         explicit shared_lock(shared_lock&);
         shared_lock& operator=(shared_lock&);
     public:
+ shared_lock():
+ m(0),is_locked(false)
+ {}
+
         explicit shared_lock(Mutex& m_):
             m(&m_),is_locked(false)
         {
@@ -252,26 +248,29 @@
             m(other->m),is_locked(other->is_locked)
         {
             other->is_locked=false;
+ other->m=0;
         }
 
         shared_lock(detail::thread_move_t<unique_lock<Mutex> > other):
             m(other->m),is_locked(other->is_locked)
         {
- other->is_locked=false;
             if(is_locked)
             {
                 m->unlock_and_lock_shared();
             }
+ other->is_locked=false;
+ other->m=0;
         }
 
         shared_lock(detail::thread_move_t<upgrade_lock<Mutex> > other):
             m(other->m),is_locked(other->is_locked)
         {
- other->is_locked=false;
             if(is_locked)
             {
                 m->unlock_upgrade_and_lock_shared();
             }
+ other->is_locked=false;
+ other->m=0;
         }
 
         operator detail::thread_move_t<shared_lock<Mutex> >()
@@ -373,19 +372,6 @@
     };
 
     template<typename Mutex>
- inline detail::thread_move_t<shared_lock<Mutex> > move(shared_lock<Mutex> & x)
- {
- return x.move();
- }
-
- template<typename Mutex>
- inline detail::thread_move_t<shared_lock<Mutex> > move(detail::thread_move_t<shared_lock<Mutex> > x)
- {
- return x;
- }
-
-
- template<typename Mutex>
     class upgrade_lock
     {
     protected:
@@ -395,6 +381,10 @@
         explicit upgrade_lock(upgrade_lock&);
         upgrade_lock& operator=(upgrade_lock&);
     public:
+ upgrade_lock():
+ m(0),is_locked(false)
+ {}
+
         explicit upgrade_lock(Mutex& m_):
             m(&m_),is_locked(false)
         {
@@ -415,16 +405,18 @@
             m(other->m),is_locked(other->is_locked)
         {
             other->is_locked=false;
+ other->m=0;
         }
 
         upgrade_lock(detail::thread_move_t<unique_lock<Mutex> > other):
             m(other->m),is_locked(other->is_locked)
         {
- other->is_locked=false;
             if(is_locked)
             {
                 m->unlock_and_lock_upgrade();
             }
+ other->is_locked=false;
+ other->m=0;
         }
 
         operator detail::thread_move_t<upgrade_lock<Mutex> >()
@@ -512,18 +504,6 @@
 
 
     template<typename Mutex>
- inline detail::thread_move_t<upgrade_lock<Mutex> > move(upgrade_lock<Mutex> & x)
- {
- return x.move();
- }
-
- template<typename Mutex>
- inline detail::thread_move_t<upgrade_lock<Mutex> > move(detail::thread_move_t<upgrade_lock<Mutex> > x)
- {
- return x;
- }
-
- template<typename Mutex>
     unique_lock<Mutex>::unique_lock(detail::thread_move_t<upgrade_lock<Mutex> > other):
         m(other->m),is_locked(other->is_locked)
     {
@@ -595,6 +575,9 @@
         {
             typedef unique_lock<Mutex> base;
         public:
+ try_lock_wrapper()
+ {}
+
             explicit try_lock_wrapper(Mutex& m):
                 base(m,try_to_lock)
             {}

Modified: branches/proto/v4/boost/thread/pthread/mutex.hpp
==============================================================================
--- branches/proto/v4/boost/thread/pthread/mutex.hpp (original)
+++ branches/proto/v4/boost/thread/pthread/mutex.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -139,6 +139,13 @@
             BOOST_ASSERT(!res || res==ETIMEDOUT);
             return !res;
         }
+
+ typedef pthread_mutex_t* native_handle_type;
+ native_handle_type native_handle()
+ {
+ return &m;
+ }
+
 #else
         void lock()
         {

Modified: branches/proto/v4/boost/thread/pthread/recursive_mutex.hpp
==============================================================================
--- branches/proto/v4/boost/thread/pthread/recursive_mutex.hpp (original)
+++ branches/proto/v4/boost/thread/pthread/recursive_mutex.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -76,6 +76,13 @@
             BOOST_ASSERT(!res || res==EBUSY);
             return !res;
         }
+
+ typedef pthread_mutex_t* native_handle_type;
+ native_handle_type native_handle()
+ {
+ return &m;
+ }
+
         typedef unique_lock<recursive_mutex> scoped_lock;
         typedef detail::try_lock_wrapper<recursive_mutex> scoped_try_lock;
     };
@@ -171,6 +178,13 @@
             BOOST_ASSERT(!res || res==EBUSY);
             return !res;
         }
+
+ typedef pthread_mutex_t* native_handle_type;
+ native_handle_type native_handle()
+ {
+ return &m;
+ }
+
 #else
         void lock()
         {

Modified: branches/proto/v4/boost/thread/pthread/thread.hpp
==============================================================================
--- branches/proto/v4/boost/thread/pthread/thread.hpp (original)
+++ branches/proto/v4/boost/thread/pthread/thread.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -222,16 +222,10 @@
         bool interruption_requested() const;
     };
 
- inline detail::thread_move_t<thread> move(thread& x)
+ inline detail::thread_move_t<thread> move(detail::thread_move_t<thread> t)
     {
- return x.move();
+ return t;
     }
-
- inline detail::thread_move_t<thread> move(detail::thread_move_t<thread> x)
- {
- return x;
- }
-
 
     template<typename F>
     struct thread::thread_data<boost::reference_wrapper<F> >:

Modified: branches/proto/v4/boost/thread/win32/basic_timed_mutex.hpp
==============================================================================
--- branches/proto/v4/boost/thread/win32/basic_timed_mutex.hpp (original)
+++ branches/proto/v4/boost/thread/win32/basic_timed_mutex.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -21,7 +21,10 @@
     {
         struct basic_timed_mutex
         {
- BOOST_STATIC_CONSTANT(long,lock_flag_value=0x80000000);
+ BOOST_STATIC_CONSTANT(unsigned char,lock_flag_bit=31);
+ BOOST_STATIC_CONSTANT(unsigned char,event_set_flag_bit=30);
+ BOOST_STATIC_CONSTANT(long,lock_flag_value=1<<lock_flag_bit);
+ BOOST_STATIC_CONSTANT(long,event_set_flag_value=1<<event_set_flag_bit);
             long active_count;
             void* event;
 
@@ -50,18 +53,7 @@
           
             bool try_lock()
             {
- long old_count=active_count&~lock_flag_value;
- do
- {
- long const current_count=BOOST_INTERLOCKED_COMPARE_EXCHANGE(&active_count,(old_count+1)|lock_flag_value,old_count);
- if(current_count==old_count)
- {
- return true;
- }
- old_count=current_count;
- }
- while(!(old_count&lock_flag_value));
- return false;
+ return !win32::interlocked_bit_test_and_set(&active_count,lock_flag_bit);
             }
             
             void lock()
@@ -70,6 +62,10 @@
             }
             bool timed_lock(::boost::system_time const& wait_until)
             {
+ if(!win32::interlocked_bit_test_and_set(&active_count,lock_flag_bit))
+ {
+ return true;
+ }
                 long old_count=active_count;
 #ifdef BOOST_MSVC
 #pragma warning(push)
@@ -80,37 +76,39 @@
 #pragma warning(pop)
 #endif
                 {
- long const current_count=BOOST_INTERLOCKED_COMPARE_EXCHANGE(&active_count,(old_count+1)|lock_flag_value,old_count);
- if(current_count==old_count)
+ long const new_count=(old_count&lock_flag_value)?(old_count+1):(old_count|lock_flag_value);
+ long const current=BOOST_INTERLOCKED_COMPARE_EXCHANGE(&active_count,new_count,old_count);
+ if(current==old_count)
                     {
                         break;
                     }
- old_count=current_count;
+ old_count=current;
                 }
 
                 if(old_count&lock_flag_value)
                 {
                     bool lock_acquired=false;
                     void* const sem=get_event();
- ++old_count; // we're waiting, too
+
                     do
                     {
- old_count-=(lock_flag_value+1); // there will be one less active thread on this mutex when it gets unlocked
                         if(win32::WaitForSingleObject(sem,::boost::detail::get_milliseconds_until(wait_until))!=0)
                         {
                             BOOST_INTERLOCKED_DECREMENT(&active_count);
                             return false;
                         }
- do
+ old_count&=~lock_flag_value;
+ old_count|=event_set_flag_value;
+ while(true)
                         {
- long const current_count=BOOST_INTERLOCKED_COMPARE_EXCHANGE(&active_count,old_count|lock_flag_value,old_count);
- if(current_count==old_count)
+ long const new_count=((old_count&lock_flag_value)?old_count:((old_count-1)|lock_flag_value))&~event_set_flag_value;
+ long const current=BOOST_INTERLOCKED_COMPARE_EXCHANGE(&active_count,new_count,old_count);
+ if(current==old_count)
                             {
                                 break;
                             }
- old_count=current_count;
+ old_count=current;
                         }
- while(!(old_count&lock_flag_value));
                         lock_acquired=!(old_count&lock_flag_value);
                     }
                     while(!lock_acquired);
@@ -131,12 +129,14 @@
 
             void unlock()
             {
- long const offset=lock_flag_value+1;
- long old_count=BOOST_INTERLOCKED_EXCHANGE_ADD(&active_count,(~offset)+1);
-
- if(old_count>offset)
+ long const offset=lock_flag_value;
+ long const old_count=BOOST_INTERLOCKED_EXCHANGE_ADD(&active_count,lock_flag_value);
+ if(!(old_count&event_set_flag_value) && (old_count>offset))
                 {
- win32::SetEvent(get_event());
+ if(!win32::interlocked_bit_test_and_set(&active_count,event_set_flag_bit))
+ {
+ win32::SetEvent(get_event());
+ }
                 }
             }
 

Modified: branches/proto/v4/boost/thread/win32/thread.hpp
==============================================================================
--- branches/proto/v4/boost/thread/win32/thread.hpp (original)
+++ branches/proto/v4/boost/thread/win32/thread.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -281,14 +281,9 @@
         bool interruption_requested() const;
     };
 
- inline detail::thread_move_t<thread> move(thread& x)
+ inline detail::thread_move_t<thread> move(detail::thread_move_t<thread> t)
     {
- return x.move();
- }
-
- inline detail::thread_move_t<thread> move(detail::thread_move_t<thread> x)
- {
- return x;
+ return t;
     }
 
     template<typename F>

Modified: branches/proto/v4/boost/thread/win32/thread_primitives.hpp
==============================================================================
--- branches/proto/v4/boost/thread/win32/thread_primitives.hpp (original)
+++ branches/proto/v4/boost/thread/win32/thread_primitives.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -13,6 +13,7 @@
 #include <boost/config.hpp>
 #include <boost/assert.hpp>
 #include <boost/thread/exceptions.hpp>
+#include <boost/detail/interlocked.hpp>
 #include <algorithm>
 
 #if defined( BOOST_USE_WINDOWS_H )
@@ -277,5 +278,113 @@
     }
 }
 
+#if defined(BOOST_MSVC) || defined(BOOST_INTEL_WIN)
+#if MSC_VER>=1400
+extern "C" unsigned char _interlockedbittestandset(long *a,long b);
+extern "C" unsigned char _interlockedbittestandreset(long *a,long b);
+
+#pragma intrinsic(_interlockedbittestandset)
+#pragma intrinsic(_interlockedbittestandreset)
+
+namespace boost
+{
+ namespace detail
+ {
+ namespace win32
+ {
+ inline bool interlocked_bit_test_and_set(long* x,long bit)
+ {
+ return _interlockedbittestandset(x,bit);
+ }
+
+ inline bool interlocked_bit_test_and_reset(long* x,long bit)
+ {
+ return _interlockedbittestandreset(x,bit);
+ }
+
+ }
+ }
+}
+#define BOOST_THREAD_BTS_DEFINED
+#elif defined(_M_IX86)
+namespace boost
+{
+ namespace detail
+ {
+ namespace win32
+ {
+ inline bool interlocked_bit_test_and_set(long* x,long bit)
+ {
+ __asm {
+ mov eax,bit;
+ mov edx,x;
+ lock bts [edx],eax;
+ setc al;
+ };
+ }
+
+ inline bool interlocked_bit_test_and_reset(long* x,long bit)
+ {
+ __asm {
+ mov eax,bit;
+ mov edx,x;
+ lock btr [edx],eax;
+ setc al;
+ };
+ }
+
+ }
+ }
+}
+#define BOOST_THREAD_BTS_DEFINED
+#endif
+#endif
+
+#ifndef BOOST_THREAD_BTS_DEFINED
+
+namespace boost
+{
+ namespace detail
+ {
+ namespace win32
+ {
+ inline bool interlocked_bit_test_and_set(long* x,long bit)
+ {
+ long const value=1<<bit;
+ long old=*x;
+ do
+ {
+ long const current=BOOST_INTERLOCKED_COMPARE_EXCHANGE(x,old|value,old);
+ if(current==old)
+ {
+ break;
+ }
+ old=current;
+ }
+ while(true);
+ return (old&value)!=0;
+ }
+
+ inline bool interlocked_bit_test_and_reset(long* x,long bit)
+ {
+ long const value=1<<bit;
+ long old=*x;
+ do
+ {
+ long const current=BOOST_INTERLOCKED_COMPARE_EXCHANGE(x,old&~value,old);
+ if(current==old)
+ {
+ break;
+ }
+ old=current;
+ }
+ while(true);
+ return (old&value)!=0;
+ }
+ }
+ }
+}
+#endif
+
 
 #endif

Modified: branches/proto/v4/boost/throw_exception.hpp
==============================================================================
--- branches/proto/v4/boost/throw_exception.hpp (original)
+++ branches/proto/v4/boost/throw_exception.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -11,23 +11,30 @@
 // boost/throw_exception.hpp
 //
 // Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+// Copyright (c) 2008 Emil Dotchevski and Reverge Studios, Inc.
 //
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
 //
 // http://www.boost.org/libs/utility/throw_exception.html
 //
 
 #include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <exception>
 
-#ifdef BOOST_NO_EXCEPTIONS
-# include <exception>
-#else
-# ifndef BOOST_EXCEPTION_DISABLE
-# include <boost/exception/enable_current_exception.hpp>
-# include <boost/exception/enable_error_info.hpp>
-# endif
+#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, <= 0x551 )
+# define BOOST_EXCEPTION_DISABLE
+#endif
+
+#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1310 )
+# define BOOST_EXCEPTION_DISABLE
+#endif
+
+#if !defined( BOOST_NO_EXCEPTIONS ) && !defined( BOOST_EXCEPTION_DISABLE )
+# include <boost/exception/enable_current_exception.hpp>
+# include <boost/exception/enable_error_info.hpp>
 #endif
 
 namespace boost
@@ -35,12 +42,18 @@
 
 #ifdef BOOST_NO_EXCEPTIONS
 
-void throw_exception(std::exception const & e); // user defined
+void throw_exception( std::exception const & e ); // user defined
 
 #else
 
-template<class E> inline void throw_exception(E const & e)
+inline void throw_exception_assert_compatibility( std::exception const & ) { }
+
+template<class E> inline void throw_exception( E const & e )
 {
+ //All boost exceptions are required to derive std::exception,
+ //to ensure compatibility with BOOST_NO_EXCEPTIONS.
+ throw_exception_assert_compatibility(e);
+
 #ifndef BOOST_EXCEPTION_DISABLE
     throw enable_current_exception(enable_error_info(e));
 #else

Modified: branches/proto/v4/boost/unordered/detail/config.hpp
==============================================================================
--- branches/proto/v4/boost/unordered/detail/config.hpp (original)
+++ branches/proto/v4/boost/unordered/detail/config.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -13,6 +13,9 @@
 #elif defined(__GNUC__) && \
     (__GNUC__ < 3 || __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
 # define BOOST_UNORDERED_NO_HAS_MOVE_ASSIGN
+#elif BOOST_WORKAROUND(BOOST_INTEL, < 900) || \
+ BOOST_WORKAROUND(__EDG_VERSION__, < 304)
+# define BOOST_UNORDERED_NO_HAS_MOVE_ASSIGN
 #endif
 
 #endif

Modified: branches/proto/v4/boost/wave/util/cpp_include_paths.hpp
==============================================================================
--- branches/proto/v4/boost/wave/util/cpp_include_paths.hpp (original)
+++ branches/proto/v4/boost/wave/util/cpp_include_paths.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -328,7 +328,7 @@
         
         if (fs::exists(currpath)) {
             fs::path dirpath (s, fs::native);
- if (!dirpath.has_root_name()) {
+ if (!dirpath.has_root_directory()) {
                 dirpath = fs::path((*it).second, fs::native);
                 dirpath /= fs::path(s, fs::native);
             }
@@ -364,7 +364,7 @@
             // if 0 != current_path (#include_next handling) it can't be
             // the file in the current directory
                 fs::path dirpath (s, fs::native);
- if (!dirpath.has_root_name()) {
+ if (!dirpath.has_root_directory()) {
                     dirpath = fs::path(current_rel_dir.string(), fs::native);
                     dirpath /= fs::path(s, fs::native);
                 }

Modified: branches/proto/v4/boost/weak_ptr.hpp
==============================================================================
--- branches/proto/v4/boost/weak_ptr.hpp (original)
+++ branches/proto/v4/boost/weak_ptr.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -61,13 +61,31 @@
 //
 
     template<class Y>
- weak_ptr(weak_ptr<Y> const & r): pn(r.pn) // never throws
+#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
+
+ weak_ptr( weak_ptr<Y> const & r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() )
+
+#else
+
+ weak_ptr( weak_ptr<Y> const & r )
+
+#endif
+ : pn(r.pn) // never throws
     {
         px = r.lock().get();
     }
 
     template<class Y>
- weak_ptr(shared_ptr<Y> const & r): px(r.px), pn(r.pn) // never throws
+#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
+
+ weak_ptr( shared_ptr<Y> const & r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() )
+
+#else
+
+ weak_ptr( shared_ptr<Y> const & r )
+
+#endif
+ : px( r.px ), pn( r.pn ) // never throws
     {
     }
 

Modified: branches/proto/v4/libs/any/test.hpp
==============================================================================
--- branches/proto/v4/libs/any/test.hpp (original)
+++ branches/proto/v4/libs/any/test.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -232,7 +232,12 @@
     template<typename test_iterator>
     bool tester<test_iterator>::operator()()
     {
- using namespace std;
+ using std::cerr;
+ using std::endl;
+ using std::ends;
+ using std::exception;
+ using std::flush;
+ using std::string;
 
         unsigned long passed = 0, failed = 0, unimplemented = 0;
 
@@ -251,9 +256,9 @@
                     unsigned long allocated = allocations::instance().allocated();
                     unsigned long deallocated = allocations::instance().deallocated();
 #ifdef BOOST_NO_STRINGSTREAM
- ostrstream report;
+ std::ostrstream report;
 #else
- ostringstream report;
+ std::ostringstream report;
 #endif
                     report << "new/delete ("
                            << allocated << " allocated, "

Modified: branches/proto/v4/libs/exception/doc/boost-exception.html
==============================================================================
--- branches/proto/v4/libs/exception/doc/boost-exception.html (original)
+++ branches/proto/v4/libs/exception/doc/boost-exception.html 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -404,7 +404,9 @@
     void <span class="RenoLink">throw_exception</span>( E const &amp; e );
 #endif</span>
     }</pre>
-</div><h4>Effects:</h4>
+</div><h4>Requirements:</h4>
+<p><tt>E</tt> must derive publicly from <tt>std::exception</tt>.</p>
+<h4>Effects:</h4>
 <div><ul><li> If <tt>BOOST_NO_EXCEPTIONS</tt> is not defined, <tt>boost::<span class="RenoLink">throw_exception</span>(e)</tt> is equivalent to <tt>throw boost::<span class="RenoLink">enable_current_exception</span>(boost::<span class="RenoLink">enable_error_info</span>(e))</tt>, unless <tt>BOOST_EXCEPTION_DISABLE</tt> is defined, in which case <tt>boost::<span class="RenoLink">throw_exception</span>(e)</tt> is equivalent to <tt>throw e;</tt></li>
 <li> If <tt>BOOST_NO_EXCEPTIONS</tt> is defined, the function is left undefined, and the user is expected to supply an appropriate definition. Callers of <tt>throw_exception</tt> are allowed to assume that the function never returns; therefore, if the user-defined <tt>throw_exception</tt> returns, the behavior is undefined.</li>
 </ul></div>

Modified: branches/proto/v4/libs/exception/doc/source/boost-exception.reno
==============================================================================
--- branches/proto/v4/libs/exception/doc/source/boost-exception.reno (original)
+++ branches/proto/v4/libs/exception/doc/source/boost-exception.reno 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -61,28 +61,32 @@
                                                                                                                                 <hook>
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
- <size>1</size>
- <strong>DFB8EFE8A4EE9FB101DC20A69A4217A96B78A272D7DE88D579CFE8ECCC070531</strong>
- <weak>2228033283</weak>
- <size>94</size>
- <position>227</position>
+ <size>2</size>
+ <strong>33C9C03A97DEE6FC1B9B36E8832FF546419173B8389B8488206E7A3DE9C7CA88</strong>
+ <weak>2998452034</weak>
+ <size>583</size>
+ <position>867</position>
+ <strong>99278A58AB0ED511046D5EBEE4B616E145C9D69033CD5577EC8BF3761227A46A</strong>
+ <weak>1992783533</weak>
+ <size>359</size>
+ <position>211</position>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
                                                                                                                                 <file>
                                                                                                                                         <path>
                                                                                                                                                 <empty>0</empty>
- <string>../../../../boost/exception/enable_error_info.hpp</string>
+ <string>../../../../boost/throw_exception.hpp</string>
                                                                                                                                                 <type>0</type>
                                                                                                                                                 <base>0</base>
                                                                                                                                         </path>
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>boost/exception/enable_error_info.hpp</string>
+ <string>throw_exception</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
- <string>exception_enable_error_info_hpp</string>
+ <string></string>
                                                                                                                         </file_name>
                                                                                                                 </object>
                                                                                                         </shared_ptr>
@@ -90,7 +94,7 @@
                                                                                                 <container>
                                                                                                         <size>1</size>
                                                                                                         <variant>2</variant>
- <string>!!!boost/exception/enable_error_info.hpp&#10;&#10;&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -106,28 +110,21 @@
                                                                                                                                 <hook>
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
- <size>1</size>
- <strong>CAD6C404CB725D336A44920D2341ECA131149AB02C368B59028F8147F16737BF</strong>
- <weak>2258638601</weak>
- <size>94</size>
- <position>227</position>
+ <size>0</size>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
                                                                                                                                 <file>
                                                                                                                                         <path>
- <empty>0</empty>
- <string>../../../../boost/exception/info_tuple.hpp</string>
- <type>0</type>
- <base>0</base>
+ <empty>1</empty>
                                                                                                                                         </path>
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>boost/exception/info_tuple.hpp</string>
+ <string>Tutorial: Transporting of Arbitrary Data to the Catch Site</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
- <string>exception_error_info_group_hpp</string>
+ <string>transporting_data</string>
                                                                                                                         </file_name>
                                                                                                                 </object>
                                                                                                         </shared_ptr>
@@ -135,7 +132,7 @@
                                                                                                 <container>
                                                                                                         <size>1</size>
                                                                                                         <variant>2</variant>
- <string>!!!boost/exception/info_tuple.hpp&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -152,87 +149,74 @@
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
                                                                                                                                                         <size>1</size>
- <strong>EB524A8A61E5F1A93CE4336B980696C09E7ADF42A6B933BA76EFB1544AB7C4CC</strong>
- <weak>2274957083</weak>
- <size>94</size>
- <position>227</position>
+ <strong>D9B8E6AA12A4F33953B1A961FA590C5A3840234B6531CA8C04AC985AD5800835</strong>
+ <weak>2432554768</weak>
+ <size>702</size>
+ <position>408</position>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
                                                                                                                                 <file>
                                                                                                                                         <path>
                                                                                                                                                 <empty>0</empty>
- <string>../../../../boost/exception/error_info.hpp</string>
+ <string>../../example/enable_error_info.cpp</string>
                                                                                                                                                 <type>0</type>
                                                                                                                                                 <base>0</base>
                                                                                                                                         </path>
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>boost/exception/error_info.hpp</string>
+ <string>Tutorial: Integrating Boost Exception in Existing Exception Class Hierarchies</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
- <string>exception_error_info_value_hpp</string>
+ <string>using_enable_error_info</string>
                                                                                                                         </file_name>
                                                                                                                 </object>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
- <variant>2</variant>
- <string>!!!boost/exception/error_info.hpp&#10;&#10;This header file contains the following declaration:&#10;&#10;[@namespace&#10;boost&#10; {&#10; template &lt;class Tag, class T&gt;&#10; class (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>8</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
- <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>2</size>
- <strong>7AC7304D50E623B0954AEB799FFFDDD646C8F62AFFD31BBB79A7EBA312A17AE8</strong>
- <weak>2015761243</weak>
- <size>6002</size>
- <position>737</position>
- <strong>865A7E598C4F2EDA41CCDFAD253F5E4699012898C97E29E3CB1C68DABA0C62B1</strong>
- <weak>2395321958</weak>
- <size>721</size>
- <position>528</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
- </hook>
- <title>
- <string>error_info</string>
- </title>
- <file_name>
- <string></string>
- </file_name>
- </object>
- </shared_ptr>
- </weak_ptr>
+ <size>1</size>
                                                                                                         <variant>2</variant>
- <string>:);&#10; }@]&#10;</string>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-8</id>
+ <id>8</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
+ <hook>
+ <stream_hook_path>
+ <container>
+ <size>1</size>
+ <strong>AEB5EEC1A44A4F0B184A6F73617CB57E82CE06A15DB6036D54109C66CDE06EFF</strong>
+ <weak>625364235</weak>
+ <size>290</size>
+ <position>302</position>
+ </container>
+ </stream_hook_path>
+ </hook>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../example/logging.cpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>Tutorial: Logging of boost::exception Objects</string>
+ </title>
+ <file_name>
+ <string>logging</string>
+ </file_name>
+ </object>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
@@ -254,25 +238,29 @@
                                                                                                                                 <hook>
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
- <size>1</size>
- <strong>49D31376D97691F7C84A134B5D8C7C66EF1ED6901D376CA250D634AE2B38AB5E</strong>
- <weak>549270010</weak>
- <size>163</size>
- <position>572</position>
+ <size>2</size>
+ <strong>4DA932D1993B771C5283379491E9425AAE1E6D132B21E074D08BAADF069A2B23</strong>
+ <weak>280314796</weak>
+ <size>2045</size>
+ <position>434</position>
+ <strong>6C36EC2567753CC18222000D43FD485704631A9F79F4B5C1BE9DE4D8282D4AE5</strong>
+ <weak>2163400011</weak>
+ <size>715</size>
+ <position>846</position>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
                                                                                                                                 <file>
                                                                                                                                         <path>
                                                                                                                                                 <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
+ <string>../../../../boost/exception/exception.hpp</string>
                                                                                                                                                 <type>0</type>
                                                                                                                                                 <base>0</base>
                                                                                                                                         </path>
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>BOOST_ERROR_INFO</string>
+ <string>exception</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
                                                                                                                                 <string></string>
@@ -300,28 +288,28 @@
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
                                                                                                                                                         <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>ED09F845070FF7D381BE5EFB6B55313FD09FBA16B64B69992410380EFA45519C</strong>
- <weak>2051939590</weak>
- <size>78</size>
- <position>363</position>
+ <strong>F2625EB427DE44F90BD9E85E4E593BFF0FA732700934105770F16C8224BAA525</strong>
+ <weak>1648371423</weak>
+ <size>6100</size>
+ <position>737</position>
+ <strong>27AC1164E0A824D548386BEDCDC81DCAC283F3D286B0ECEE05B039BB8C392BFC</strong>
+ <weak>1247954090</weak>
+ <size>249</size>
+ <position>1499</position>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
                                                                                                                                 <file>
                                                                                                                                         <path>
                                                                                                                                                 <empty>0</empty>
- <string>../../../../boost/exception_ptr.hpp</string>
+ <string>../../../../boost/exception/info.hpp</string>
                                                                                                                                                 <type>0</type>
                                                                                                                                                 <base>0</base>
                                                                                                                                         </path>
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>exception_ptr</string>
+ <string>operator&lt;&lt;/exception</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
                                                                                                                                 <string></string>
@@ -349,28 +337,28 @@
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
                                                                                                                                                         <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>921FBF6991E17349BFF2AD6F165372F85AA9457DDB28E502ABB6B392BBA6B529</strong>
- <weak>3119269037</weak>
- <size>284</size>
- <position>4306</position>
+ <strong>F2625EB427DE44F90BD9E85E4E593BFF0FA732700934105770F16C8224BAA525</strong>
+ <weak>1648371423</weak>
+ <size>6100</size>
+ <position>737</position>
+ <strong>65D13C1BB0A16823F69A32BAB56A51CA317075C7FC8B7441EE0D9B57AF5AB2AC</strong>
+ <weak>2592266329</weak>
+ <size>712</size>
+ <position>1750</position>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
                                                                                                                                 <file>
                                                                                                                                         <path>
                                                                                                                                                 <empty>0</empty>
- <string>../../../../boost/exception_ptr.hpp</string>
+ <string>../../../../boost/exception/info.hpp</string>
                                                                                                                                                 <type>0</type>
                                                                                                                                                 <base>0</base>
                                                                                                                                         </path>
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>copy_exception</string>
+ <string>get_error_info</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
                                                                                                                                 <string></string>
@@ -398,28 +386,28 @@
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
                                                                                                                                                         <size>2</size>
- <strong>0ABC82B04F3761C21F4588ABC9D5F82BAF3F293974F0ECE694303EFB59BA7376</strong>
- <weak>3824507607</weak>
- <size>2762</size>
- <position>516</position>
- <strong>8F3B5E1A267CA225679713F4DDF528041F573BC02D1DBCD8FFEF57EF0AA599B9</strong>
- <weak>4197332561</weak>
- <size>180</size>
- <position>2576</position>
+ <strong>C4D33E012F1FD360A08BE7032246E4361A8D8A3E1D316D454707AD9484C9F8C0</strong>
+ <weak>2765396103</weak>
+ <size>1505</size>
+ <position>367</position>
+ <strong>21F529F6CC88DB2566F36223A07F700BD043680083D73ABA1A7444A663AAFCFF</strong>
+ <weak>4141043385</weak>
+ <size>241</size>
+ <position>1258</position>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
                                                                                                                                 <file>
                                                                                                                                         <path>
                                                                                                                                                 <empty>0</empty>
- <string>../../../../boost/exception/enable_current_exception.hpp</string>
+ <string>../../../../boost/exception/enable_error_info.hpp</string>
                                                                                                                                                 <type>0</type>
                                                                                                                                                 <base>0</base>
                                                                                                                                         </path>
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>enable_current_exception</string>
+ <string>enable_error_info</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
                                                                                                                                 <string></string>
@@ -447,14 +435,14 @@
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
                                                                                                                                                         <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>9DEEF8ED70BF74F501A96BA5DE5BFD42FAD16DE333ABE189E512C332586FC465</strong>
- <weak>2250569940</weak>
- <size>1893</size>
- <position>2411</position>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>156B870761DB092CE4269C1173B479A344A1041BA2B883765AF19A72B371D776</strong>
+ <weak>3239976720</weak>
+ <size>117</size>
+ <position>4709</position>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
@@ -468,7 +456,7 @@
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>current_exception</string>
+ <string>rethrow_exception</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
                                                                                                                                 <string></string>
@@ -496,8 +484,8 @@
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
                                                                                                                                                         <size>1</size>
- <strong>5EE6ED209B5DBBD30DFCDA1FD30719A799EE9DBD48A5176F73EADB588CAEB2AA</strong>
- <weak>2442598207</weak>
+ <strong>E64E4DFB1DC251F844260AE133EFD419677D0F7143D65B578DEE525492F6B624</strong>
+ <weak>2172131053</weak>
                                                                                                                                                         <size>94</size>
                                                                                                                                                         <position>227</position>
                                                                                                                                                 </container>
@@ -506,17 +494,17 @@
                                                                                                                                 <file>
                                                                                                                                         <path>
                                                                                                                                                 <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
+ <string>../../../../boost/exception.hpp</string>
                                                                                                                                                 <type>0</type>
                                                                                                                                                 <base>0</base>
                                                                                                                                         </path>
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>boost/exception/info.hpp</string>
+ <string>boost/exception.hpp</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
- <string>exception_error_info_hpp</string>
+ <string>exception_hpp</string>
                                                                                                                         </file_name>
                                                                                                                 </object>
                                                                                                         </shared_ptr>
@@ -524,7 +512,7 @@
                                                                                                 <container>
                                                                                                         <size>1</size>
                                                                                                         <variant>2</variant>
- <string>!!!boost/exception/info.hpp&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ <string>!!!boost/exception.hpp&#10;&#10;This header file includes all other header files of Boost Exception:&#10;&#10;(:pagelist tags=&quot;header&quot;:)&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -540,15 +528,11 @@
                                                                                                                                 <hook>
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
- <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>7B6F48BAF7F452EDAEC5D09418936D96101CCA8700CD7469B9C7DA5DCA659E6A</strong>
- <weak>3892925390</weak>
- <size>335</size>
- <position>26</position>
+ <size>1</size>
+ <strong>40C2FBC8600FE6877A6D46EC005D97EB1F612B8687CCA297C838E10A80E089AA</strong>
+ <weak>2576029551</weak>
+ <size>94</size>
+ <position>227</position>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
@@ -562,10 +546,10 @@
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>unknown_exception</string>
+ <string>boost/exception_ptr.hpp</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
- <string></string>
+ <string>exception_cloning_hpp</string>
                                                                                                                         </file_name>
                                                                                                                 </object>
                                                                                                         </shared_ptr>
@@ -573,7 +557,7 @@
                                                                                                 <container>
                                                                                                         <size>1</size>
                                                                                                         <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
+ <string>!!!boost/exception_ptr.hpp&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -589,197 +573,266 @@
                                                                                                                                 <hook>
                                                                                                                                         <stream_hook_path>
                                                                                                                                                 <container>
- <size>0</size>
+ <size>1</size>
+ <strong>2C5F1B7E5C5052C9C9305848AB499A9C166D728EAAD25DC936B75FCA997A0650</strong>
+ <weak>3171555959</weak>
+ <size>88</size>
+ <position>1</position>
                                                                                                                                                 </container>
                                                                                                                                         </stream_hook_path>
                                                                                                                                 </hook>
                                                                                                                                 <file>
                                                                                                                                         <path>
- <empty>1</empty>
+ <empty>0</empty>
+ <string>../../../../boost/throw_exception.hpp</string>
+ <type>0</type>
+ <base>0</base>
                                                                                                                                         </path>
                                                                                                                                 </file>
                                                                                                                         </hook>
                                                                                                                         <title>
- <string>Boost Exception</string>
+ <string>boost/throw_exception.hpp</string>
                                                                                                                         </title>
                                                                                                                         <file_name>
- <string>boost-exception</string>
+ <string>throw_exception_hpp</string>
                                                                                                                         </file_name>
                                                                                                                 </object>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>113</size>
+ <size>1</size>
                                                                                                         <variant>2</variant>
- <string>!!Abstract&#10;&#10;The purpose of Boost Exception is to ease the design of exception class hierarchies and to help write exception handling and error reporting code.&#10;&#10;It supports transporting of arbitrary data to the catch site, which is otherwise tricky due to the no-throw requirements (15.5.1) for exception classes. Data can be added to any exception object, either directly in the throw-expression (15.1), or at a later time as the exception object propagates up the call stack.&#10;&#10;The ability to add data to exception objects after they have been passed to @@throw@@ is important, because often some of the information needed to handle an exception is unavailable in the context where the failure is detected. &#10;&#10;Boost Exception also supports (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>17</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
+ <string>!!!boost/exception/throw_exception.hpp&#10;&#10;&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>17</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
                                                                                                                                 <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>0</size>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>1</empty>
- </path>
- </file>
+ <stream_hook_path>
+ <container>
+ <size>1</size>
+ <strong>C9AFCA0931CB65AE31811E702FC48CB22348149B1D259CD9161D391FEC640FA8</strong>
+ <weak>2324436793</weak>
+ <size>94</size>
+ <position>227</position>
+ </container>
+ </stream_hook_path>
                                                                                                                                 </hook>
- <title>
- <string>Tutorial: Transporting of Exceptions between Threads</string>
- </title>
- <file_name>
- <string>cloning</string>
- </file_name>
- </object>
- </shared_ptr>
- </weak_ptr>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception/exception.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>boost/exception/exception.hpp</string>
+ </title>
+ <file_name>
+ <string>exception_exception_hpp</string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
                                                                                                         <variant>2</variant>
- <string>|cloning:) of exception objects, implemented non-intrusively and automatically by the @@boost::(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>18</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
- <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>2</size>
- <strong>BE8985294A55E37D9B677C21D50CF4EB5251827504230A4FE52FCB7702370F51</strong>
- <weak>1124820874</weak>
- <size>329</size>
- <position>864</position>
- <strong>02FC4C7F80E4704A722A49C8337614DB5DF60CA53B53AAD869CD7ECE2DCBE057</strong>
- <weak>928857252</weak>
- <size>187</size>
- <position>129</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/throw_exception.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
+ <string>!!!boost/exception/exception.hpp&#10;&#10;&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>18</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
+ <hook>
+ <stream_hook_path>
+ <container>
+ <size>1</size>
+ <strong>A9C65F105342D728DE9C996079E82DF25408B94A272090039FAAC12D29659F69</strong>
+ <weak>2378831669</weak>
+ <size>94</size>
+ <position>227</position>
+ </container>
+ </stream_hook_path>
                                                                                                                                 </hook>
- <title>
- <string>throw_exception</string>
- </title>
- <file_name>
- <string></string>
- </file_name>
- </object>
- </shared_ptr>
- </weak_ptr>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception/enable_current_exception.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>boost/exception/enable_current_exception.hpp</string>
+ </title>
+ <file_name>
+ <string>exception_enable_exception_cloning_hpp</string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
                                                                                                         <variant>2</variant>
- <string>:)()@@ function.&#10;&#10;!!!!Note:&#10;&#10;Boost Exception was accepted as a Boost library on November 7 2007, however it has not yet been part of an official Boost release. Current version can be downloaded from (:link http://svn.boost.org/svn/boost/trunk | Boost SVN:).&#10;&#10;!!Contents&#10;&#10;#Tutorial&#10;##(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>19</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
+ <string>!!!boost/exception/enable_current_exception.hpp&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>19</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
                                                                                                                                 <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>0</size>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>1</empty>
- </path>
- </file>
+ <stream_hook_path>
+ <container>
+ <size>1</size>
+ <strong>DFB8EFE8A4EE9FB101DC20A69A4217A96B78A272D7DE88D579CFE8ECCC070531</strong>
+ <weak>2228033283</weak>
+ <size>94</size>
+ <position>227</position>
+ </container>
+ </stream_hook_path>
                                                                                                                                 </hook>
- <title>
- <string>Tutorial: Transporting of Arbitrary Data to the Catch Site</string>
- </title>
- <file_name>
- <string>transporting_data</string>
- </file_name>
- </object>
- </shared_ptr>
- </weak_ptr>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception/enable_error_info.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>boost/exception/enable_error_info.hpp</string>
+ </title>
+ <file_name>
+ <string>exception_enable_error_info_hpp</string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
                                                                                                         <variant>2</variant>
- <string>:)&#10;##(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>20</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
+ <string>!!!boost/exception/enable_error_info.hpp&#10;&#10;&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>20</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
                                                                                                                                 <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>1</size>
- <strong>D9B8E6AA12A4F33953B1A961FA590C5A3840234B6531CA8C04AC985AD5800835</strong>
- <weak>2432554768</weak>
- <size>702</size>
- <position>408</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../example/enable_error_info.cpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
+ <stream_hook_path>
+ <container>
+ <size>1</size>
+ <strong>CAD6C404CB725D336A44920D2341ECA131149AB02C368B59028F8147F16737BF</strong>
+ <weak>2258638601</weak>
+ <size>94</size>
+ <position>227</position>
+ </container>
+ </stream_hook_path>
                                                                                                                                 </hook>
- <title>
- <string>Tutorial: Integrating Boost Exception in Existing Exception Class Hierarchies</string>
- </title>
- <file_name>
- <string>using_enable_error_info</string>
- </file_name>
- </object>
- </shared_ptr>
- </weak_ptr>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception/info_tuple.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>boost/exception/info_tuple.hpp</string>
+ </title>
+ <file_name>
+ <string>exception_error_info_group_hpp</string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
                                                                                                         <variant>2</variant>
- <string>:)&#10;##(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-17</id>
- </shared_ptr>
- </weak_ptr>
+ <string>!!!boost/exception/info_tuple.hpp&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>21</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
+ <hook>
+ <stream_hook_path>
+ <container>
+ <size>1</size>
+ <strong>EB524A8A61E5F1A93CE4336B980696C09E7ADF42A6B933BA76EFB1544AB7C4CC</strong>
+ <weak>2274957083</weak>
+ <size>94</size>
+ <position>227</position>
+ </container>
+ </stream_hook_path>
+ </hook>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception/error_info.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>boost/exception/error_info.hpp</string>
+ </title>
+ <file_name>
+ <string>exception_error_info_value_hpp</string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>3</size>
                                                                                                         <variant>2</variant>
- <string>:)&#10;##(:link </string>
+ <string>!!!boost/exception/error_info.hpp&#10;&#10;This header file contains the following declaration:&#10;&#10;[@namespace&#10;boost&#10; {&#10; template &lt;class Tag, class T&gt;&#10; class (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>21</id>
+ <id>22</id>
                                                                                                                         <type>
                                                                                                                                 <string>reno_context</string>
                                                                                                                         </type>
@@ -788,138 +841,429 @@
                                                                                                                                         <hook>
                                                                                                                                                 <stream_hook_path>
                                                                                                                                                         <container>
- <size>1</size>
- <strong>AEB5EEC1A44A4F0B184A6F73617CB57E82CE06A15DB6036D54109C66CDE06EFF</strong>
- <weak>625364235</weak>
- <size>290</size>
- <position>302</position>
+ <size>2</size>
+ <strong>F2625EB427DE44F90BD9E85E4E593BFF0FA732700934105770F16C8224BAA525</strong>
+ <weak>1648371423</weak>
+ <size>6100</size>
+ <position>737</position>
+ <strong>865A7E598C4F2EDA41CCDFAD253F5E4699012898C97E29E3CB1C68DABA0C62B1</strong>
+ <weak>2395321958</weak>
+ <size>721</size>
+ <position>626</position>
                                                                                                                                                         </container>
                                                                                                                                                 </stream_hook_path>
                                                                                                                                         </hook>
                                                                                                                                         <file>
                                                                                                                                                 <path>
                                                                                                                                                         <empty>0</empty>
- <string>../../example/logging.cpp</string>
+ <string>../../../../boost/exception/info.hpp</string>
                                                                                                                                                         <type>0</type>
                                                                                                                                                         <base>0</base>
                                                                                                                                                 </path>
                                                                                                                                         </file>
                                                                                                                                 </hook>
                                                                                                                                 <title>
- <string>Tutorial: Logging of boost::exception Objects</string>
+ <string>error_info</string>
                                                                                                                                 </title>
                                                                                                                                 <file_name>
- <string>logging</string>
+ <string></string>
                                                                                                                                 </file_name>
                                                                                                                         </object>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&#10;#Documentation&#10;##Class @@(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>22</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
+ <string>:);&#10; }@]&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-22</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
+ <variant>2</variant>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>23</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
                                                                                                                                 <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>2</size>
- <strong>4DA932D1993B771C5283379491E9425AAE1E6D132B21E074D08BAADF069A2B23</strong>
- <weak>280314796</weak>
- <size>2045</size>
- <position>434</position>
- <strong>6C36EC2567753CC18222000D43FD485704631A9F79F4B5C1BE9DE4D8282D4AE5</strong>
- <weak>2163400011</weak>
- <size>715</size>
- <position>846</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/exception/exception.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
+ <stream_hook_path>
+ <container>
+ <size>1</size>
+ <strong>49D31376D97691F7C84A134B5D8C7C66EF1ED6901D376CA250D634AE2B38AB5E</strong>
+ <weak>549270010</weak>
+ <size>163</size>
+ <position>572</position>
+ </container>
+ </stream_hook_path>
                                                                                                                                 </hook>
- <title>
- <string>exception</string>
- </title>
- <file_name>
- <string></string>
- </file_name>
- </object>
- </shared_ptr>
- </weak_ptr>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception/info.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>BOOST_ERROR_INFO</string>
+ </title>
+ <file_name>
+ <string></string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
                                                                                                         <variant>2</variant>
- <string>:)@@&#10;##Transporting of Arbitrary Data to the Catch Site&#10;###@@(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-8</id>
- </shared_ptr>
- </weak_ptr>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>24</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
+ <hook>
+ <stream_hook_path>
+ <container>
+ <size>2</size>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>ED09F845070FF7D381BE5EFB6B55313FD09FBA16B64B69992410380EFA45519C</strong>
+ <weak>2051939590</weak>
+ <size>78</size>
+ <position>409</position>
+ </container>
+ </stream_hook_path>
+ </hook>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception_ptr.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>exception_ptr</string>
+ </title>
+ <file_name>
+ <string></string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
                                                                                                         <variant>2</variant>
- <string>:)@@&#10;###@@(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>23</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>25</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
                                                                                                                                 <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>2</size>
- <strong>7AC7304D50E623B0954AEB799FFFDDD646C8F62AFFD31BBB79A7EBA312A17AE8</strong>
- <weak>2015761243</weak>
- <size>6002</size>
- <position>737</position>
- <strong>27AC1164E0A824D548386BEDCDC81DCAC283F3D286B0ECEE05B039BB8C392BFC</strong>
- <weak>1247954090</weak>
- <size>249</size>
- <position>1401</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
+ <stream_hook_path>
+ <container>
+ <size>2</size>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>921FBF6991E17349BFF2AD6F165372F85AA9457DDB28E502ABB6B392BBA6B529</strong>
+ <weak>3119269037</weak>
+ <size>284</size>
+ <position>4423</position>
+ </container>
+ </stream_hook_path>
                                                                                                                                 </hook>
- <title>
- <string>operator&lt;&lt;/exception</string>
- </title>
- <file_name>
- <string></string>
- </file_name>
- </object>
- </shared_ptr>
- </weak_ptr>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception_ptr.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>copy_exception</string>
+ </title>
+ <file_name>
+ <string></string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
+ <variant>2</variant>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>26</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
+ <hook>
+ <stream_hook_path>
+ <container>
+ <size>2</size>
+ <strong>0ABC82B04F3761C21F4588ABC9D5F82BAF3F293974F0ECE694303EFB59BA7376</strong>
+ <weak>3824507607</weak>
+ <size>2762</size>
+ <position>516</position>
+ <strong>8F3B5E1A267CA225679713F4DDF528041F573BC02D1DBCD8FFEF57EF0AA599B9</strong>
+ <weak>4197332561</weak>
+ <size>180</size>
+ <position>2576</position>
+ </container>
+ </stream_hook_path>
+ </hook>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception/enable_current_exception.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>enable_current_exception</string>
+ </title>
+ <file_name>
+ <string></string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
+ <variant>2</variant>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>27</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
+ <hook>
+ <stream_hook_path>
+ <container>
+ <size>2</size>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>9DEEF8ED70BF74F501A96BA5DE5BFD42FAD16DE333ABE189E512C332586FC465</strong>
+ <weak>2250569940</weak>
+ <size>1893</size>
+ <position>2528</position>
+ </container>
+ </stream_hook_path>
+ </hook>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception_ptr.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>current_exception</string>
+ </title>
+ <file_name>
+ <string></string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
+ <variant>2</variant>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>28</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
+ <hook>
+ <stream_hook_path>
+ <container>
+ <size>1</size>
+ <strong>5EE6ED209B5DBBD30DFCDA1FD30719A799EE9DBD48A5176F73EADB588CAEB2AA</strong>
+ <weak>2442598207</weak>
+ <size>94</size>
+ <position>227</position>
+ </container>
+ </stream_hook_path>
+ </hook>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception/info.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>boost/exception/info.hpp</string>
+ </title>
+ <file_name>
+ <string>exception_error_info_hpp</string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
+ <variant>2</variant>
+ <string>!!!boost/exception/info.hpp&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>29</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
+ <hook>
+ <stream_hook_path>
+ <container>
+ <size>2</size>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>9567A192BF523DDF741004FFF5BDB044D715FEB7CE9AEC89ACC25C1C33E48C4E</strong>
+ <weak>2232115228</weak>
+ <size>381</size>
+ <position>26</position>
+ </container>
+ </stream_hook_path>
+ </hook>
+ <file>
+ <path>
+ <empty>0</empty>
+ <string>../../../../boost/exception_ptr.hpp</string>
+ <type>0</type>
+ <base>0</base>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>unknown_exception</string>
+ </title>
+ <file_name>
+ <string></string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
+ <variant>2</variant>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>30</id>
+ <type>
+ <string>reno_context</string>
+ </type>
+ <object>
+ <hook>
+ <hook>
+ <stream_hook_path>
+ <container>
+ <size>0</size>
+ </container>
+ </stream_hook_path>
+ </hook>
+ <file>
+ <path>
+ <empty>1</empty>
+ </path>
+ </file>
+ </hook>
+ <title>
+ <string>Boost Exception</string>
+ </title>
+ <file_name>
+ <string>boost-exception</string>
+ </file_name>
+ </object>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>113</size>
                                                                                                         <variant>2</variant>
- <string>|operator&lt;&lt;:)()@@&#10;###@@(:link </string>
+ <string>!!Abstract&#10;&#10;The purpose of Boost Exception is to ease the design of exception class hierarchies and to help write exception handling and error reporting code.&#10;&#10;It supports transporting of arbitrary data to the catch site, which is otherwise tricky due to the no-throw requirements (15.5.1) for exception classes. Data can be added to any exception object, either directly in the throw-expression (15.1), or at a later time as the exception object propagates up the call stack.&#10;&#10;The ability to add data to exception objects after they have been passed to @@throw@@ is important, because often some of the information needed to handle an exception is unavailable in the context where the failure is detected. &#10;&#10;Boost Exception also supports (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>24</id>
+ <id>31</id>
                                                                                                                         <type>
                                                                                                                                 <string>reno_context</string>
                                                                                                                         </type>
@@ -928,83 +1272,72 @@
                                                                                                                                         <hook>
                                                                                                                                                 <stream_hook_path>
                                                                                                                                                         <container>
- <size>2</size>
- <strong>7AC7304D50E623B0954AEB799FFFDDD646C8F62AFFD31BBB79A7EBA312A17AE8</strong>
- <weak>2015761243</weak>
- <size>6002</size>
- <position>737</position>
- <strong>65D13C1BB0A16823F69A32BAB56A51CA317075C7FC8B7441EE0D9B57AF5AB2AC</strong>
- <weak>2592266329</weak>
- <size>712</size>
- <position>1652</position>
+ <size>0</size>
                                                                                                                                                         </container>
                                                                                                                                                 </stream_hook_path>
                                                                                                                                         </hook>
                                                                                                                                         <file>
                                                                                                                                                 <path>
- <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
- <type>0</type>
- <base>0</base>
+ <empty>1</empty>
                                                                                                                                                 </path>
                                                                                                                                         </file>
                                                                                                                                 </hook>
                                                                                                                                 <title>
- <string>get_error_info</string>
+ <string>Tutorial: Transporting of Exceptions between Threads</string>
                                                                                                                                 </title>
                                                                                                                                 <file_name>
- <string></string>
+ <string>cloning</string>
                                                                                                                                 </file_name>
                                                                                                                         </object>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@&#10;###@@(:link </string>
+ <string>|cloning:) of exception objects, implemented non-intrusively and automatically by the @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>25</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
- <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>2</size>
- <strong>9535E799FA734E0B544C723831057F15D0D36849A0B70EB3485F545E3DBBF9D0</strong>
- <weak>2555086413</weak>
- <size>1421</size>
- <position>367</position>
- <strong>21F529F6CC88DB2566F36223A07F700BD043680083D73ABA1A7444A663AAFCFF</strong>
- <weak>4141043385</weak>
- <size>241</size>
- <position>1174</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/exception/enable_error_info.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
- </hook>
- <title>
- <string>enable_error_info</string>
- </title>
- <file_name>
- <string></string>
- </file_name>
- </object>
+ <id>-5</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@&#10;###@@(:link </string>
+ <string>:)()@@ function.&#10;&#10;!!!!Note:&#10;&#10;Boost Exception was accepted as a Boost library on November 7 2007, however it has not yet been part of an official Boost release. Current version can be downloaded from (:link http://svn.boost.org/svn/boost/trunk | Boost SVN:).&#10;&#10;!!Contents&#10;&#10;#Tutorial&#10;##(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-6</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&#10;##(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-7</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&#10;##(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-31</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&#10;##(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-8</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&#10;#Documentation&#10;##Class @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
@@ -1013,12 +1346,12 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@&#10;##Transporting of Exceptions between Threads&#10;###@@(:link </string>
+ <string>:)@@&#10;##Transporting of Arbitrary Data to the Catch Site&#10;###@@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1027,16 +1360,16 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@&#10;###@@(:link </string>
+ <string>|operator&lt;&lt;:)()@@&#10;###@@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-11</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1045,7 +1378,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-11</id>
+ <id>-12</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1054,43 +1387,25 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>26</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
- <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>156B870761DB092CE4269C1173B479A344A1041BA2B883765AF19A72B371D776</strong>
- <weak>3239976720</weak>
- <size>117</size>
- <position>4592</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/exception_ptr.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
- </hook>
- <title>
- <string>rethrow_exception</string>
- </title>
- <file_name>
- <string></string>
- </file_name>
- </object>
+ <id>-23</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)@@&#10;##Transporting of Exceptions between Threads&#10;###@@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-24</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)@@&#10;###@@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1099,180 +1414,61 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-15</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@&#10;##@@(:link </string>
+ <string>:)()@@&#10;###@@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-18</id>
+ <id>-25</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@&#10;##Headers&#10;###@@(:link </string>
+ <string>:)()@@&#10;###@@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>27</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
- <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>1</size>
- <strong>E64E4DFB1DC251F844260AE133EFD419677D0F7143D65B578DEE525492F6B624</strong>
- <weak>2172131053</weak>
- <size>94</size>
- <position>227</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/exception.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
- </hook>
- <title>
- <string>boost/exception.hpp</string>
- </title>
- <file_name>
- <string>exception_hpp</string>
- </file_name>
- </object>
+ <id>-13</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@&#10;###@@(:link </string>
+ <string>:)()@@&#10;###@@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>28</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
- <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>1</size>
- <strong>40C2FBC8600FE6877A6D46EC005D97EB1F612B8687CCA297C838E10A80E089AA</strong>
- <weak>2576029551</weak>
- <size>94</size>
- <position>227</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/exception_ptr.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
- </hook>
- <title>
- <string>boost/exception_ptr.hpp</string>
- </title>
- <file_name>
- <string>exception_cloning_hpp</string>
- </file_name>
- </object>
+ <id>-29</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@&#10;###@@(:link </string>
+ <string>:)@@&#10;##@@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>29</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
- <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>1</size>
- <strong>2C5F1B7E5C5052C9C9305848AB499A9C166D728EAAD25DC936B75FCA997A0650</strong>
- <weak>3171555959</weak>
- <size>88</size>
- <position>1</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/throw_exception.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
- </hook>
- <title>
- <string>boost/throw_exception.hpp</string>
- </title>
- <file_name>
- <string>throw_exception_hpp</string>
- </file_name>
- </object>
+ <id>-5</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@&#10;###@@(:link </string>
+ <string>:)()@@&#10;##Headers&#10;###@@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>30</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
- <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>1</size>
- <strong>A9C65F105342D728DE9C996079E82DF25408B94A272090039FAAC12D29659F69</strong>
- <weak>2378831669</weak>
- <size>94</size>
- <position>227</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/exception/enable_current_exception.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
- </hook>
- <title>
- <string>boost/exception/enable_current_exception.hpp</string>
- </title>
- <file_name>
- <string>exception_enable_exception_cloning_hpp</string>
- </file_name>
- </object>
+ <id>-14</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)@@&#10;###@@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-15</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1281,7 +1477,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-5</id>
+ <id>-16</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1290,7 +1486,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-14</id>
+ <id>-18</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1299,7 +1495,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-6</id>
+ <id>-19</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1308,7 +1504,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-7</id>
+ <id>-28</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1317,39 +1513,25 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>31</id>
- <type>
- <string>reno_context</string>
- </type>
- <object>
- <hook>
- <hook>
- <stream_hook_path>
- <container>
- <size>1</size>
- <strong>C9AFCA0931CB65AE31811E702FC48CB22348149B1D259CD9161D391FEC640FA8</strong>
- <weak>2324436793</weak>
- <size>94</size>
- <position>227</position>
- </container>
- </stream_hook_path>
- </hook>
- <file>
- <path>
- <empty>0</empty>
- <string>../../../../boost/exception/exception.hpp</string>
- <type>0</type>
- <base>0</base>
- </path>
- </file>
- </hook>
- <title>
- <string>boost/exception/exception.hpp</string>
- </title>
- <file_name>
- <string>exception_exception_hpp</string>
- </file_name>
- </object>
+ <id>-20</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)@@&#10;###@@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-21</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)@@&#10;###@@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-17</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1392,7 +1574,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-27</id>
+ <id>-14</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1401,7 +1583,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1410,7 +1592,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1419,7 +1601,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1428,7 +1610,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-24</id>
+ <id>-11</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1437,7 +1619,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-25</id>
+ <id>-12</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1446,7 +1628,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-9</id>
+ <id>-23</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1455,7 +1637,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1464,7 +1646,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1473,7 +1655,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1482,7 +1664,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-11</id>
+ <id>-25</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1491,7 +1673,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-26</id>
+ <id>-13</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1500,7 +1682,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-15</id>
+ <id>-29</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1509,7 +1691,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-18</id>
+ <id>-5</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1518,7 +1700,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1527,34 +1709,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-23</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-24</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-25</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1563,15 +1718,6 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-9</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;!!Transporting of Exceptions between Threads&#10;&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
                                                                                                                         <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
@@ -1581,24 +1727,6 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-13</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
                                                                                                                         <id>-11</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
@@ -1608,7 +1736,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-26</id>
+ <id>-12</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -1617,202 +1745,74 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-15</id>
+ <id>-23</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&#10;&#10;!!Throwing Exceptions&#10;&#10;(:include </string>
+ <string>:)&#10;!!Transporting of Exceptions between Threads&#10;&#10;(:include </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
- <shared_ptr>
- <id>-18</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-17</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
- <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-18</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
- <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-19</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
- <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-20</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
- <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-21</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
- <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-22</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
- <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-23</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
- <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-24</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
+ <shared_ptr>
+ <id>-24</id>
+ </shared_ptr>
+ </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-25</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
+ <string>:)&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-26</id>
+ </shared_ptr>
+ </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-26</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
+ <string>:)&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-27</id>
+ </shared_ptr>
+ </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-27</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
+ <string>:)&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-25</id>
+ </shared_ptr>
+ </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>!!!boost/exception.hpp&#10;&#10;This header file includes all other header files of Boost Exception:&#10;&#10;(:pagelist tags=&quot;header&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-28</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
+ <string>:)&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-13</id>
+ </shared_ptr>
+ </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>!!!boost/exception_ptr.hpp&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-29</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
+ <string>:)&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-29</id>
+ </shared_ptr>
+ </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>!!!boost/exception/throw_exception.hpp&#10;&#10;&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-30</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
+ <string>:)&#10;&#10;!!Throwing Exceptions&#10;&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-5</id>
+ </shared_ptr>
+ </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>!!!boost/exception/enable_current_exception.hpp&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ <string>:)&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -1825,7 +1825,7 @@
                                                                                                 <container>
                                                                                                         <size>1</size>
                                                                                                         <variant>2</variant>
- <string>!!!boost/exception/exception.hpp&#10;&#10;&#10;&#10;This header file contains the following definitions/declarations:&#10;&#10;(:pagelist link=&quot;backlink&quot; layer=&quot;synopsis&quot;:)&#10;</string>
+ <string>(:include include:)&#10;&#10;!!!See also:&#10;&#10;(:pagelist link=&quot;backlink&quot; except_tags=&quot;noalso&quot;:)&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -2279,15 +2279,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
- <variant>2</variant>
- <string>[@#include &lt;</string>
- <variant>1</variant>
- <weak_ptr>
- <expired>1</expired>
- </weak_ptr>
- <variant>2</variant>
- <string>&gt;@]</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -2309,18 +2301,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
- <variant>2</variant>
- <string>[@#include &lt;(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-30</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&gt;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -2460,7 +2441,15 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>3</size>
+ <variant>2</variant>
+ <string>[@#include &lt;</string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>1</expired>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>&gt;@]</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -2484,13 +2473,16 @@
                                                                                                 <container>
                                                                                                         <size>3</size>
                                                                                                         <variant>2</variant>
- <string>[@#include &lt;</string>
+ <string>[@#include &lt;(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
- <expired>1</expired>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-18</id>
+ </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>&gt;@]</string>
+ <string>:)&gt;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -2501,7 +2493,15 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>3</size>
+ <variant>2</variant>
+ <string>[@#include &lt;</string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>1</expired>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>&gt;@]</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -3489,7 +3489,27 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>5</size>
+ <variant>2</variant>
+ <string>[@#ifdef BOOST_NO_EXCEPTIONS&#10; void (:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-5</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)( std::exception const &amp; e ); // user defined&#10;#else&#10; template &lt;class E&gt;&#10; void (:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-5</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)( E const &amp; e );&#10;#endif@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -3522,18 +3542,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
- <variant>2</variant>
- <string>[@ template &lt;class Tag,class T&gt;&#10; class&#10; (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-8</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10; {&#10; public:&#10;&#10; typedef T value_type;&#10;&#10; error_info( value_type const &amp; );&#10;&#10; private:&#10;&#10; ---unspecified---&#10; };@]&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -3546,65 +3555,83 @@
                                                                                                 <container>
                                                                                                         <size>9</size>
                                                                                                         <variant>2</variant>
- <string>[@ typedef (:link </string>
+ <string>[@ class&#10; (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;struct tag_throw_function,char const *&gt; throw_function;&#10; typedef (:link </string>
+ <string>:)&#10; {&#10; public:&#10;&#10;(:include </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-35</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;struct tag_throw_file,char const *&gt; throw_file;&#10; typedef (:link </string>
+ <string> decl:)&#10;&#10; protected:&#10;&#10;(:include </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-36</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string> decl:)&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-37</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string> decl:)&#10;&#10; private:&#10;&#10; ---unspecified---&#10; };@]&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-10</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>7</size>
+ <variant>2</variant>
+ <string>[@ template &lt;class E, class Tag1, class T1&gt;&#10; E const &amp; operator&lt;&lt;( E const &amp; x, (:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;struct tag_throw_line,int&gt; throw_line;&#10;&#10; #define (:link </string>
+ <string>:)&lt;Tag1,T1&gt; const &amp; v );&#10;&#10; template &lt;class E, class Tag1, class T1, ..., class TagN, class TN&gt;&#10; E const &amp; operator&lt;&lt;( E const &amp; x,&#10; (:link http://www.boost.org/libs/tuple/doc/tuple_users_guide.html|tuple:)&lt;&#10; (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-9</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)\&#10; ::boost::throw_function(BOOST_CURRENT_FUNCTION) &lt;&lt;\&#10; ::boost::throw_file(__FILE__) &lt;&lt;\&#10; ::boost::throw_line((int)__LINE__)@]&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-10</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>3</size>
- <variant>2</variant>
- <string>[@ typedef ---unspecified--- (:link </string>
+ <string>:)&lt;Tag1,T1&gt;,&#10; ...,&#10; (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:);@]&#10;</string>
+ <string>:)&lt;TagN,TN&gt; &gt; const &amp; v );@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -3615,18 +3642,9 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>5</size>
- <variant>2</variant>
- <string>[@ template &lt;class T&gt;&#10; (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-10</id>
- </shared_ptr>
- </weak_ptr>
+ <size>3</size>
                                                                                                         <variant>2</variant>
- <string>:) (:link </string>
+ <string>[@ template &lt;class ErrorInfo,class E&gt;&#10; (:link http://www.boost.org/libs/smart_ptr/shared_ptr.htm|shared_ptr:)&lt;typename ErrorInfo::value_type const&gt; (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
@@ -3635,7 +3653,7 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)( T const &amp; e );@]&#10;</string>
+ <string>:)( E const &amp; x );</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -3657,7 +3675,7 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)( T const &amp; e );</string>
+ <string>:)( T const &amp; x );@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -3670,25 +3688,25 @@
                                                                                                 <container>
                                                                                                         <size>5</size>
                                                                                                         <variant>2</variant>
- <string>[@ (:link </string>
+ <string>[@ void (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-13</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:) (:link </string>
+ <string>:)( (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)();@]&#10;</string>
+ <string>:) const &amp; ep );</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -3710,18 +3728,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
- <variant>2</variant>
- <string>[@ class&#10; (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-15</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:):&#10; public std::exception&#10; public boost::exception&#10; {&#10; ---unspecified---&#10; };@]&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -3754,27 +3761,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>5</size>
- <variant>2</variant>
- <string>[@#ifdef BOOST_NO_EXCEPTIONS&#10; void (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-18</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)( std::exception const &amp; e ); // user defined&#10;#else&#10; template &lt;class E&gt;&#10; void (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-18</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)( E const &amp; e );&#10;#endif@]&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -3818,9 +3805,31 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
+ <size>3</size>
+ <variant>2</variant>
+ <string>[@ template &lt;class Tag,class T&gt;&#10; class&#10; (:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-22</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&#10; {&#10; public:&#10;&#10; typedef T value_type;&#10;&#10; error_info( value_type const &amp; );&#10;&#10; private:&#10;&#10; ---unspecified---&#10; };@]&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-23</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
                                                                                                         <size>9</size>
                                                                                                         <variant>2</variant>
- <string>[@ class&#10; (:link </string>
+ <string>[@ typedef (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
@@ -3829,87 +3838,69 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&#10; {&#10; public:&#10;&#10;(:include </string>
+ <string>:)&lt;struct tag_throw_function,char const *&gt; throw_function;&#10; typedef (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-35</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string> decl:)&#10;&#10; protected:&#10;&#10;(:include </string>
+ <string>:)&lt;struct tag_throw_file,char const *&gt; throw_file;&#10; typedef (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-36</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string> decl:)&#10;(:include </string>
+ <string>:)&lt;struct tag_throw_line,int&gt; throw_line;&#10;&#10; #define (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-37</id>
+ <id>-23</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string> decl:)&#10;&#10; private:&#10;&#10; ---unspecified---&#10; };@]&#10;</string>
+ <string>:)\&#10; ::boost::throw_function(BOOST_CURRENT_FUNCTION) &lt;&lt;\&#10; ::boost::throw_file(__FILE__) &lt;&lt;\&#10; ::boost::throw_line((int)__LINE__)@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-23</id>
+ <id>-24</id>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>7</size>
- <variant>2</variant>
- <string>[@ template &lt;class E, class Tag1, class T1&gt;&#10; E const &amp; operator&lt;&lt;( E const &amp; x, (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-8</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&lt;Tag1,T1&gt; const &amp; v );&#10;&#10; template &lt;class E, class Tag1, class T1, ..., class TagN, class TN&gt;&#10; E const &amp; operator&lt;&lt;( E const &amp; x,&#10; (:link http://www.boost.org/libs/tuple/doc/tuple_users_guide.html|tuple:)&lt;&#10; (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-8</id>
- </shared_ptr>
- </weak_ptr>
+ <size>3</size>
                                                                                                         <variant>2</variant>
- <string>:)&lt;Tag1,T1&gt;,&#10; ...,&#10; (:link </string>
+ <string>[@ typedef ---unspecified--- (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;TagN,TN&gt; &gt; const &amp; v );@]&#10;</string>
+ <string>:);@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-24</id>
+ <id>-25</id>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
+ <size>5</size>
                                                                                                         <variant>2</variant>
- <string>[@ template &lt;class ErrorInfo,class E&gt;&#10; (:link http://www.boost.org/libs/smart_ptr/shared_ptr.htm|shared_ptr:)&lt;typename ErrorInfo::value_type const&gt; (:link </string>
+ <string>[@ template &lt;class T&gt;&#10; (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
@@ -3918,14 +3909,23 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)( E const &amp; x );</string>
+ <string>:) (:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-25</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)( T const &amp; e );@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-25</id>
+ <id>-26</id>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
@@ -3936,53 +3936,42 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-25</id>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)( T const &amp; x );@]&#10;</string>
+ <string>:)( T const &amp; e );</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-26</id>
+ <id>-27</id>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
                                                                                                         <size>5</size>
                                                                                                         <variant>2</variant>
- <string>[@ void (:link </string>
+ <string>[@ (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-26</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)( (:link </string>
+ <string>:) (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:) const &amp; ep );</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-27</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>0</size>
+ <string>:)();@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -4004,7 +3993,18 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>3</size>
+ <variant>2</variant>
+ <string>[@ class&#10; (:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-29</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:):&#10; public std::exception&#10; public boost::exception&#10; {&#10; ---unspecified---&#10; };@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -4117,7 +4117,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -4201,221 +4201,206 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-6</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>0</size>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-7</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>0</size>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-8</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>21</size>
- <variant>2</variant>
- <string>!!!error_info&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;@@T@@ must have accessible copy constructor and must not be a reference.&#10;&#10;!!!!Description:&#10;&#10;This class template is used to associate a @@Tag@@ type with a value type @@T@@. Objects of type @@(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-8</id>
- </shared_ptr>
- </weak_ptr>
+ <size>9</size>
                                                                                                         <variant>2</variant>
- <string>:)&lt;Tag,T&gt;@@ can be passed to @@(:link </string>
+ <string>!!!throw_exception()&#10;&#10;&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;@@E@@ must derive publicly from @@std::exception@@.&#10;&#10;!!!!Effects:&#10;&#10;* If @@BOOST_NO_EXCEPTIONS@@ is not defined, @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-5</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>|operator&lt;&lt;:)()@@ to be stored in objects of type @@boost::(:link </string>
+ <string>:)(e)@@ is equivalent to @@throw boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@.&#10;&#10;!!!!Note:&#10;&#10;The header @@&lt;(:link </string>
+ <string>:)(boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-7</id>
+ <id>-12</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&gt;@@ provides a declaration of the @@(:link </string>
+ <string>:)(e))@@, unless @@BOOST_EXCEPTION_DISABLE@@ is defined, in which case @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-5</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ template, which is sufficient for the purpose of @@typedef@@ing an instance for specific @@Tag@@ and @@T@@, like this:&#10;&#10;[@#include &lt;(:link </string>
+ <string>:)(e)@@ is equivalent to @@throw e;@@&#10;* If @@BOOST_NO_EXCEPTIONS@@ is defined, the function is left undefined, and the user is expected to supply an appropriate definition. Callers of @@throw_exception@@ are allowed to assume that the function never returns; therefore, if the user-defined @@throw_exception@@ returns, the behavior is undefined.&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-6</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>11</size>
+ <variant>2</variant>
+ <string>!!Transporting of Arbitrary Data to the Catch Site&#10;&#10;All exception types that derive from @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-7</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&gt;&#10;&#10;typedef boost::(:link </string>
+ <string>:)@@ can be used as type-safe containers of arbitrary data objects, while complying with the no-throw requirements (15.5.1) of the ANSI C++ standard for exception classes. Data can be added to a @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;struct tag_errno,int&gt; errno_info;@]&#10;&#10;Of course, to actually add an @@errno_info@@ object to exceptions using @@(:link </string>
+ <string>:)@@ at the time of the throw, or at a later time.&#10;&#10;(:include </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-34</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>|operator&lt;&lt;:)()@@, or to retrieve it using @@(:link </string>
+ <string>:)&#10;&#10;(:include </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-24</id>
+ <id>-40</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@, you must first @@#include &lt;(:link </string>
+ <string>:)&#10;(:include </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-14</id>
+ <id>-38</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&gt;@@.&#10;</string>
+ <string>:)&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-9</id>
+ <id>-7</id>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>7</size>
+ <size>27</size>
                                                                                                         <variant>2</variant>
- <string>!!!BOOST_ERROR_INFO&#10;&#10;(:include synopsis:)&#10;&#10;This macro is designed to be used with @@(:link </string>
+ <string>!!Integrating Boost Exception in Existing Exception Class Hierarchies&#10;&#10;Some exception hierarchies can not be modified to make @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>|operator&lt;&lt;:)()@@ when throwing a @@boost::(:link </string>
+ <string>:)@@ a base type. For this case, the @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-12</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@, to store information about the location of the throw statement. It can be chained with other @@(:link </string>
+ <string>:)()@@ function template can be used to make exception objects derive from @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@s in a single throw expression.&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-10</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>15</size>
+ <string>:)@@ anyway. Here is an example:&#10;&#10;[@#include &lt;(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-14</id>
+ </shared_ptr>
+ </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>!!!exception_ptr&#10;&#10;(:include synopsis:)&#10;&#10;The @@(:link </string>
+ <string>:)&gt;&#10;#include &lt;stdexcept&gt;&#10;&#10;typedef boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ type can be used to refer to a copy of an exception object. It is Default Constructible, Copy Constructible, Assignable and Equality Comparable; @@(:link </string>
+ <string>:)&lt;struct tag_std_range_min,size_t&gt; std_range_min;&#10;typedef boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@&apos;s operations do not throw.&#10;&#10;Two instances of @@(:link </string>
+ <string>:)&lt;struct tag_std_range_max,size_t&gt; std_range_max;&#10;typedef boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ are equivalent and compare equal if and only if they refer to the same exception.&#10;&#10;The default constructor of @@(:link </string>
+ <string>:)&lt;struct tag_std_range_index,size_t&gt; std_range_index;&#10;&#10;template &lt;class T&gt;&#10;class&#10;my_container&#10; {&#10; public:&#10;&#10; size_t size() const;&#10;&#10; T const &amp;&#10; operator[]( size_t i ) const&#10; {&#10; if( i &gt; size() )&#10; throw boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-12</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ produces the null value of the type. The null value is equivalent only to itself.&#10;&#10;!!!!Note:&#10;&#10;@@(:link </string>
+ <string>:)(std::range_error(&quot;Index out of range&quot;)) &lt;&lt;&#10; std_range_min(0) &lt;&lt;&#10; std_range_max(size()) &lt;&lt;&#10; std_range_index(i);&#10; //....&#10; }&#10; };&#10;@]&#10;&#10;@@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-12</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>|Enable_error_info:)&lt;T&gt;@@ returns an object of &apos;&apos;unspecified type&apos;&apos; which is guaranteed to derive from both @@boost::(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-9</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)@@ and @@T@@. This makes it possible to use @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
@@ -4424,123 +4409,119 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ objects are returned by @@(:link </string>
+ <string>|operator&lt;&lt;:)()@@ to store additional information in the exception object. The exception can be intercepted as @@T &amp;@@, therefore existing exception handling will not break. It can also be intercepted as @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ and @@(:link </string>
+ <string>:) &amp;@@, so that (:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-11</id>
+ <id>-6</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@.&#10;</string>
+ <string>|more information can be added to the exception at a later time:).&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-11</id>
+ <id>-8</id>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
+ <size>21</size>
                                                                                                         <variant>2</variant>
- <string>!!!copy_exception()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Effects:&#10;&#10;As if @@try { throw e; } catch( ... ) { return </string>
+ <string>!!Logging of boost::exception Objects&#10;&#10;Class @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>(); }@@&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-12</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>17</size>
+ <string>:)@@ provides a virtual member function @@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-35</id>
+ </shared_ptr>
+ </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>!!!enable_current_exception()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;@@T@@ must have an accessible no-throw copy constructor&#10;&#10;!!!!Returns:&#10;&#10;An object of &apos;&apos;unspecified&apos;&apos; type which derives publicly from @@T@@. That is, the returned object can be intercepted by a @@catch(T &amp;)@@.&#10;&#10;!!!!Description:&#10;&#10;&#10;&#10;This function is designed to be used directly in a throw-expression to enable the cloning support in Boost Exception. For example:&#10;&#10;[@class&#10;my_exception:&#10; public std::exception&#10; {&#10; };&#10;&#10;....&#10;throw boost::(:link </string>
+ <string>:::)()@@, with a signature identical to the familiar @@std::exception::what()@@ function. The default implementation returns a string value that is not presentable as a friendly user message, but because it is generated automatically, it is useful for debugging or logging purposes. Here is an example:&#10;&#10;[@#include &lt;(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
+ <id>-14</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)(my_exception());@]&#10;&#10;Unless @@(:link </string>
+ <string>:)&gt;&#10;#include &lt;iostream&gt;&#10;&#10;void f(); //throws unknown types that derive from boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ is called at the time an exception object is used in a throw-expression, an attempt to copy it using @@(:link </string>
+ <string>:).&#10;&#10;void&#10;g()&#10; {&#10; try&#10; {&#10; f();&#10; }&#10; catch(&#10; boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ may return an @@(:link </string>
+ <string>:) &amp; e )&#10; {&#10; std::cerr &lt;&lt; e.(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-35</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ which refers to an instance of @@(:link </string>
+ <string>:::)();&#10; }&#10; }@]&#10;&#10;The @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-15</id>
+ <id>-35</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@. See @@(:link </string>
+ <string>:::)()@@ member function iterates over all data objects stored in the @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ for details.&#10;&#10;!!!!Note:&#10;&#10;Instead of using the @@throw@@ keyword directly, it is preferable to call @@boost::(:link </string>
+ <string>:)@@ through @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-18</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@. This is guaranteed to throw an exception that derives from @@boost::(:link </string>
+ <string>|operator&lt;&lt;:)()@@. The returned string is constructed by converting each data object to string and then concatenating these strings together.&#10;&#10;When the @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
@@ -4549,38 +4530,47 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ and supports cloning.&#10;</string>
+ <string>:)&lt;Tag,T&gt;@@ template is instantiated, the system attempts overload resolution for an unqualified call to @@to_string(x)@@, where @@x@@ is of type @@T@@. If this is successful, the @@to_string()@@ overload is used to convert objects of type @@T@@ to string.&#10;&#10;Otherwise, the system attempts overload resolution for @@s &lt;&lt; x@@, where @@s@@ is a @@std::ostringstream@@ and @@x@@ is of type @@T@@. If this is successful, the @@operator&lt;&lt;@@ overload is used to convert objects of type @@T@@ to string.&#10;&#10;Otherwise the system is unable to convert objects of type @@T@@ to string, and an unspecified stub string value is used without issuing a compile error.&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-13</id>
+ <id>-9</id>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>29</size>
+ <size>13</size>
                                                                                                         <variant>2</variant>
- <string>!!!current_exception()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;The @@(:link </string>
+ <string>!!exception&#10;&#10;&#10;&#10;(:include synopsis:)&#10;&#10;Class @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ function must not be called outside of a @@catch@@ block.&#10;&#10;!!!!Returns:&#10;&#10;* An @@(:link </string>
+ <string>:)@@ is designed to be used as a universal base for user-defined exception types.&#10;&#10;An object of any type deriving from @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ that refers to the currently handled exception or a copy of the currently handled exception.&#10;* If the function needs to allocate memory and the attempt fails, it returns an @@(:link </string>
+ <string>:)@@ can store data of arbitrary types, using the @@</string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-22</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>@@ wrapper and @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
@@ -4589,106 +4579,158 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ that refers to an instance of @@std::bad_alloc@@.&#10;&#10;!!!!Notes:&#10;&#10;* It is unspecified whether the return values of two successive calls to @@(:link </string>
+ <string>|operator&lt;&lt;:)()@@.&#10;&#10;To retrieve data from a @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ refer to the same exception object.&#10;* Correct implementation of @@(:link </string>
+ <string>:)@@ object, use the @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-11</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ may require compiler support, unless @@(:link </string>
+ <string>:)()@@ function template.&#10;&#10;(:include members:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-10</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>7</size>
+ <variant>2</variant>
+ <string>!!!operator&lt;&lt;()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;@@E@@ must be @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ is used at the time the currently handled exception object was passed to @@throw@@. If @@(:link </string>
+ <string>:)@@, or a type that derives (indirectly) from @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ is not used, and if the compiler does not provide the necessary support, then @@(:link </string>
+ <string>:)@@.&#10;&#10;!!!!Effects:&#10;&#10;* The first overload stores a copy of @@v@@ into @@x@@. If @@x@@ already contains data of type @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ may return an @@(:link </string>
+ <string>:)&lt;Tag1,T1&gt;@@, that data is overwritten.&#10;* The @@boost::(:link http://www.boost.org/libs/tuple/doc/tuple_users_guide.html|tuple:)@@ overload is equivalent to @@x &lt;&lt; v.(:link http://www.boost.org/libs/tuple/doc/tuple_users_guide.html#accessing_elements|get:)&lt;0&gt;() &lt;&lt; ... &lt;&lt; v.(:link http://www.boost.org/libs/tuple/doc/tuple_users_guide.html#accessing_elements|get:)&lt;N&gt;()@@.&#10;&#10;!!!!Returns:&#10;&#10;@@x@@.&#10;&#10;(:include throws:)&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-11</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>7</size>
+ <variant>2</variant>
+ <string>!!!get_error_info()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;The type of the @@x@@ object must derive from @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ that refers to an instance of @@(:link </string>
+ <string>:)@@; @@ErrorInfo@@ must be an instance of the @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-15</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@. In this case, if the original exception object derives from @@boost::(:link </string>
+ <string>:)@@ template.&#10;&#10;!!!!Returns:&#10;&#10;If @@x@@ does not store an object of type @@ErrorInfo@@, returns an empty @@(:link http://www.boost.org/libs/smart_ptr/shared_ptr.htm|shared_ptr:)@@; otherwise returns pointer to the stored value. Use @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@, then the @@boost::(:link </string>
+ <string>|operator&lt;&lt;:)()@@ to store values in exception objects.&#10;&#10;!!!!Throws:&#10;&#10;Nothing.&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-12</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>7</size>
+ <variant>2</variant>
+ <string>!!!enable_error_info()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;@@T@@ must be a user-defined type with accessible no-throw copy constructor.&#10;&#10;!!!!Returns:&#10;&#10;An object of unspecified type with no-throw copy semantics, which derives publicly from both @@T@@, and class @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ sub-object of the @@(:link </string>
+ <string>:)@@. The @@T@@ sub-object is initialized from @@x@@ by the @@T@@ copy constructor. If @@T@@ already derives from @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-15</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ object is initialized by the @@boost::(:link </string>
+ <string>:)@@, then the type of the returned object does not derive @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ copy constructor.&#10;</string>
+ <string>:)@@.&#10;&#10;!!!!Throws:&#10;&#10;Nothing.&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-13</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>1</size>
+ <variant>2</variant>
+ <string>!!!rethrow_exception()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Precondition:&#10;&#10;@@ep@@ shall not be null.&#10;&#10;!!!!Throws:&#10;&#10;&#10;&#10;The exception to which @@ep@@ refers.&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -4710,27 +4752,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>5</size>
- <variant>2</variant>
- <string>!!!unknown_exception&#10;&#10;(:include synopsis:)&#10;&#10;This type is used by the (:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-17</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>|cloning:) support in Boost Exception. Please see @@(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-13</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)()@@.&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -4752,54 +4774,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>11</size>
- <variant>2</variant>
- <string>!!Transporting of Exceptions between Threads&#10;&#10;&#10;&#10;Boost Exception supports transporting of exception objects between threads through cloning. This system is similar to (:link http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html|N2179:), but because Boost Exception can not rely on language support, the use of @@(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-12</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)()@@ at the time of the throw is required in order to use cloning.&#10;&#10;!!!!Note:&#10;&#10;All exceptions emitted by the familiar function @@boost::(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-18</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)()@@ are guaranteed to derive from @@boost::(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-22</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)@@ and to support cloning.&#10;&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-33</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;&#10;&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-39</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -4810,67 +4785,89 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>9</size>
- <variant>2</variant>
- <string>!!!throw_exception()&#10;&#10;&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Effects:&#10;&#10;* If @@BOOST_NO_EXCEPTIONS@@ is not defined, @@boost::(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-18</id>
- </shared_ptr>
- </weak_ptr>
+ <size>0</size>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-19</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>0</size>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-20</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>0</size>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-21</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>0</size>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-22</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>21</size>
                                                                                                         <variant>2</variant>
- <string>:)(e)@@ is equivalent to @@throw boost::(:link </string>
+ <string>!!!error_info&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;@@T@@ must have accessible copy constructor and must not be a reference.&#10;&#10;!!!!Description:&#10;&#10;This class template is used to associate a @@Tag@@ type with a value type @@T@@. Objects of type @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)(boost::(:link </string>
+ <string>:)&lt;Tag,T&gt;@@ can be passed to @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-25</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)(e))@@, unless @@BOOST_EXCEPTION_DISABLE@@ is defined, in which case @@boost::(:link </string>
+ <string>|operator&lt;&lt;:)()@@ to be stored in objects of type @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-18</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)(e)@@ is equivalent to @@throw e;@@&#10;* If @@BOOST_NO_EXCEPTIONS@@ is defined, the function is left undefined, and the user is expected to supply an appropriate definition. Callers of @@throw_exception@@ are allowed to assume that the function never returns; therefore, if the user-defined @@throw_exception@@ returns, the behavior is undefined.&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-19</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>11</size>
- <variant>2</variant>
- <string>!!Transporting of Arbitrary Data to the Catch Site&#10;&#10;All exception types that derive from @@boost::(:link </string>
+ <string>:)@@.&#10;&#10;!!!!Note:&#10;&#10;The header @@&lt;(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-21</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ can be used as type-safe containers of arbitrary data objects, while complying with the no-throw requirements (15.5.1) of the ANSI C++ standard for exception classes. Data can be added to a @@boost::(:link </string>
+ <string>:)&gt;@@ provides a declaration of the @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
@@ -4879,478 +4876,414 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ at the time of the throw, or at a later time.&#10;&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-34</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;&#10;(:include </string>
+ <string>:)@@ template, which is sufficient for the purpose of @@typedef@@ing an instance for specific @@Tag@@ and @@T@@, like this:&#10;&#10;[@#include &lt;(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-40</id>
+ <id>-21</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&#10;(:include </string>
+ <string>:)&gt;&#10;&#10;typedef boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-38</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-20</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>27</size>
- <variant>2</variant>
- <string>!!Integrating Boost Exception in Existing Exception Class Hierarchies&#10;&#10;Some exception hierarchies can not be modified to make @@boost::(:link </string>
+ <string>:)&lt;struct tag_errno,int&gt; errno_info;@]&#10;&#10;Of course, to actually add an @@errno_info@@ object to exceptions using @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ a base type. For this case, the @@(:link </string>
+ <string>|operator&lt;&lt;:)()@@, or to retrieve it using @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-25</id>
+ <id>-11</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ function template can be used to make exception objects derive from @@boost::(:link </string>
+ <string>:)()@@, you must first @@#include &lt;(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-28</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ anyway. Here is an example:&#10;&#10;[@#include &lt;(:link </string>
+ <string>:)&gt;@@.&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-23</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>7</size>
+ <variant>2</variant>
+ <string>!!!BOOST_ERROR_INFO&#10;&#10;(:include synopsis:)&#10;&#10;This macro is designed to be used with @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-27</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&gt;&#10;#include &lt;stdexcept&gt;&#10;&#10;typedef boost::(:link </string>
+ <string>|operator&lt;&lt;:)()@@ when throwing a @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;struct tag_std_range_min,size_t&gt; std_range_min;&#10;typedef boost::(:link </string>
+ <string>:)@@, to store information about the location of the throw statement. It can be chained with other @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;struct tag_std_range_max,size_t&gt; std_range_max;&#10;typedef boost::(:link </string>
+ <string>:)@@s in a single throw expression.&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-24</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>15</size>
+ <variant>2</variant>
+ <string>!!!exception_ptr&#10;&#10;(:include synopsis:)&#10;&#10;The @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;struct tag_std_range_index,size_t&gt; std_range_index;&#10;&#10;template &lt;class T&gt;&#10;class&#10;my_container&#10; {&#10; public:&#10;&#10; size_t size() const;&#10;&#10; T const &amp;&#10; operator[]( size_t i ) const&#10; {&#10; if( i &gt; size() )&#10; throw boost::(:link </string>
+ <string>:)@@ type can be used to refer to a copy of an exception object. It is Default Constructible, Copy Constructible, Assignable and Equality Comparable; @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-25</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)(std::range_error(&quot;Index out of range&quot;)) &lt;&lt;&#10; std_range_min(0) &lt;&lt;&#10; std_range_max(size()) &lt;&lt;&#10; std_range_index(i);&#10; //....&#10; }&#10; };&#10;@]&#10;&#10;@@(:link </string>
+ <string>:)@@&apos;s operations do not throw.&#10;&#10;Two instances of @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-25</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>|Enable_error_info:)&lt;T&gt;@@ returns an object of &apos;&apos;unspecified type&apos;&apos; which is guaranteed to derive from both @@boost::(:link </string>
+ <string>:)@@ are equivalent and compare equal if and only if they refer to the same exception.&#10;&#10;The default constructor of @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ and @@T@@. This makes it possible to use @@(:link </string>
+ <string>:)@@ produces the null value of the type. The null value is equivalent only to itself.&#10;&#10;!!!!Note:&#10;&#10;@@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>|operator&lt;&lt;:)()@@ to store additional information in the exception object. The exception can be intercepted as @@T &amp;@@, therefore existing exception handling will not break. It can also be intercepted as @@boost::(:link </string>
+ <string>:)@@ objects are returned by @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:) &amp;@@, so that (:link </string>
+ <string>:)()@@ and @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-19</id>
+ <id>-25</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>|more information can be added to the exception at a later time:).&#10;</string>
+ <string>:)()@@.&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-21</id>
+ <id>-25</id>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>21</size>
+ <size>3</size>
                                                                                                         <variant>2</variant>
- <string>!!Logging of boost::exception Objects&#10;&#10;Class @@boost::(:link </string>
+ <string>!!!copy_exception()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Effects:&#10;&#10;As if @@try { throw e; } catch( ... ) { return </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ provides a virtual member function @@(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-35</id>
- </shared_ptr>
- </weak_ptr>
+ <string>(); }@@&#10;</string>
+ </container>
+ </pair>
+ <pair>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-26</id>
+ </shared_ptr>
+ </weak_ptr>
+ <container>
+ <size>17</size>
                                                                                                         <variant>2</variant>
- <string>:::)()@@, with a signature identical to the familiar @@std::exception::what()@@ function. The default implementation returns a string value that is not presentable as a friendly user message, but because it is generated automatically, it is useful for debugging or logging purposes. Here is an example:&#10;&#10;[@#include &lt;(:link </string>
+ <string>!!!enable_current_exception()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;@@T@@ must have an accessible no-throw copy constructor&#10;&#10;!!!!Returns:&#10;&#10;An object of &apos;&apos;unspecified&apos;&apos; type which derives publicly from @@T@@. That is, the returned object can be intercepted by a @@catch(T &amp;)@@.&#10;&#10;!!!!Description:&#10;&#10;&#10;&#10;This function is designed to be used directly in a throw-expression to enable the cloning support in Boost Exception. For example:&#10;&#10;[@class&#10;my_exception:&#10; public std::exception&#10; {&#10; };&#10;&#10;....&#10;throw boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-27</id>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&gt;&#10;#include &lt;iostream&gt;&#10;&#10;void f(); //throws unknown types that derive from boost::(:link </string>
+ <string>:)(my_exception());@]&#10;&#10;Unless @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:).&#10;&#10;void&#10;g()&#10; {&#10; try&#10; {&#10; f();&#10; }&#10; catch(&#10; boost::(:link </string>
+ <string>:)()@@ is called at the time an exception object is used in a throw-expression, an attempt to copy it using @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:) &amp; e )&#10; {&#10; std::cerr &lt;&lt; e.(:link </string>
+ <string>:)()@@ may return an @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-35</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:::)();&#10; }&#10; }@]&#10;&#10;The @@(:link </string>
+ <string>:)@@ which refers to an instance of @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-35</id>
+ <id>-29</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:::)()@@ member function iterates over all data objects stored in the @@boost::(:link </string>
+ <string>:)@@. See @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ through @@(:link </string>
+ <string>:)()@@ for details.&#10;&#10;!!!!Note:&#10;&#10;Instead of using the @@throw@@ keyword directly, it is preferable to call @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-5</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>|operator&lt;&lt;:)()@@. The returned string is constructed by converting each data object to string and then concatenating these strings together.&#10;&#10;When the @@(:link </string>
+ <string>:)()@@. This is guaranteed to throw an exception that derives from @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;Tag,T&gt;@@ template is instantiated, the system attempts overload resolution for an unqualified call to @@to_string(x)@@, where @@x@@ is of type @@T@@. If this is successful, the @@to_string()@@ overload is used to convert objects of type @@T@@ to string.&#10;&#10;Otherwise, the system attempts overload resolution for @@s &lt;&lt; x@@, where @@s@@ is a @@std::ostringstream@@ and @@x@@ is of type @@T@@. If this is successful, the @@operator&lt;&lt;@@ overload is used to convert objects of type @@T@@ to string.&#10;&#10;Otherwise the system is unable to convert objects of type @@T@@ to string, and an unspecified stub string value is used without issuing a compile error.&#10;</string>
+ <string>:)@@ and supports cloning.&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
                                                                                                 <weak_ptr>
                                                                                                         <expired>0</expired>
                                                                                                         <shared_ptr>
- <id>-22</id>
+ <id>-27</id>
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>13</size>
- <variant>2</variant>
- <string>!!exception&#10;&#10;&#10;&#10;(:include synopsis:)&#10;&#10;Class @@boost::(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-22</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)@@ is designed to be used as a universal base for user-defined exception types.&#10;&#10;An object of any type deriving from @@boost::(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-22</id>
- </shared_ptr>
- </weak_ptr>
+ <size>29</size>
                                                                                                         <variant>2</variant>
- <string>:)@@ can store data of arbitrary types, using the @@</string>
+ <string>!!!current_exception()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;The @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>@@ wrapper and @@(:link </string>
+ <string>:)()@@ function must not be called outside of a @@catch@@ block.&#10;&#10;!!!!Returns:&#10;&#10;* An @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>|operator&lt;&lt;:)()@@.&#10;&#10;To retrieve data from a @@boost::(:link </string>
+ <string>:)@@ that refers to the currently handled exception or a copy of the currently handled exception.&#10;* If the function needs to allocate memory and the attempt fails, it returns an @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ object, use the @@(:link </string>
+ <string>:)@@ that refers to an instance of @@std::bad_alloc@@.&#10;&#10;!!!!Notes:&#10;&#10;* It is unspecified whether the return values of two successive calls to @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-24</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)()@@ function template.&#10;&#10;(:include members:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-23</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>7</size>
- <variant>2</variant>
- <string>!!!operator&lt;&lt;()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;@@E@@ must be @@boost::(:link </string>
+ <string>:)()@@ refer to the same exception object.&#10;* Correct implementation of @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@, or a type that derives (indirectly) from @@boost::(:link </string>
+ <string>:)()@@ may require compiler support, unless @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@.&#10;&#10;!!!!Effects:&#10;&#10;* The first overload stores a copy of @@v@@ into @@x@@. If @@x@@ already contains data of type @@(:link </string>
+ <string>:)()@@ is used at the time the currently handled exception object was passed to @@throw@@. If @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&lt;Tag1,T1&gt;@@, that data is overwritten.&#10;* The @@boost::(:link http://www.boost.org/libs/tuple/doc/tuple_users_guide.html|tuple:)@@ overload is equivalent to @@x &lt;&lt; v.(:link http://www.boost.org/libs/tuple/doc/tuple_users_guide.html#accessing_elements|get:)&lt;0&gt;() &lt;&lt; ... &lt;&lt; v.(:link http://www.boost.org/libs/tuple/doc/tuple_users_guide.html#accessing_elements|get:)&lt;N&gt;()@@.&#10;&#10;!!!!Returns:&#10;&#10;@@x@@.&#10;&#10;(:include throws:)&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-24</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>7</size>
- <variant>2</variant>
- <string>!!!get_error_info()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;The type of the @@x@@ object must derive from @@boost::(:link </string>
+ <string>:)()@@ is not used, and if the compiler does not provide the necessary support, then @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@; @@ErrorInfo@@ must be an instance of the @@(:link </string>
+ <string>:)()@@ may return an @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@ template.&#10;&#10;!!!!Returns:&#10;&#10;If @@x@@ does not store an object of type @@ErrorInfo@@, returns an empty @@(:link http://www.boost.org/libs/smart_ptr/shared_ptr.htm|shared_ptr:)@@; otherwise returns pointer to the stored value. Use @@(:link </string>
+ <string>:)@@ that refers to an instance of @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-29</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>|operator&lt;&lt;:)()@@ to store values in exception objects.&#10;&#10;!!!!Throws:&#10;&#10;Nothing.&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-25</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>7</size>
- <variant>2</variant>
- <string>!!!enable_error_info()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Requirements:&#10;&#10;@@T@@ must be a user-defined type with accessible no-throw copy constructor.&#10;&#10;!!!!Returns:&#10;&#10;An object of unspecified type with no-throw copy semantics, which derives publicly from both @@T@@, and class @@boost::(:link </string>
+ <string>:)@@. In this case, if the original exception object derives from @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@. The @@T@@ sub-object is initialized from @@x@@ by the @@T@@ copy constructor. If @@T@@ already derives from @@boost::(:link </string>
+ <string>:)@@, then the @@boost::(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@, then the type of the returned object does not derive @@boost::(:link </string>
+ <string>:)@@ sub-object of the @@(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-29</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)@@.&#10;&#10;!!!!Throws:&#10;&#10;Nothing.&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-26</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>1</size>
- <variant>2</variant>
- <string>!!!rethrow_exception()&#10;&#10;(:include synopsis:)&#10;&#10;!!!!Precondition:&#10;&#10;@@ep@@ shall not be null.&#10;&#10;!!!!Throws:&#10;&#10;&#10;&#10;The exception to which @@ep@@ refers.&#10;</string>
- </container>
- </pair>
- <pair>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-27</id>
- </shared_ptr>
- </weak_ptr>
- <container>
- <size>0</size>
+ <string>:)@@ object is initialized by the @@boost::(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-9</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)@@ copy constructor.&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -5372,7 +5305,27 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>5</size>
+ <variant>2</variant>
+ <string>!!!unknown_exception&#10;&#10;(:include synopsis:)&#10;&#10;This type is used by the (:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-31</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>|cloning:) support in Boost Exception. Please see @@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-27</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)()@@.&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -5394,7 +5347,54 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>11</size>
+ <variant>2</variant>
+ <string>!!Transporting of Exceptions between Threads&#10;&#10;&#10;&#10;Boost Exception supports transporting of exception objects between threads through cloning. This system is similar to (:link http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html|N2179:), but because Boost Exception can not rely on language support, the use of @@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-26</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)()@@ at the time of the throw is required in order to use cloning.&#10;&#10;!!!!Note:&#10;&#10;All exceptions emitted by the familiar function @@boost::(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-5</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)()@@ are guaranteed to derive from @@boost::(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-9</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)@@ and to support cloning.&#10;&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-33</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&#10;&#10;&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-39</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -5423,7 +5423,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-30</id>
+ <id>-18</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5432,7 +5432,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-14</id>
+ <id>-28</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5441,7 +5441,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5450,7 +5450,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5472,7 +5472,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-27</id>
+ <id>-14</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5481,7 +5481,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5490,7 +5490,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5499,7 +5499,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5508,7 +5508,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5517,7 +5517,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5526,7 +5526,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-24</id>
+ <id>-11</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5535,7 +5535,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-24</id>
+ <id>-11</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5544,7 +5544,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5566,7 +5566,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5575,7 +5575,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5584,7 +5584,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-21</id>
+ <id>-8</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5606,7 +5606,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5615,7 +5615,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5624,7 +5624,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-23</id>
+ <id>-10</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5646,7 +5646,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5668,7 +5668,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-6</id>
+ <id>-20</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5677,7 +5677,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5686,7 +5686,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5695,7 +5695,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5704,7 +5704,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5713,7 +5713,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-24</id>
+ <id>-11</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5735,7 +5735,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5744,7 +5744,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5753,7 +5753,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5762,7 +5762,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-28</id>
+ <id>-15</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5771,7 +5771,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5780,7 +5780,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5789,7 +5789,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5798,7 +5798,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5807,7 +5807,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5816,7 +5816,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-26</id>
+ <id>-13</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5825,7 +5825,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5834,7 +5834,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-26</id>
+ <id>-13</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5843,7 +5843,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5852,7 +5852,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5861,7 +5861,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-12</id>
+ <id>-26</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5870,7 +5870,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-10</id>
+ <id>-24</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5879,7 +5879,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-15</id>
+ <id>-29</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5888,7 +5888,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-13</id>
+ <id>-27</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5897,7 +5897,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-26</id>
+ <id>-13</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5919,7 +5919,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5928,7 +5928,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-27</id>
+ <id>-14</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5937,7 +5937,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5946,7 +5946,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5955,7 +5955,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-27</id>
+ <id>-14</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5964,7 +5964,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-8</id>
+ <id>-22</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5973,7 +5973,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5982,7 +5982,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -5991,7 +5991,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -6000,7 +6000,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-24</id>
+ <id>-11</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -6062,18 +6062,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
- <variant>2</variant>
- <string>!!!!Throws:&#10;&#10;@@std::bad_alloc@@, or any other exception resulting from copying any of the arguments of @@(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-8</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)()@@.&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -6095,7 +6084,9 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>1</size>
+ <variant>2</variant>
+ <string>!!!!Throws:&#10;&#10;@@std::bad_alloc@@, or any exception emitted by @@T1..TN@@ copy constructor.&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -6227,7 +6218,18 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>3</size>
+ <variant>2</variant>
+ <string>!!!!Throws:&#10;&#10;@@std::bad_alloc@@, or any other exception resulting from copying any of the arguments of @@(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-22</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)()@@.&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -6238,9 +6240,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>1</size>
- <variant>2</variant>
- <string>!!!!Throws:&#10;&#10;@@std::bad_alloc@@, or any exception emitted by @@T1..TN@@ copy constructor.&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -6496,7 +6496,36 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>7</size>
+ <variant>2</variant>
+ <string>(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-36</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-37</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&#10;(:include </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-35</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -6639,36 +6668,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>7</size>
- <variant>2</variant>
- <string>(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-36</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-37</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&#10;(:include </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-35</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -6891,7 +6891,18 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>3</size>
+ <variant>2</variant>
+ <string>@@#include &lt;(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-16</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&gt;@@&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -6924,18 +6935,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
- <variant>2</variant>
- <string>@@#include &lt;(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-14</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&gt;@@&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -6953,7 +6953,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-14</id>
+ <id>-17</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -6968,7 +6968,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
+ <size>5</size>
                                                                                                         <variant>2</variant>
                                                                                                         <string>@@#include &lt;(:link </string>
                                                                                                         <variant>1</variant>
@@ -6979,7 +6979,16 @@
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&gt;@@&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
+ <string>:)&gt;@@\\&#10;@@#include &lt;(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-20</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&gt;&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -7019,7 +7028,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-30</id>
+ <id>-19</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -7041,7 +7050,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-28</id>
+ <id>-15</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -7067,18 +7076,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
- <variant>2</variant>
- <string>@@#include &lt;(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-28</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&gt;@@&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -7111,18 +7109,7 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>3</size>
- <variant>2</variant>
- <string>@@#include &lt;(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-29</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&gt;@@&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
+ <size>0</size>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -7173,7 +7160,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-31</id>
+ <id>-28</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -7188,27 +7175,18 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>5</size>
+ <size>3</size>
                                                                                                         <variant>2</variant>
                                                                                                         <string>@@#include &lt;(:link </string>
                                                                                                         <variant>1</variant>
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-14</id>
- </shared_ptr>
- </weak_ptr>
- <variant>2</variant>
- <string>:)&gt;@@\\&#10;@@#include &lt;(:link </string>
- <variant>1</variant>
- <weak_ptr>
- <expired>0</expired>
- <shared_ptr>
- <id>-6</id>
+ <id>-28</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
- <string>:)&gt;&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
+ <string>:)&gt;@@&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -7226,7 +7204,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-14</id>
+ <id>-15</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -7248,7 +7226,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-5</id>
+ <id>-15</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -7270,7 +7248,7 @@
                                                                                                         <weak_ptr>
                                                                                                                 <expired>0</expired>
                                                                                                                 <shared_ptr>
- <id>-28</id>
+ <id>-18</id>
                                                                                                                 </shared_ptr>
                                                                                                         </weak_ptr>
                                                                                                         <variant>2</variant>
@@ -7285,7 +7263,18 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>3</size>
+ <variant>2</variant>
+ <string>@@#include &lt;(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-15</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&gt;@@&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -7307,7 +7296,18 @@
                                                                                                         </shared_ptr>
                                                                                                 </weak_ptr>
                                                                                                 <container>
- <size>0</size>
+ <size>3</size>
+ <variant>2</variant>
+ <string>@@#include &lt;(:link </string>
+ <variant>1</variant>
+ <weak_ptr>
+ <expired>0</expired>
+ <shared_ptr>
+ <id>-15</id>
+ </shared_ptr>
+ </weak_ptr>
+ <variant>2</variant>
+ <string>:)&gt;@@&#10;&#10;[@namespace&#10;boost&#10; {&#10;(:include decl:)&#10; }@]&#10;</string>
                                                                                                 </container>
                                                                                         </pair>
                                                                                         <pair>
@@ -7576,7 +7576,7 @@
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-16</id>
+ <id>-30</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -7610,7 +7610,7 @@
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-17</id>
+ <id>-31</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -7627,7 +7627,7 @@
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-19</id>
+ <id>-6</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -7752,7 +7752,7 @@
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-22</id>
+ <id>-9</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -7776,79 +7776,91 @@
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-27</id>
+ <id>-14</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>1</size>
- <strong>DFB8EFE8A4EE9FB101DC20A69A4217A96B78A272D7DE88D579CFE8ECCC070531</strong>
- <weak>2228033283</weak>
- <size>94</size>
- <position>227</position>
+ <size>2</size>
+ <strong>F2625EB427DE44F90BD9E85E4E593BFF0FA732700934105770F16C8224BAA525</strong>
+ <weak>1648371423</weak>
+ <size>6100</size>
+ <position>737</position>
+ <strong>65D13C1BB0A16823F69A32BAB56A51CA317075C7FC8B7441EE0D9B57AF5AB2AC</strong>
+ <weak>2592266329</weak>
+ <size>712</size>
+ <position>1750</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/enable_error_info.hpp</string>
+ <string>../../../../boost/exception/info.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-5</id>
+ <id>-11</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>1</size>
- <strong>D9B8E6AA12A4F33953B1A961FA590C5A3840234B6531CA8C04AC985AD5800835</strong>
- <weak>2432554768</weak>
- <size>702</size>
- <position>408</position>
+ <size>2</size>
+ <strong>F2625EB427DE44F90BD9E85E4E593BFF0FA732700934105770F16C8224BAA525</strong>
+ <weak>1648371423</weak>
+ <size>6100</size>
+ <position>737</position>
+ <strong>865A7E598C4F2EDA41CCDFAD253F5E4699012898C97E29E3CB1C68DABA0C62B1</strong>
+ <weak>2395321958</weak>
+ <size>721</size>
+ <position>626</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../example/enable_error_info.cpp</string>
+ <string>../../../../boost/exception/info.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-20</id>
+ <id>-22</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>1</size>
- <strong>5373E336DC4892A41D31694BCA1146382FC3137819A04689CA1F9FFAF1CFAB3B</strong>
- <weak>4050491732</weak>
- <size>466</size>
- <position>307</position>
+ <size>2</size>
+ <strong>F2625EB427DE44F90BD9E85E4E593BFF0FA732700934105770F16C8224BAA525</strong>
+ <weak>1648371423</weak>
+ <size>6100</size>
+ <position>737</position>
+ <strong>27AC1164E0A824D548386BEDCDC81DCAC283F3D286B0ECEE05B039BB8C392BFC</strong>
+ <weak>1247954090</weak>
+ <size>249</size>
+ <position>1499</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../example/cloning_1.cpp</string>
+ <string>../../../../boost/exception/info.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-33</id>
+ <id>-10</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -7856,51 +7868,47 @@
                                                                                 <stream_hook_path>
                                                                                         <container>
                                                                                                 <size>1</size>
- <strong>2C5F1B7E5C5052C9C9305848AB499A9C166D728EAAD25DC936B75FCA997A0650</strong>
- <weak>3171555959</weak>
- <size>88</size>
- <position>1</position>
+ <strong>DFB8EFE8A4EE9FB101DC20A69A4217A96B78A272D7DE88D579CFE8ECCC070531</strong>
+ <weak>2228033283</weak>
+ <size>94</size>
+ <position>227</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/throw_exception.hpp</string>
+ <string>../../../../boost/exception/enable_error_info.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-29</id>
+ <id>-19</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>2</size>
- <strong>BE8985294A55E37D9B677C21D50CF4EB5251827504230A4FE52FCB7702370F51</strong>
- <weak>1124820874</weak>
- <size>329</size>
- <position>864</position>
- <strong>02FC4C7F80E4704A722A49C8337614DB5DF60CA53B53AAD869CD7ECE2DCBE057</strong>
- <weak>928857252</weak>
- <size>187</size>
- <position>129</position>
+ <size>1</size>
+ <strong>D9B8E6AA12A4F33953B1A961FA590C5A3840234B6531CA8C04AC985AD5800835</strong>
+ <weak>2432554768</weak>
+ <size>702</size>
+ <position>408</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/throw_exception.hpp</string>
+ <string>../../example/enable_error_info.cpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-18</id>
+ <id>-7</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -7908,23 +7916,23 @@
                                                                                 <stream_hook_path>
                                                                                         <container>
                                                                                                 <size>1</size>
- <strong>49D31376D97691F7C84A134B5D8C7C66EF1ED6901D376CA250D634AE2B38AB5E</strong>
- <weak>549270010</weak>
- <size>163</size>
- <position>572</position>
+ <strong>5373E336DC4892A41D31694BCA1146382FC3137819A04689CA1F9FFAF1CFAB3B</strong>
+ <weak>4050491732</weak>
+ <size>466</size>
+ <position>307</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
+ <string>../../example/cloning_1.cpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-9</id>
+ <id>-33</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -7932,23 +7940,23 @@
                                                                                 <stream_hook_path>
                                                                                         <container>
                                                                                                 <size>1</size>
- <strong>A9C65F105342D728DE9C996079E82DF25408B94A272090039FAAC12D29659F69</strong>
- <weak>2378831669</weak>
- <size>94</size>
- <position>227</position>
+ <strong>2C5F1B7E5C5052C9C9305848AB499A9C166D728EAAD25DC936B75FCA997A0650</strong>
+ <weak>3171555959</weak>
+ <size>88</size>
+ <position>1</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/enable_current_exception.hpp</string>
+ <string>../../../../boost/throw_exception.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-30</id>
+ <id>-16</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -7956,62 +7964,70 @@
                                                                                 <stream_hook_path>
                                                                                         <container>
                                                                                                 <size>2</size>
- <strong>0ABC82B04F3761C21F4588ABC9D5F82BAF3F293974F0ECE694303EFB59BA7376</strong>
- <weak>3824507607</weak>
- <size>2762</size>
- <position>516</position>
- <strong>8F3B5E1A267CA225679713F4DDF528041F573BC02D1DBCD8FFEF57EF0AA599B9</strong>
- <weak>4197332561</weak>
- <size>180</size>
- <position>2576</position>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>921FBF6991E17349BFF2AD6F165372F85AA9457DDB28E502ABB6B392BBA6B529</strong>
+ <weak>3119269037</weak>
+ <size>284</size>
+ <position>4423</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/enable_current_exception.hpp</string>
+ <string>../../../../boost/exception_ptr.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-12</id>
+ <id>-25</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>1</size>
- <strong>C9AFCA0931CB65AE31811E702FC48CB22348149B1D259CD9161D391FEC640FA8</strong>
- <weak>2324436793</weak>
- <size>94</size>
- <position>227</position>
+ <size>2</size>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>9567A192BF523DDF741004FFF5BDB044D715FEB7CE9AEC89ACC25C1C33E48C4E</strong>
+ <weak>2232115228</weak>
+ <size>381</size>
+ <position>26</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/exception.hpp</string>
+ <string>../../../../boost/exception_ptr.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-31</id>
+ <id>-29</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>1</size>
- <strong>40C2FBC8600FE6877A6D46EC005D97EB1F612B8687CCA297C838E10A80E089AA</strong>
- <weak>2576029551</weak>
- <size>94</size>
- <position>227</position>
+ <size>2</size>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>9DEEF8ED70BF74F501A96BA5DE5BFD42FAD16DE333ABE189E512C332586FC465</strong>
+ <weak>2250569940</weak>
+ <size>1893</size>
+ <position>2528</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
@@ -8024,55 +8040,63 @@
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-28</id>
+ <id>-27</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>1</size>
- <strong>5EE6ED209B5DBBD30DFCDA1FD30719A799EE9DBD48A5176F73EADB588CAEB2AA</strong>
- <weak>2442598207</weak>
- <size>94</size>
- <position>227</position>
+ <size>2</size>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>156B870761DB092CE4269C1173B479A344A1041BA2B883765AF19A72B371D776</strong>
+ <weak>3239976720</weak>
+ <size>117</size>
+ <position>4709</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
+ <string>../../../../boost/exception_ptr.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-14</id>
+ <id>-13</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>1</size>
- <strong>CAD6C404CB725D336A44920D2341ECA131149AB02C368B59028F8147F16737BF</strong>
- <weak>2258638601</weak>
- <size>94</size>
- <position>227</position>
+ <size>2</size>
+ <strong>973F8368D72D56424349CBB81C8F3015CB9F4F0CD7B23A8C62C3DBADDA37CD57</strong>
+ <weak>3833800883</weak>
+ <size>4832</size>
+ <position>514</position>
+ <strong>ED09F845070FF7D381BE5EFB6B55313FD09FBA16B64B69992410380EFA45519C</strong>
+ <weak>2051939590</weak>
+ <size>78</size>
+ <position>409</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/info_tuple.hpp</string>
+ <string>../../../../boost/exception_ptr.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-6</id>
+ <id>-24</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -8080,75 +8104,75 @@
                                                                                 <stream_hook_path>
                                                                                         <container>
                                                                                                 <size>1</size>
- <strong>EB524A8A61E5F1A93CE4336B980696C09E7ADF42A6B933BA76EFB1544AB7C4CC</strong>
- <weak>2274957083</weak>
- <size>94</size>
- <position>227</position>
+ <strong>49D31376D97691F7C84A134B5D8C7C66EF1ED6901D376CA250D634AE2B38AB5E</strong>
+ <weak>549270010</weak>
+ <size>163</size>
+ <position>572</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/error_info.hpp</string>
+ <string>../../../../boost/exception/info.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-7</id>
+ <id>-23</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>2</size>
- <strong>9535E799FA734E0B544C723831057F15D0D36849A0B70EB3485F545E3DBBF9D0</strong>
- <weak>2555086413</weak>
- <size>1421</size>
- <position>367</position>
- <strong>21F529F6CC88DB2566F36223A07F700BD043680083D73ABA1A7444A663AAFCFF</strong>
- <weak>4141043385</weak>
- <size>241</size>
- <position>1174</position>
+ <size>1</size>
+ <strong>A9C65F105342D728DE9C996079E82DF25408B94A272090039FAAC12D29659F69</strong>
+ <weak>2378831669</weak>
+ <size>94</size>
+ <position>227</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/enable_error_info.hpp</string>
+ <string>../../../../boost/exception/enable_current_exception.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-25</id>
+ <id>-18</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>1</size>
- <strong>F4C951B28F7DE500973AA3DFAA99F2BADA6EDAFA2B406C30BEF3B7FBE6FD57D7</strong>
- <weak>2263754923</weak>
- <size>982</size>
- <position>306</position>
+ <size>2</size>
+ <strong>0ABC82B04F3761C21F4588ABC9D5F82BAF3F293974F0ECE694303EFB59BA7376</strong>
+ <weak>3824507607</weak>
+ <size>2762</size>
+ <position>516</position>
+ <strong>8F3B5E1A267CA225679713F4DDF528041F573BC02D1DBCD8FFEF57EF0AA599B9</strong>
+ <weak>4197332561</weak>
+ <size>180</size>
+ <position>2576</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../example/error_info_2.cpp</string>
+ <string>../../../../boost/exception/enable_current_exception.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-40</id>
+ <id>-26</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -8156,70 +8180,62 @@
                                                                                 <stream_hook_path>
                                                                                         <container>
                                                                                                 <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>921FBF6991E17349BFF2AD6F165372F85AA9457DDB28E502ABB6B392BBA6B529</strong>
- <weak>3119269037</weak>
- <size>284</size>
- <position>4306</position>
+ <strong>33C9C03A97DEE6FC1B9B36E8832FF546419173B8389B8488206E7A3DE9C7CA88</strong>
+ <weak>2998452034</weak>
+ <size>583</size>
+ <position>867</position>
+ <strong>99278A58AB0ED511046D5EBEE4B616E145C9D69033CD5577EC8BF3761227A46A</strong>
+ <weak>1992783533</weak>
+ <size>359</size>
+ <position>211</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception_ptr.hpp</string>
+ <string>../../../../boost/throw_exception.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-11</id>
+ <id>-5</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>9DEEF8ED70BF74F501A96BA5DE5BFD42FAD16DE333ABE189E512C332586FC465</strong>
- <weak>2250569940</weak>
- <size>1893</size>
- <position>2411</position>
+ <size>1</size>
+ <strong>C9AFCA0931CB65AE31811E702FC48CB22348149B1D259CD9161D391FEC640FA8</strong>
+ <weak>2324436793</weak>
+ <size>94</size>
+ <position>227</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception_ptr.hpp</string>
+ <string>../../../../boost/exception/exception.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-13</id>
+ <id>-17</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>7B6F48BAF7F452EDAEC5D09418936D96101CCA8700CD7469B9C7DA5DCA659E6A</strong>
- <weak>3892925390</weak>
- <size>335</size>
- <position>26</position>
+ <size>1</size>
+ <strong>40C2FBC8600FE6877A6D46EC005D97EB1F612B8687CCA297C838E10A80E089AA</strong>
+ <weak>2576029551</weak>
+ <size>94</size>
+ <position>227</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
@@ -8239,56 +8255,48 @@
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>156B870761DB092CE4269C1173B479A344A1041BA2B883765AF19A72B371D776</strong>
- <weak>3239976720</weak>
- <size>117</size>
- <position>4592</position>
+ <size>1</size>
+ <strong>5EE6ED209B5DBBD30DFCDA1FD30719A799EE9DBD48A5176F73EADB588CAEB2AA</strong>
+ <weak>2442598207</weak>
+ <size>94</size>
+ <position>227</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception_ptr.hpp</string>
+ <string>../../../../boost/exception/info.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-26</id>
+ <id>-28</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>2</size>
- <strong>5D3DFA90F5284E2BBF205D4BE191AD1949612D410554F40C20FDAE88EBE373DC</strong>
- <weak>3654158033</weak>
- <size>4715</size>
- <position>498</position>
- <strong>ED09F845070FF7D381BE5EFB6B55313FD09FBA16B64B69992410380EFA45519C</strong>
- <weak>2051939590</weak>
- <size>78</size>
- <position>363</position>
+ <size>1</size>
+ <strong>CAD6C404CB725D336A44920D2341ECA131149AB02C368B59028F8147F16737BF</strong>
+ <weak>2258638601</weak>
+ <size>94</size>
+ <position>227</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception_ptr.hpp</string>
+ <string>../../../../boost/exception/info_tuple.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-10</id>
+ <id>-20</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -8296,83 +8304,75 @@
                                                                                 <stream_hook_path>
                                                                                         <container>
                                                                                                 <size>2</size>
- <strong>7AC7304D50E623B0954AEB799FFFDDD646C8F62AFFD31BBB79A7EBA312A17AE8</strong>
- <weak>2015761243</weak>
- <size>6002</size>
- <position>737</position>
- <strong>65D13C1BB0A16823F69A32BAB56A51CA317075C7FC8B7441EE0D9B57AF5AB2AC</strong>
- <weak>2592266329</weak>
- <size>712</size>
- <position>1652</position>
+ <strong>C4D33E012F1FD360A08BE7032246E4361A8D8A3E1D316D454707AD9484C9F8C0</strong>
+ <weak>2765396103</weak>
+ <size>1505</size>
+ <position>367</position>
+ <strong>21F529F6CC88DB2566F36223A07F700BD043680083D73ABA1A7444A663AAFCFF</strong>
+ <weak>4141043385</weak>
+ <size>241</size>
+ <position>1258</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
+ <string>../../../../boost/exception/enable_error_info.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-24</id>
+ <id>-12</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>2</size>
- <strong>7AC7304D50E623B0954AEB799FFFDDD646C8F62AFFD31BBB79A7EBA312A17AE8</strong>
- <weak>2015761243</weak>
- <size>6002</size>
- <position>737</position>
- <strong>865A7E598C4F2EDA41CCDFAD253F5E4699012898C97E29E3CB1C68DABA0C62B1</strong>
- <weak>2395321958</weak>
- <size>721</size>
- <position>528</position>
+ <size>1</size>
+ <strong>EB524A8A61E5F1A93CE4336B980696C09E7ADF42A6B933BA76EFB1544AB7C4CC</strong>
+ <weak>2274957083</weak>
+ <size>94</size>
+ <position>227</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
+ <string>../../../../boost/exception/error_info.hpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-8</id>
+ <id>-21</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
                                                                         <hook>
                                                                                 <stream_hook_path>
                                                                                         <container>
- <size>2</size>
- <strong>7AC7304D50E623B0954AEB799FFFDDD646C8F62AFFD31BBB79A7EBA312A17AE8</strong>
- <weak>2015761243</weak>
- <size>6002</size>
- <position>737</position>
- <strong>27AC1164E0A824D548386BEDCDC81DCAC283F3D286B0ECEE05B039BB8C392BFC</strong>
- <weak>1247954090</weak>
- <size>249</size>
- <position>1401</position>
+ <size>1</size>
+ <strong>F4C951B28F7DE500973AA3DFAA99F2BADA6EDAFA2B406C30BEF3B7FBE6FD57D7</strong>
+ <weak>2263754923</weak>
+ <size>982</size>
+ <position>306</position>
                                                                                         </container>
                                                                                 </stream_hook_path>
                                                                         </hook>
                                                                         <file>
                                                                                 <path>
                                                                                         <empty>0</empty>
- <string>../../../../boost/exception/info.hpp</string>
+ <string>../../example/error_info_2.cpp</string>
                                                                                         <type>0</type>
                                                                                         <base>0</base>
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-23</id>
+ <id>-40</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                                 <pair>
@@ -8444,7 +8444,7 @@
                                                                                 </path>
                                                                         </file>
                                                                         <shared_ptr>
- <id>-21</id>
+ <id>-8</id>
                                                                         </shared_ptr>
                                                                 </pair>
                                                         </sorted>
@@ -8475,7 +8475,7 @@
                                                                                         <id>-5</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>boost/exception/enable_error_info.hpp,exception,header</string>
+ <string>cloning,exception,free,function,template,throw_exception</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8484,7 +8484,7 @@
                                                                                         <id>-6</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>boost/exception/info_tuple.hpp,exception,header</string>
+ <string>error_info,exception,noindex,tutorial</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8493,7 +8493,7 @@
                                                                                         <id>-7</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>boost/exception/error_info.hpp,exception,header</string>
+ <string>noindex,tutorial</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8502,7 +8502,7 @@
                                                                                         <id>-8</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>error_info,exception,free,function,template</string>
+ <string>noindex,tutorial</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8511,7 +8511,7 @@
                                                                                         <id>-9</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>BOOST_ERROR_INFO,error_info,exception,macro</string>
+ <string>exception,type</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8520,7 +8520,7 @@
                                                                                         <id>-10</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>cloning,exception,exception_ptr,type</string>
+ <string>error_info,exception,free,function,operator&lt;&lt;/exception,template</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8529,7 +8529,7 @@
                                                                                         <id>-11</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>cloning,copy_exception,exception,free,function</string>
+ <string>error_info,exception,free,function,get_error_info,template</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8538,7 +8538,7 @@
                                                                                         <id>-12</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>cloning,enable_current_exception,exception,free,function,template</string>
+ <string>enable_error_info,error_info,exception,free,function,template</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8547,7 +8547,7 @@
                                                                                         <id>-13</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>cloning,current_exception,exception,free,function</string>
+ <string>cloning,exception,free,function,rethrow_exception</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8556,7 +8556,7 @@
                                                                                         <id>-14</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>boost/exception/info.hpp,exception,header</string>
+ <string>boost/exception.hpp,exception,header</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8565,7 +8565,7 @@
                                                                                         <id>-15</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>cloning,exception,type,unknown_exception</string>
+ <string>boost/exception_ptr.hpp,header</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8574,7 +8574,7 @@
                                                                                         <id>-16</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>exception,noindex</string>
+ <string>boost/throw_exception.hpp,header</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8583,7 +8583,7 @@
                                                                                         <id>-17</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>cloning,exception,noindex,tutorial</string>
+ <string>boost/exception/exception.hpp,exception,header</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8592,7 +8592,7 @@
                                                                                         <id>-18</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>cloning,exception,free,function,template,throw_exception</string>
+ <string>boost/exception/enable_current_exception.hpp,exception,header</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8601,7 +8601,7 @@
                                                                                         <id>-19</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>error_info,exception,noindex,tutorial</string>
+ <string>boost/exception/enable_error_info.hpp,exception,header</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8610,7 +8610,7 @@
                                                                                         <id>-20</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>noindex,tutorial</string>
+ <string>boost/exception/info_tuple.hpp,exception,header</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8619,7 +8619,7 @@
                                                                                         <id>-21</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>noindex,tutorial</string>
+ <string>boost/exception/error_info.hpp,exception,header</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8628,7 +8628,7 @@
                                                                                         <id>-22</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>exception,type</string>
+ <string>error_info,exception,free,function,template</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8637,7 +8637,7 @@
                                                                                         <id>-23</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>error_info,exception,free,function,operator&lt;&lt;/exception,template</string>
+ <string>BOOST_ERROR_INFO,error_info,exception,macro</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8646,7 +8646,7 @@
                                                                                         <id>-24</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>error_info,exception,free,function,get_error_info,template</string>
+ <string>cloning,exception,exception_ptr,type</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8655,7 +8655,7 @@
                                                                                         <id>-25</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>enable_error_info,error_info,exception,free,function,template</string>
+ <string>cloning,copy_exception,exception,free,function</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8664,7 +8664,7 @@
                                                                                         <id>-26</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>cloning,exception,free,function,rethrow_exception</string>
+ <string>cloning,enable_current_exception,exception,free,function,template</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8673,7 +8673,7 @@
                                                                                         <id>-27</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>boost/exception.hpp,exception,header</string>
+ <string>cloning,current_exception,exception,free,function</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8682,7 +8682,7 @@
                                                                                         <id>-28</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>boost/exception_ptr.hpp,header</string>
+ <string>boost/exception/info.hpp,exception,header</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8691,7 +8691,7 @@
                                                                                         <id>-29</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>boost/throw_exception.hpp,header</string>
+ <string>cloning,exception,type,unknown_exception</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8700,7 +8700,7 @@
                                                                                         <id>-30</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>boost/exception/enable_current_exception.hpp,exception,header</string>
+ <string>exception,noindex</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>
@@ -8709,7 +8709,7 @@
                                                                                         <id>-31</id>
                                                                                 </shared_ptr>
                                                                         </weak_ptr>
- <string>boost/exception/exception.hpp,exception,header</string>
+ <string>cloning,exception,noindex,tutorial</string>
                                                                 </pair>
                                                                 <pair>
                                                                         <weak_ptr>

Modified: branches/proto/v4/libs/exception/doc/throw_exception.html
==============================================================================
--- branches/proto/v4/libs/exception/doc/throw_exception.html (original)
+++ branches/proto/v4/libs/exception/doc/throw_exception.html 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -31,7 +31,9 @@
     void <span class="RenoLink">throw_exception</span>( E const &amp; e );
 #endif</span>
     }</pre>
-</div><h4>Effects:</h4>
+</div><h4>Requirements:</h4>
+<p><tt>E</tt> must derive publicly from <tt>std::exception</tt>.</p>
+<h4>Effects:</h4>
 <div><ul><li> If <tt>BOOST_NO_EXCEPTIONS</tt> is not defined, <tt>boost::<span class="RenoLink">throw_exception</span>(e)</tt> is equivalent to <tt>throw boost::<span class="RenoLink">enable_current_exception</span>(boost::<span class="RenoLink">enable_error_info</span>(e))</tt>, unless <tt>BOOST_EXCEPTION_DISABLE</tt> is defined, in which case <tt>boost::<span class="RenoLink">throw_exception</span>(e)</tt> is equivalent to <tt>throw e;</tt></li>
 <li> If <tt>BOOST_NO_EXCEPTIONS</tt> is defined, the function is left undefined, and the user is expected to supply an appropriate definition. Callers of <tt>throw_exception</tt> are allowed to assume that the function never returns; therefore, if the user-defined <tt>throw_exception</tt> returns, the behavior is undefined.</li>
 </ul></div>

Modified: branches/proto/v4/libs/exception/test/Jamfile.v2
==============================================================================
--- branches/proto/v4/libs/exception/test/Jamfile.v2 (original)
+++ branches/proto/v4/libs/exception/test/Jamfile.v2 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -26,6 +26,7 @@
 run error_info_test.cpp ;
 run what_test.cpp ;
 compile-fail exception_fail.cpp ;
+compile-fail throw_exception_fail.cpp ;
 
 #headers
 compile enable_current_exception_hpp_test.cpp ;

Modified: branches/proto/v4/libs/exception/test/helper2.hpp
==============================================================================
--- branches/proto/v4/libs/exception/test/helper2.hpp (original)
+++ branches/proto/v4/libs/exception/test/helper2.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -7,6 +7,7 @@
 #define UUID_BC765EB4CA2A11DCBDC5828355D89593
 
 #include <boost/exception/exception.hpp>
+#include <exception>
 
 namespace
 boost

Modified: branches/proto/v4/libs/lambda/doc/lambda.xml
==============================================================================
--- branches/proto/v4/libs/lambda/doc/lambda.xml (original)
+++ branches/proto/v4/libs/lambda/doc/lambda.xml 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -44,7 +44,7 @@
     <para>
 
       The Boost Lambda Library (BLL in the sequel) is a C++ template
- library, which implements form of <emphasis>lambda abstractions</emphasis> for C++.
+ library, which implements a form of <emphasis>lambda abstractions</emphasis> for C++.
 The term originates from functional programming and lambda calculus, where a lambda abstraction defines an unnamed function.
       The primary motivation for the BLL is to provide flexible and
       convenient means to define unnamed function objects for STL algorithms.

Modified: branches/proto/v4/libs/numeric/interval/doc/interval.htm
==============================================================================
--- branches/proto/v4/libs/numeric/interval/doc/interval.htm (original)
+++ branches/proto/v4/libs/numeric/interval/doc/interval.htm 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -87,7 +87,7 @@
   <h3>Interval Arithmetic</h3>
 
   <p>An interval is a pair of numbers which represents all the numbers
- between these two. (Intervals are considered close so the bounds are
+ between these two. (Intervals are considered closed so the bounds are
   included.) The purpose of this library is to extend the usual arithmetic
   functions to intervals. These intervals will be written [<i>a</i>,<i>b</i>]
   to represent all the numbers between <i>a</i> and <i>b</i> (included).

Modified: branches/proto/v4/libs/range/test/string.cpp
==============================================================================
--- branches/proto/v4/libs/range/test/string.cpp (original)
+++ branches/proto/v4/libs/range/test/string.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -137,14 +137,7 @@
     BOOST_CHECK_EQUAL( str_end( char_s ), str_end1 );
     BOOST_CHECK_EQUAL( str_empty( char_s ), (char_s == 0 || char_s[0] == char()) );
     BOOST_CHECK_EQUAL( sz, std::char_traits<char>::length( char_s ) );
-/*
- BOOST_CHECK_EQUAL( str_begin( char_s2 ), char_s2 );
- std::size_t sz2 = size( char_s2 );
- const char* str_end12 = str_begin( char_s2 ) + sz;
- BOOST_CHECK_EQUAL( str_end( char_s2 ), str_end12 );
- BOOST_CHECK_EQUAL( empty( char_s2 ), (char_s2 == 0 || char_s2[0] == char()) );
- BOOST_CHECK_EQUAL( sz2, std::char_traits<char>::length( char_s2 ) );
-*/
+
     BOOST_CHECK_EQUAL( str_begin( my_string ), my_string );
     range_iterator<char_array_t>::type str_end2 = str_begin( my_string ) + str_size(my_string);
     range_iterator<char_array_t>::type str_end3 = str_end(my_string);
@@ -165,6 +158,20 @@
 
     BOOST_CHECK( find_const( as_array( my_string ), to_search ) != str_end(my_string) );
     BOOST_CHECK( find_const( as_array( my_const_string ), to_search ) != str_end(my_string) );
+
+ //
+ // Test that as_literal() always scan for null terminator
+ //
+ char an_array[] = "foo\0bar";
+ BOOST_CHECK_EQUAL( str_begin( an_array ), an_array );
+ BOOST_CHECK_EQUAL( str_end( an_array ), an_array + 3 );
+ BOOST_CHECK_EQUAL( str_size( an_array ), 3 );
+
+ const char a_const_array[] = "foobar\0doh";
+ BOOST_CHECK_EQUAL( str_begin( a_const_array ), a_const_array );
+ BOOST_CHECK_EQUAL( str_end( a_const_array ), a_const_array + 6 );
+ BOOST_CHECK_EQUAL( str_size( a_const_array ), 6 );
+
 }
 
 
@@ -172,9 +179,6 @@
 void check_string()
 {
     check_char();
-// check_char<volatile char>();
-// check_char<const char>();
-// check_char<const volatile char>();
     
 #ifndef BOOST_NO_STD_WSTRING
     typedef wchar_t* wchar_iterator_t;
@@ -197,13 +201,7 @@
     BOOST_CHECK_EQUAL( str_end(char_ws), (str_begin( char_ws ) + sz) );
     BOOST_CHECK_EQUAL( str_empty( char_ws ), (char_ws == 0 || char_ws[0] == wchar_t()) );
     BOOST_CHECK_EQUAL( sz, std::char_traits<wchar_t>::length( char_ws ) );
- /*
- std::size_t sz2 = size( char_ws2 );
- BOOST_CHECK_EQUAL( str_begin( char_ws2 ), char_ws2 );
- BOOST_CHECK_EQUAL( str_end( char_ws2 ), (begin( char_ws2 ) + sz2) );
- BOOST_CHECK_EQUAL( empty( char_ws2 ), (char_ws2 == 0 || char_ws2[0] == wchar_t()) );
- BOOST_CHECK_EQUAL( sz2, std::char_traits<wchar_t>::length( char_ws2 ) );
- */
+
     wchar_t to_search = L'n';
     BOOST_CHECK( find( char_ws, to_search ) != str_end(char_ws) );
 

Modified: branches/proto/v4/libs/smart_ptr/intrusive_ptr.html
==============================================================================
--- branches/proto/v4/libs/smart_ptr/intrusive_ptr.html (original)
+++ branches/proto/v4/libs/smart_ptr/intrusive_ptr.html 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -62,6 +62,8 @@
       intrusive_ptr &amp; operator=(intrusive_ptr const &amp; r);
       template&lt;class Y&gt; intrusive_ptr &amp; operator=(intrusive_ptr&lt;Y&gt; const &amp; r);
       intrusive_ptr &amp; operator=(T * r);
+
+ void reset();
       void reset(T * r);
 
       T &amp; operator*() const; // never throws
@@ -148,6 +150,10 @@
                         <P><B>Returns:</B> <code>*this</code>.</P>
                 </BLOCKQUOTE>
                 <H3><a name="reset">reset</a></H3>
+ <pre>void reset();</pre>
+ <BLOCKQUOTE>
+ <P><B>Effects:</B> Equivalent to <code>intrusive_ptr().swap(*this)</code>.</P>
+ </BLOCKQUOTE>
                 <pre>void reset(T * r);</pre>
                 <BLOCKQUOTE>
                         <P><B>Effects:</B> Equivalent to <code>intrusive_ptr(r).swap(*this)</code>.</P>

Modified: branches/proto/v4/libs/smart_ptr/test/Jamfile.v2
==============================================================================
--- branches/proto/v4/libs/smart_ptr/test/Jamfile.v2 (original)
+++ branches/proto/v4/libs/smart_ptr/test/Jamfile.v2 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -46,5 +46,9 @@
           [ run sp_accept_owner_test.cpp ]
           [ run sp_atomic_test.cpp ]
           [ run make_shared_test.cpp ]
+ [ run sp_convertible_test.cpp ]
+ [ run wp_convertible_test.cpp ]
+ [ run ip_convertible_test.cpp ]
+ [ run allocate_shared_test.cpp ]
         ;
 }

Modified: branches/proto/v4/libs/smart_ptr/test/make_shared_test.cpp
==============================================================================
--- branches/proto/v4/libs/smart_ptr/test/make_shared_test.cpp (original)
+++ branches/proto/v4/libs/smart_ptr/test/make_shared_test.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -47,26 +47,12 @@
     }
 
     {
- boost::shared_ptr< int > pi = boost::allocate_shared< int >( std::allocator<int>() );
-
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( *pi == 0 );
- }
-
- {
         boost::shared_ptr< int > pi = boost::make_shared< int >( 5 );
 
         BOOST_TEST( pi.get() != 0 );
         BOOST_TEST( *pi == 5 );
     }
 
- {
- boost::shared_ptr< int > pi = boost::allocate_shared< int >( std::allocator<int>(), 5 );
-
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( *pi == 5 );
- }
-
     BOOST_TEST( X::instances == 0 );
 
     {
@@ -82,20 +68,6 @@
         BOOST_TEST( X::instances == 0 );
     }
 
-
- {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>() );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 0 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
     {
         boost::shared_ptr< X > pi = boost::make_shared< X >( 1 );
         boost::weak_ptr<X> wp( pi );
@@ -110,19 +82,6 @@
     }
 
     {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>(), 1 );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 1 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
- {
         boost::shared_ptr< X > pi = boost::make_shared< X >( 1, 2 );
         boost::weak_ptr<X> wp( pi );
 
@@ -136,19 +95,6 @@
     }
 
     {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>(), 1, 2 );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 1+2 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
- {
         boost::shared_ptr< X > pi = boost::make_shared< X >( 1, 2, 3 );
         boost::weak_ptr<X> wp( pi );
 
@@ -162,19 +108,6 @@
     }
 
     {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3 );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 1+2+3 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
- {
         boost::shared_ptr< X > pi = boost::make_shared< X >( 1, 2, 3, 4 );
         boost::weak_ptr<X> wp( pi );
 
@@ -188,19 +121,6 @@
     }
 
     {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4 );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 1+2+3+4 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
- {
         boost::shared_ptr< X > pi = boost::make_shared< X >( 1, 2, 3, 4, 5 );
         boost::weak_ptr<X> wp( pi );
 
@@ -214,19 +134,6 @@
     }
 
     {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5 );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 1+2+3+4+5 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
- {
         boost::shared_ptr< X > pi = boost::make_shared< X >( 1, 2, 3, 4, 5, 6 );
         boost::weak_ptr<X> wp( pi );
 
@@ -240,19 +147,6 @@
     }
 
     {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5, 6 );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 1+2+3+4+5+6 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
- {
         boost::shared_ptr< X > pi = boost::make_shared< X >( 1, 2, 3, 4, 5, 6, 7 );
         boost::weak_ptr<X> wp( pi );
 
@@ -266,19 +160,6 @@
     }
 
     {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7 );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 1+2+3+4+5+6+7 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
- {
         boost::shared_ptr< X > pi = boost::make_shared< X >( 1, 2, 3, 4, 5, 6, 7, 8 );
         boost::weak_ptr<X> wp( pi );
 
@@ -292,19 +173,6 @@
     }
 
     {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7, 8 );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
- {
         boost::shared_ptr< X > pi = boost::make_shared< X >( 1, 2, 3, 4, 5, 6, 7, 8, 9 );
         boost::weak_ptr<X> wp( pi );
 
@@ -317,18 +185,5 @@
         BOOST_TEST( X::instances == 0 );
     }
 
- {
- boost::shared_ptr< X > pi = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7, 8, 9 );
- boost::weak_ptr<X> wp( pi );
-
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( pi.get() != 0 );
- BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8+9 );
-
- pi.reset();
-
- BOOST_TEST( X::instances == 0 );
- }
-
     return boost::report_errors();
 }

Modified: branches/proto/v4/libs/smart_ptr/test/pointer_cast_test.cpp
==============================================================================
--- branches/proto/v4/libs/smart_ptr/test/pointer_cast_test.cpp (original)
+++ branches/proto/v4/libs/smart_ptr/test/pointer_cast_test.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -1,7 +1,7 @@
 //
 // pointer_cast_test.cpp - a test for boost/pointer_cast.hpp
 //
-// Copyright (c) 2005 Ion Gaztañaga
+// Copyright (c) 2005 Ion Gaztanaga
 // Copyright (c) 2005 Peter Dimov
 //
 // Distributed under the Boost Software License, Version 1.0. (See

Modified: branches/proto/v4/libs/smart_ptr/test/smart_ptr_test.cpp
==============================================================================
--- branches/proto/v4/libs/smart_ptr/test/smart_ptr_test.cpp (original)
+++ branches/proto/v4/libs/smart_ptr/test/smart_ptr_test.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -196,6 +196,10 @@
     BOOST_TEST( cp.use_count() == 3 );
     BOOST_TEST( *cp == 87654 );
 
+#if defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP )
+ using boost::swap;
+#endif
+
     boost::shared_ptr<int> cp4;
     swap( cp2, cp4 );
     BOOST_TEST( cp4.use_count() == 3 );

Modified: branches/proto/v4/libs/smart_ptr/test/sp_atomic_mt_test.cpp
==============================================================================
--- branches/proto/v4/libs/smart_ptr/test/sp_atomic_mt_test.cpp (original)
+++ branches/proto/v4/libs/smart_ptr/test/sp_atomic_mt_test.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -1,3 +1,10 @@
+
+// Copyright (c) 2008 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+
 //#define USE_MUTEX
 //#define USE_RWLOCK
 

Modified: branches/proto/v4/libs/smart_ptr/test/sp_unary_addr_test.cpp
==============================================================================
--- branches/proto/v4/libs/smart_ptr/test/sp_unary_addr_test.cpp (original)
+++ branches/proto/v4/libs/smart_ptr/test/sp_unary_addr_test.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -49,6 +49,9 @@
         BOOST_TEST( q != 0 && q->data == 17041 );
     }
 
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1300 )
+#else
+
     {
         boost::shared_ptr<X> p( &x, deleter(), std::allocator<X>() );
 
@@ -58,5 +61,7 @@
         BOOST_TEST( q != 0 && q->data == 17041 );
     }
 
+#endif
+
     return boost::report_errors();
 }

Modified: branches/proto/v4/libs/spirit/example/karma/Jamfile
==============================================================================
--- branches/proto/v4/libs/spirit/example/karma/Jamfile (original)
+++ branches/proto/v4/libs/spirit/example/karma/Jamfile 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -13,4 +13,5 @@
 exe functor_facilities : functor_facilities.cpp ;
 exe calc2_ast_dump : calc2_ast_dump.cpp ;
 exe calc2_ast_rpn : calc2_ast_rpn.cpp ;
+exe calc2_ast_vm : calc2_ast_vm.cpp ;
 

Modified: branches/proto/v4/libs/spirit/example/karma/actions.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/example/karma/actions.cpp (original)
+++ branches/proto/v4/libs/spirit/example/karma/actions.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -10,7 +10,6 @@
 #include <boost/spirit/include/karma.hpp>
 #include <boost/lambda/lambda.hpp>
 #include <boost/bind.hpp>
-#include <boost/function_output_iterator.hpp>
 
 #include <iostream>
 #include <strstream>
@@ -36,40 +35,12 @@
     }
 };
 
-///////////////////////////////////////////////////////////////////////////
-template <typename String>
-struct string_appender
-{
- string_appender(String& s)
- : str(s)
- {}
-
- template <typename T>
- void operator()(T const &x) const
- {
- str += x;
- }
-
- String& str;
-};
-
-template <typename String>
-inline string_appender<String>
-make_string_appender(String& str)
-{
- return string_appender<String>(str);
-}
-
-
 ///////////////////////////////////////////////////////////////////////////////
 int main()
 {
- using boost::make_function_output_iterator;
-
     { // example using plain functions
         std::string generated;
- bool result = karma::generate(
- make_function_output_iterator(make_string_appender(generated)),
+ bool result = karma::generate(std::back_inserter(generated),
             '{' << int_[&read] << '}');
 
         if (result)
@@ -78,8 +49,7 @@
 
     { // example using simple function objects
         std::string generated;
- bool result = karma::generate(
- make_function_output_iterator(make_string_appender(generated)),
+ bool result = karma::generate(std::back_inserter(generated),
             '{' << int_[read_action()] << '}');
 
         if (result)
@@ -88,8 +58,7 @@
 
     { // example using boost.bind
         std::string generated;
- bool result = karma::generate(
- make_function_output_iterator(make_string_appender(generated)),
+ bool result = karma::generate(std::back_inserter(generated),
             '{' << int_[boost::bind(&read, _1)] << '}');
 
         if (result)
@@ -97,14 +66,13 @@
     }
 
     { // example using boost.lambda
- using boost::lambda::_1;
+ namespace lambda = boost::lambda;
 
         std::string generated;
         std::stringstream strm("42");
 
- bool result = karma::generate(
- make_function_output_iterator(make_string_appender(generated)),
- '{' << int_[strm >> _1] << '}');
+ bool result = karma::generate(std::back_inserter(generated),
+ '{' << int_[strm >> lambda::_1] << '}');
 
         if (result)
             std::cout << "Boost.Lambda: " << generated << std::endl;

Modified: branches/proto/v4/libs/spirit/example/karma/calc2_ast_dump.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/example/karma/calc2_ast_dump.cpp (original)
+++ branches/proto/v4/libs/spirit/example/karma/calc2_ast_dump.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -71,22 +71,22 @@
     dump_ast()
     {
         ast_node %=
- int_ [_1 = _int(_r0)]
- | binary_node [_1 = _bin_op(_r0)]
- | unary_node [_1 = _unary_op(_r0)]
+ int_ [_1 = _int(_val)]
+ | binary_node [_1 = _bin_op(_val)]
+ | unary_node [_1 = _unary_op(_val)]
             ;
             
         binary_node =
                 ('(' << ast_node << char_ << ast_node << ')')
                 [
- _1 = _left(_r0), _2 = _op(_r0), _3 = _right(_r0)
+ _1 = _left(_val), _2 = _op(_val), _3 = _right(_val)
                 ]
             ;
 
         unary_node =
                 ('(' << char_ << ast_node << ')')
                 [
- _1 = _op(_r0), _2 = _right(_r0)
+ _1 = _op(_val), _2 = _right(_val)
                 ]
             ;
     }

Modified: branches/proto/v4/libs/spirit/example/karma/calc2_ast_rpn.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/example/karma/calc2_ast_rpn.cpp (original)
+++ branches/proto/v4/libs/spirit/example/karma/calc2_ast_rpn.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -72,22 +72,24 @@
     ast_rpn()
     {
         ast_node %=
- int_ [_1 = _int(_r0)]
- | binary_node [_1 = _bin_op(_r0)]
- | unary_node [_1 = _unary_op(_r0)]
+ int_ [_1 = _int(_val)]
+ | binary_node [_1 = _bin_op(_val)]
+ | unary_node [_1 = _unary_op(_val)]
             ;
             
         binary_node =
                 (ast_node << ast_node << char_)
                 [
- _1 = _left(_r0), _2 = _right(_r0), _3 = _op(_r0)
+ _1 = _left(_val), _2 = _right(_val), _3 = _op(_val)
                 ]
             ;
 
         unary_node =
- verbatim['(' << ast_node << char_ << ')']
- [
- _1 = _right(_r0), _2 = _op(_r0)
+ verbatim [
+ ('(' << ast_node << char_ << ')')
+ [
+ _1 = _right(_val), _2 = _op(_val)
+ ]
                 ]
             ;
     }

Modified: branches/proto/v4/libs/spirit/example/qi/actions.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/example/qi/actions.cpp (original)
+++ branches/proto/v4/libs/spirit/example/qi/actions.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -55,9 +55,9 @@
 
     { // example using boost.lambda
 
- using boost::lambda::_1;
+ namespace lambda = boost::lambda;
         char const *s1 = "{45}", *e1 = s1 + std::strlen(s1);
- qi::parse(s1, e1, '{' >> int_[std::cout << _1 << '\n'] >> '}');
+ qi::parse(s1, e1, '{' >> int_[std::cout << lambda::_1 << '\n'] >> '}');
     }
 
     return 0;

Deleted: branches/proto/v4/libs/spirit/example/qi/mini_xml_karma.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/example/qi/mini_xml_karma.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
+++ (empty file)
@@ -1,264 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2007 Joel de Guzman
- Copyright (c) 2001-2007 Hartmut Kaiser
-
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-=============================================================================*/
-///////////////////////////////////////////////////////////////////////////////
-//
-// A mini XML-like parser, Karma is used to print out the generated AST
-//
-// [ JDG March 25, 2007 ] spirit2
-// [ HK April 02, 2007 ] spirit2
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/karma.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_stl.hpp>
-#include <boost/fusion/include/adapt_struct.hpp>
-#include <boost/variant/recursive_variant.hpp>
-#include <boost/function_output_iterator.hpp>
-
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <vector>
-
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::karma;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-namespace fusion = boost::fusion;
-namespace phoenix = boost::phoenix;
-
-using phoenix::at_c;
-using phoenix::push_back;
-
-///////////////////////////////////////////////////////////////////////////////
-// Our mini XML tree representation
-///////////////////////////////////////////////////////////////////////////////
-struct mini_xml;
-
-typedef
- boost::variant<
- boost::recursive_wrapper<mini_xml>
- , std::string
- >
-mini_xml_node;
-
-struct mini_xml
-{
- std::string name; // tag name
- std::vector<mini_xml_node> children; // children
-};
-
-// We need to tell fusion about our mini_xml struct
-// to make it a first-class fusion citizen
-BOOST_FUSION_ADAPT_STRUCT(
- mini_xml,
- (std::string, name)
- (std::vector<mini_xml_node>, children)
-)
-
-///////////////////////////////////////////////////////////////////////////////
-// Our mini XML grammar definition
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator>
-struct mini_xml_parser :
- qi::grammar_def<Iterator, mini_xml(), space_type>
-{
- mini_xml_parser()
- {
- text = lexeme[+(char_ - '<') [text.val += _1]];
- node = (xml | text) [node.val = _1];
-
- start_tag =
- '<'
- >> lexeme[+(char_ - '>') [start_tag.val += _1]]
- >> '>'
- ;
-
- end_tag =
- "</"
- >> lit(end_tag._1)
- >> '>'
- ;
-
- xml =
- start_tag [at_c<0>(xml.val) = _1]
- >> *node [push_back(at_c<1>(xml.val), _1)]
- >> end_tag(at_c<0>(xml.val))
- ;
- }
-
- qi::rule<Iterator, mini_xml(), space_type> xml;
- qi::rule<Iterator, mini_xml_node(), space_type> node;
- qi::rule<Iterator, std::string(), space_type> text;
- qi::rule<Iterator, std::string(), space_type> start_tag;
- qi::rule<Iterator, void(std::string), space_type> end_tag;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//
-///////////////////////////////////////////////////////////////////////////////
-template <typename String>
-struct string_appender
-{
- string_appender(String& s)
- : str(s)
- {}
-
- template <typename T>
- void operator()(T const &x) const
- {
- str += x;
- }
-
- String& str;
-};
-
-template <typename String>
-inline string_appender<String>
-make_string_appender(String& str)
-{
- return string_appender<String>(str);
-}
-
-template <typename Char>
-struct output_iterator
-{
- typedef std::basic_string<Char> string_type;
- typedef string_appender<string_type> appender_type;
- typedef boost::function_output_iterator<appender_type> type;
-
- static type
- call(std::basic_string<Char>& str)
- {
- return boost::make_function_output_iterator(
- make_string_appender(str));
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//
-///////////////////////////////////////////////////////////////////////////////
-template <typename OutputIterator>
-struct mini_xml_generator
- : boost::spirit::karma::grammar_def<OutputIterator, void(mini_xml), space_type>
-{
-// typedef karma::grammar_def<OutputIterator, void(mini_xml), space_type> base_type;
-// boost::mpl::print<typename base_type::start_type::param_types> x;
-
- mini_xml_generator()
- {
-// text = verbatim[lit(text._1)];
-// node = (xml | text) [_1 = node._1];
-//
-// start_tag =
-// '<'
-// << verbatim[lit(start_tag._1)]
-// << '>'
-// ;
-//
-// end_tag =
-// "</"
-// << verbatim[lit(end_tag._1)]
-// << '>'
-// ;
-//
-// xml =
-// start_tag(at_c<0>(xml._1))
-// << (*node) [ref(at_c<1>(xml._1))]
-// << end_tag(at_c<0>(xml._1))
- ;
- }
-
- karma::rule<OutputIterator, void(mini_xml), space_type> xml;
-// karma::rule<OutputIterator, void(mini_xml_node), space_type> node;
-// karma::rule<OutputIterator, void(std::string), space_type> text;
-// karma::rule<OutputIterator, void(std::string), space_type> start_tag;
-// karma::rule<OutputIterator, void(std::string), space_type> end_tag;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Main program
-///////////////////////////////////////////////////////////////////////////////
-int main(int argc, char **argv)
-{
- char const* filename;
- if (argc > 1)
- {
- filename = argv[1];
- }
- else
- {
- std::cerr << "Error: No input file provided." << std::endl;
- return 1;
- }
-
- std::ifstream in(filename, std::ios_base::in);
-
- if (!in)
- {
- std::cerr << "Error: Could not open input file: "
- << filename << std::endl;
- return 1;
- }
-
- std::string storage; // We will read the contents here.
- in.unsetf(std::ios::skipws); // No white space skipping!
- std::copy(
- std::istream_iterator<char>(in),
- std::istream_iterator<char>(),
- std::back_inserter(storage));
-
- typedef mini_xml_parser<std::string::const_iterator> mini_xml_parser;
- mini_xml_parser def; // Our grammar definition
- qi::grammar<mini_xml_parser> xmlin(def, def.xml); // Our grammar
- mini_xml ast; // our tree
-
- std::string::const_iterator iter = storage.begin();
- std::string::const_iterator end = storage.end();
- bool r = phrase_parse(iter, end, xmlin, ast, space);
-
- if (r && iter == end)
- {
- std::cout << "-------------------------\n";
- std::cout << "Parsing succeeded\n";
- std::cout << "-------------------------\n";
-
- typedef output_iterator<char>::type outiter_type;
- typedef mini_xml_generator<outiter_type> mini_xml_generator;
-
- mini_xml_generator gen; // Our grammar definition
- karma::grammar<mini_xml_generator> xmlout(gen, gen.xml); // Our grammar
-
- std::string generated;
- bool r = generate_delimited(output_iterator<char>::call(generated),
- xmlout(ast), space);
-
- if (r)
- std::cout << generated << std::endl;
- return 0;
- }
- else
- {
- std::string::const_iterator some = iter+30;
- std::string context(iter, (some>end)?end:some);
- std::cout << "-------------------------\n";
- std::cout << "Parsing failed\n";
- std::cout << "stopped at: \": " << context << "...\"\n";
- std::cout << "-------------------------\n";
- return 1;
- }
-}
-
-

Modified: branches/proto/v4/libs/spirit/test/karma/binary.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/test/karma/binary.cpp (original)
+++ branches/proto/v4/libs/spirit/test/karma/binary.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -31,7 +31,17 @@
         BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
             0x0807060504030201LL));
 #endif
-#else
+
+ BOOST_TEST(binary_test_delimited("\x01\x00\x00\x00", 4, byte, 0x01, pad(4)));
+ BOOST_TEST(binary_test_delimited("\x01\x02\x00\x00", 4, word, 0x0201, pad(4)));
+ BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04", 4, dword, 0x04030201, pad(4)));
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00", 10,
+ qword, 0x0807060504030201LL, pad(10)));
+#endif
+
+#else // BOOST_LITTLE_ENDIAN
+
         BOOST_TEST(binary_test("\x01", 1, byte, 0x01));
         BOOST_TEST(binary_test("\x01\x02", 2, word, 0x0102));
         BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, 0x01020304));
@@ -39,6 +49,14 @@
         BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
             0x0102030405060708LL));
 #endif
+
+ BOOST_TEST(binary_test_delimited("\x01\x00\x00\x00", 4, byte, 0x01, pad(4)));
+ BOOST_TEST(binary_test_delimited("\x01\x02\x00\x00", 4, word, 0x0102, pad(4)));
+ BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04", 4, dword, 0x01020304, pad(4)));
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00", 10,
+ qword, 0x0102030405060708LL, pad(10)));
+#endif
 #endif
     }
 

Modified: branches/proto/v4/libs/spirit/test/karma/test.hpp
==============================================================================
--- branches/proto/v4/libs/spirit/test/karma/test.hpp (original)
+++ branches/proto/v4/libs/spirit/test/karma/test.hpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -12,13 +12,11 @@
 #include <iostream>
 #include <typeinfo>
 
-#include <boost/function_output_iterator.hpp>
 #include <boost/spirit/include/karma_generate.hpp>
 #include <boost/spirit/include/karma_what.hpp>
 
 namespace spirit_test
 {
-
     ///////////////////////////////////////////////////////////////////////////
     struct display_type
     {
@@ -38,57 +36,18 @@
     display_type const display = {};
 
     ///////////////////////////////////////////////////////////////////////////
- template <typename String>
- struct string_appender
- {
- string_appender(String& s)
- : str(s)
- {}
-
- template <typename T>
- void operator()(T const &x) const
- {
- str += x;
- }
-
- String& str;
-
- // suppress warning about assignment operator not being generated
- string_appender& operator=(string_appender const&);
- };
-
- template <typename String>
- inline string_appender<String>
- make_string_appender(String& str)
- {
- return string_appender<String>(str);
- }
-
- template <typename Char>
- struct output_iterator
- {
- typedef std::basic_string<Char> string_type;
- typedef string_appender<string_type> appender_type;
- typedef boost::function_output_iterator<appender_type> type;
- };
-
- ///////////////////////////////////////////////////////////////////////////
     template <typename Char, typename Generator>
     inline bool test(Char const *expected, Generator const& g)
     {
- // we don't care about the result of the "what" function.
- // we only care that all generators have it:
- boost::spirit::karma::what(g);
-
- using boost::make_function_output_iterator;
         namespace karma = boost::spirit::karma;
-
         typedef std::basic_string<Char> string_type;
         
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
+
         string_type generated;
-
- bool result = karma::generate(make_function_output_iterator(
- make_string_appender(generated)), g);
+ bool result = karma::generate(std::back_inserter(generated), g);
                 
         return result && generated == expected;
     }
@@ -96,19 +55,15 @@
     template <typename Char, typename Generator>
     inline bool test(std::basic_string<Char> const& expected, Generator const& g)
     {
- // we don't care about the result of the "what" function.
- // we only care that all generators have it:
- boost::spirit::karma::what(g);
-
- using boost::make_function_output_iterator;
         namespace karma = boost::spirit::karma;
-
         typedef std::basic_string<Char> string_type;
         
- string_type generated;
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
 
- bool result = karma::generate(make_function_output_iterator(
- make_string_appender(generated)), g);
+ string_type generated;
+ bool result = karma::generate(std::back_inserter(generated), g);
                 
         return result && generated == expected;
     }
@@ -118,19 +73,15 @@
     inline bool test(Char const *expected, Generator const& g,
         Parameter const &parameter)
     {
- // we don't care about the result of the "what" function.
- // we only care that all generators have it:
- boost::spirit::karma::what(g);
-
- using boost::make_function_output_iterator;
         namespace karma = boost::spirit::karma;
-
         typedef std::basic_string<Char> string_type;
         
- string_type generated;
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
 
- bool result = karma::generate(make_function_output_iterator(
- make_string_appender(generated)), g, parameter);
+ string_type generated;
+ bool result = karma::generate(std::back_inserter(generated), g, parameter);
                 
         return result && generated == expected;
     }
@@ -139,19 +90,15 @@
     inline bool test(std::basic_string<Char> const& expected, Generator const& g,
         Parameter const &parameter)
     {
- // we don't care about the result of the "what" function.
- // we only care that all generators have it:
- boost::spirit::karma::what(g);
-
- using boost::make_function_output_iterator;
         namespace karma = boost::spirit::karma;
-
         typedef std::basic_string<Char> string_type;
         
- string_type generated;
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
 
- bool result = karma::generate(make_function_output_iterator(
- make_string_appender(generated)), g, parameter);
+ string_type generated;
+ bool result = karma::generate(std::back_inserter(generated), g, parameter);
                 
         return result && generated == expected;
     }
@@ -161,19 +108,15 @@
     inline bool test_delimited(Char const *expected, Generator const& g,
         Delimiter const& d)
     {
- // we don't care about the result of the "what" function.
- // we only care that all generators have it:
- boost::spirit::karma::what(g);
-
- using boost::make_function_output_iterator;
         namespace karma = boost::spirit::karma;
-
         typedef std::basic_string<Char> string_type;
         
- string_type generated;
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
 
- bool result = karma::generate_delimited(make_function_output_iterator(
- make_string_appender(generated)), g, d);
+ string_type generated;
+ bool result = karma::generate_delimited(std::back_inserter(generated), g, d);
                 
         return result && generated == expected;
     }
@@ -182,19 +125,15 @@
     inline bool test_delimited(std::basic_string<Char> const& expected,
         Generator const& g, Delimiter const& d)
     {
- // we don't care about the result of the "what" function.
- // we only care that all generators have it:
- boost::spirit::karma::what(g);
-
- using boost::make_function_output_iterator;
         namespace karma = boost::spirit::karma;
-
         typedef std::basic_string<Char> string_type;
         
- string_type generated;
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
 
- bool result = karma::generate_delimited(make_function_output_iterator(
- make_string_appender(generated)), g, d);
+ string_type generated;
+ bool result = karma::generate_delimited(std::back_inserter(generated), g, d);
                 
         return result && generated == expected;
     }
@@ -205,19 +144,16 @@
     inline bool test_delimited(Char const *expected, Generator const& g,
         Parameter const &parameter, Delimiter const& d)
     {
- // we don't care about the result of the "what" function.
- // we only care that all generators have it:
- boost::spirit::karma::what(g);
-
- using boost::make_function_output_iterator;
         namespace karma = boost::spirit::karma;
-
         typedef std::basic_string<Char> string_type;
         
- string_type generated;
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
 
- bool result = karma::generate_delimited(make_function_output_iterator(
- make_string_appender(generated)), g, parameter, d);
+ string_type generated;
+ bool result = karma::generate_delimited(std::back_inserter(generated),
+ g, parameter, d);
                 
         return result && generated == expected;
     }
@@ -227,19 +163,16 @@
     inline bool test_delimited(std::basic_string<Char> const& expected,
         Generator const& g, Parameter const &parameter, Delimiter const& d)
     {
- // we don't care about the result of the "what" function.
- // we only care that all generators have it:
- boost::spirit::karma::what(g);
-
- using boost::make_function_output_iterator;
         namespace karma = boost::spirit::karma;
-
         typedef std::basic_string<Char> string_type;
         
- string_type generated;
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
 
- bool result = karma::generate_delimited(make_function_output_iterator(
- make_string_appender(generated)), g, parameter, d);
+ string_type generated;
+ bool result = karma::generate_delimited(std::back_inserter(generated),
+ g, parameter, d);
                 
         return result && generated == expected;
     }
@@ -250,19 +183,15 @@
     binary_test(char const *expected, std::size_t size,
         Generator const& g)
     {
+ namespace karma = boost::spirit::karma;
+ typedef std::basic_string<char> string_type;
+
         // we don't care about the result of the "what" function.
         // we only care that all generators have it:
- boost::spirit::karma::what(g);
+ karma::what(g);
 
- using boost::make_function_output_iterator;
- namespace karma = boost::spirit::karma;
-
- typedef std::basic_string<unsigned char> string_type;
-
         string_type generated;
-
- bool result = karma::generate(make_function_output_iterator(
- make_string_appender(generated)), g);
+ bool result = karma::generate(std::back_inserter(generated), g);
                 
         return result && !std::memcmp(generated.c_str(), expected, size);
     }
@@ -273,19 +202,55 @@
     binary_test(char const *expected, std::size_t size,
         Generator const& g, Parameter const &parameter)
     {
+ namespace karma = boost::spirit::karma;
+ typedef std::basic_string<char> string_type;
+
         // we don't care about the result of the "what" function.
         // we only care that all generators have it:
- boost::spirit::karma::what(g);
+ karma::what(g);
+
+ string_type generated;
+ bool result = karma::generate(std::back_inserter(generated), g, parameter);
+
+ return result && !std::memcmp(generated.c_str(), expected, size);
+ }
 
- using boost::make_function_output_iterator;
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Generator, typename Delimiter>
+ inline bool
+ binary_test_delimited(char const *expected, std::size_t size,
+ Generator const& g, Delimiter const& d)
+ {
         namespace karma = boost::spirit::karma;
+ typedef std::basic_string<char> string_type;
         
- typedef std::basic_string<unsigned char> string_type;
-
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
+
         string_type generated;
+ bool result = karma::generate_delimited(std::back_inserter(generated),
+ g, d);
+
+ return result && !std::memcmp(generated.c_str(), expected, size);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Generator, typename Parameter, typename Delimiter>
+ inline bool
+ binary_test_delimited(char const *expected, std::size_t size,
+ Generator const& g, Parameter const &parameter, Delimiter const& d)
+ {
+ namespace karma = boost::spirit::karma;
+ typedef std::basic_string<char> string_type;
+
+ // we don't care about the result of the "what" function.
+ // we only care that all generators have it:
+ karma::what(g);
 
- bool result = karma::generate(make_function_output_iterator(
- make_string_appender(generated)), g, parameter);
+ string_type generated;
+ bool result = karma::generate_delimited(std::back_inserter(generated),
+ g, parameter, d);
                 
         return result && !std::memcmp(generated.c_str(), expected, size);
     }

Modified: branches/proto/v4/libs/spirit/test/qi/actions.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/test/qi/actions.cpp (original)
+++ branches/proto/v4/libs/spirit/test/qi/actions.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -64,10 +64,9 @@
     }
 
     {
- using boost::lambda::_1;
- using boost::lambda::var;
+ namespace lambda = boost::lambda;
         char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
- qi::parse(s1, e1, '{' >> int_[var(x) += _1] >> '}');
+ qi::parse(s1, e1, '{' >> int_[lambda::var(x) += lambda::_1] >> '}');
     }
 
     BOOST_TEST(x == (42*6));

Modified: branches/proto/v4/libs/thread/doc/mutex_concepts.qbk
==============================================================================
--- branches/proto/v4/libs/thread/doc/mutex_concepts.qbk (original)
+++ branches/proto/v4/libs/thread/doc/mutex_concepts.qbk 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -373,6 +373,7 @@
     class unique_lock
     {
     public:
+ unique_lock();
         explicit unique_lock(Lockable& m_);
         unique_lock(Lockable& m_,adopt_lock_t);
         unique_lock(Lockable& m_,defer_lock_t);
@@ -426,6 +427,20 @@
 __lockable_concept_type__ object by a particular thread, and the member functions that release ownership of the lock state
 (including the destructor) must be called by the same thread that acquired ownership of the lock state.
 
+[section:defaultconstructor `unique_lock()`]
+
+[variablelist
+
+[[Effects:] [Creates a lock object with no associated mutex.]]
+
+[[Postcondition:] [__owns_lock_ref__ returns `false`. __mutex_func_ref__ returns `NULL`.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
 [section:constructor `unique_lock(Lockable & m)`]
 
 [variablelist
@@ -599,6 +614,7 @@
     class shared_lock
     {
     public:
+ shared_lock();
         explicit shared_lock(Lockable& m_);
         shared_lock(Lockable& m_,adopt_lock_t);
         shared_lock(Lockable& m_,defer_lock_t);
@@ -644,6 +660,20 @@
 ownership of a __lockable_concept_type__ object by a particular thread, and the member functions that release ownership of the lock
 state (including the destructor) must be called by the same thread that acquired ownership of the lock state.
 
+[section:defaultconstructor `shared_lock()`]
+
+[variablelist
+
+[[Effects:] [Creates a lock object with no associated mutex.]]
+
+[[Postcondition:] [__owns_lock_ref__ returns `false`. __mutex_func_ref__ returns `NULL`.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
 [section:constructor `shared_lock(Lockable & m)`]
 
 [variablelist

Modified: branches/proto/v4/libs/thread/doc/mutexes.qbk
==============================================================================
--- branches/proto/v4/libs/thread/doc/mutexes.qbk (original)
+++ branches/proto/v4/libs/thread/doc/mutexes.qbk 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -12,6 +12,9 @@
         void lock();
         bool try_lock();
         void unlock();
+
+ typedef platform-specific-type native_handle_type;
+ native_handle_type native_handle();
         
         typedef unique_lock<mutex> scoped_lock;
         typedef scoped_lock scoped_try_lock;
@@ -20,6 +23,23 @@
 __mutex__ implements the __lockable_concept__ to provide an exclusive-ownership mutex. At most one thread can own the lock on a given
 instance of __mutex__ at any time. Multiple concurrent calls to __lock_ref__, __try_lock_ref__ and __unlock_ref__ shall be permitted.
 
+[section:nativehandle Member function `native_handle()`]
+
+ typedef platform-specific-type native_handle_type;
+ native_handle_type native_handle();
+
+[variablelist
+
+[[Effects:] [Returns an instance of `native_handle_type` that can be used with platform-specific APIs to manipulate the underlying
+implementation. If no such instance exists, `native_handle()` and `native_handle_type` are not present.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+
 [endsect]
 
 [section:try_mutex Typedef `try_mutex`]
@@ -47,6 +67,9 @@
         template<typename TimeDuration>
         bool timed_lock(TimeDuration const & relative_time);
 
+ typedef platform-specific-type native_handle_type;
+ native_handle_type native_handle();
+
         typedef unique_lock<timed_mutex> scoped_timed_lock;
         typedef scoped_timed_lock scoped_try_lock;
         typedef scoped_timed_lock scoped_lock;
@@ -56,6 +79,22 @@
 lock on a given instance of __timed_mutex__ at any time. Multiple concurrent calls to __lock_ref__, __try_lock_ref__,
 __timed_lock_ref__, __timed_lock_duration_ref__ and __unlock_ref__ shall be permitted.
 
+[section:nativehandle Member function `native_handle()`]
+
+ typedef platform-specific-type native_handle_type;
+ native_handle_type native_handle();
+
+[variablelist
+
+[[Effects:] [Returns an instance of `native_handle_type` that can be used with platform-specific APIs to manipulate the underlying
+implementation. If no such instance exists, `native_handle()` and `native_handle_type` are not present.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
 [endsect]
 
 [section:recursive_mutex Class `recursive_mutex`]
@@ -70,6 +109,9 @@
         void lock();
         bool try_lock();
         void unlock();
+
+ typedef platform-specific-type native_handle_type;
+ native_handle_type native_handle();
         
         typedef unique_lock<recursive_mutex> scoped_lock;
         typedef scoped_lock scoped_try_lock;
@@ -81,6 +123,22 @@
 __lock_ref__ or __try_lock_ref__ to acquire an additional level of ownership of the mutex. __unlock_ref__ must be called once for
 each level of ownership acquired by a single thread before ownership can be acquired by another thread.
 
+[section:nativehandle Member function `native_handle()`]
+
+ typedef platform-specific-type native_handle_type;
+ native_handle_type native_handle();
+
+[variablelist
+
+[[Effects:] [Returns an instance of `native_handle_type` that can be used with platform-specific APIs to manipulate the underlying
+implementation. If no such instance exists, `native_handle()` and `native_handle_type` are not present.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
 [endsect]
 
 [section:recursive_try_mutex Typedef `recursive_try_mutex`]
@@ -108,6 +166,9 @@
 
         template<typename TimeDuration>
         bool timed_lock(TimeDuration const & relative_time);
+
+ typedef platform-specific-type native_handle_type;
+ native_handle_type native_handle();
         
         typedef unique_lock<recursive_timed_mutex> scoped_lock;
         typedef scoped_lock scoped_try_lock;
@@ -121,6 +182,22 @@
 __timed_lock_duration_ref__ or __try_lock_ref__ to acquire an additional level of ownership of the mutex. __unlock_ref__ must be
 called once for each level of ownership acquired by a single thread before ownership can be acquired by another thread.
 
+[section:nativehandle Member function `native_handle()`]
+
+ typedef platform-specific-type native_handle_type;
+ native_handle_type native_handle();
+
+[variablelist
+
+[[Effects:] [Returns an instance of `native_handle_type` that can be used with platform-specific APIs to manipulate the underlying
+implementation. If no such instance exists, `native_handle()` and `native_handle_type` are not present.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
 [endsect]
 
 [include shared_mutex_ref.qbk]

Modified: branches/proto/v4/libs/thread/doc/thread_ref.qbk
==============================================================================
--- branches/proto/v4/libs/thread/doc/thread_ref.qbk (original)
+++ branches/proto/v4/libs/thread/doc/thread_ref.qbk 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -364,6 +364,22 @@
 
 [endsect]
 
+[section:nativehandle Member function `native_handle()`]
+
+ typedef platform-specific-type native_handle_type;
+ native_handle_type native_handle();
+
+[variablelist
+
+[[Effects:] [Returns an instance of `native_handle_type` that can be used with platform-specific APIs to manipulate the underlying
+implementation. If no such instance exists, `native_handle()` and `native_handle_type` are not present.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
 [section:equals `operator==`]
 
     bool operator==(const thread& other) const;

Modified: branches/proto/v4/libs/thread/test/Jamfile.v2
==============================================================================
--- branches/proto/v4/libs/thread/test/Jamfile.v2 (original)
+++ branches/proto/v4/libs/thread/test/Jamfile.v2 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -53,5 +53,7 @@
           [ thread-run test_shared_mutex_part_2.cpp ]
           [ thread-run test_shared_mutex_timed_locks.cpp ]
           [ thread-run test_lock_concept.cpp ]
+ [ compile-fail no_implicit_move_from_lvalue_thread.cpp ]
+ [ compile-fail no_implicit_assign_from_lvalue_thread.cpp ]
     ;
 }

Modified: branches/proto/v4/libs/thread/test/test_lock_concept.cpp
==============================================================================
--- branches/proto/v4/libs/thread/test/test_lock_concept.cpp (original)
+++ branches/proto/v4/libs/thread/test/test_lock_concept.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -185,11 +185,22 @@
         BOOST_CHECK_THROW( lock.unlock(), boost::lock_error );
     }
 };
+template<typename Lock>
+struct test_default_constructed_has_no_mutex_and_unlocked
+{
+ void operator()() const
+ {
+ Lock l;
+ BOOST_CHECK(!l.mutex());
+ BOOST_CHECK(!l.owns_lock());
+ };
+};
 
 BOOST_TEST_CASE_TEMPLATE_FUNCTION(test_scoped_lock_concept,Mutex)
 {
     typedef typename Mutex::scoped_lock Lock;
     
+ test_default_constructed_has_no_mutex_and_unlocked<Lock>()();
     test_initially_locked<Mutex,Lock>()();
     test_initially_unlocked_with_defer_lock_parameter<Mutex,Lock>()();
     test_initially_locked_with_adopt_lock_parameter<Mutex,Lock>()();
@@ -203,6 +214,7 @@
 {
     typedef typename Mutex::scoped_try_lock Lock;
     
+ test_default_constructed_has_no_mutex_and_unlocked<Lock>()();
     test_initially_locked<Mutex,Lock>()();
     test_initially_unlocked_if_other_thread_has_lock<Mutex,Lock>()();
     test_initially_unlocked_with_defer_lock_parameter<Mutex,Lock>()();

Modified: branches/proto/v4/libs/thread/test/test_move_function.cpp
==============================================================================
--- branches/proto/v4/libs/thread/test/test_move_function.cpp (original)
+++ branches/proto/v4/libs/thread/test/test_move_function.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -1,10 +1,11 @@
-// Copyright (C) 2007 Anthony Williams
+// Copyright (C) 2007-8 Anthony Williams
 //
 // Distributed under the Boost Software License, Version 1.0. (See accompanying
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 #include <boost/thread/thread.hpp>
 #include <boost/test/unit_test.hpp>
 #include <boost/thread/mutex.hpp>
+#include <boost/shared_ptr.hpp>
 
 void do_nothing()
 {}
@@ -20,13 +21,36 @@
     dest.join();
 }
 
+void test_thread_move_from_lvalue_on_assignment()
+{
+ boost::thread src(do_nothing);
+ boost::thread::id src_id=src.get_id();
+ boost::thread dest;
+ dest=boost::move(src);
+ boost::thread::id dest_id=dest.get_id();
+ BOOST_CHECK(src_id==dest_id);
+ BOOST_CHECK(src.get_id()==boost::thread::id());
+ dest.join();
+}
+
+boost::thread start_thread()
+{
+ return boost::thread(do_nothing);
+}
+
 void test_thread_move_from_rvalue_on_construction()
 {
- boost::thread x(boost::move(boost::thread(do_nothing)));
+ boost::thread x(start_thread());
     BOOST_CHECK(x.get_id()!=boost::thread::id());
     x.join();
 }
 
+void test_thread_move_from_rvalue_using_explicit_move()
+{
+ boost::thread x(boost::move(start_thread()));
+ BOOST_CHECK(x.get_id()!=boost::thread::id());
+ x.join();
+}
 
 void test_unique_lock_move_from_lvalue_on_construction()
 {
@@ -42,6 +66,48 @@
     BOOST_CHECK(l2.mutex()==&m);
 }
 
+boost::unique_lock<boost::mutex> get_lock(boost::mutex& m)
+{
+ return boost::unique_lock<boost::mutex>(m);
+}
+
+
+void test_unique_lock_move_from_rvalue_on_construction()
+{
+ boost::mutex m;
+ boost::unique_lock<boost::mutex> l(get_lock(m));
+ BOOST_CHECK(l.owns_lock());
+ BOOST_CHECK(l.mutex()==&m);
+}
+
+namespace user
+{
+ template<typename T>
+ T move(T& t)
+ {
+ return t.move();
+ }
+
+ bool move_called=false;
+
+ struct nc:
+ public boost::shared_ptr<int>
+ {
+ nc move()
+ {
+ move_called=true;
+ return nc();
+ }
+ };
+}
+
+void test_move_for_user_defined_type_unaffected()
+{
+ user::nc src;
+ user::nc dest=move(src);
+ BOOST_CHECK(user::move_called);
+}
+
 boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
 {
     boost::unit_test_framework::test_suite* test =
@@ -49,6 +115,10 @@
 
     test->add(BOOST_TEST_CASE(test_thread_move_from_lvalue_on_construction));
     test->add(BOOST_TEST_CASE(test_thread_move_from_rvalue_on_construction));
+ test->add(BOOST_TEST_CASE(test_thread_move_from_rvalue_using_explicit_move));
+ test->add(BOOST_TEST_CASE(test_thread_move_from_lvalue_on_assignment));
     test->add(BOOST_TEST_CASE(test_unique_lock_move_from_lvalue_on_construction));
+ test->add(BOOST_TEST_CASE(test_unique_lock_move_from_rvalue_on_construction));
+ test->add(BOOST_TEST_CASE(test_move_for_user_defined_type_unaffected));
     return test;
 }

Modified: branches/proto/v4/libs/wave/ChangeLog
==============================================================================
--- branches/proto/v4/libs/wave/ChangeLog (original)
+++ branches/proto/v4/libs/wave/ChangeLog 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -41,7 +41,7 @@
   triggered an error in constructs like #ifndef __FILE__. Thanks to Daniel
   Wadehn for reporting and supplying a patch. Added corresponding regression
   test: t_2_018.cpp.
-- Fixed a bug which reported a valid macro definition as invalid if the macro
+- Fixed a bug which reported a valid macro redefinition as invalid if the macro
   replacement text referred to a second or higher parameter of this macro.
 - Fixed a problem in the wave tool to allow two errors to occur while
   preprocessing two consecutive tokens.

Modified: branches/proto/v4/libs/wave/test/testwave/testwave_app.cpp
==============================================================================
--- branches/proto/v4/libs/wave/test/testwave/testwave_app.cpp (original)
+++ branches/proto/v4/libs/wave/test/testwave/testwave_app.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -178,9 +178,10 @@
             case 'P': // insert full path
             case 'B': // same as 'P', but forward slashs on Windows
                 {
- fs::path fullpath = fs::complete(
- fs::path(filename, fs::native),
- fs::current_path());
+ fs::path fullpath (
+ fs::complete(
+ fs::path(filename, fs::native), fs::current_path())
+ );
                         
                     if ('(' == expected[pos1+2]) {
                     // the $P(basename) syntax is used

Modified: branches/proto/v4/tools/build/v2/build-system.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/build-system.jam (original)
+++ branches/proto/v4/tools/build/v2/build-system.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -599,12 +599,21 @@
     local cleanall ; if "--clean-all" in $(.argv) { cleanall = true ; }
 
 
- # List of Boost Build meta-targets and actual raw Jam targets directly
- # requested by the user. Raw Jam targets are used when user's request
- # contains a reference to a specific file not modeled using a main Boost
- # Build target.
+ # List of explicitly requested files to build. Any target references read
+ # from the command line parameter not recognized as one of the targets
+ # defined in the loaded Jamfiles will be interpreted as an explicitly
+ # requested file to build. If any such files are explicitly requested then
+ # only those files and the targets they depend on will be built and they
+ # will be searched for among targets that would have been built had there
+ # been no explicitly requested files.
+ local explicitly-requested-files
+
+
+ # List of Boost Build meta-targets, virtual-targets and actual Jam targets
+ # constructed in this build system run.
     local targets ;
- local bjam-targets ;
+ local virtual-targets ;
+ local actual-targets ;
 
     
     # Process each target specified on the command-line and convert it into
@@ -633,7 +642,7 @@
             {
                 ECHO "notice: could not find main target" $(id) ;
                 ECHO "notice: assuming it's a name of file to create." ;
- bjam-targets += $(id) ;
+ explicitly-requested-files += $(id) ;
             }
             else
             {
@@ -647,10 +656,6 @@
     }
 
 
- # List of all virtual-targets created in this build system run.
- local virtual-targets ;
-
-
     # Now that we have a set of targets to build and a set of property sets to
     # build the targets with, we can start the main build process by using each
     # property set to generate virtual targets from all of our listed targets
@@ -670,11 +675,7 @@
     }
 
 
- # List of all Jam targets constructed in this build system run.
- local actual-targets ;
-
-
- # Convert all collected virtual targets into actual raw Jam targets.
+ # Convert collected virtual targets into actual raw Jam targets.
     for t in $(virtual-targets)
     {
         actual-targets += [ $(t).actualize ] ;
@@ -856,19 +857,24 @@
     }
 
 
- # TODO: See if this 'NOTFILE all' statement can be moved below to the
- # default case where the 'all' target is actually requested to be built.
- # Check for other Jam scripts manually setting a dependency for this target.
+ # The 'all' pseudo target is not strictly needed expect in the case when we
+ # use it below but people often assume they always have this target
+ # available and do not declare it themselves before use which may cause
+ # build failures with an error message about not being able to build the
+ # 'all' target.
     NOTFILE all ;
 
 
     # And now that all the actual raw Jam targets and all the dependencies
- # between them have been prepared (or we have everything set so we can
- # easily prepare them) all that is left is to tell Jam to update those
- # targets.
- if $(bjam-targets)
+ # between them have been prepared all that is left is to tell Jam to update
+ # those targets.
+ if $(explicitly-requested-files)
     {
- UPDATE $(bjam-targets:G=e) $(.out-xml) ;
+ # Note that this case can not be joined with the regular one when only
+ # exact Boost Build targets are requested as here we do not build those
+ # requested targets but only use them to construct the dependency tree
+ # needed to build the explicitly requested files.
+ UPDATE $(explicitly-requested-files:G=e) $(.out-xml) ;
     }
     else if $(cleanall)
     {

Modified: branches/proto/v4/tools/build/v2/build/alias.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/build/alias.jam (original)
+++ branches/proto/v4/tools/build/v2/build/alias.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -51,6 +51,7 @@
     }
 }
 
+
 # Declares the 'alias' target. It will build sources, and return them unaltered.
 #
 rule alias ( name : sources * : requirements * : default-build * : usage-requirements * )
@@ -66,4 +67,5 @@
         ] ;
 }
 
+
 IMPORT $(__name__) : alias : : alias ;

Modified: branches/proto/v4/tools/build/v2/build/generators.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/build/generators.jam (original)
+++ branches/proto/v4/tools/build/v2/build/generators.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -5,46 +5,37 @@
 # (See accompanying file LICENSE_1_0.txt or copy at
 # http://www.boost.org/LICENSE_1_0.txt)
 
-# Manages 'generators' --- objects which can do transformation between
-# different target types and contain algorithm for finding transformation from
-# sources to targets.
-#
-# The main entry point to this module is generators.construct rule. It is given
-# a list of source targets, desired target type and a set of properties. It
-# starts by selecting 'viable generators', which have any chances of producing
-# the desired target type with the required properties. Generators are ranked
-# and a set of the most specific ones is selected.
-#
-# The most specific generators have their 'run' methods called, with the
-# properties and list of sources. Each one selects a target which can be
-# directly consumed, and tries to convert the remaining ones to the types it
-# can consume. This is done by recursively calling 'construct' with all
-# consumable types.
-#
-# If the generator has collected all the targets it needs, it creates targets
-# corresponding to result, and returns it. When all generators have been run,
-# results of one of them are selected and returned as a result.
-#
-# It's quite possible that 'construct' returns more targets that it was asked
-# for. For example, it was asked to target type EXE, but the only found
-# generators produces both EXE and TDS (file with debug) information. The extra
-# target will be returned.
-#
-# Likewise, when generator tries to convert sources to consumable types, it can
-# get more targets that it was asked for. The question is what to do with extra
-# targets. Boost.Build attempts to convert them to requested types, and
-# attempts that as early as possible. Specifically, this is done after invoking
-# each generator. (Later I'll document the rationale for trying extra target
-# conversion at that point).
-#
-# That early conversion is not always desirable. Suppose a generator got a
-# source of type Y and must consume one target of type X_1 and one target of
-# type X_2. When converting Y to X_1 extra target of type Y_2 is created. We
-# should not try to convert it to type X_1, because if we do so, the generator
-# will get two targets of type X_1, and will be at loss as to which one to use.
-# Because of that, the 'construct' rule has a parameter, telling if multiple
-# targets can be returned. If the parameter is false, conversion of extra
-# targets is not performed.
+# Manages 'generators' --- objects which can do transformation between different
+# target types and contain algorithm for finding transformation from sources to
+# targets.
+#
+# The main entry point to this module is generators.construct rule. It is given
+# a list of source targets, desired target type and a set of properties. It
+# starts by selecting 'viable generators', which have any chances of producing
+# the desired target type with the required properties. Generators are ranked
+# and a set of the most specific ones is selected.
+#
+# The most specific generators have their 'run' methods called, with the
+# properties and list of sources. Each one selects a target which can be
+# directly consumed, and tries to convert the remaining ones to the types it can
+# consume. This is done by recursively calling 'construct' with all consumable
+# types.
+#
+# If the generator has collected all the targets it needs, it creates targets
+# corresponding to result, and returns it. When all generators have been run,
+# results of one of them are selected and returned as a result.
+#
+# It is quite possible for 'construct' to return more targets that it was asked
+# for. For example, if it were asked to generate a target of type EXE, but the
+# only found generator produces both EXE and TDS (file with debug) information.
+# The extra target will be returned.
+#
+# Likewise, when generator tries to convert sources to consumable types, it can
+# get more targets that it was asked for. The question is what to do with extra
+# targets. Boost.Build attempts to convert them to requested types, and attempts
+# that as early as possible. Specifically, this is done after invoking each
+# generator. TODO: An example is needed to document the rationale for trying
+# extra target conversion at that point.
 
 import "class" : new ;
 import errors ;
@@ -293,7 +284,6 @@
             )
     {
         generators.dout [ indent ] " ** generator" $(self.id) ;
- generators.dout [ indent ] " multiple:" $(mutliple) ;
         generators.dout [ indent ] " composing:" $(self.composing) ;
 
         if ! $(self.composing) && $(sources[2]) && $(self.source-types[2])
@@ -1163,8 +1153,7 @@
 
 # Attempts to create a target of 'target-type' with 'properties' from 'sources'.
 # The 'sources' are treated as a collection of *possible* ingridients -- i.e. it
-# is not required to consume them all. If 'multiple' is true, the rule is
-# allowed to return several targets of 'target-type'.
+# is not required to consume them all.
 #
 # Returns a list of targets. When this invocation is first instance of
 # 'construct' in stack, returns only targets of requested 'target-type',

Modified: branches/proto/v4/tools/build/v2/build/targets.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/build/targets.jam (original)
+++ branches/proto/v4/tools/build/v2/build/targets.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -1258,7 +1258,6 @@
                 if $(rproperties[1]) = "@error"
                 {
                     ECHO [ targets.indent ] "Skipping build of:" [ full-name ]
-
                         "cannot compute common properties" ;
                 }
                 else if [ $(rproperties).get <build> ] = no
@@ -1291,7 +1290,7 @@
     }
 
     # Given the set of generated targets, and refined build properties,
- # determines and sets appripriate usage requirements on those targets.
+ # determines and sets appropriate usage requirements on those targets.
     #
     rule compute-usage-requirements ( subvariant )
     {
@@ -1324,6 +1323,13 @@
         # Essentially, when those two features are in usage requirements, they
         # are propagated only to direct dependents. We might need a more general
         # mechanism, but for now, only those two features are special.
+ #
+ # TODO - Actually there are more possible candidates like for instance
+ # when listing static library X as a source for another static library.
+ # Then static library X will be added as a <source> property to the
+ # second library's usage requirements but those requirements should last
+ # only up to the first executable or shared library that actually links
+ # to it.
         local raw = [ $(subvariant).sources-usage-requirements ] ;
         raw = [ $(raw).raw ] ;
         raw = [ property.change $(raw) : <pch-header> ] ;
@@ -1336,9 +1342,8 @@
     # 'all-targets' - virtual targets created while building this main target
     # 'build-request' - property-set instance with requested build properties
     #
- local rule create-subvariant ( root-targets *
- : all-targets * : build-request : sources * : rproperties
- : usage-requirements )
+ local rule create-subvariant ( root-targets * : all-targets * :
+ build-request : sources * : rproperties : usage-requirements )
     {
         for local e in $(root-targets)
         {
@@ -1347,8 +1352,8 @@
 
         # Process all virtual targets that will be created if this main target
         # is created.
- local s = [ new subvariant $(__name__) : $(build-request) : $(sources)
- : $(rproperties) : $(usage-requirements) : $(all-targets) ] ;
+ local s = [ new subvariant $(__name__) : $(build-request) : $(sources) :
+ $(rproperties) : $(usage-requirements) : $(all-targets) ] ;
         for local v in $(all-targets)
         {
             if ! [ $(v).creating-subvariant ]
@@ -1529,8 +1534,8 @@
 # 'requirements', 'default-build' and 'usage-requirements' are assumed to be in
 # the form specified by the user in Jamfile corresponding to 'project'.
 #
-rule create-typed-target ( type : project : name : sources * : requirements *
- : default-build * : usage-requirements * )
+rule create-typed-target ( type : project : name : sources * : requirements * :
+ default-build * : usage-requirements * )
 {
     return [
         targets.main-target-alternative

Modified: branches/proto/v4/tools/build/v2/build/version.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/build/version.jam (original)
+++ branches/proto/v4/tools/build/v2/build/version.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -1,7 +1,12 @@
 # Copyright 2002, 2003, 2004, 2006 Vladimir Prus
+# Copyright 2008 Jurko Gospodnetic
 # Distributed under the Boost Software License, Version 1.0.
 # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
+import errors ;
+import numbers ;
+
+
 rule boost-build ( )
 {
     return "V2 (Milestone 12)" ;
@@ -10,7 +15,7 @@
 
 rule jam ( )
 {
- local v = [ modules.peek : JAM_VERSION ] ;
+ local v = [ modules.peek : JAM_VERSION ] ;
     return $(v:J=.) ;
 }
 
@@ -20,3 +25,119 @@
     ECHO "Boost.Build" [ boost-build ] ;
     ECHO "Boost.Jam" [ jam ] ;
 }
+
+
+# Utility rule for testing whether all elements in a sequence are equal to 0.
+#
+local rule is-all-zeroes ( sequence * )
+{
+ local result = "true" ;
+ for local e in $(sequence)
+ {
+ if $(e) != "0"
+ {
+ result = "" ;
+ }
+ }
+ return $(result) ;
+}
+
+
+# Returns "true" if the first version is less than the second one.
+#
+rule version-less ( lhs + : rhs + )
+{
+ numbers.check $(lhs) ;
+ numbers.check $(rhs) ;
+
+ local done ;
+ local result ;
+
+ while ! $(done) && $(lhs) && $(rhs)
+ {
+ if [ numbers.less $(lhs[1]) $(rhs[1]) ]
+ {
+ done = "true" ;
+ result = "true" ;
+ }
+ else if [ numbers.less $(rhs[1]) $(lhs[1]) ]
+ {
+ done = "true" ;
+ }
+ else
+ {
+ lhs = $(lhs[2-]) ;
+ rhs = $(rhs[2-]) ;
+ }
+ }
+ if ( ! $(done) && ! $(lhs) && ! [ is-all-zeroes $(rhs) ] )
+ {
+ result = "true" ;
+ }
+
+ return $(result) ;
+}
+
+
+# Returns "true" if the current JAM version version is at least the given
+# version.
+#
+rule check-jam-version ( version + )
+{
+ local version-tag = $(version:J=.) ;
+ if ! $(version-tag)
+ {
+ errors.error Invalid version specifier: : $(version:E="(undefined)") ;
+ }
+
+ if ! $(.jam-version-check.$(version-tag))-is-defined
+ {
+ local jam-version = [ modules.peek : JAM_VERSION ] ;
+ if ! $(jam-version)
+ {
+ errors.error "Unable to deduce Boost Jam version. Your Boost Jam"
+ "installation is most likely terribly outdated." ;
+ }
+ .jam-version-check.$(version-tag) = "true" ;
+ if [ version-less [ modules.peek : JAM_VERSION ] : $(version) ]
+ {
+ .jam-version-check.$(version-tag) = "" ;
+ }
+ }
+ return $(.jam-version-check.$(version-tag)) ;
+}
+
+
+rule __test__ ( )
+{
+ import assert ;
+
+ local jam-version = [ modules.peek : JAM_VERSION ] ;
+ local future-version = $(jam-version) ;
+ future-version += "1" ;
+
+ assert.true check-jam-version $(jam-version) ;
+ assert.false check-jam-version $(future-version) ;
+
+ assert.true version-less 0 : 1 ;
+ assert.false version-less 0 : 0 ;
+ assert.true version-less 1 : 2 ;
+ assert.false version-less 1 : 1 ;
+ assert.false version-less 2 : 1 ;
+ assert.true version-less 3 1 20 : 3 4 10 ;
+ assert.false version-less 3 1 10 : 3 1 10 ;
+ assert.false version-less 3 4 10 : 3 1 20 ;
+ assert.true version-less 3 1 20 5 1 : 3 4 10 ;
+ assert.false version-less 3 1 10 5 1 : 3 1 10 ;
+ assert.false version-less 3 4 10 5 1 : 3 1 20 ;
+ assert.true version-less 3 1 20 : 3 4 10 5 1 ;
+ assert.true version-less 3 1 10 : 3 1 10 5 1 ;
+ assert.false version-less 3 4 10 : 3 1 20 5 1 ;
+ assert.false version-less 3 1 10 : 3 1 10 0 0 ;
+ assert.false version-less 3 1 10 0 0 : 3 1 10 ;
+ assert.false version-less 3 1 10 0 : 3 1 10 0 0 ;
+ assert.false version-less 3 1 10 0 : 03 1 10 0 0 ;
+ assert.false version-less 03 1 10 0 : 3 1 10 0 0 ;
+
+ # TODO: Add tests for invalid input data being sent to version-less.
+}

Modified: branches/proto/v4/tools/build/v2/build/virtual-target.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/build/virtual-target.jam (original)
+++ branches/proto/v4/tools/build/v2/build/virtual-target.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -275,7 +275,7 @@
                                     # instance.
                              )
     {
- if $(s) && ! $(self.creating-subvariant) && ! $(overwrite)
+ if $(s) && ! $(self.creating-subvariant)
         {
             self.creating-subvariant = $(s) ;
         }
@@ -957,9 +957,10 @@
 }
 
 
-# Each target returned by 'register' is added to a recent-targets list, returned
-# by this function. This allows us to find all targets created when building a
-# given main target, even if the target... !!!MISSING TEXT HERE!!!
+# Each target returned by 'register' is added to a .recent-targets list,
+# returned by this function. This allows us to find all virtual targets created
+# when building a given main target, even those constructed only as intermediate
+# targets.
 #
 rule recent-targets ( )
 {

Modified: branches/proto/v4/tools/build/v2/doc/src/advanced.xml
==============================================================================
--- branches/proto/v4/tools/build/v2/doc/src/advanced.xml (original)
+++ branches/proto/v4/tools/build/v2/doc/src/advanced.xml 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -7,15 +7,14 @@
 
   <para>This section will provide the information necessary to create your own
   projects using Boost.Build. The information provided here is relatively
- high-level, and <xref linkend="bbv2.reference"/> as
- well as the on-line help system must be used to obtain
- low-level documentation (see <xref linkend=
+ high-level, and <xref linkend="bbv2.reference"/> as well as the on-line help
+ system must be used to obtain low-level documentation (see <xref linkend=
   "bbv2.reference.init.options.help"/>).</para>
 
- <para>Boost.Build actually consists of two parts - Boost.Jam, a
- build engine with its own interpreted language, and Boost.Build itself,
- implemented in Boost.Jam's language. The chain of events when
- you type <command>bjam</command> on the command line is:
+ <para>Boost.Build actually consists of two parts - Boost.Jam, a build engine
+ with its own interpreted language, and Boost.Build itself, implemented in
+ Boost.Jam's language. The chain of events when you type
+ <command>bjam</command> on the command line is:
       <orderedlist>
         <listitem>
           <para>Boost.Jam tries to find Boost.Build and loads the top-level
@@ -23,9 +22,10 @@
           linkend="bbv2.reference.init"/></para>
         </listitem>
         <listitem>
- <para>The top-level module loads user-defined configuration
- files, <filename>user-config.jam</filename> and <filename>site-config.jam</filename>, which define
- available toolsets.</para>
+ <para>The top-level module loads user-defined configuration files,
+ <filename>user-config.jam</filename> and
+ <filename>site-config.jam</filename>, which define available toolsets.
+ </para>
         </listitem>
         <listitem>
           <para>The Jamfile in the current directory is read. That in turn
@@ -37,7 +37,7 @@
           Boost.Build decides which targets should be built, and how. That
           information is passed back to Boost.Jam, which takes care of
           actually running commands.</para>
- </listitem>
+ </listitem>
       </orderedlist>
     </para>
 
@@ -57,45 +57,45 @@
               How the build process works</link></para>
         </listitem>
         <listitem>
- <para>Some Basics about the Boost.Jam language. See
+ <para>Some Basics about the Boost.Jam language. See
           <xref linkend="bbv2.advanced.jam_language"/>.
           </para>
         </listitem>
       </itemizedlist>
     </para>
-
+
     <section id="bbv2.advanced.jam_language">
       <title>Boost.Jam Language</title>
 
       <para>This section will describe the basics of the Boost.Jam
       language&#x2014;just enough for writing Jamfiles. For more information,
- please see the <link linkend="bbv2.jam">Boost.Jam</link>
- documentation.</para>
+ please see the <link linkend="bbv2.jam">Boost.Jam</link> documentation.
+ </para>
 
- <para>Boost.Jam has an interpreted, procedural language.
- On the lowest level, a Boost.Jam program consists of variables and
+ <para><link linkend="bbv2.jam">Boost.Jam</link> has an interpreted,
+ procedural language. On the lowest level, a <link linkend="bbv2.jam">
+ Boost.Jam</link> program consists of variables and
       <indexterm><primary>rule</primary></indexterm>
       <firstterm>rules</firstterm> (the Jam term for function). They are grouped
- in modules&#x2014;there's one global module and a number of named
- modules. Besides that, a Boost.Jam program contains classes and class
- instances.
- </para>
-
- <para>Syntantically, a Boost.Jam program consists of two kind of
- elements&#x2014;keywords (which have a special meaning to Boost.Jam) and
- literals.
+ in modules&#x2014;there's one global module and a number of named modules.
+ Besides that, a <link linkend="bbv2.jam">Boost.Jam</link> program contains
+ classes and class instances.</para>
+
+ <para>Syntantically, a <link linkend="bbv2.jam">Boost.Jam</link> program
+ consists of two kind of elements&#x2014;keywords (which have a special
+ meaning to <link linkend="bbv2.jam">Boost.Jam</link>) and literals.
 
       Consider this code:
       <programlisting>
 a = b ;</programlisting>
       which assigns the value <literal>b</literal> to the variable
- <literal>a</literal>. Here, <literal>=</literal> and
- <literal>;</literal> are keywords, while <literal>a</literal> and
- <literal>b</literal> are literals.
+ <literal>a</literal>. Here, <literal>=</literal> and <literal>;</literal>
+ are keywords, while <literal>a</literal> and <literal>b</literal> are
+ literals.
       <warning>
- <para>All syntax elements, even keywords, must be separated by
- spaces. For example, omitting the space character before
- <literal>;</literal> will lead to a syntax error.
+ <para>All syntax elements, even keywords, must be separated by spaces.
+ For example, omitting the space character before <literal>;</literal>
+ will lead to a syntax error.
         </para>
       </warning>
       If you want to use a literal value that is the same as some keyword, the
@@ -103,11 +103,11 @@
       <programlisting>
 a = "=" ;</programlisting>
       </para>
-
- <para>All variables in Boost.Jam have the same type&#x2014;list of
- strings. To define a variable one assigns a value to it, like in the
- previous example. An undefined variable is the same as a variable with
- an empty value. Variables can be accessed with the
+
+ <para>All variables in <link linkend="bbv2.jam">Boost.Jam</link> have the
+ same type&#x2014;list of strings. To define a variable one assigns a value
+ to it, like in the previous example. An undefined variable is the same as
+ a variable with an empty value. Variables can be accessed using the
       <code>$(<replaceable>variable</replaceable>)</code> syntax. For example:
       <programlisting>
 a = $(b) $(c) ;</programlisting>
@@ -115,27 +115,28 @@
 
       <para>
         Rules are defined by specifying the rule name, the parameter names,
- and the allowed size of the list value for each parameter.
+ and the allowed size of the list value for each parameter.
         <programlisting>
-rule <replaceable>example</replaceable>
+rule <replaceable>example</replaceable>
      (
- <replaceable>parameter1</replaceable> :
- <replaceable>parameter2 ?</replaceable> :
+ <replaceable>parameter1</replaceable> :
+ <replaceable>parameter2 ?</replaceable> :
          <replaceable>parameter3 +</replaceable> :
- <replaceable>parameter4 *</replaceable>
+ <replaceable>parameter4 *</replaceable>
      )
      {
         // body
      }</programlisting>
         When this rule is called, the list passed as the first argument must
         have exactly one value. The list passed as the second argument can
- either have one value of be empty. The two remaining arguments can
- be arbitrary long, but the third argument may not be empty.
+ either have one value of be empty. The two remaining arguments can be
+ arbitrarily long, but the third argument may not be empty.
       </para>
 
- <para>The overview of Boost.Jam language statements is given below:
+ <para>The overview of <link linkend="bbv2.jam">Boost.Jam</link> language
+ statements is given below:
       <programlisting>
-helper 1 : 2 : 3 ;
+helper 1 : 2 : 3 ;
 x = [ helper 1 : 2 : 3 ] ;</programlisting>
       This code calls the named rule with the specified arguments. When the
       result of the call must be used inside some expression, you need to add
@@ -144,7 +145,7 @@
 if cond { statements } [ else { statements } ]</programlisting>
       This is a regular if-statement. The condition is composed of:
       <itemizedlist>
- <listitem><para>Literals (true if at least one string is not empty)</para></listitem>
+ <listitem><para>Literals (true if at least one string is not empty)</para></listitem>
         <listitem><para>Comparisons: <code>a
         <replaceable>operator</replaceable> b</code> where
         <replaceable>operator</replaceable> is one of <code>=</code>,
@@ -163,7 +164,7 @@
       <varname>var</varname> to the element value.
       <programlisting>
 while cond { statements }</programlisting>
- Repeatedly execute statements while cond remains true upon entry.
+ Repeatedly execute statements while cond remains true upon entry.
       <programlisting>
 return values ;
       </programlisting>This statement should be used only inside a
@@ -202,16 +203,17 @@
     create-file-from-another $(&lt;) $(&gt;)
 }
 </programlisting>
- This specifies a named action called
- <literal>create-file-from-another</literal>. The text inside braces is the
- command to invoke. The <literal>$(&lt;)</literal> variable will be expanded to list of
- generated files, and the <literal>$(&gt;)</literal> variable will be expanded
- to the list of source files.
+ This specifies a named action called
+ <literal>create-file-from-another</literal>. The text inside braces is
+ the command to invoke. The <literal>$(&lt;)</literal> variable will be
+ expanded to a list of generated files, and the
+ <literal>$(&gt;)</literal> variable will be expanded to a list of
+ source files.
       </para>
 
- <para>To flexibly adjust command line, you can define a rule with the
- same name as the action, and taking three parameters -- targets, sources
- and properties. For example:
+ <para>To flexibly adjust command line, you can define a rule with the same
+ name as the action, and taking three parameters -- targets, sources and
+ properties. For example:
 <programlisting>
 rule create-file-from-another ( targets * : sources * : properties * )
 {
@@ -226,14 +228,15 @@
 }
 </programlisting>
       In this example, the rule checks if certain build property is specified.
- If so, it sets variable <varname>OPIONS</varname> that's used inside
- action. Note that the variable is set "on targets" -- the value will
- be only visible inside action, not globally. Were it set globally,
- using variable named <varname>OPTIONS</varname> in two unrelated
- actions would be impossible.
+ If so, it sets variable <varname>OPIONS</varname> that is then used inside
+ the action. Note that the variables set "on a target" will be visible only
+ inside actions building that target, not globally. Were they set globally,
+ using variable named <varname>OPTIONS</varname> in two unrelated actions
+ would be impossible.
       </para>
 
- <para>More details can be found in Jam reference, <xref linkend="jam.language.rules"/>
+ <para>More details can be found in Jam reference,
+ <xref linkend="jam.language.rules"/>
       </para>
 
     </section>
@@ -243,35 +246,33 @@
 
     <para>The Boost.Build configuration is specified in the file
     <filename>user-config.jam</filename>. You can edit the one in the top-level
- directory of Boost.Build installation or create a copy in your home directory
- and edit that. (See <xref linkend="bbv2.reference.init.config"/> for the
- exact search paths.) The primary function of that file is to declare which
- compilers and other tools are available. The simplest syntax to configure
- a tool is:
+ directory of Boost.Build installation or create a copy in your home
+ directory and edit that. (See <xref linkend="bbv2.reference.init.config"/>
+ for the exact search paths.) The primary function of that file is to declare
+ which compilers and other tools are available. The simplest syntax to
+ configure a tool is:
 
 <programlisting>
-using <replaceable>tool-name</replaceable> ;
-</programlisting>
- The <functionname>using</functionname> rule is given a name of tool, and will make that tool
- available to Boost.Build. For example, <code>using gcc ;</code> will make the gcc compiler
- available.
+using <replaceable>tool-name</replaceable> ;
+</programlisting>
+ The <functionname>using</functionname> rule is given a name of tool, and
+ will make that tool available to Boost.Build. For example,
+ <code>using gcc ;</code> will make the gcc compiler available.
     </para>
 
     <para>
- Since nothing but a tool name is specified, Boost.Build will
- pick some default settings. For example, it will use the
- <command>gcc</command> executable found in the
- <envar>PATH</envar>, or look in some known installation
- locations. In most cases, this strategy works automatically. In
- case you have several versions of a compiler, it's installed in
- some unusual location, or you need to tweak its configuration,
- you'll need to pass additional parameters to the
- <functionname>using</functionname> rule. The parameters to
- <functionname>using</functionname> can be different for each
- tool. You can obtain specific documentation for any tool's
+ Since nothing but a tool name is specified, Boost.Build will pick some
+ default settings. For example, it will use the <command>gcc</command>
+ executable found in the <envar>PATH</envar>, or look in some known
+ installation locations. In most cases, this strategy works automatically.
+ In case you have several versions of a compiler, it's installed in some
+ unusual location, or you need to tweak its configuration, you'll need to
+ pass additional parameters to the <functionname>using</functionname> rule.
+ The parameters to <functionname>using</functionname> can be different for
+ each tool. You can obtain specific documentation for any tool's
       configuration parameters by invoking
 <programlisting>
-bjam --help <replaceable>tool-name</replaceable>.init
+bjam --help <replaceable>tool-name</replaceable>.init
 </programlisting>
     </para>
     <para>
@@ -285,28 +286,23 @@
       <!-- the previous text here was really confusing -->
     </para>
 
- <para>The <parameter class="function">version</parameter>
- parameter identifies the toolset version, in case you have
- several installed. It can have any form you like, but
- it's recommended that you use a numeric identifier like
- <literal>7.1</literal>.
+ <para>The <parameter class="function">version</parameter> parameter
+ identifies the toolset version, in case you have several installed. It can
+ have any form you like, but it is recommended that you use a numeric
+ identifier like <literal>7.1</literal>.
     </para>
 
     <para>
- The <parameter class="function">invocation-command</parameter>
- parameter is the command that must be executed to run the
- compiler. This parameter can usually be omitted if the compiler
- executable
+ The <parameter class="function">invocation-command</parameter> parameter
+ is the command that must be executed to run the compiler. This parameter
+ can usually be omitted if the compiler executable
       <itemizedlist>
- <listitem><para>has its &#x201C;usual
- name&#x201D; and is in the <envar>PATH</envar>,
- or</para></listitem>
- <listitem><para>was installed in a standard
- &#x201C;installation directory&#x201D;,
- or</para></listitem>
-
- <listitem><para>can be found through a global mechanism like the
- Windows registry.</para></listitem>
+ <listitem><para>has its &#x201C;usual name&#x201D; and is in the
+ <envar>PATH</envar>, or</para></listitem>
+ <listitem><para>was installed in a standard &#x201C;installation
+ directory&#x201D;, or</para></listitem>
+ <listitem><para>can be found using a global system like the Windows
+ registry.</para></listitem>
       </itemizedlist>
 
       For example:
@@ -382,7 +378,7 @@
 using gcc : 3.4 : : &lt;compileflags&gt;-m64 &lt;linkflags&gt;-m64 ;
 </programlisting>
     </para>
-
+
     </section>
 
     <section id="bbv2.advanced.invocation">
@@ -397,7 +393,7 @@
 
       <para>To build specific targets, specify them on the command line:
 <screen>
-bjam lib1 subproject//lib2
+bjam lib1 subproject//lib2
 </screen>
       </para>
 
@@ -417,12 +413,12 @@
       <para>Boost.Build recognizes the following command line options.</para>
 
       <variablelist>
-
+
         <varlistentry>
           <term><option>--clean</option></term>
           <listitem>
- <para>Cleans all targets in the current directory and
- in any subprojects. Note that unlike the <literal>clean</literal>
+ <para>Cleans all targets in the current directory and
+ in any subprojects. Note that unlike the <literal>clean</literal>
             target in make, you can use <literal>--clean</literal>
             together with target names to clean specific targets.</para>
           </listitem>
@@ -431,8 +427,8 @@
         <varlistentry>
           <term><option>--clean-all</option></term>
           <listitem>
- <para>Cleans all targets,
- no matter where they are defined. In particular, it will clean targets
+ <para>Cleans all targets,
+ no matter where they are defined. In particular, it will clean targets
             in parent Jamfiles, and targets defined under other project roots.
             </para>
           </listitem>
@@ -444,8 +440,8 @@
             <para>Changes build directories for all project roots being built. When
             this option is specified, all Jamroot files should declare project name.
             The build directory for the project root will be computed by concatanating
- the value of the <option>--build-dir</option> option, the project name
- specified in Jamroot, and the build dir specified in Jamroot
+ the value of the <option>--build-dir</option> option, the project name
+ specified in Jamroot, and the build dir specified in Jamroot
             (or <literal>bin</literal>, if none is specified).
             </para>
 
@@ -477,7 +473,7 @@
         <varlistentry>
           <term><option>--debug-configuration</option></term>
           <listitem>
- <para>Produces debug information about loading of Boost.Build
+ <para>Produces debug information about loading of Boost.Build
             and toolset files.</para>
           </listitem>
         </varlistentry>
@@ -493,7 +489,7 @@
         <varlistentry>
           <term><option>--debug-generators</option></term>
           <listitem>
- <para>Produces debug output from generator search process.
+ <para>Produces debug output from generator search process.
             Useful for debugging custom generators.
             </para>
           </listitem>
@@ -515,11 +511,11 @@
             </para>
           </listitem>
         </varlistentry>
-
+
       </variablelist>
 
 
- <para>For complete specification of command line syntax, see
+ <para>For complete specification of command line syntax, see
       <xref linkend="bbv2.reference.init.args"/>
       </para>
 
@@ -546,7 +542,7 @@
 
       <!-- I think we maybe ought to be talking about a common
            _signature_ here, having already explained Boost.Jam function
- signatures at the beginning of this chapter. Then we could show
+ signatures at the beginning of this chapter. Then we could show
            ( main-target-name : sources * : requirements * : default-build * : usage-requirements * )
            instead. More precise.
 
@@ -575,21 +571,21 @@
             (&#x2018;<code>_</code>&#x2019;).
           </simpara>
         </listitem>
-
+
         <listitem>
           <simpara>
             <parameter>sources</parameter> is the list of source files and other main
- targets that must be combined.
+ targets that must be combined.
           </simpara>
         </listitem>
-
+
         <listitem>
           <simpara>
             <parameter>requirements</parameter> is the list of properties that must always
             be present when this main target is built.
           </simpara>
         </listitem>
-
+
         <listitem>
           <simpara>
             <parameter>default-build</parameter> is the list of properties that will be used
@@ -597,7 +593,7 @@
             specified, e.g. on the command line or by propagation from a dependent target.
           </simpara>
         </listitem>
-
+
         <listitem>
           <simpara>
             <parameter>usage-requirements</parameter> is the list of properties that will be
@@ -607,7 +603,7 @@
         </listitem>
       </itemizedlist>
 
- <para>
+ <para>
         Some main target rules have a different list of parameters as explicitly
         stated in their documentation.
       </para>
@@ -615,7 +611,7 @@
       <para>The actual requirements for a target are obtained by refining
       requirements of the project where a target is declared with the
       explicitly specified requirements. The same is true for
- usage-requirements. More details can be found in
+ usage-requirements. More details can be found in
       <xref linkend="bbv2.reference.variants.proprefine"/>
       </para>
 
@@ -631,7 +627,7 @@
         prefixes.
         </para>
 
- <para>The name of a main target can contain alphanumeric characters,
+ <para>The name of a main target can contain alphanumeric characters,
         dashes, undescores and dots. The entire
         name is significant when resolving references from other targets. For determining filenames, only the
         part before the first dot is taken. For example:</para>
@@ -641,7 +637,7 @@
 </programlisting>
         <para>will generate two files named <filename>test.obj</filename> (in two different directories), not
         two files named <filename>test.release.obj</filename> and <filename>test.debug.obj</filename>.
- </para>
+ </para>
 
       </section>
 
@@ -656,7 +652,7 @@
         <functionname>glob</functionname> rule. Here are two examples:</para>
 <programlisting>
 exe a : a.cpp ; # a.cpp is the only source file
-exe b : [ glob *.cpp ] ; # all .cpp files in this directory are sources
+exe b : [ glob *.cpp ] ; # all .cpp files in this directory are sources
 </programlisting>
         <para>
         Unless you specify a file with an absolute path, the name is
@@ -677,7 +673,7 @@
           the double slash is first looked up as project name, and then as directory
           name. For example:
         </para>
-
+
 <programlisting>
 lib helper : helper.cpp ;
 exe a : a.cpp helper ;
@@ -712,18 +708,18 @@
 <programlisting>
 lib util : util.cpp : &lt;link&gt;static ;
 obj main : main.cpp : &lt;optimization&gt;off ;
-</programlisting>
+</programlisting>
         </para>
 
         <para id="bbv2.advanced.targets.requirements.conditional">Sometimes, particular relationships need to be maintained
- among a target's build properties. This can be achieved with
+ among a target's build properties. This can be achieved with
         <firstterm>conditional
         requirements</firstterm>. For example, you might want to set
         specific <code>#defines</code> when a library is built as shared,
         or when a target's <code>release</code> variant is built in
         release mode.
 <programlisting>
-lib network : network.cpp
+lib network : network.cpp
     : <emphasis role="bold">&lt;link&gt;shared:&lt;define&gt;NEWORK_LIB_SHARED</emphasis>
      &lt;variant&gt;release:&lt;define&gt;EXTRA_FAST
     ;
@@ -732,7 +728,7 @@
         In the example above, whenever <filename>network</filename> is
         built with <code>&lt;link&gt;shared</code>,
         <code>&lt;define&gt;NEWORK_LIB_SHARED</code> will be in its
- properties, too.
+ properties, too.
         </para>
 
         <para>You can use several properties in the condition, for example:
@@ -744,12 +740,12 @@
         </para>
 
         <para id="bbv2.advanced.targets.requirements.indirect">
- A more powerful variant of conditional requirements
+ A more powerful variant of conditional requirements
           is <firstterm>indirect conditional requirements</firstterm>.
           You can provide a rule that will be called with the current build properties and can compute additional properties
           to be added. For example:
 <programlisting>
-lib network : network.cpp
+lib network : network.cpp
     : &lt;conditional&gt;@my-rule
     ;
 rule my-rule ( properties * )
@@ -760,7 +756,7 @@
         result += &lt;define&gt;USE_INLINE_ASSEMBLER ;
     }
     return $(result) ;
-}
+}
 </programlisting>
         This example is equivalent to the previous one, but for complex cases, indirect conditional
         requirements can be easier to write and understand.
@@ -785,15 +781,15 @@
         Here, <code>test1</code> inherits project requirements and will always
         be built in multi-threaded mode. The <code>test2</code> target
         <emphasis>overrides</emphasis> project's requirements and will
- always be built in single-threaded mode. In contrast, the
+ always be built in single-threaded mode. In contrast, the
         <code>test3</code> target <emphasis>removes</emphasis> a property
         from project requirements and will be built either in single-threaded or
         multi-threaded mode depending on which variant is requested by the
         user.</para>
 
- <para>Note that the removal of requirements is completely textual:
+ <para>Note that the removal of requirements is completely textual:
         you need to specify exactly the same property to remove it.</para>
-
+
       </section>
 
       <section>
@@ -838,7 +834,7 @@
         parameter may include calls to other main rules. For example:</para>
 
 <programlisting>
-exe hello : hello.cpp
+exe hello : hello.cpp
     [ obj helpers : helpers.cpp : &lt;optimization&gt;off ] ;</programlisting>
 
          <para>
@@ -868,7 +864,7 @@
       because they allow us to group related targets together, define
       properties common to all those targets, and assign a symbolic
       name to the project that can be used in referring to its
- targets.
+ targets.
       </para>
 
       <para>Projects are named using the
@@ -883,11 +879,11 @@
         of attribute names along with its handling is also shown in
         the table below. For example, it is possible to write:
 <programlisting>
-project tennis
- : requirements &lt;threading&gt;multi
+project tennis
+ : requirements &lt;threading&gt;multi
     : default-build release
     ;
-</programlisting>
+</programlisting>
       </para>
 
       <para>The possible attributes are listed below.</para>
@@ -897,7 +893,7 @@
         unrelated to filesystem, such as "boost/thread". <link linkend=
           "bbv2.reference.ids">Target references</link> make use of project ids to
         specify a target.</para>
- <!--
+ <!--
              This is actually spelled "project-id," isn't it? You
              have to fix all of these and use a code font. Also below
              in the table.
@@ -911,7 +907,7 @@
 
       <para><emphasis>Default build</emphasis> is the build request that should be
         used when no build request is specified explicitly.</para>
- <!--
+ <!--
              This contradicts your earlier description of default
              build and I believe it is incorrect. Specifying a build
              request does not neccessarily render default build
@@ -930,73 +926,73 @@
             <thead>
               <row>
                 <entry>Attribute</entry>
-
+
                 <entry>Name</entry>
-
+
                 <entry>Default value</entry>
-
+
                 <entry>Handling by the <functionname>project</functionname>
                 rule</entry>
 
               </row>
             </thead>
-
+
             <tbody>
-
+
               <row>
                 <entry>Project id</entry>
-
+
                 <entry>none</entry>
-
+
                 <entry>none</entry>
-
+
                 <entry>Assigned from the first parameter of the 'project' rule.
                   It is assumed to denote absolute project id.</entry>
               </row>
-
+
               <row>
                 <entry>Source location</entry>
-
+
                 <entry><literal>source-location</literal></entry>
-
+
                 <entry>The location of jamfile for the project</entry>
-
+
                 <entry>Sets to the passed value</entry>
               </row>
-
+
               <row>
                 <entry>Requirements</entry>
-
+
                 <entry><literal>requirements</literal></entry>
-
+
                 <entry>The parent's requirements</entry>
-
+
                 <entry>The parent's requirements are refined with the passed
                   requirement and the result is used as the project
                   requirements.</entry>
               </row>
-
+
               <row>
                 <entry>Default build</entry>
-
+
                 <entry><literal>default-build</literal></entry>
-
+
                 <entry>none</entry>
-
+
                 <entry>Sets to the passed value</entry>
               </row>
-
+
               <row>
                 <entry>Build directory</entry>
-
+
                 <entry><literal>build-dir</literal></entry>
-
+
                 <entry>Empty if the parent has no build directory set.
                 Otherwise, the parent's build directory with the
                 relative path from parent to the current project
                 appended to it.
                 </entry>
-
+
                 <entry>Sets to the passed value, interpreted as relative to the
                   project's location.</entry>
               </row>
@@ -1007,7 +1003,7 @@
 
       <para>Besides defining projects and main targets, Jamfiles
       often invoke various utility rules. For the full list of rules
- that can be directly used in Jamfile see
+ that can be directly used in Jamfile see
       <xref linkend="bbv2.reference.rules"/>.
       </para>
 
@@ -1028,7 +1024,7 @@
       subprojects, so that every definition made in a parent project
       is always available to its children. The loading order of any
       other projects is unspecified. Even if one project refers to
- another via the <code>use-project</code> or a target reference,
+ another via the <code>use-project</code> or a target reference,
       no specific order should be assumed.
       </para>
 
@@ -1038,7 +1034,7 @@
         Boost.Build won't misinterpret a directory above it as the
         project root just because the directory contains a Jamfile.
         <!-- The logic of the previous reasoning didn't hang together -->
- </para>
+ </para>
       </note>
 
       <!-- All this redundancy with the tutorial is bad. The tutorial
@@ -1047,12 +1043,12 @@
            perfectly appropriate to start a user guide with that kind
            of material. -->
     </section>
-
+
   <section id="bbv2.advanced.build_process">
     <title>The Build Process</title>
 
     <para>When you've described your targets, you want Boost.Build to run the
- right tools and create the needed targets.
+ right tools and create the needed targets.
       <!-- That sentence is awkward and doesn't add much. -->
       This section will describe
       two things: how you specify what to build, and how the main targets are
@@ -1061,7 +1057,7 @@
 
     <para>The most important thing to note is that in Boost.Build, unlike
       other build tools, the targets you declare do not correspond to specific
- files. What you declare in a Jamfile is more like a “metatarget.”
+ files. What you declare in a Jamfile is more like a “metatarget.”
       <!-- Do we need a new word? We already have “main target.” If
            you're going to introduce “metatarget” you should at least
            tie it together with the main target concept. It's too
@@ -1077,7 +1073,7 @@
       <para>
         This means that for Boost.Build, you cannot directly obtain a build
         variant from a Jamfile. There could be several variants requested by the
- user, and each target can be built with different properties.
+ user, and each target can be built with different properties.
       </para>
     </tip>
 
@@ -1091,7 +1087,7 @@
 bjam app1 lib1//lib1 toolset=gcc variant=debug optimization=full
 </programlisting>
         would build two targets, "app1" and "lib1//lib1" with the specified
- properties. You can refer to any targets, using
+ properties. You can refer to any targets, using
         <link linkend="bbv2.reference.ids">target id</link> and specify arbitrary
         properties. Some of the properties are very common, and for them the name
         of the property can be omitted. For example, the above can be written as:
@@ -1110,7 +1106,7 @@
         explanation is provided, and more details are given in <xref
         linkend="bbv2.reference.buildprocess"/>.
         <orderedlist>
-
+
           <listitem><para>Applying default build. If the default-build
           property of a target specifies a value of a feature that is not
           present in the build request, that value is added.</para>
@@ -1120,21 +1116,21 @@
               the reader will be confused.
           -->
           </listitem>
-
+
           <listitem><para>Selecting the main target alternative to use. For
               each alternative we look how many properties are present both in
               alternative's requirements, and in build request. The
               alternative with large number of matching properties is selected.
             </para></listitem>
-
- <listitem><para>Determining "common" properties.
+
+ <listitem><para>Determining "common" properties.
           <!-- It would be nice to have a better name for this. But
                even more importantly, unless you say something about
                the reason for choosing whatever term you use, the
                reader is going to wonder what it means. -->
               The build request
               is <link linkend="bbv2.reference.variants.proprefine">refined</link>
- with target's requirements.
+ with target's requirements.
               <!-- It's good that you have the links here and below,
                    but I'm concerned that it doesn't communicate well
                    in print and there's not enough information for the
@@ -1144,7 +1140,7 @@
               requirements are handled as well. Finally, default values of
               features are added.
             </para></listitem>
-
+
           <listitem><para>Building targets referred by the sources list and
               dependency properties. The list of sources and the properties
               can refer to other target using <link
@@ -1153,38 +1149,34 @@
               linkend="bbv2.reference.features.attributes.propagated">propagated</link>
               properties, refine them by explicit properties specified in the
               target reference, and pass the resulting properties as build
- request to the other target.
+ request to the other target.
             </para></listitem>
-
+
           <listitem><para>Adding the usage requirements produced when building
               dependencies to the "common" properties. When dependencies are
- built in the previous step, they return
+ built in the previous step, they return
               <!-- don't assume reader has a mental model for BB internals! -->
               both the set of created
               "real" targets, and usage requirements. The usage requirements
               are added to the common properties and the resulting property
- set will be used for building the current target.
+ set will be used for building the current target.
             </para></listitem>
-
+
           <listitem><para>Building the target using generators. To convert the
               sources to the desired type, Boost.Build uses "generators" ---
- objects that correspond to tools like compilers and
- linkers. Each generator declares what type of targets it
- <!-- Was "in." Why are these short and unmistakable
- words so commonly misspelled? -->
- can
- produce and what type of sources it requires. Using this
- information, Boost.Build determines which generators must be run
- to produce a specific target from specific sources. When
- generators are run, they return the "real" targets.
+ objects that correspond to tools like compilers and linkers. Each
+ generator declares what type of targets it can produce and what
+ type of sources it requires. Using this information, Boost.Build
+ determines which generators must be run to produce a specific
+ target from specific sources. When generators are run, they return
+ the "real" targets.
             </para></listitem>
-
+
           <listitem><para>Computing the usage requirements to be returned. The
- conditional properties in usage requirements are expanded
+ conditional properties in usage requirements are expanded
           <!-- what does "expanded" mean? -->
- and the
- result is returned.</para></listitem>
- </orderedlist>
+ and the result is returned.</para></listitem>
+ </orderedlist>
       </para>
     </section>
 
@@ -1213,22 +1205,20 @@
       </para>
 
       <para>The Jamfile for a project can include a number of
- <code>build-project</code> rule calls
- <!-- A comma would only be correct here in German -->
- that specify additional projects
- to be built.
+ <code>build-project</code> rule calls that specify additional projects to
+ be built.
       </para>
 
     </section>
 
   </section>
-
+
   </chapter>
 
 <!--
      Local Variables:
      mode: nxml
- sgml-indent-data: t
+ sgml-indent-data: t
      sgml-parent-document: ("userman.xml" "chapter")
      sgml-set-face: t
      End:

Modified: branches/proto/v4/tools/build/v2/doc/src/extending.xml
==============================================================================
--- branches/proto/v4/tools/build/v2/doc/src/extending.xml (original)
+++ branches/proto/v4/tools/build/v2/doc/src/extending.xml 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -130,14 +130,14 @@
         automatically generate necessary build actions only because you
         specify the desired type (using the different main target rules), and
         because Boost.Build can guess the type of sources from their
- extensions.
+ extensions.
       </para>
 
       <para>The first two parameters for the <code>type.register</code> rule
         are the name of new type and the list of extensions associated with
         it. A file with an extension from the list will have the given target
         type. In the case where a target of the declared type is generated
- from other sources, the first specified extension will be used.
+ from other sources, the first specified extension will be used.
       </para>
 
     <para>Sometimes you want to change the suffix used for generated targets
@@ -149,7 +149,7 @@
 </programlisting>
     </para>
 
- <para>A new target type can be inherited from an existing one.
+ <para>A new target type can be inherited from an existing one.
 <programlisting>
 type.register PLUGIN : : SHARED_LIB ;
 </programlisting>
@@ -174,10 +174,10 @@
       <section id="bbv2.extending.scanners">
         <title>Scanners</title>
         <para>
- Sometimes, a file can refer to other files via some include
- mechanism. To make Boost.Build track dependencies to the included
- files, you need to provide a scanner. The primary limitation is that
- only one scanner can be assigned to a target type.
+ Sometimes, a file can refer to other files via some include system. To
+ make Boost.Build track dependencies between included files, you need
+ to provide a scanner. The primary limitation is that only one scanner
+ can be assigned to a target type.
         </para>
 
         <para>First, we need to declare a new class for the scanner:
@@ -189,7 +189,7 @@
         return "//###include[ ]*\"([^\"]*)\"" ;
     }
 }
-</programlisting>
+</programlisting>
           All the complex logic is in the <code>common-scanner</code>
           class, and you only need to override the method that returns
           the regular expression to be used for scanning. The
@@ -221,7 +221,7 @@
       </section>
 
   </section>
-
+
   <section id="bbv2.extending.tools">
     <title>Tools and generators</title>
       <para>
@@ -319,7 +319,7 @@
 <!-- What is the point of this __init__ function?? -->
 }
 
-generators.register
+generators.register
   [ new custom-generator verbatim.inline-file : VERBATIM : CPP ] ;
 </programlisting>
         This generator will work exactly like the
@@ -363,13 +363,13 @@
 generators.register [ new itrace-generator nm.itrace : EXE : ITRACE ] ;
 </programlisting>
         The <code>generated-targets</code> method will be called with a single
- source target of type <literal>EXE</literal>. The call to
+ source target of type <literal>EXE</literal>. The call to
         <code>virtual-target.traverse</code> will return all targets the
         executable depends on, and we further find files that are not
         produced from anything. <!-- What does "not produced from anything" mean? -->
         The found targets are added to the sources.
       </para>
-
+
       <para>The <code>run</code> method can be overriden to completely
         customize the way the generator works. In particular, the conversion of
         sources to the desired types can be completely customized. Here's
@@ -382,7 +382,7 @@
         done:
 <programlisting>
 rule run ( project name ? : property-set : sources * )
-{
+{
     local python ;
     for local s in $(sources)
     {
@@ -400,26 +400,26 @@
             libs += $(s) ;
         }
     }
-
+
     local new-sources ;
     for local s in $(sources)
     {
- if [ type.is-derived [ $(s).type ] CPP ]
+ if [ type.is-derived [ $(s).type ] CPP ]
         {
             local name = [ $(s).name ] ; # get the target's basename
- if $(name) = [ $(python).name ]
+ if $(name) = [ $(python).name ]
             {
                 name = $(name)_ext ; # rename the target
- }
+ }
             new-sources += [ generators.construct $(project) $(name) :
               PYTHON_EXTENSION : $(property-set) : $(s) $(libs) ] ;
         }
     }
-
- result = [ construct-result $(python) $(new-sources) : $(project) $(name)
- : $(property-set) ] ;
-}
-</programlisting>
+
+ result = [ construct-result $(python) $(new-sources) : $(project) $(name)
+ : $(property-set) ] ;
+}
+</programlisting>
         <!-- Why are we doing this with a generator??? It seems
              insane. We could just use a nice front-end rule that
              calls some normal target-creation rules. No? -->
@@ -428,16 +428,16 @@
         sources. For each C++ source we create a separate Python extension by
         calling <code>generators.construct</code> and passing the C++ source
         and the libraries. At this point, we also change the extension's name,
- if necessary.
+ if necessary.
       </para>
 
-
+
     </section>
 
     <section id="bbv2.extending.features">
       <title>Features</title>
       <para>
- Often, we need to control the options passed the invoked tools. This
+ Often, we need to control the options passed the invoked tools. This
         is done with features. Consider an example:
 <programlisting>
 # Declare a new free feature
@@ -492,9 +492,9 @@
       linkend="bbv2.faq.external"/> for an example of very smart usage of that
       feature). Of course one should always strive to use portable
       features, but these are still be provided as a backdoor just to make
- sure Boost.Build does not take away any control from the user.
+ sure Boost.Build does not take away any control from the user.
     </para>
-
+
     <para>
       Using portable features is a good idea because:
       <itemizedlist>
@@ -508,7 +508,7 @@
             <!-- It's a computer program. It doesn't "care" about options -->
           </para>
         </listitem>
-
+
         <listitem>
           <para>Unlike with “raw” features, you don't need to use
           specific command-line flags in your Jamfile, and it will be
@@ -517,7 +517,7 @@
         </listitem>
       </itemizedlist>
     </para>
-
+
       <bridgehead>Steps for adding a feauture</bridgehead>
       <!-- This section is redundant with the previous one -->
       <para>Adding a feature requires three steps:
@@ -529,27 +529,28 @@
               attributes</link>:
 
               <itemizedlist>
- <listitem><para>if a feature has several values<!-- what do you mean by that?? --> and
- significantly affects the build, make it “propagated,” so that the
- whole project is built with the same value by
- default</para></listitem>
-
- <listitem><para>if a feature does not have a fixed
- list of values, it must be “free.” For example, the
- <code>include</code> feature is a free
- feature.</para></listitem>
-
- <listitem><para>if a feature is used to refer to a
- path relative to the Jamfile, it must be a “path”
- feature. <code>include</code> is also a path
- feature.</para></listitem>
-
+ <listitem><para>if you want a feature value set for one target
+ to automaticaly propagate to its dependant targets then make it
+ “propagated”. <!-- Examples needed. --></para></listitem>
+
+ <listitem><para>if a feature does not have a fixed list of
+ values, it must be “free.” For example, the <code>include
+ </code> feature is a free feature.</para></listitem>
+
+ <listitem><para>if a feature is used to refer to a path relative
+ to the Jamfile, it must be a “path” feature. Such features will
+ also get their values automatically converted to Boost Build's
+ internal path representation. For example, <code>include</code>
+ is a path feature.</para></listitem>
+
                 <listitem><para>if feature is used to refer to some target, it
- must be a “dependency” feature. <!-- for example? --></para></listitem>
+ must be a “dependency” feature. <!-- for example? --></para>
+
+ <!-- Any other feature attributes? -->
+ </listitem>
               </itemizedlist>
               </para>
           </listitem>
-
 
           <listitem><para>Representing the feature value in a
           target-specific variable. Build actions are command
@@ -568,13 +569,13 @@
 
       <para>Here's another example.
         Let's see how we can make a feature that refers to a target. For example,
- when linking dynamic libraries on windows, one sometimes needs to specify
- "DEF file", telling what functions should be exported. It would be nice to
- use this file like this:
+ when linking dynamic libraries on Windows, one sometimes needs to
+ specify a "DEF file", telling what functions should be exported. It
+ would be nice to use this file like this:
 <programlisting>
         lib a : a.cpp : &lt;def-file&gt;a.def ;
 </programlisting>
-<!-- Why would that be nice? It seems to me that having a.def in the sources is the obvious and much nicer thing to do:
+<!-- Why would that be nice? It seems to me that having a.def in the sources is the obvious and much nicer thing to do:
 
         lib a : a.cpp a.def ;
 -->
@@ -603,9 +604,9 @@
 </programlisting>
             <!-- And that line does... what? -->
             </para></listitem>
-
+
         <listitem><para>Since the DEF_FILE variable is not used by the
-msvc.link action,
+msvc.link action,
 <!-- It's not? You just told us that MSVC "cares" about DEF files. I
      presume that means that it uses them in some appropriate way? -->
 we need to modify it to be:
@@ -617,8 +618,8 @@
 }
 </programlisting>
             </para>
-
-
+
+
           <para> Note the <code>bind DEF_FILE</code> part. It tells
           bjam to translate the internal target name in
           <varname>DEF_FILE</varname> to a corresponding filename in
@@ -640,11 +641,11 @@
     DEPENDS $(&lt;) : [ on $(&lt;) return $(DEF_FILE) ] ;
 }
 </programlisting>
-<!-- You *must* explain the part in [...] above. It's completely opaque to the casual reader -->
+<!-- You *must* explain the part in [...] above. It's completely opaque to the casual reader -->
 
             This is needed to accomodate some bug in bjam, which hopefully
             will be fixed one day.
- <!-- This is *NOT* a bug!! Anyway, BBv2 shouild handle this automatically. Why doesn't it? -->
+ <!-- This is *NOT* a bug!! Anyway, BBv2 shouild handle this automatically. Why doesn't it? -->
 </para></listitem>
 
       </orderedlist>
@@ -652,7 +653,7 @@
       <bridgehead>Variants and composite features.</bridgehead>
 
       <para>Sometimes you want to create a shortcut for some set of
- features. For example, <code>release</code> is a value of
+ features. For example, <code>release</code> is a value of
         <code>&lt;variant&gt;</code> and is a shortcut for a set of features.
       </para>
 
@@ -671,7 +672,7 @@
       </para>
 
       <para>You are not restricted to using the <code>variant</code> feature
- only.
+ only.
       <!-- What do you mean by that? How is defining a new feature related to what came before? -->
       Here's example that defines a brand new feature:
 <programlisting>
@@ -683,11 +684,11 @@
      above is at best confusing and unexplained -->
         This will allow you to specify the value of feature
         <code>parallelism</code>, which will expand to link to the necessary
- library.
+ library.
       </para>
-
+
   </section>
-
+
   <section id="bbv2.extending.rules">
     <title>Main target rules</title>
     <para>
@@ -703,7 +704,7 @@
       rule is already defined for you! When you define a new type, Boost.Build
       automatically defines a corresponding rule. The name of the rule is
       obtained from the name of the type, by downcasing all letters and
- replacing underscores with dashes.
+ replacing underscores with dashes.
       <!-- This strikes me as needless complexity, and confusing. Why
            do we have the uppercase-underscore convention for target
            types? If we just dropped that, the rule names could be
@@ -721,7 +722,7 @@
       and import that module, you'll be able to use the rule "obfuscated-cpp"
       in Jamfiles, which will convert source to the OBFUSCATED_CPP type.
     </para>
-
+
     <para>
       The second way is to write a wrapper rule that calls any of the existing
       rules. For example, suppose you have only one library per directory and
@@ -814,7 +815,7 @@
         <listitem><para>Check for multiple initialization. A user can try to
             initialize the module several times. You need to check for this
             and decide what to do. Typically, unless you support several
- versions of a tool, duplicate initialization is a user error.
+ versions of a tool, duplicate initialization is a user error.
             <!-- Why should that be typical? -->
             If the
             tool's version can be specified during initialization, make sure the
@@ -852,7 +853,7 @@
     </para>
 
 
-
+
 
   </section>
 
@@ -860,7 +861,7 @@
 
 <!--
      Local Variables:
- sgml-indent-data: t
+ sgml-indent-data: t
      sgml-parent-document: ("userman.xml" "chapter")
      sgml-set-face: t
      End:

Modified: branches/proto/v4/tools/build/v2/kernel/bootstrap.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/kernel/bootstrap.jam (original)
+++ branches/proto/v4/tools/build/v2/kernel/bootstrap.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -94,14 +94,8 @@
       util # low-level substrate: string/number handling, etc.
       build # essential elements of the build system architecture
       tools # toolsets for handling specific build jobs and targets.
-
- new # until we get everything sorted out, there is
- # still some code here
-
       contrib # user contributed (unreviewed) modules
-
       . # build-system.jam lives here
-
       ;
     local whereami = [ NORMALIZE_PATH $(.bootstrap-file:DT) ] ;
     BOOST_BUILD_PATH += $(whereami:D)/$(subdirs) ;

Modified: branches/proto/v4/tools/build/v2/kernel/modules.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/kernel/modules.jam (original)
+++ branches/proto/v4/tools/build/v2/kernel/modules.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -95,7 +95,7 @@
                    # $(BOOST_BUILD_PATH).
 )
 {
- # Avoid loading modules twice
+ # Avoid loading modules twice.
     if ! ( $(module-name) in $(.loaded) )
     {
         filename ?= $(module-name).jam ;

Modified: branches/proto/v4/tools/build/v2/test/build_file.py
==============================================================================
--- branches/proto/v4/tools/build/v2/test/build_file.py (original)
+++ branches/proto/v4/tools/build/v2/test/build_file.py 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -1,46 +1,170 @@
 #!/usr/bin/python
 
 # Copyright (C) Vladimir Prus 2006.
+# Copyright (C) Jurko Gospodnetic 2008.
 # Distributed under the Boost Software License, Version 1.0. (See
 # accompanying file LICENSE_1_0.txt or copy at
 # http://www.boost.org/LICENSE_1_0.txt)
 
-# Tests that we can build a file (not target), by it's name
-from BoostBuild import Tester, List
-from string import find
+# Tests that we explicitly request a file (not target) to be built by specifying
+# its name on the command line.
 
-# Create a temporary working directory
-t = Tester()
+import BoostBuild
 
-# Create the needed files
-t.write("Jamroot", """
+
+################################################################################
+#
+# test_building_file_from_specific_project()
+# ------------------------------------------
+#
+################################################################################
+
+def test_building_file_from_specific_project():
+ t = BoostBuild.Tester()
+
+ t.write("Jamroot.jam", """
 exe hello : hello.cpp ;
+exe hello2 : hello.cpp ;
 build-project sub ;
 """)
-t.write("hello.cpp", """
-int main()
-{
- return 0;
-}
-""")
-t.write("sub/Jamfile", """
+ t.write("hello.cpp", "int main() { return 0; }")
+ t.write("sub/Jamfile.jam", """
 exe hello : hello.cpp ;
+exe hello2 : hello.cpp ;
 exe sub : hello.cpp ;
 """)
-t.write("sub/hello.cpp", """
-int main()
-{
- return 0;
-}
-""")
+ t.write("sub/hello.cpp", "int main() { return 0; }")
 
+ t.run_build_system("sub " + t.adjust_suffix("hello.obj"))
+ t.expect_output_line("*depends on itself*", False)
+ t.expect_addition("sub/bin/$toolset/debug/hello.obj")
+ t.expect_nothing_more()
+
+ t.cleanup()
+
+
+################################################################################
+#
+# test_building_file_from_specific_target()
+# -----------------------------------------
+#
+################################################################################
+
+def test_building_file_from_specific_target():
+ t = BoostBuild.Tester()
+
+ t.write("Jamroot.jam", """
+exe hello1 : hello1.cpp ;
+exe hello2 : hello2.cpp ;
+exe hello3 : hello3.cpp ;
+""")
+ t.write("hello1.cpp", "int main() { return 0; }")
+ t.write("hello2.cpp", "int main() { return 0; }")
+ t.write("hello3.cpp", "int main() { return 0; }")
+
+ t.run_build_system("hello1 " + t.adjust_suffix("hello1.obj"))
+ t.expect_addition("bin/$toolset/debug/hello1.obj")
+ t.expect_nothing_more()
+
+ t.cleanup()
+
+
+################################################################################
+#
+# test_building_missing_file_from_specific_target()
+# -------------------------------------------------
+#
+################################################################################
+
+def test_building_missing_file_from_specific_target():
+ t = BoostBuild.Tester()
+
+ t.write("Jamroot.jam", """
+exe hello1 : hello1.cpp ;
+exe hello2 : hello2.cpp ;
+exe hello3 : hello3.cpp ;
+""")
+ t.write("hello1.cpp", "int main() { return 0; }")
+ t.write("hello2.cpp", "int main() { return 0; }")
+ t.write("hello3.cpp", "int main() { return 0; }")
+
+ t.run_build_system("hello1 " + t.adjust_suffix("hello2.obj"), status=1)
+ t.expect_output_line("don't know how to make*hello2.obj")
+ t.expect_nothing_more()
+
+ t.cleanup()
+
+
+################################################################################
+#
+# test_building_multiple_files_with_different_names()
+# ---------------------------------------------------
+#
+################################################################################
+
+def test_building_multiple_files_with_different_names():
+ t = BoostBuild.Tester()
+
+ t.write("Jamroot.jam", """
+exe hello1 : hello1.cpp ;
+exe hello2 : hello2.cpp ;
+exe hello3 : hello3.cpp ;
+""")
+ t.write("hello1.cpp", "int main() { return 0; }")
+ t.write("hello2.cpp", "int main() { return 0; }")
+ t.write("hello3.cpp", "int main() { return 0; }")
+
+ t.run_build_system(
+ t.adjust_suffix("hello1.obj") + " " +
+ t.adjust_suffix("hello2.obj"))
+ t.expect_addition("bin/$toolset/debug/hello1.obj")
+ t.expect_addition("bin/$toolset/debug/hello2.obj")
+ t.expect_nothing_more()
+
+ t.cleanup()
+
+
+################################################################################
+#
+# test_building_multiple_files_with_the_same_name()
+# -------------------------------------------------
+#
+################################################################################
 
-t.run_build_system(t.adjust_suffix("hello.obj"))
+def test_building_multiple_files_with_the_same_name():
+ t = BoostBuild.Tester()
 
-t.fail_test(find(t.stdout(), "depends on itself") != -1)
-t.expect_addition("bin/$toolset/debug/hello.obj")
-t.expect_addition("sub/bin/$toolset/debug/hello.obj")
-t.expect_nothing_more()
+ t.write("Jamroot.jam", """
+exe hello : hello.cpp ;
+exe hello2 : hello.cpp ;
+build-project sub ;
+""")
+ t.write("hello.cpp", "int main() { return 0; }")
+ t.write("sub/Jamfile.jam", """
+exe hello : hello.cpp ;
+exe hello2 : hello.cpp ;
+exe sub : hello.cpp ;
+""")
+ t.write("sub/hello.cpp", "int main() { return 0; }")
 
-# Remove temporary directories
-t.cleanup()
+ t.run_build_system(t.adjust_suffix("hello.obj"))
+ t.expect_output_line("*depends on itself*", False)
+ t.expect_addition("bin/$toolset/debug/hello.obj")
+ t.expect_addition("sub/bin/$toolset/debug/hello.obj")
+ t.expect_nothing_more()
+
+ t.cleanup()
+
+
+################################################################################
+#
+# main()
+# ------
+#
+################################################################################
+
+test_building_file_from_specific_project()
+test_building_file_from_specific_target()
+test_building_missing_file_from_specific_target()
+test_building_multiple_files_with_different_names()
+test_building_multiple_files_with_the_same_name()

Modified: branches/proto/v4/tools/build/v2/test/test_all.py
==============================================================================
--- branches/proto/v4/tools/build/v2/test/test_all.py (original)
+++ branches/proto/v4/tools/build/v2/test/test_all.py 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -167,6 +167,7 @@
           "example_make",
           "remove_requirement",
           "free_features_request",
+ "file_name_handling",
           "sort_rule"
           ]
 

Modified: branches/proto/v4/tools/build/v2/tools/common.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/tools/common.jam (original)
+++ branches/proto/v4/tools/build/v2/tools/common.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -861,7 +861,7 @@
     local nl = "
 " ;
 
- local save-os = [ modules.peek os : name ] ;
+ local save-os = [ modules.peek os : .name ] ;
 
     modules.poke os : .name : LINUX ;
 

Modified: branches/proto/v4/tools/build/v2/tools/darwin.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/tools/darwin.jam (original)
+++ branches/proto/v4/tools/build/v2/tools/darwin.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -50,7 +50,7 @@
     common.handle-options darwin : $(condition) : $(command) : $(options) ;
     
     # GCC 4.0 and higher in Darwin does not have -fcoalesce-templates.
- local gccversion = [ SHELL "$(command) -dumpversion" ] ;
+ local gccversion = [ SHELL "$(command:J= ) -dumpversion" ] ;
     if $(gccversion) < "4.0.0"
     {
         flags darwin.compile.c++ OPTIONS $(condition) : -fcoalesce-templates ;

Modified: branches/proto/v4/tools/build/v2/tools/qt3.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/tools/qt3.jam (original)
+++ branches/proto/v4/tools/build/v2/tools/qt3.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -2,10 +2,10 @@
 # Distributed under the Boost Software License, Version 1.0.
 # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
-# Support for the Qt GUI library version 3
-# (http://www.trolltech.com/products/qt3/index.html).
-# For new developments, it's recommented to use Qt4 via the qt4
-# Boost.Build module.
+# Support for the Qt GUI library version 3
+# (http://www.trolltech.com/products/qt3/index.html).
+# For new developments, it is recommended to use Qt4 via the qt4 Boost.Build
+# module.
 
 import modules ;
 import feature ;
@@ -16,15 +16,14 @@
 import project ;
 import toolset : flags ;
 
-# Convert this module into a project, so that we can declare
-# targets here.
-
+# Convert this module into a project, so that we can declare targets here.
 project.initialize $(__name__) ;
 project qt3 ;
 
-# Initialized the QT support module. The 'prefix' parameter
-# tells where QT is installed. When not given, environmental
-# variable QTDIR should be set.
+
+# Initialized the QT support module. The 'prefix' parameter tells where QT is
+# installed. When not given, environmental variable QTDIR should be set.
+#
 rule init ( prefix ? )
 {
     if ! $(prefix)
@@ -51,23 +50,21 @@
         .prefix = $(prefix) ;
         
         generators.register-standard qt3.moc : H : CPP(moc_%) : <allow>qt3 ;
- # Note: the OBJ target type here is fake, take a look
- # at qt4.jam/uic-h-generator for explanations that
- # apply in this case as well.
+ # Note: the OBJ target type here is fake, take a look at
+ # qt4.jam/uic-h-generator for explanations that apply in this case as
+ # well.
         generators.register [ new moc-h-generator-qt3
             qt3.moc.cpp : MOCCABLE_CPP : OBJ : <allow>qt3 ] ;
         
- # The UI type is defined in types/qt.jam,
- # and UIC_H is only used in qt.jam, but not in qt4.jam, so
- # define it here.
+ # The UI type is defined in types/qt.jam, and UIC_H is only used in
+ # qt.jam, but not in qt4.jam, so define it here.
         type.register UIC_H : : H ;
         
         generators.register-standard qt3.uic-h : UI : UIC_H : <allow>qt3 ;
         
- # The following generator is used to convert UI files to CPP
- # It creates UIC_H from UI, and constructs CPP from UI/UIC_H
- # In addition, it also returns UIC_H target, so that it can bee
- # mocced.
+ # The following generator is used to convert UI files to CPP. It creates
+ # UIC_H from UI, and constructs CPP from UI/UIC_H. In addition, it also
+ # returns UIC_H target, so that it can be mocced.
         class qt::uic-cpp-generator : generator
         {
             rule __init__ ( )
@@ -146,11 +143,11 @@
             
             local r = [ virtual-target.register $(target) ] ;
                                   
- # Since this generator will return H target, the linking generator
- # won't use it at all, and won't set any dependency on it.
- # However, we need to target to be seen by bjam, so that dependency
- # from sources to this generated header is detected -- if jam does
- # not know about this target, it won't do anything.
+ # Since this generator will return a H target, the linking generator
+ # won't use it at all, and won't set any dependency on it. However,
+ # we need the target to be seen by bjam, so that the dependency from
+ # sources to this generated header is detected -- if Jam does not
+ # know about this target, it won't do anything.
             DEPENDS all : [ $(r).actualize ] ;
             
             return $(r) ;
@@ -159,25 +156,26 @@
 }
 
 
-# Query the installation directory
-# This is needed in at least two scenarios
-# First, when re-using sources from the Qt-Tree.
-# Second, to "install" custom Qt plugins to the Qt-Tree.
+# Query the installation directory. This is needed in at least two scenarios.
+# First, when re-using sources from the Qt-Tree. Second, to "install" custom Qt
+# plugins to the Qt-Tree.
+#
 rule directory
 {
     return $(.prefix) ;
 }
 
-# -f forces moc to include the processed source file.
-# Without it, it would think that .qpp is not a header and would not
-# include it from the generated file.
+# -f forces moc to include the processed source file. Without it, it would think
+# that .qpp is not a header and would not include it from the generated file.
+#
 actions moc
 {
     $(.prefix)/bin/moc -f $(>) -o $(<)
 }
 
-# When moccing .cpp files, we don't need -f, otherwise generated
-# code will include .cpp and we'll get duplicated symbols.
+# When moccing .cpp files, we don't need -f, otherwise generated code will
+# include .cpp and we'll get duplicated symbols.
+#
 actions moc.cpp
 {
     $(.prefix)/bin/moc $(>) -o $(<)
@@ -186,27 +184,26 @@
 
 space = " " ;
 
-# Sometimes it's required to make 'plugins' available during
-# uic invocation. To help with this we add paths to all dependency
-# libraries to uic commane line. The intention is that it's possible
-# to write
+# Sometimes it's required to make 'plugins' available during uic invocation. To
+# help with this we add paths to all dependency libraries to uic commane line.
+# The intention is that it's possible to write
 #
 # exe a : ... a.ui ... : <uses>some_plugin ;
 #
-# and have everything work. We'd add quite a bunch of unrelated paths
-# but it won't hurt.
+# and have everything work. We'd add quite a bunch of unrelated paths but it
+# won't hurt.
+#
 flags qt3.uic-h LIBRARY_PATH <xdll-path> ;
 actions uic-h
 {
     $(.prefix)/bin/uic $(>) -o $(<) -L$(space)$(LIBRARY_PATH)
 }
 
+
 flags qt3.uic-cpp LIBRARY_PATH <xdll-path> ;
-# The second target is uic-generated header name. It's placed in
-# build dir, but we want to include it using only basename.
+# The second target is uic-generated header name. It's placed in build dir, but
+# we want to include it using only basename.
 actions uic-cpp
 {
     $(.prefix)/bin/uic $(>[1]) -i $(>[2]:D=) -o $(<) -L$(space)$(LIBRARY_PATH)
 }
-
-

Modified: branches/proto/v4/tools/build/v2/tools/qt4.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/tools/qt4.jam (original)
+++ branches/proto/v4/tools/build/v2/tools/qt4.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -1,4 +1,4 @@
-# Copyright 2002-2006 Vladimir Prus
+# Copyright 2002-2006 Vladimir Prus
 # Copyright 2005 Alo Sarv
 # Copyright 2005-2006 Juergen Hunold
 #
@@ -20,12 +20,12 @@
 #
 # Example:
 #
-# exe myapp : myapp.cpp myapp.h myapp.ui myapp.qrc
+# exe myapp : myapp.cpp myapp.h myapp.ui myapp.qrc
 # /qt4//QtGui /qt4//QtNetwork ;
 #
 # It's also possible to run moc on cpp sources:
 #
-# import cast ;
+# import cast ;
 #
 # exe myapp : myapp.cpp [ cast _ moccable-cpp : myapp.cpp ] /qt4//QtGui ;
 #
@@ -56,11 +56,11 @@
 #
 # The Qt3Support library can be activated by adding
 # "<qt3support>on" to requirements
-#
+#
 # Use "<qt3support>on:<define>QT3_SUPPORT_WARNINGS"
 # to get warnings about deprecated Qt3 support funtions and classes.
-# Files ported by the "qt3to4" conversion tool contain _tons_ of
-# warnings, so this define is not set as default.
+# Files ported by the "qt3to4" conversion tool contain _tons_ of
+# warnings, so this define is not set as default.
 #
 # Todo: Detect Qt3Support from Qt's configure data.
 # Or add more auto-configuration (like python).
@@ -73,18 +73,61 @@
 .project = [ project.current ] ;
 
 
-# Initialized the QT support module. The 'prefix' parameter
-# tells where QT is installed.
-rule init ( prefix )
+# Initialized the QT support module. The 'prefix' parameter tells where QT is
+# installed.
+#
+rule init ( prefix : full_bin ? : full_inc ? : full_lib ? )
 {
     project.push-current $(.project) ;
-
+
+ # pre-build paths to detect reinitializations changes
+ local inc_prefix lib_prefix bin_prefix ;
+ if $(full_inc)
+ {
+ inc_prefix = $(full_inc) ;
+ }
+ else
+ {
+ inc_prefix = $(prefix)/include ;
+ }
+ if $(full_lib)
+ {
+ lib_prefix = $(full_lib) ;
+ }
+ else
+ {
+ lib_prefix = $(prefix)/lib ;
+ }
+ if $(full_bin)
+ {
+ bin_prefix = $(full_bin) ;
+ }
+ else
+ {
+ bin_prefix = $(prefix)/bin ;
+ }
+
     if $(.initialized)
     {
         if $(prefix) != $(.prefix)
         {
             errors.error
- "Attempt the reinitialize QT with different installation prefix" ;
+ "Attempt the reinitialize QT with different installation prefix" ;
+ }
+ if $(inc_prefix) != $(.incprefix)
+ {
+ errors.error
+ "Attempt the reinitialize QT with different include path" ;
+ }
+ if $(lib_prefix) != $(.libprefix)
+ {
+ errors.error
+ "Attempt the reinitialize QT with different library path" ;
+ }
+ if $(bin_prefix) != $(.binprefix)
+ {
+ errors.error
+ "Attempt the reinitialize QT with different bin path" ;
         }
     }
     else
@@ -92,32 +135,30 @@
         .initialized = true ;
         .prefix = $(prefix) ;
 
- #~ Setup prefixes for include, binaries and libs.
- #~ TODO: Implement overrides in "init" parameter list.
+ # Setup prefixes for include, binaries and libs.
         .incprefix = $(.prefix)/include ;
         .libprefix = $(.prefix)/lib ;
         .binprefix = $(.prefix)/bin ;
 
         # Generates cpp files from header files using "moc" tool
         generators.register-standard qt4.moc : H : CPP(moc_%) : <allow>qt4 ;
-
- # The OBJ result type is a fake, 'H' will be really produces.
- # See comments on the generator calss, defined below
- # the 'init' function.
- generators.register [ new uic-h-generator qt4.uic-h : UI : OBJ
- : <allow>qt4 ] ;
-
+
+ # The OBJ result type is a fake, 'H' will be really produced. See
+ # comments on the generator class, defined below the 'init' function.
+ generators.register [ new uic-h-generator qt4.uic-h : UI : OBJ :
+ <allow>qt4 ] ;
+
         # The OBJ result type is a fake here too.
- generators.register [ new moc-h-generator
+ generators.register [ new moc-h-generator
             qt4.moc.inc : MOCCABLE_CPP : OBJ : <allow>qt4 ] ;
 
- generators.register [ new moc-inc-generator
+ generators.register [ new moc-inc-generator
             qt4.moc.inc : MOCCABLE_H : OBJ : <allow>qt4 ] ;
 
- # Generates .cpp file from qrc file
+ # Generates .cpp files from .qrc files.
         generators.register-standard qt4.rcc : QRC : CPP(qrc_%) ;
-
- # dependency scanner for wrapped files
+
+ # dependency scanner for wrapped files.
         type.set-scanner QRC : qrc-scanner ;
 
         # Test for a buildable Qt.
@@ -125,71 +166,70 @@
         {
             # Import all Qt Modules
             local all-libraries = QtCore QtGui QtNetwork QtXml QtSql QtSvg QtOpenGL Qt3Support QtTest QtAssistantClient QtDesigner QtUiTools QtDBus QtScript ;
- for local l in $(all-libraries)
+ for local l in $(all-libraries)
             {
- alias $(l)
- : $(.prefix)//$(l)
- :
- :
- : <allow>qt4
- ;
+ alias $(l)
+ : $(.prefix)//$(l)
+ :
+ :
+ : <allow>qt4 ;
                 explicit $(l) ;
             }
         }
         else
- # Use pre-built Qt
+ # Use pre-built Qt.
         {
- local usage-requirements =
- <include>$(.incprefix)
- <library-path>$(.libprefix)
- <dll-path>$(.libprefix)
- <threading>multi
- <allow>qt4
- ;
-
+ local usage-requirements =
+ <include>$(.incprefix)
+ <library-path>$(.libprefix)
+ <dll-path>$(.libprefix)
+ <threading>multi
+ <allow>qt4 ;
+
             local suffix ;
             if [ os.name ] = NT
             {
- # On NT, the libs have "4" suffix, and "d" suffix in debug builds
- # Also, on NT we must link against qtmain library (for WinMain)
+ # On NT, the libs have "4" suffix, and "d" suffix in debug
+ # builds. Also, on NT we must link against the qtmain library
+ # (for WinMain).
                 suffix_version = "4" ;
                 suffix_debug = "d" ;
- lib qtmain
+ lib qtmain
                     : # sources
                     : # requirements
                       <name>qtmain$(suffix_debug)
                       <variant>debug
                     ;
 
- lib qtmain
- : # sources
+ lib qtmain
+ : # sources
                     : # requirements
- <name>qtmain
+ <name>qtmain
                     ;
                 main = qtmain ;
- }
+ }
             else if [ os.name ] = MACOSX
             {
                 # On MacOS X, both debug and release libraries are available.
                 suffix_version = "" ;
                 suffix_debug = "_debug" ;
             }
- else
+ else
             {
- # Since Qt-4.2, debug versions on unix have to be built separately
- # and therefore have no suffix.
+ # Since Qt-4.2, debug versions on unix have to be built
+ # separately and therefore have no suffix.
                 suffix_version = "" ;
                 suffix_debug = "" ;
             }
-
+
             lib QtCore : $(main)
                 : # requirements
- <name>QtCore$(suffix_version)
+ <name>QtCore$(suffix_version)
                 : # default-build
                 : # usage-requirements
                   <define>QT_CORE_LIB
                   <define>QT_NO_DEBUG
- <include>$(.incprefix)/QtCore
+ <include>$(.incprefix)/QtCore
                   $(usage-requirements)
                 ;
             lib QtCore : $(main)
@@ -199,19 +239,19 @@
                 : # default-build
                 : # usage-requirements
                   <define>QT_CORE_LIB
- <include>$(.incprefix)/QtCore
- $(usage-requirements)
+ <include>$(.incprefix)/QtCore
+ $(usage-requirements)
                 ;
-
+
             lib QtGui : QtCore
                 : # requirements
- <name>QtGui$(suffix_version)
+ <name>QtGui$(suffix_version)
                 : # default-build
                 : # usage-requirements
                   <define>QT_GUI_LIB
- <include>$(.incprefix)/QtGui
+ <include>$(.incprefix)/QtGui
                 ;
-
+
             lib QtGui : QtCore
                 : # requirements
                   <name>QtGui$(suffix_debug)$(suffix_version)
@@ -219,16 +259,16 @@
                 : # default-build
                 : # usage-requirements
                   <define>QT_GUI_LIB
- <include>$(.incprefix)/QtGui
+ <include>$(.incprefix)/QtGui
                 ;
-
+
             lib QtNetwork : QtCore
                 : # requirements
- <name>QtNetwork$(suffix_version)
+ <name>QtNetwork$(suffix_version)
                 : # default-build
                 : # usage-requirements
                   <define>QT_NETWORK_LIB
- <include>$(.incprefix)/QtNetwork
+ <include>$(.incprefix)/QtNetwork
                 ;
             lib QtNetwork : QtCore
                 : # requirements
@@ -237,16 +277,16 @@
                 : # default-build
                 : # usage-requirements
                   <define>QT_NETWORK_LIB
- <include>$(.incprefix)/QtNetwork
+ <include>$(.incprefix)/QtNetwork
                 ;
-
+
             lib QtSql : QtCore
                 : # requirements
- <name>QtSql$(suffix_version)
+ <name>QtSql$(suffix_version)
                 : # default-build
                 : # usage-requirements
                   <define>QT_SQL_LIB
- <include>$(.incprefix)/QtSql
+ <include>$(.incprefix)/QtSql
                 ;
             lib QtSql : QtCore
                 : # requirements
@@ -255,16 +295,16 @@
                 : # default-build
                 : # usage-requirements
                   <define>QT_SQL_LIB
- <include>$(.incprefix)/QtSql
+ <include>$(.incprefix)/QtSql
                 ;
-
+
             lib QtXml : QtCore
                 : # requirements
- <name>QtXml$(suffix_version)
+ <name>QtXml$(suffix_version)
                 : # default-build
                 : # usage-requirements
                   <define>QT_XML_LIB
- <include>$(.incprefix)/QtXml
+ <include>$(.incprefix)/QtXml
                 ;
             lib QtXml : QtCore
                 : # requirements
@@ -273,9 +313,9 @@
                 : # default-build
                 : # usage-requirements
                   <define>QT_XML_LIB
- <include>$(.incprefix)/QtXml
+ <include>$(.incprefix)/QtXml
                 ;
-
+
             lib Qt3Support : QtGui QtNetwork QtXml QtSql
                 : # requirements
                   <name>Qt3Support$(suffix_version)
@@ -284,9 +324,9 @@
                 : # usage-requirements
                   <define>QT_QT3SUPPORT_LIB
                   <define>QT3_SUPPORT
- <include>$(.incprefix)/Qt3Support
+ <include>$(.incprefix)/Qt3Support
                 ;
-
+
             lib Qt3Support : QtGui QtNetwork QtXml QtSql
                 : # requirements
                   <name>Qt3Support$(suffix_debug)$(suffix_version)
@@ -296,21 +336,22 @@
                 : # usage-requirements
                   <define>QT_QT3SUPPORT_LIB
                   <define>QT3_SUPPORT
- <include>$(.incprefix)/Qt3Support
+ <include>$(.incprefix)/Qt3Support
                 ;
 
- # Dummy target to enable "<qt3support>off" and "<library>/qt//Qt3Support" at the same time.
- # This enables quick switching from one to the other for test/porting purposes.
+ # Dummy target to enable "<qt3support>off" and
+ # "<library>/qt//Qt3Support" at the same time. This enables quick
+ # switching from one to the other for test/porting purposes.
             alias Qt3Support : : <qt3support>off ;
-
+
             # OpenGl Support
             lib QtOpenGL : QtGui
                 : # requirements
- <name>QtOpenGL$(suffix_version)
+ <name>QtOpenGL$(suffix_version)
                 : # default-build
                 : # usage-requirements
                   <define>QT_OPENGL_LIB
- <include>$(.incprefix)/QtOpenGL
+ <include>$(.incprefix)/QtOpenGL
                 ;
             lib QtOpenGL : QtGui
                 : # requirements
@@ -319,109 +360,109 @@
                 : # default-build
                 : # usage-requirements
                   <define>QT_OPENGL_LIB
- <include>$(.incprefix)/QtOpenGL
+ <include>$(.incprefix)/QtOpenGL
                 ;
-
+
             # SVG-Support (Qt 4.1)
             lib QtSvg : QtXml QtOpenGL
                 : # requirements
- <name>QtSvg$(suffix_version)
+ <name>QtSvg$(suffix_version)
                 : # default-build
                 : # usage-requirements
                   <define>QT_SVG_LIB
- <include>$(.incprefix)/QtSvg
+ <include>$(.incprefix)/QtSvg
                 ;
             lib QtSvg : QtXml QtOpenGL
                 : # requirements
                   <name>QtSvg$(suffix_debug)$(suffix_version)
                   <variant>debug
                 : # default-build
- : # usage-requirements
+ : # usage-requirements
                   <define>QT_SVG_LIB
- <include>$(.incprefix)/QtSvg
+ <include>$(.incprefix)/QtSvg
                 ;
-
+
             # Test-Support (Qt 4.1)
             lib QtTest : QtCore
                 : # requirements
- <name>QtTest$(suffix_version)
+ <name>QtTest$(suffix_version)
                 : # default-build
                 : # usage-requirements
- <include>$(.incprefix)/QtTest
+ <include>$(.incprefix)/QtTest
                 ;
             lib QtTest : QtCore
                 : # requirements
                   <name>QtTest$(suffix_debug)$(suffix_version)
- <variant>debug
+ <variant>debug
                 : # default-build
                 : # usage-requirements
- <include>$(.incprefix)/QtTest
+ <include>$(.incprefix)/QtTest
                 ;
-
+
             # AssistantClient Support
             lib QtAssistantClient : QtGui
                 : # requirements
- <name>QtAssistantClient$(suffix_version)
+ <name>QtAssistantClient$(suffix_version)
                 : # default-build
                 : # usage-requirements
                   <include>$(.incprefix)/QtAssistant
                 ;
             lib QtAssistantClient : QtGui
                 : # requirements
- <name>QtAssistantClient$(suffix_debug)$(suffix_version)
- <variant>debug
+ <name>QtAssistantClient$(suffix_debug)$(suffix_version)
+ <variant>debug
                 : # default-build
                 : # usage-requirements
- <include>$(.incprefix)/QtAssistant
+ <include>$(.incprefix)/QtAssistant
                 ;
-
+
             # Qt designer library
             lib QtDesigner : QtGui QtXml
                 : # requirements
- <name>QtDesigner$(suffix_version)
- : # default-build
+ <name>QtDesigner$(suffix_version)
+ : # default-build
                 : # usage-requirements
                   <include>$(.incprefix)/QtDesigner
                 ;
 
             lib QtDesigner : QtGui QtXml
                 : # requirements
- <name>QtDesigner$(suffix_debug)$(suffix_version)
- <variant>debug
- : # default-build
+ <name>QtDesigner$(suffix_debug)$(suffix_version)
+ <variant>debug
+ : # default-build
                 : # usage-requirements
                   <include>$(.incprefix)/QtDesigner
                 ;
 
             # Support for dynamic Widgets (Qt 4.1)
             lib QtUiTools : QtGui QtXml
- : # requirements
+ : # requirements
                   <name>QtUiTools
                 : # default-build
                 : # usage-requirements
- <include>$(.incprefix)/QtUiTools
+ <include>$(.incprefix)/QtUiTools
                 ;
             lib QtUiTools : QtGui QtXml
                 : # requirements
- <name>QtUiTools$(suffix_debug)
- <variant>debug
- : # default-build
+ <name>QtUiTools$(suffix_debug)
+ <variant>debug
+ : # default-build
                 : # usage-requirements
- <include>$(.incprefix)/QtUiTools
+ <include>$(.incprefix)/QtUiTools
                 ;
 
             # DBus-Support (Qt 4.2)
             lib QtDBus : QtXml
                 : # requirements
- <name>QtDBus$(suffix_version)
+ <name>QtDBus$(suffix_version)
                 : # default-build
                 : # usage-requirements
- <include>$(.incprefix)/QtDBus
+ <include>$(.incprefix)/QtDBus
                 ;
             lib QtDBus : QtXml
                 : # requirements
- <name>QtDBus$(suffix_debug)$(suffix_version)
- <variant>debug
+ <name>QtDBus$(suffix_debug)$(suffix_version)
+ <variant>debug
                 : # default-build
                 : # usage-requirements
                   <include>$(.incprefix)/QtDBus
@@ -430,22 +471,22 @@
             # Script-Engine (Qt 4.3)
             lib QtScript : QtGui QtXml
                 : # requirements
- <name>QtScript$(suffix_version)
+ <name>QtScript$(suffix_version)
                 : # default-build
                 : # usage-requirements
- <include>$(.incprefix)/QtScript
+ <include>$(.incprefix)/QtScript
                 ;
             lib QtScript : QtGui QtXml
                 : # requirements
- <name>QtScript$(suffix_debug)$(suffix_version)
- <variant>debug
+ <name>QtScript$(suffix_debug)$(suffix_version)
+ <variant>debug
                 : # default-build
                 : # usage-requirements
                   <include>$(.incprefix)/QtScript
                 ;
         }
     }
-
+
     project.pop-current ;
 }
 
@@ -456,17 +497,15 @@
 
 
 
-# This custom generator is needed because it QT4, UI files are translated
-# only in H files, and no C++ files are created. Further, the H files
-# need not be passed via MOC. The header is used only via inclusion.
-# If we define standard UI -> H generator, Boost.Build will run
-# MOC on H, and the compile resulting cpp. It will give a warning, since
-# output from moc will be empty.
-#
-# This generator is declared with UI -> OBJ signature, so it's
-# invoked when linking generator tries to convert sources to OBJ,
-# but it produces target of type H. This is non-standard, but allowed.
-# That header won't be mocced.
+# This custom generator is needed because in QT4, UI files are translated only
+# into H files, and no C++ files are created. Further, the H files need not be
+# passed via MOC. The header is used only via inclusion. If we define a standard
+# UI -> H generator, Boost.Build will run MOC on H, and then compile the
+# resulting cpp. It will give a warning, since output from moc will be empty.
+#
+# This generator is declared with a UI -> OBJ signature, so it gets invoked when
+# linking generator tries to convert sources to OBJ, but it produces target of
+# type H. This is non-standard, but allowed. That header won't be mocced.
 #
 class uic-h-generator : generator
 {
@@ -476,31 +515,29 @@
     }
 
     rule run ( project name ? : property-set : sources * )
- {
- if ! $(name)
+ {
+ if ! $(name)
         {
             name = [ $(sources[0]).name ] ;
             name = $(name:B) ;
         }
-
- local a = [ new action $(sources[1]) : qt4.uic-h :
- $(property-set) ] ;
-
+
+ local a = [ new action $(sources[1]) : qt4.uic-h : $(property-set) ] ;
+
         # The 'ui_' prefix is to match qmake's default behavior.
- local target = [
- new file-target ui_$(name) : H : $(project) : $(a) ] ;
-
+ local target = [ new file-target ui_$(name) : H : $(project) : $(a) ] ;
+
         local r = [ virtual-target.register $(target) ] ;
-
+
         # Since this generator will return a H target, the linking generator
         # won't use it at all, and won't set any dependency on it. However, we
         # need the target to be seen by bjam, so that dependency from sources to
         # this generated header is detected -- if jam does not know about this
         # target, it won't do anything.
         DEPENDS all : [ $(r).actualize ] ;
-
+
         return $(r) ;
- }
+ }
 }
 
 
@@ -512,29 +549,29 @@
     }
 
     rule run ( project name ? : property-set : sources * )
- {
+ {
         if ! $(sources[2]) && [ $(sources[1]).type ] = MOCCABLE_CPP
- {
+ {
             name = [ $(sources[0]).name ] ;
             name = $(name:B) ;
-
+
             local a = [ new action $(sources[1]) : qt4.moc.inc :
- $(property-set) ] ;
-
- local target = [
- new file-target $(name) : MOC : $(project) : $(a) ] ;
-
+ $(property-set) ] ;
+
+ local target = [ new file-target $(name) : MOC : $(project) : $(a)
+ ] ;
+
             local r = [ virtual-target.register $(target) ] ;
-
+
             # Since this generator will return a H target, the linking generator
             # won't use it at all, and won't set any dependency on it. However,
             # we need the target to be seen by bjam, so that dependency from
             # sources to this generated header is detected -- if jam does not
             # know about this target, it won't do anything.
             DEPENDS all : [ $(r).actualize ] ;
-
+
             return $(r) ;
- }
+ }
     }
 }
 
@@ -547,82 +584,85 @@
     }
 
     rule run ( project name ? : property-set : sources * )
- {
+ {
         if ! $(sources[2]) && [ $(sources[1]).type ] = MOCCABLE_H
- {
+ {
             name = [ $(sources[0]).name ] ;
             name = $(name:B) ;
-
+
             local a = [ new action $(sources[1]) : qt4.moc.inc :
- $(property-set) ] ;
-
- local target = [
- new file-target moc_$(name) : CPP : $(project) : $(a) ] ;
-
+ $(property-set) ] ;
+
+ local target = [ new file-target moc_$(name) : CPP : $(project) :
+ $(a) ] ;
+
             # Since this generator will return a H target, the linking generator
             # won't use it at all, and won't set any dependency on it. However,
             # we need the target to be seen by bjam, so that dependency from
             # sources to this generated header is detected -- if jam does not
             # know about this target, it won't do anything.
             DEPENDS all : [ $(target).actualize ] ;
-
+
             return [ virtual-target.register $(target) ] ;
- }
- }
+ }
+ }
 }
 
 
 # Query the installation directory. This is needed in at least two scenarios.
 # First, when re-using sources from the Qt-Tree. Second, to "install" custom Qt
 # plugins to the Qt-Tree.
+#
 rule directory
 {
     return $(.prefix) ;
 }
 
 
-# Get <include> and <defines> from current toolset
+# Get <include> and <defines> from current toolset.
 flags qt4.moc INCLUDES <include> ;
 flags qt4.moc DEFINES <define> ;
 
 
-# Processes headers to create Qt MetaObject information
-# Qt4-moc has its c++-parser, so pass INCLUDES and DEFINES.
+# Processes headers to create Qt MetaObject information. Qt4-moc has its
+# c++-parser, so pass INCLUDES and DEFINES.
+#
 actions moc
 {
     $(.binprefix)/moc -I$(INCLUDES) -D$(DEFINES) -f $(>) -o $(<)
 }
 
 
-# When moccing files for include only, we don't need -f,
-# otherwise the generated code will include the .cpp
-# and we'll get duplicated symbols.
+# When moccing files for include only, we don't need -f, otherwise the generated
+# code will include the .cpp and we'll get duplicated symbols.
+#
 actions moc.inc
 {
     $(.binprefix)/moc -I$(INCLUDES) -D$(DEFINES) $(>) -o $(<)
 }
 
 
-# Generates source files from resource files
+# Generates source files from resource files.
+#
 actions rcc
 {
     $(.binprefix)/rcc $(>) -name $(>:B) -o $(<)
 }
 
 
-# Generates user-interface source from .ui files
+# Generates user-interface source from .ui files.
+#
 actions uic-h
 {
     $(.binprefix)/uic $(>) -o $(<)
 }
 
 
-# Scanner for .qrc files.
-# Look for the CDATA section of the <file> tag.
-# Ignore the "alias" attribute.
-# See http://doc.trolltech.com/qt/resources.html
-# for detailed documentation of the Qt Resource System.
-class qrc-scanner : common-scanner
+# Scanner for .qrc files. Look for the CDATA section of the <file> tag. Ignore
+# the "alias" attribute. See http://doc.trolltech.com/qt/resources.html for
+# detailed documentation of the Qt Resource System.
+#
+class qrc-scanner : common-scanner
 {
     rule pattern ( )
     {
@@ -630,5 +670,6 @@
     }
 }
 
+
 # Wrapped files are "included".
 scanner.register qrc-scanner : include ;

Modified: branches/proto/v4/tools/build/v2/tools/stage.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/tools/stage.jam (original)
+++ branches/proto/v4/tools/build/v2/tools/stage.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -24,8 +24,8 @@
 feature.feature <install-source-root> : : free path ;
 feature.feature <so-version> : : free incidental ;
 
-# If 'on', version symlinks for shared libraries won't be created. Affects Unix
-# builds only.
+# If 'on', version symlinks for shared libraries will not be created. Affects
+# Unix builds only.
 feature.feature <install-no-version-symlinks> : on : optional incidental ;
 
 
@@ -152,7 +152,7 @@
                 $(property-set) ] ;
 
             # See if something special should be done when staging this type. It
- # is indicated by the presense of special "INSTALLED_" type.
+ # is indicated by the presence of a special "INSTALLED_" type.
             local t = [ $(i).type ] ;
             if $(t) && [ type.registered INSTALLED_$(t) ]
             {
@@ -169,8 +169,8 @@
             }
             else
             {
- staged-targets = [ stage.copy-file $(self.project) $(ename)
- : $(i) : $(new-properties) ] ;
+ staged-targets = [ stage.copy-file $(self.project) $(ename) :
+ $(i) : $(new-properties) ] ;
             }
 
             if ! $(staged-targets)
@@ -286,8 +286,8 @@
 #
 rule copy-file ( project name ? : source : properties )
 {
- local targets ;
     name ?= [ $(source).name ] ;
+ local relative ;
 
     local new-a = [ new non-scanning-action $(source) : common.copy :
         $(properties) ] ;
@@ -304,24 +304,16 @@
         path = [ path.root $(path) [ path.pwd ] ] ;
 
         relative = [ path.relative-to $(source-root) $(path) ] ;
- # Note: using $(name:D=$(relative)) might be faster here, but then we
- # need to explicitly check that relative is not ".", otherwise we might
- # get paths like
- #
- # <prefix>/boost/.
- #
- # try to create it, and mkdir will obviously fail.
- name = [ path.root $(name:D=) $(relative) ] ;
- targets = [ new file-target $(name) exact : [ $(source).type ] :
- $(project) : $(new-a) ] ;
- }
- else
- {
- targets = [ new file-target $(name:D=) exact : [ $(source).type ] :
- $(project) : $(new-a) ] ;
     }
 
- return $(targets) ;
+ # Note: Using $(name:D=$(relative)) might be faster here, but then we would
+ # need to explicitly check that relative is not ".", otherwise we might get
+ # paths like '<prefix>/boost/.', try to create it and mkdir would obviously
+ # fail.
+ name = [ path.join $(relative) $(name:D=) ] ;
+
+ return [ new file-target $(name) exact : [ $(source).type ] : $(project) :
+ $(new-a) ] ;
 }
 
 
@@ -364,7 +356,7 @@
         if [ $(property-set).get <os> ] in NT CYGWIN ||
             [ $(property-set).get <target-os> ] in windows cygwin
         {
- # Relinking is never needed on NT
+ # Relinking is never needed on NT.
             return [ stage.copy-file $(project)
               : $(source) : $(property-set) ] ;
         }
@@ -443,7 +435,7 @@
             # 'Z' are numbers, we need to create NNN.XXX and NNN.XXX.YYY
             # symbolic links.
             local m = [ MATCH (.*)\\.([0123456789]+)\\.([0123456789]+)\\.([0123456789]+)$
- : [ $(copied).name ] ] ;
+ : [ $(copied).name ] ] ;
             if $(m)
             {
                 # Symlink without version at all is used to make
@@ -492,7 +484,7 @@
     if <tag> in $(requirements:G)
     {
         errors.user-error
- "The <tag> property is not allowed for the 'install' rule" ;
+ "The <tag> property is not allowed for the 'install' rule" ;
     }
 
     targets.main-target-alternative

Modified: branches/proto/v4/tools/build/v2/tools/testing.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/tools/testing.jam (original)
+++ branches/proto/v4/tools/build/v2/tools/testing.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -47,6 +47,7 @@
 import common ;
 import sequence ;
 import errors ;
+import regex ;
 
 
 rule init ( )
@@ -83,6 +84,15 @@
 rule make-test ( target-type : sources + : requirements * : target-name ? )
 {
     target-name ?= $(sources[1]:D=:S=) ;
+
+ # Having periods (".") in the target name is problematic because the
+ # typed generator will strip the suffix and use the bare name for the
+ # file targets. Even though the location-prefix averts problems most
+ # times it doesn't prevent ambiguity issues when referring to the
+ # test targets. For example when using the XML log output. So we
+ # rename the target to remove the periods, and provide an alias
+ # for users.
+ local real-name = [ regex.replace $(target-name) "[.]" "~" ] ;
 
     local project = [ project.current ] ;
     # The <location-prefix> forces the build system for generate paths in the
@@ -91,8 +101,14 @@
     local t =
       [ targets.create-typed-target
           [ type.type-from-rule-name $(target-type) ] : $(project)
- : $(target-name) : $(sources)
- : $(requirements) <location-prefix>$(target-name).test ] ;
+ : $(real-name) : $(sources)
+ : $(requirements) <location-prefix>$(real-name).test ] ;
+
+ # The alias to the real target, per period replacement above.
+ if $(real-name) != $(target-name)
+ {
+ alias $(target-name) : $(t) ;
+ }
 
     # Remember the test (for --dump-tests). A good way would be to collect all
     # given a project. This has some technical problems: e.g. we can't call this

Modified: branches/proto/v4/tools/build/v2/util/assert.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/util/assert.jam (original)
+++ branches/proto/v4/tools/build/v2/util/assert.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -7,7 +7,9 @@
 import errors : error-skip-frames lol->list ;
 import modules ;
 
-# assert the equality of A and B
+
+# Assert the equality of A and B.
+#
 rule equal ( a * : b * )
 {
     if $(a) != $(b)
@@ -16,8 +18,10 @@
     }
 }
 
-# assert that EXPECTED is the result of calling RULE-NAME with the
-# given arguments
+
+# Assert that EXPECTED is the result of calling RULE-NAME with the given
+# arguments.
+#
 rule result ( expected * : rule-name args * : * )
 {
     local result ;
@@ -37,6 +41,7 @@
     }
 }
 
+
 rule .set.equal ( set1 * : set2 * )
 {
     if ( $(set1) in $(set2) ) && ( $(set2) in $(set1) )
@@ -45,8 +50,10 @@
     }
 }
 
-# assert that EXPECTED is equal to the result of calling RULE-NAME with the
-# given arguments
+
+# Assert that EXPECTED is equal to the result of calling RULE-NAME with the
+# given arguments.
+#
 rule result-equal ( expected * : rule-name args * : * )
 {
     local result ;
@@ -66,7 +73,9 @@
     }
 }
 
-# assert that the given variable is nonempty.
+
+# Assert that the given variable is nonempty.
+#
 rule nonempty-variable ( name )
 {
     local value = [ modules.peek [ CALLER_MODULE ] : $(name) ] ;
@@ -77,9 +86,10 @@
     }
 }
 
-# assert that the result of calling RULE-NAME on the given arguments
-# has a true logical value (is neither an empty list nor all empty
-# strings).
+
+# Assert that the result of calling RULE-NAME on the given arguments has a true
+# logical value (is neither an empty list nor all empty strings).
+#
 rule true ( rule-name args * : * )
 {
     local result ;
@@ -99,29 +109,31 @@
     }
 }
 
-# assert that the result of calling RULE-NAME on the given arguments
-# has a false logical value (is either an empty list or all empty
-# strings).
+
+# Assert that the result of calling RULE-NAME on the given arguments has a false
+# logical value (is either an empty list or all empty strings).
+#
 rule false ( rule-name args * : * )
 {
     local result ;
     module [ CALLER_MODULE ]
     {
- modules.poke assert : result
- : [ $(1) : $(2) : $(3) : $(4)
- : $(5) : $(6) : $(7) : $(8) : $(9) ] ;
+ modules.poke assert : result : [ $(1) : $(2) : $(3) : $(4) : $(5) : $(6)
+ : $(7) : $(8) : $(9) ] ;
     }
 
     if $(result)
     {
         error-skip-frames 3 assertion failure: expecting false result from
- "[" $(rule-name)
- [ lol->list $(args) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ]
- "]" : got [ lol->list $(result) ] instead ;
+ "[" $(rule-name) [ lol->list $(args) : $(2) : $(3) : $(4) : $(5) :
+ $(6) : $(7) : $(8) : $(9) ] "]" : got [ lol->list $(result) ]
+ instead ;
     }
 }
 
-# assert that 'element' is present in 'list'.
+
+# Assert that 'element' is present in 'list'.
+#
 rule "in" ( element : list * )
 {
     if ! $(element) in $(list)
@@ -131,7 +143,9 @@
     }
 }
 
-# assert that 'element' is not present in 'list'.
+
+# Assert that 'element' is not present in 'list'.
+#
 rule not-in ( element : list * )
 {
     if $(element) in $(list)

Modified: branches/proto/v4/tools/build/v2/util/numbers.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/util/numbers.jam (original)
+++ branches/proto/v4/tools/build/v2/util/numbers.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -1,7 +1,10 @@
-# Copyright 2001, 2002 Dave Abrahams
-# Copyright 2002, 2003 Vladimir Prus
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+# Copyright 2001, 2002 Dave Abrahams
+# Copyright 2002, 2003 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+import errors ;
+
 
 digits = 0 1 2 3 4 5 6 7 8 9 ;
 powers = 1 ;
@@ -10,9 +13,8 @@
 positive = $(digits[2-]) ;
 incr = $(positive[2-]) ;
 znatural = $(digits) ;
-zero-test = is zero ; # if $(zero-test[$(n)]) == "is" "zero", n == 0
+zero-test = is zero ; # if $(zero-test[$(n)]) == "is" "zero", n == 0
 
-import errors : * ;
 
 local rule extend ( )
 {
@@ -23,6 +25,19 @@
     znatural = $(digits)$(znatural) ;
 }
 
+
+rule trim-leading-zeroes ( value )
+{
+ local value2 = [ MATCH "^0(.*)$" : $(value) ] ;
+ while $(value2)
+ {
+ value = $(value2) ;
+ value2 = [ MATCH "^0(.*)$" : $(value) ] ;
+ }
+ return $(value:E="") ;
+}
+
+
 rule check ( numbers * )
 {
     for local n in $(numbers)
@@ -30,23 +45,24 @@
         switch $(n)
         {
             case *[^0-9]* :
- error $(n) "in" $(numbers) : is not a number ;
+ errors.error $(n) "in" $(numbers) : is not a number ;
         }
     }
 }
 
+
 rule increment ( number )
 {
     return [ CALC $(number) + 1 ] ;
 }
 
+
 rule decrement ( number )
 {
- # Previous rule did not allow decrementing zero.
- # Is that what we want?
     return [ CALC $(number) - 1 ] ;
 }
 
+
 rule range ( start finish ? : step ? )
 {
     if ! $(finish)
@@ -55,7 +71,7 @@
         start = 1 ;
     }
     step ?= 1 ;
-
+
     check $(start) $(finish) $(step) ;
 
     if $(finish) != 0
@@ -64,7 +80,7 @@
         {
             extend ;
         }
-
+
         if $(step) = 1
         {
             return $(positive[$(start)-$(finish)]) ;
@@ -84,26 +100,31 @@
     }
 }
 
+
 rule less ( n1 n2 )
 {
     check $(n1) $(n2) ;
- # avoid messy 0 case by appending 1
+ n1 = [ trim-leading-zeroes $(n1) ] ;
+ n2 = [ trim-leading-zeroes $(n2) ] ;
+
+ # Avoid messy 0 case by appending 1.
     local l1 = [ range 2 [ log10 $(n1)1 ] ] ;
     local l2 = [ range 2 [ log10 $(n2)1 ] ] ;
-
- # number of digits mismatch?
+
+ # Number of digits mismatch?
     if ( $(l1) < $(l2) ) || ( ( $(l1) = $(l2) ) && $(n1) < $(n2) )
     {
         return true ;
     }
 }
 
+
 rule log10 ( number )
 {
     switch $(number)
     {
- case *[^0-9]* : error $(number) is not a number ;
- case 0 : error can't take log of zero ;
+ case *[^0-9]* : errors.error $(number) is not a number ;
+ case 0 : errors.error can't take log of zero ;
         case [1-9] : return 0 ;
         case [1-9]? : return 1 ;
         case [1-9]?? : return 2 ;
@@ -123,23 +144,23 @@
             {
                 chars = $(chars[2-]) ;
             }
-
             if ! $(chars)
             {
- error can't take log of zero ;
+ errors.error can't take log of zero ;
             }
             else
             {
- return [ sequence.length $(chars) ] ;
+ return [ decrement [ sequence.length $(chars) ] ] ;
             }
         }
     }
 }
 
+
 rule __test__ ( )
 {
     import assert ;
-
+
     assert.result 1 : increment 0 ;
     assert.result 2 : increment 1 ;
     assert.result 1 : decrement 2 ;
@@ -149,10 +170,9 @@
     assert.result 99 : increment 98 ;
     assert.result 99 : decrement 100 ;
     assert.result 100 : increment 99 ;
- # This just makes debugging output too large
- # assert.result 1000 : increment 999 ;
- # assert.result 999 : decrement 1000 ;
-
+ assert.result 999 : decrement 1000 ;
+ assert.result 1000 : increment 999 ;
+
     assert.result 1 2 3 : range 3 ;
     assert.result 1 2 3 4 5 6 7 8 9 10 11 12 : range 12 ;
     assert.result 3 4 5 6 7 8 9 10 11 : range 3 11 ;
@@ -160,40 +180,53 @@
     assert.result 1 4 7 10 : range 10 : 3 ;
     assert.result 2 4 6 8 10 : range 2 10 : 2 ;
     assert.result 25 50 75 100 : range 25 100 : 25 ;
-
- assert.true less 1 2 ;
- assert.true less 1 12 ;
- assert.true less 1 21 ;
+
+ assert.result 0 : trim-leading-zeroes 0 ;
+ assert.result 1234 : trim-leading-zeroes 1234 ;
+ assert.result 123456 : trim-leading-zeroes 0000123456 ;
+ assert.result 10000123456 : trim-leading-zeroes 10000123456 ;
+ assert.result 10000 : trim-leading-zeroes 10000 ;
+ assert.result 10000 : trim-leading-zeroes 00010000 ;
+
+ assert.true less 1 2 ;
+ assert.true less 1 12 ;
+ assert.true less 1 21 ;
+ assert.true less 005 217 ;
     assert.false less 0 0 ;
-
- # TEMPORARY disabled, because nested "try"/"catch" do not work, I don't the
- # time to fix that right now.
- if $(0)
- {
+ assert.false less 03 3 ;
+ assert.false less 3 03 ;
+ assert.true less 005 217 ;
+ assert.true less 0005 217 ;
+ assert.true less 5 00217 ;
+
+ # TEMPORARY disabled, because nested "try"/"catch" do not work and I do no
+ # have the time to fix that right now.
+ if $(0)
+ {
     try ;
     {
         decrement 0 ;
     }
     catch can't decrement zero! ;
-
+
     try ;
     {
         check foo ;
     }
     catch : not a number ;
-
+
     try ;
     {
         increment foo ;
     }
     catch : not a number ;
-
+
     try ;
     {
         log10 0 ;
     }
     catch can't take log of zero ;
-
+
     try ;
     {
         log10 000 ;
@@ -201,14 +234,18 @@
     catch can't take log of zero ;
 
     }
-
+
     assert.result 0 : log10 1 ;
     assert.result 0 : log10 9 ;
     assert.result 1 : log10 10 ;
     assert.result 1 : log10 99 ;
+ assert.result 2 : log10 100 ;
+ assert.result 2 : log10 101 ;
     assert.result 2 : log10 125 ;
- assert.result 11 : log10 12345678901 ;
-
+ assert.result 2 : log10 999 ;
+ assert.result 3 : log10 1000 ;
+ assert.result 10 : log10 12345678901 ;
+
     for local x in [ range 75 110 : 5 ]
     {
         for local y in [ range $(x) 111 : 3 ]
@@ -219,7 +256,7 @@
             }
         }
     }
-
+
     for local x in [ range 90 110 : 2 ]
     {
         for local y in [ range 80 $(x) : 4 ]

Modified: branches/proto/v4/tools/build/v2/util/os.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/util/os.jam (original)
+++ branches/proto/v4/tools/build/v2/util/os.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -15,7 +15,6 @@
     return [ modules.peek .ENVIRON : $(variable-names) ] ;
 }
 
-
 .name = [ modules.peek : OS ] ;
 .platform = [ modules.peek : OSPLAT ] ;
 .version = [ modules.peek : OSVER ] ;
@@ -24,7 +23,7 @@
 local rule constant ( c : os ? )
 {
     os ?= $(.name) ;
- # First look for platform-specific name, then general value
+ # First look for a platform-specific name, then the general value.
     local variables = .$(c)-$(os) .$(c) ;
     local result = $($(variables)) ;
     return $(result[1]) ;

Modified: branches/proto/v4/tools/build/v2/util/path.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/util/path.jam (original)
+++ branches/proto/v4/tools/build/v2/util/path.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -22,6 +22,7 @@
 import regex ;
 import sequence ;
 import set ;
+import version ;
 
 
 os = [ modules.peek : OS ] ;
@@ -35,6 +36,7 @@
     }
 }
 
+
 # Converts the native path into normalized form.
 #
 rule make ( native )
@@ -149,31 +151,12 @@
 }
 
 
-# Auxillary rule: does all the semantic of 'join', except for error cheching.
-# The error checking has been separated because this rule is recursive, and I
-# do not like the idea of checking the same input over and over.
-#
-local rule join-imp ( elements + )
-{
- local result = ;
- if ! $(elements[1])
- {
- result = [ NORMALIZE_PATH "/" "$(elements[2-])" ] ;
- }
- else
- {
- result = [ NORMALIZE_PATH "$(elements)" ] ;
- }
- return $(result) ;
-}
-
-
 # Concatenates the passed path elements. Generates an error if any element other
-# than the first one is rooted.
+# than the first one is rooted. Skips any empty or undefined path elements.
 #
 rule join ( elements + )
 {
- if ! $(elements[2])
+ if ! $(elements[2-])
     {
         return $(elements[1]) ;
     }
@@ -183,10 +166,30 @@
         {
             if [ is-rooted $(e) ]
             {
- errors.error only first element may be rooted ;
+ errors.error only the first element may be rooted ;
+ }
+ }
+ if [ version.check-jam-version 3 1 17 ]
+ {
+ return [ NORMALIZE_PATH "$(elements)" ] ;
+ }
+ else
+ {
+ # Boost Jam prior to version 3.1.17 had problems with its
+ # NORMALIZE_PATH rule in case you passed it a leading backslash
+ # instead of a slash, in some cases when you sent it an empty
+ # initial path element and possibly some others. At least some of
+ # those cases were being hit and relied upon when calling this rule
+ # from the path.make-NT rule.
+ if ! $(elements[1]) && $(elements[2])
+ {
+ return [ NORMALIZE_PATH "/" "$(elements[2-])" ] ;
+ }
+ else
+ {
+ return [ NORMALIZE_PATH "$(elements)" ] ;
             }
         }
- return [ join-imp $(elements) ] ;
     }
 }
 
@@ -195,9 +198,12 @@
 #
 rule root ( path root )
 {
- if [ is-rooted $(path) ] {
+ if [ is-rooted $(path) ]
+ {
         return $(path) ;
- } else {
+ }
+ else
+ {
         return [ join $(root) $(path) ] ;
     }
 }
@@ -447,27 +453,38 @@
 }
 
 
+# Converts native Windows paths into our internal canonic path representation.
+# Supports 'invalid' paths containing multiple successive path separator
+# characters.
+#
+# TODO: Check and if needed add support for Windows 'X:file' path format where
+# the file is located in the current folder on drive X.
+#
 rule make-NT ( native )
 {
- local tokens = [ regex.split $(native) "[/\\]" ] ;
     local result ;
 
- # Handle paths ending with slashes.
- if $(tokens[-1]) = ""
+ if [ version.check-jam-version 3 1 17 ]
     {
- tokens = $(tokens[1--2]) ; # Discard the empty element.
+ result = [ NORMALIZE_PATH $(native) ] ;
     }
-
- result = [ path.join $(tokens) ] ;
-
- if [ regex.match "(^.:)" : $(native) ]
+ else
     {
- result = /$(result) ;
+ # This old implementation is really fragile due to a not so clear way
+ # NORMALIZE_PATH rule worked in Boost.Jam versions prior to 3.1.17. E.g.
+ # path.join would mostly ignore empty path elements but would root the
+ # joined path in case the initial two path elements were empty or some
+ # similar accidental wierdness.
+ result = [ path.join [ regex.split $(native) "[/\\]" ] ] ;
     }
 
- if $(native) = ""
+ # We need to add an extra '/' in front in case this is a rooted Windows path
+ # starting with a drive letter and not a path separator character since the
+ # builtin NORMALIZE_PATH rule has no knowledge of this leading drive letter
+ # and treats it as a regular folder name.
+ if [ regex.match "(^.:)" : $(native) ]
     {
- result = "." ;
+ result = /$(result) ;
     }
 
     return $(result) ;
@@ -607,7 +624,7 @@
         if ! [ MATCH (\\.) : $(file) ]
         {
             #
- # Always add "." to end of non-extension file
+ # Always add "." to end of non-extension file.
             #
             file = $(file). ;
         }
@@ -768,12 +785,47 @@
 
     assert.result "foo/bar/giz" : make "foo/bar/giz" ;
     assert.result "foo/bar/giz" : make "foo\\bar\\giz" ;
+ assert.result "foo" : make "foo/" ;
+ assert.result "foo" : make "foo\\" ;
     assert.result "foo" : make "foo/." ;
     assert.result "foo" : make "foo/bar/.." ;
+ assert.result "foo" : make "foo/bar/../" ;
+ assert.result "foo" : make "foo/bar/..\\" ;
     assert.result "foo/bar" : make "foo/././././bar" ;
     assert.result "/foo" : make "\\foo" ;
     assert.result "/D:/My Documents" : make "D:\\My Documents" ;
     assert.result "/c:/boost/tools/build/new/project.jam" : make "c:\\boost\\tools\\build\\test\\..\\new\\project.jam" ;
+
+ # Test processing 'invalid' paths containing multiple successive path
+ # separators.
+ assert.result "foo" : make "foo//" ;
+ assert.result "foo" : make "foo///" ;
+ assert.result "foo" : make "foo\\\\" ;
+ assert.result "foo" : make "foo\\\\\\" ;
+ assert.result "/foo" : make "//foo" ;
+ assert.result "/foo" : make "///foo" ;
+ assert.result "/foo" : make "\\\\foo" ;
+ assert.result "/foo" : make "\\\\\\foo" ;
+ assert.result "/foo" : make "\\/\\/foo" ;
+ assert.result "foo/bar" : make "foo//\\//\\\\bar//\\//\\\\\\//\\//\\\\" ;
+ assert.result "foo" : make "foo/bar//.." ;
+ assert.result "foo/bar" : make "foo/bar/giz//.." ;
+ assert.result "foo/giz" : make "foo//\\//\\\\bar///\\\\//\\\\////\\/..///giz\\//\\\\\\//\\//\\\\" ;
+ assert.result "../../../foo" : make "..///.//..///.//..////foo///" ;
+
+ # Test processing 'invalid' rooted paths with too many '..' path elements
+ # that would place them before the root.
+ assert.result "" : make "/.." ;
+ assert.result "" : make "/../" ;
+ assert.result "" : make "/../." ;
+ assert.result "" : make "/.././" ;
+ assert.result "" : make "/foo/../bar/giz/.././././../../." ;
+ assert.result "" : make "/foo/../bar/giz/.././././../.././" ;
+ assert.result "" : make "//foo/../bar/giz/.././././../../." ;
+ assert.result "" : make "//foo/../bar/giz/.././././../.././" ;
+ assert.result "" : make "\\\\foo/../bar/giz/.././././../../." ;
+ assert.result "" : make "\\\\foo/../bar/giz/.././././../.././" ;
+ assert.result "" : make "/..///.//..///.//..////foo///" ;
 
     assert.result "foo\\bar\\giz" : native "foo/bar/giz" ;
     assert.result "foo" : native "foo" ;

Modified: branches/proto/v4/tools/build/v2/util/sequence.jam
==============================================================================
--- branches/proto/v4/tools/build/v2/util/sequence.jam (original)
+++ branches/proto/v4/tools/build/v2/util/sequence.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -8,15 +8,17 @@
 import numbers ;
 import modules ;
 
-# Note that algorithms in this module execute largely in the caller's
-# module namespace, so that local rules can be used as function
-# objects. Also note that most predicates can be multi-element
-# lists. In that case, all but the first element are prepended to the
-# first argument which is passed to the rule named by the first
-# element.
 
-# Return the elements e of $(sequence) for which [ $(predicate) e ]
-# has a non-null value.
+# Note that algorithms in this module execute largely in the caller's module
+# namespace, so that local rules can be used as function objects. Also note that
+# most predicates can be multi-element lists. In that case, all but the first
+# element are prepended to the first argument which is passed to the rule named
+# by the first element.
+
+
+# Return the elements e of $(sequence) for which [ $(predicate) e ] has a
+# non-null value.
+#
 rule filter ( predicate + : sequence * )
 {
     local caller = [ CALLER_MODULE ] ;
@@ -32,8 +34,10 @@
     return $(result) ;
 }
 
-# return a new sequence consisting of [ $(function) $(e) ] for each
-# element e of $(sequence).
+
+# Return a new sequence consisting of [ $(function) $(e) ] for each element e of
+# $(sequence).
+#
 rule transform ( function + : sequence * )
 {
     local caller = [ CALLER_MODULE ] ;
@@ -46,6 +50,7 @@
     return $(result) ;
 }
 
+
 rule reverse ( s * )
 {
     local r ;
@@ -65,7 +70,9 @@
     }
 }
 
-# insertion-sort s using the BinaryPredicate ordered.
+
+# Insertion-sort s using the BinaryPredicate ordered.
+#
 rule insertion-sort ( s * : ordered * )
 {
     if ! $(ordered)
@@ -111,14 +118,17 @@
     }
 }
 
-# merge two ordered sequences using the BinaryPredicate ordered.
+
+# Merge two ordered sequences using the BinaryPredicate ordered.
+#
 rule merge ( s1 * : s2 * : ordered * )
 {
     ordered ?= sequence.less ;
     local result__ ;
     local caller = [ CALLER_MODULE ] ;
 
- while $(s1) && $(s2) {
+ while $(s1) && $(s2)
+ {
         if [ modules.call-in $(caller) : $(ordered) $(s1[1]) $(s2[1]) ]
         {
             result__ += $(s1[1]) ;
@@ -141,15 +151,19 @@
     return $(result__) ;
 }
 
-# join the elements of s into one long string. If joint is supplied,
-# it is used as a separator.
+
+# Join the elements of s into one long string. If joint is supplied, it is used
+# as a separator.
+#
 rule join ( s * : joint ? )
 {
     joint ?= "" ;
     return $(s:J=$(joint)) ;
 }
 
+
 # Find the length of any sequence.
+#
 rule length ( s * )
 {
     local result = 0 ;
@@ -160,6 +174,7 @@
     return $(result) ;
 }
 
+
 rule unique ( list * : stable ? )
 {
     local result ;
@@ -188,8 +203,10 @@
     return $(result) ;
 }
 
-# Returns the maximum number in 'elements'. Uses 'ordered' for comparisons,
-# or 'numbers.less' is none is provided.
+
+# Returns the maximum number in 'elements'. Uses 'ordered' for comparisons, or
+# 'numbers.less' is none is provided.
+#
 rule max-element ( elements + : ordered ? )
 {
     ordered ?= numbers.less ;
@@ -205,8 +222,10 @@
     return $(max) ;
 }
 
-# Returns all of 'elements' for which corresponding element in parallel
-# list 'rank' is equal to the maximum value in 'rank'.
+
+# Returns all of 'elements' for which corresponding element in parallel list
+# 'rank' is equal to the maximum value in 'rank'.
+#
 rule select-highest-ranked ( elements * : ranks * )
 {
     if $(elements)
@@ -230,7 +249,7 @@
 
 local rule __test__ ( )
 {
- # use a unique module so we can test the use of local rules.
+ # Use a unique module so we can test the use of local rules.
     module sequence.__test__
     {
         import assert ;
@@ -244,10 +263,9 @@
             }
         }
 
- assert.result 4 6 4 2 8
- : sequence.filter is-even : 1 4 6 3 4 7 2 3 8 ;
+ assert.result 4 6 4 2 8 : sequence.filter is-even : 1 4 6 3 4 7 2 3 8 ;
 
- # test that argument binding works
+ # Test that argument binding works.
         local rule is-equal-test ( x y )
         {
             if $(x) = $(y)
@@ -302,18 +320,15 @@
         local p2 = x ;
         for local i in 1 2 3 4 5 6 7 8
         {
- p2 = $(p2) $(p2) ;
+ p2 = $(p2) $(p2) ;
         }
         assert.result 256 : sequence.length $(p2) ;
 
- assert.result 1 2 3 4 5
- : sequence.unique 1 2 3 2 4 3 3 5 5 5 ;
+ assert.result 1 2 3 4 5 : sequence.unique 1 2 3 2 4 3 3 5 5 5 ;
                 
- assert.result 5
- : sequence.max-element 1 3 5 0 4 ;
+ assert.result 5 : sequence.max-element 1 3 5 0 4 ;
         
- assert.result e-3 h-3
- : sequence.select-highest-ranked e-1 e-3 h-3 m-2 : 1 3 3 2 ;
+ assert.result e-3 h-3 : sequence.select-highest-ranked e-1 e-3 h-3 m-2 : 1 3 3 2 ;
         
         assert.result 7 6 5 4 3 2 1 : sequence.reverse 1 2 3 4 5 6 7 ;
     }

Modified: branches/proto/v4/tools/inspect/build/Jamfile.v2
==============================================================================
--- branches/proto/v4/tools/inspect/build/Jamfile.v2 (original)
+++ branches/proto/v4/tools/inspect/build/Jamfile.v2 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -14,7 +14,7 @@
 
 exe inspect
     :
- inspect.cpp license_check.cpp link_check.cpp long_name_check.cpp tab_check.cpp crlf_check.cpp unnamed_namespace_check.cpp
+ inspect.cpp license_check.cpp link_check.cpp long_name_check.cpp tab_check.cpp ascii_check.cpp crlf_check.cpp unnamed_namespace_check.cpp
     copyright_check.cpp minmax_check.cpp
     /boost//filesystem/<link>static
     /boost//regex/<link>static

Modified: branches/proto/v4/tools/inspect/inspect.cpp
==============================================================================
--- branches/proto/v4/tools/inspect/inspect.cpp (original)
+++ branches/proto/v4/tools/inspect/inspect.cpp 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -36,6 +36,7 @@
 #include "link_check.hpp"
 #include "long_name_check.hpp"
 #include "tab_check.hpp"
+#include "ascii_check.hpp"
 #include "minmax_check.hpp"
 #include "unnamed_namespace_check.hpp"
 
@@ -421,6 +422,7 @@
          " -link\n"
          " -long_name\n"
          " -tab\n"
+ " -ascii\n"
          " -minmax\n"
          " -unnamed\n"
          " default is all checks on; otherwise options specify desired checks"
@@ -581,6 +583,7 @@
   bool link_ck = true;
   bool long_name_ck = true;
   bool tab_ck = true;
+ bool ascii_ck = true;
   bool minmax_ck = true;
   bool unnamed_ck = true;
   bool cvs = false;
@@ -611,6 +614,7 @@
     link_ck = false;
     long_name_ck = false;
     tab_ck = false;
+ ascii_ck = false;
     minmax_ck = false;
     unnamed_ck = false;
   }
@@ -632,6 +636,8 @@
       long_name_ck = true;
     else if ( std::strcmp( argv[1], "-tab" ) == 0 )
       tab_ck = true;
+ else if ( std::strcmp( argv[1], "-ascii" ) == 0 )
+ ascii_ck = true;
     else if ( std::strcmp( argv[1], "-minmax" ) == 0 )
         minmax_ck = true;
     else if ( std::strcmp( argv[1], "-unnamed" ) == 0 )
@@ -671,6 +677,8 @@
     inspectors.push_back( inspector_element( new boost::inspect::file_name_check ) );
   if ( tab_ck )
       inspectors.push_back( inspector_element( new boost::inspect::tab_check ) );
+ if ( ascii_ck )
+ inspectors.push_back( inspector_element( new boost::inspect::ascii_check ) );
   if ( minmax_ck )
       inspectors.push_back( inspector_element( new boost::inspect::minmax_check ) );
   if ( unnamed_ck )

Modified: branches/proto/v4/tools/jam/src/builtins.c
==============================================================================
--- branches/proto/v4/tools/jam/src/builtins.c (original)
+++ branches/proto/v4/tools/jam/src/builtins.c 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -66,7 +66,7 @@
 RULE* bind_builtin( char* name, LIST*(*f)(PARSE*, FRAME*), int flags, char** args )
 {
     argument_list* arg_list = 0;
-
+
     if ( args )
     {
         arg_list = args_new();
@@ -130,7 +130,7 @@
         bind_builtin( "REBUILDS" ,
                       builtin_rebuilds, 0, args );
     }
-
+
     duplicate_rule( "Leaves" ,
       bind_builtin( "LEAVES" ,
                     builtin_flags, T_FLAG_LEAVES, 0 ) );
@@ -174,7 +174,7 @@
                     builtin_flags, T_FLAG_FAIL_EXPECTED, 0 );
 
       bind_builtin( "RMOLD" , builtin_flags, T_FLAG_RMOLD, 0 );
-
+
       {
           char * args[] = { "targets", "*", 0 };
           bind_builtin( "UPDATE", builtin_update, 0, args );
@@ -315,7 +315,7 @@
 
 #ifdef HAVE_PYTHON
       {
- char * args[] = { "python-module", ":", "function", ":",
+ char * args[] = { "python-module", ":", "function", ":",
                             "jam-module", ":", "rule-name", 0 };
           bind_builtin( "PYTHON_IMPORT_RULE",
               builtin_python_import_rule, 0, args );
@@ -410,8 +410,8 @@
 /*
  * builtin_depends() - DEPENDS/INCLUDES rule
  *
- * The DEPENDS builtin rule appends each of the listed sources on the
- * dependency list of each of the listed targets. It binds both the
+ * The DEPENDS builtin rule appends each of the listed sources on the
+ * dependency list of each of the listed targets. It binds both the
  * targets and sources as TARGETs.
  */
 
@@ -483,7 +483,7 @@
 /*
  * builtin_echo() - ECHO rule
  *
- * The ECHO builtin rule echoes the targets to the user. No other
+ * The ECHO builtin rule echoes the targets to the user. No other
  * actions are taken.
  */
 
@@ -559,7 +559,8 @@
         *p = tolower(*p);
     }
 }
-
+
+
 static void
 builtin_glob_back(
     void *closure,
@@ -568,12 +569,12 @@
     time_t time )
 {
     PROFILE_ENTER(BUILTIN_GLOB_BACK);
-
+
     struct globbing *globbing = (struct globbing *)closure;
     LIST *l;
     PATHNAME f;
     string buf[1];
-
+
     /* Null out directory for matching. */
     /* We wish we had file_dirscan() pass up a PATHNAME. */
 
@@ -607,19 +608,19 @@
             break;
         }
     }
-
+
     string_free( buf );
-
+
     PROFILE_EXIT(BUILTIN_GLOB_BACK);
 }
 
 static LIST* downcase_list( LIST *in )
 {
     LIST* result = 0;
-
+
     string s[1];
     string_new( s );
-
+
     while (in)
     {
         string_copy( s, in->string );
@@ -627,7 +628,7 @@
         result = list_append( result, list_new( 0, newstr( s->value ) ) );
         in = in->next;
     }
-
+
     string_free( s );
     return result;
 }
@@ -639,16 +640,16 @@
 {
     LIST *l = lol_get( frame->args, 0 );
     LIST *r = lol_get( frame->args, 1 );
-
+
     struct globbing globbing;
 
     globbing.results = L0;
     globbing.patterns = r;
-
+
     globbing.case_insensitive
 # if defined( OS_NT ) || defined( OS_CYGWIN )
        = l; /* always case-insensitive if any files can be found */
-# else
+# else
        = lol_get( frame->args, 2 );
 # endif
 
@@ -656,7 +657,7 @@
     {
         globbing.patterns = downcase_list( r );
     }
-
+
     for( ; l; l = list_next( l ) )
         file_dirscan( l->string, builtin_glob_back, &globbing );
 
@@ -686,9 +687,10 @@
     if (time > 0)
         return list_new(list, newstr(file));
     else
- return list;
+ return list;
 }
 
+
 LIST* glob1(char* dirname, char* pattern)
 {
     LIST* plist = list_new(L0, pattern);
@@ -696,11 +698,11 @@
 
     globbing.results = L0;
     globbing.patterns = plist;
-
+
     globbing.case_insensitive
 # if defined( OS_NT ) || defined( OS_CYGWIN )
        = plist; /* always case-insensitive if any files can be found */
-# else
+# else
        = L0;
 # endif
 
@@ -708,7 +710,7 @@
     {
         globbing.patterns = downcase_list( plist );
     }
-
+
     file_dirscan( dirname, builtin_glob_back, &globbing );
 
     if ( globbing.case_insensitive )
@@ -731,13 +733,13 @@
     {
         /* No metacharacters. Check if the path exists. */
         result = append_if_exists(result, pattern);
- }
+ }
     else
     {
         /* Have metacharacters in the pattern. Split into dir/name */
         PATHNAME path[1];
- path_parse(pattern, path);
-
+ path_parse(pattern, path);
+
         if (path->f_dir.ptr)
         {
             LIST* dirs = L0;
@@ -746,7 +748,7 @@
             string_new(dirname);
             string_new(basename);
 
- string_append_range(dirname, path->f_dir.ptr,
+ string_append_range(dirname, path->f_dir.ptr,
                                 path->f_dir.ptr + path->f_dir.len);
 
             path->f_grist.ptr = 0;
@@ -763,12 +765,12 @@
             {
                 dirs = list_new(dirs, dirname->value);
             }
-
+
             if (has_wildcards(basename->value))
             {
                 for(; dirs; dirs = dirs->next)
                 {
- result = list_append(result,
+ result = list_append(result,
                                          glob1(dirs->string, basename->value));
                 }
             }
@@ -779,9 +781,9 @@
 
                 /** No wildcard in basename. */
                 for(; dirs; dirs = dirs->next)
- {
+ {
                     path->f_dir.ptr = dirs->string;
- path->f_dir.len = strlen(dirs->string);
+ path->f_dir.len = strlen(dirs->string);
                     path_build(path, file_string, 0);
 
                     result = append_if_exists(result, file_string->value);
@@ -805,6 +807,7 @@
     return result;
 }
 
+
 LIST *
 builtin_glob_recursive(
     PARSE *parse,
@@ -821,6 +824,7 @@
     return result;
 }
 
+
 /*
  * builtin_match() - MATCH rule, regexp matching
  */
@@ -832,7 +836,7 @@
 {
         LIST *l, *r;
         LIST *result = 0;
-
+
         string buf[1];
         string_new(buf);
 
@@ -873,28 +877,30 @@
         return result;
 }
 
+
 LIST *
 builtin_hdrmacro(
     PARSE *parse,
     FRAME *frame )
 {
   LIST* l = lol_get( frame->args, 0 );
-
+
   for ( ; l; l = list_next(l) )
   {
     TARGET* t = bindtarget( l->string );
 
- /* scan file for header filename macro definitions */
+ /* scan file for header filename macro definitions */
     if ( DEBUG_HEADER )
       printf( "scanning '%s' for header file macro definitions\n",
               l->string );
 
     macro_headers( t );
   }
-
+
   return L0;
 }
 
+
 /* builtin_rulenames() - RULENAMES ( MODULE ? )
  *
  * Returns a list of the non-local rule names in the given MODULE. If
@@ -926,6 +932,7 @@
     return result;
 }
 
+
 /* builtin_varnames() - VARNAMES ( MODULE ? )
  *
  * Returns a list of the variable names in the given MODULE. If
@@ -933,6 +940,7 @@
  * global module.
  */
 
+
 /* helper function for builtin_varnames(), below. Used with
  * hashenumerate, will prepend the key of each element to a list
  */
@@ -943,6 +951,7 @@
     *result = list_new( *result, copystr( *(char**)np ) );
 }
 
+
 static struct hash *get_running_module_vars()
 {
     struct hash *dummy, *vars = NULL;
@@ -954,6 +963,7 @@
     return vars;
 }
 
+
 LIST *
 builtin_varnames(
     PARSE *parse,
@@ -965,8 +975,8 @@
 
     /* The running module _always_ has its 'variables' member set to NULL
      * due to the way enter_module and var_hash_swap work */
- struct hash *vars =
- source_module == frame->module ?
+ struct hash *vars =
+ source_module == frame->module ?
             get_running_module_vars() : source_module->variables;
 
     if ( vars )
@@ -974,6 +984,7 @@
     return result;
 }
 
+
 /*
  * builtin_delete_module() - MODULE ?
  *
@@ -992,15 +1003,16 @@
     return result;
 }
 
+
 static void unknown_rule( FRAME *frame, char* key, char *module_name, char *rule_name )
 {
     backtrace_line( frame->prev );
     printf( "%s error: rule \"%s\" unknown in module \"%s\"\n", key, rule_name, module_name );
     backtrace( frame->prev );
     exit(1);
-
 }
 
+
 /*
  * builtin_import() - IMPORT ( SOURCE_MODULE ? : SOURCE_RULES * : TARGET_MODULE ? : TARGET_RULES * : LOCALIZE ? )
  *
@@ -1027,9 +1039,9 @@
 
     module_t* target_module = bindmodule( target_module_list ? target_module_list->string : 0 );
     module_t* source_module = bindmodule( source_module_list ? source_module_list->string : 0 );
-
+
     LIST *source_name, *target_name;
-
+
     for ( source_name = source_rules, target_name = target_rules;
           source_name && target_name;
           source_name = list_next( source_name )
@@ -1037,20 +1049,20 @@
     {
         RULE r_, *r = &r_, *imported;
         r_.name = source_name->string;
-
+
         if ( !source_module->rules
              || !hashcheck( source_module->rules, (HASHDATA**)&r )
             )
         {
             unknown_rule( frame, "IMPORT", source_module->name, r_.name );
         }
-
+
         imported = import_rule( r, target_module, target_name->string );
         if ( localize )
             imported->module = target_module;
         imported->exported = 0; /* this rule is really part of some other module; just refer to it here, but don't let it out */
     }
-
+
     if ( source_name || target_name )
     {
         backtrace_line( frame->prev );
@@ -1084,7 +1096,7 @@
     LIST *rules = lol_get( frame->args, 1 );
 
     module_t* m = bindmodule( module_list ? module_list->string : 0 );
-
+
     for ( ; rules; rules = list_next( rules ) )
     {
         RULE r_, *r = &r_;
@@ -1098,6 +1110,7 @@
     return L0;
 }
 
+
 /* Retrieve the file and line number that should be indicated for a
  * given procedure in debug output or an error backtrace
  */
@@ -1122,6 +1135,7 @@
     }
 }
 
+
 void print_source_line( PARSE* p )
 {
     char* file;
@@ -1134,6 +1148,7 @@
         printf( "%s:%d:", file, line);
 }
 
+
 /* Print a single line of error backtrace for the given frame */
 void backtrace_line( FRAME *frame )
 {
@@ -1148,6 +1163,7 @@
     }
 }
 
+
 /* Print the entire backtrace from the given frame to the Jambase
  * which invoked it.
  */
@@ -1160,6 +1176,7 @@
     }
 }
 
+
 /* A Jam version of the backtrace function, taking no arguments and
  * returning a list of quadruples: FILENAME LINE MODULE. RULENAME
  * describing each frame. Note that the module-name is always
@@ -1186,6 +1203,7 @@
     return result;
 }
 
+
 /*
  * builtin_caller_module() - CALLER_MODULE ( levels ? )
  *
@@ -1213,19 +1231,20 @@
     else
     {
         LIST* result;
-
+
         string name;
         string_copy( &name, frame->module->name );
         string_pop_back( &name );
 
         result = list_new( L0, newstr(name.value) );
-
+
         string_free( &name );
-
+
         return result;
     }
 }
 
+
 /*
  * Return the current working directory.
  *
@@ -1237,10 +1256,11 @@
     return pwd();
 }
 
+
 /*
  * Adds targets to the list of target that jam will attempt to update.
  */
-LIST*
+LIST*
 builtin_update( PARSE *parse, FRAME *frame)
 {
     LIST* result = list_copy( L0, targets_to_update() );
@@ -1251,6 +1271,7 @@
     return result;
 }
 
+
 LIST*
 builtin_search_for_target( PARSE *parse, FRAME *frame )
 {
@@ -1261,6 +1282,7 @@
     return list_new( L0, t->name );
 }
 
+
 LIST *builtin_import_module( PARSE *parse, FRAME *frame )
 {
     LIST* arg1 = lol_get( frame->args, 0 );
@@ -1282,6 +1304,7 @@
     return imported_modules(source_module);
 }
 
+
 LIST *builtin_instance( PARSE *parse, FRAME *frame )
 {
     LIST* arg1 = lol_get( frame->args, 0 );
@@ -1294,6 +1317,7 @@
     return L0;
 }
 
+
 LIST*
 builtin_sort( PARSE *parse, FRAME *frame )
 {
@@ -1302,113 +1326,131 @@
     return list_sort(arg1);
 }
 
+
 LIST *builtin_normalize_path( PARSE *parse, FRAME *frame )
 {
     LIST* arg = lol_get( frame->args, 0 );
 
- /* First, we iterate over all '/'-separated elements, starting from
- the end of string. If we see '..', we remove previous path elements.
- If we see '.', we remove it.
- The removal is done by putting '\1' in the string. After all the string
- is processed, we do a second pass, removing '\1' characters.
+ /* First, we iterate over all '/'-separated elements, starting from the end
+ of string. If we see a '..', we remove a previous path elements. If we
+ see '.', we remove it. The removal is done by overwriting data using '\1'
+ in the string. After the whole string has been processed, we do a second
+ pass, removing all the entered '\1' characters.
     */
-
- string in[1], out[1], tmp[1];
- char* end; /* Last character of the part of string still to be processed. */
- char* current; /* Working pointer. */
- int dotdots = 0; /* Number of '..' elements seen and not processed yet. */
- int rooted = arg->string[0] == '/';
- char* result;
 
- /* Make a copy of input: we should not change it. */
+ string in[1];
+ string out[1];
+ char * end; /* Last character of the part of string still to be processed. */
+ char * current; /* Working pointer. */
+ int dotdots = 0; /* Number of '..' elements seen and not processed yet. */
+ int rooted = 0;
+ char * result = 0;
+
+ /* Make a copy of input: we should not change it. Prepend a '/' before it as
+ a guard for the algorithm later on and remember whether it was originally
+ rooted or not. */
+
     string_new(in);
- if (!rooted)
- string_push_back(in, '/');
- while (arg)
- {
- string_append(in, arg->string);
- arg = list_next(arg);
- if (arg)
- string_append(in, "/");
+ string_push_back(in, '/');
+ for (; arg; arg = list_next(arg) )
+ {
+ if (arg->string[0] != '\0')
+ {
+ if (in->size == 1)
+ rooted = ( (arg->string[0] == '/' ) || (arg->string[0] == '\\') );
+ else
+ string_append(in, "/");
+ string_append(in, arg->string);
+ }
     }
 
- /* Convert \ into /. On windows, paths using / and \ are equivalent,
- and we want this function to obtain canonic representation. */
- for (current = in->value, end = in->value + in->size;
- current < end; ++current)
+ /* Convert \ into /. On Windows, paths using / and \ are equivalent, and we
+ want this function to obtain a canonic representation. */
+
+ for (current = in->value, end = in->value + in->size;
+ current < end; ++current)
         if (*current == '\\')
             *current = '/';
 
-
- end = in->value + in->size - 1;
- current = end;
-
- for(;end >= in->value;) {
+ /* Now we remove any extra path elements by overwriting them with '\1'
+ characters and cound how many more unused '..' path elements there are
+ remaining. Note that each remaining path element with always starts with
+ a '/' character. */
+
+ for (end = in->value + in->size - 1; end >= in->value; )
+ {
         /* Set 'current' to the next occurence of '/', which always exists. */
- for(current = end; *current != '/'; --current)
+ for (current = end; *current != '/'; --current)
             ;
-
- if (current == end && current != in->value) {
- /* Found a trailing slash. Remove it. */
- *current = '\1';
- } else if (current == end && *(current+1) == '/') {
- /* Found duplicated slash. Remove it. */
+
+ if (current == end)
+ {
+ /* Found a trailing or duplicate '/'. Remove it. */
             *current = '\1';
- } else if (end - current == 1 && strncmp(current, "/.", 2) == 0) {
- /* Found '/.'. Drop them all. */
+ }
+ else if (end - current == 1 && *(current+1) == '.')
+ {
+ /* Found '/.'. Remove them all. */
             *current = '\1';
- *(current+1) = '\1';
- } else if (end - current == 2 && strncmp(current, "/..", 3) == 0) {
- /* Found '/..' */
+ *(current+1) = '\1';
+ }
+ else if (end - current == 2 && *(current+1) == '.' && *(current+2) == '.')
+ {
+ /* Found '/..'. Remove them all. */
             *current = '\1';
- *(current+1) = '\1';
- *(current+2) = '\1';
+ *(current+1) = '\1';
+ *(current+2) = '\1';
             ++dotdots;
- } else if (dotdots) {
- char* p = current;
+ }
+ else if (dotdots)
+ {
             memset(current, '\1', end-current+1);
             --dotdots;
- }
+ }
         end = current-1;
     }
 
-
- string_new(tmp);
- while(dotdots--)
- string_append(tmp, "/..");
- string_append(tmp, in->value);
- string_copy(in, tmp->value);
- string_free(tmp);
-
-
     string_new(out);
- /* The resulting path is either empty or has '/' as the first significant
- element. If the original path was not rooted, we need to drop first '/'.
- If the original path was rooted, and we've got empty path, need to add '/'
- */
- if (!rooted) {
- current = strchr(in->value, '/');
- if (current)
- *current = '\1';
- }
-
+
+ /* Now we know that we need to add exactly dotdots '..' path elements to the
+ front and that our string is either empty or has a '/' as its first
+ significant character. If we have any dotdots remaining then the passed
+ path must not have been rooted or else it is invalid we return an empty
+ list. */
+
+ if (dotdots)
+ {
+ if (rooted) return L0;
+ do
+ string_append(out, "/..");
+ while (--dotdots);
+ }
+
+ /* Now we actually remove all the path characters marked for removal. */
+
     for (current = in->value; *current; ++current)
         if (*current != '\1')
             string_push_back(out, *current);
 
-
- result = newstr(out->size ? out->value : (rooted ? "/" : "."));
- string_free(in);
+ /* Here we know that our string contains no '\1' characters and is either
+ empty or has a '/' as its initial character. If the original path was not
+ rooted and we have a non-empty path we need to drop the initial '/'. If
+ the original path was rooted and we have an empty path we need to add
+ back the '/'. */
+
+ result = newstr( out->size ? out->value + !rooted : (rooted ? "/" : "."));
+
     string_free(out);
+ string_free(in);
 
     return list_new(0, result);
-
 }
 
+
 LIST *builtin_native_rule( PARSE *parse, FRAME *frame )
 {
- LIST* module_name = lol_get( frame->args, 0 );
- LIST* rule_name = lol_get( frame->args, 1 );
+ LIST* module_name = lol_get( frame->args, 0 );
+ LIST* rule_name = lol_get( frame->args, 1 );
 
     module_t* module = bindmodule(module_name->string);
 
@@ -1421,19 +1463,20 @@
     else
     {
         backtrace_line( frame->prev );
- printf( "error: no native rule \"%s\" defined in module \"%s\"\n",
+ printf( "error: no native rule \"%s\" defined in module \"%s\"\n",
                 n.name, module->name);
         backtrace( frame->prev );
         exit(1);
     }
- return L0;
+ return L0;
 }
 
+
 LIST *builtin_has_native_rule( PARSE *parse, FRAME *frame )
 {
- LIST* module_name = lol_get( frame->args, 0 );
- LIST* rule_name = lol_get( frame->args, 1 );
- LIST* version = lol_get( frame->args, 2 );
+ LIST* module_name = lol_get( frame->args, 0 );
+ LIST* rule_name = lol_get( frame->args, 1 );
+ LIST* version = lol_get( frame->args, 2 );
 
     module_t* module = bindmodule(module_name->string);
 
@@ -1445,14 +1488,14 @@
         if (np->version == expected_version)
             return list_new(0, newstr("true"));
     }
- return L0;
+ return L0;
 }
 
 
 LIST *builtin_user_module( PARSE *parse, FRAME *frame )
 {
- LIST* module_name = lol_get( frame->args, 0 );
- for(; module_name; module_name = module_name->next)
+ LIST* module_name = lol_get( frame->args, 0 );
+ for(; module_name; module_name = module_name->next)
     {
         module_t* m = bindmodule( module_name->string);
         m->user_module = 1;
@@ -1463,7 +1506,7 @@
 LIST *builtin_nearest_user_location( PARSE *parse, FRAME *frame )
 {
     LIST* result = 0;
- FRAME* nearest_user_frame =
+ FRAME* nearest_user_frame =
         frame->module->user_module ? frame : frame->prev_user;
 
     if (nearest_user_frame)
@@ -1499,10 +1542,10 @@
 LIST *builtin_python_import_rule( PARSE *parse, FRAME *frame )
 {
     static int first_time = 1;
- char* python_module = lol_get( frame->args, 0 )->string;
- char* python_function = lol_get( frame->args, 1 )->string;
- char* jam_module = lol_get( frame->args, 2 )->string;
- char* jam_rule = lol_get( frame->args, 3 )->string;
+ char* python_module = lol_get( frame->args, 0 )->string;
+ char* python_function = lol_get( frame->args, 1 )->string;
+ char* jam_module = lol_get( frame->args, 2 )->string;
+ char* jam_rule = lol_get( frame->args, 3 )->string;
 
    PyObject *pName, *pModule, *pDict, *pFunc;
 
@@ -1522,9 +1565,9 @@
            exit_module( outer_module );
            enter_module( root_module());
        }
-
+
        extra = var_get("EXTRA_PYTHONPATH");
-
+
        if ( outer_module != root_module())
        {
             exit_module( root_module());
@@ -1538,14 +1581,14 @@
            string_append(buf, "import sys\nsys.path.append(\"");
            string_append(buf, extra->string);
            string_append(buf, "\")\n");
- PyRun_SimpleString(buf->value);
- string_free(buf);
- }
+ PyRun_SimpleString(buf->value);
+ string_free(buf);
+ }
    }
 
 
    pName = PyString_FromString(python_module);
-
+
    pModule = PyImport_Import(pName);
    Py_DECREF(pName);
 
@@ -1584,7 +1627,7 @@
 {
     LIST* l = L0;
     lol_init( lol );
-
+
     while ( elements && *elements )
     {
         if ( !strcmp( *elements, ":" ) )
@@ -1598,7 +1641,7 @@
         }
         ++elements;
     }
-
+
     if ( l != L0 )
         lol_add( lol, l );
 }
@@ -1616,7 +1659,7 @@
     LIST *result;
     PARSE *p;
     char* rulename;
-
+
     /* Build up the list of arg lists */
 
     frame_init( inner );
@@ -1636,7 +1679,7 @@
             PyObject* a = PyTuple_GetItem(args, i);
             if (PyString_Check(a))
             {
- lol_add(inner->args,
+ lol_add(inner->args,
                         list_new(0, newstr(PyString_AsString(a))));
             }
             else if (PySequence_Check(a))
@@ -1658,7 +1701,7 @@
                     Py_DECREF(e);
                 }
                 lol_add(inner->args, l);
- }
+ }
         }
     }
 
@@ -1686,14 +1729,14 @@
 
     if (!PyArg_ParseTuple(args, "ssO:import_rule", &module, &rule, &func))
         return NULL;
-
+
     if (!PyCallable_Check(func))
     {
- PyErr_SetString(PyExc_RuntimeError,
+ PyErr_SetString(PyExc_RuntimeError,
                         "Non-callable object passed to bjam.import_rule");
         return NULL;
     }
-
+
     m = bindmodule(module);
     r = bindrule(rule, m);
 
@@ -1712,7 +1755,7 @@
    - an action body
    - a list of variable that will be bound inside the action
    - integer flags.
- Defines an action on bjam side.
+ Defines an action on bjam side.
 */
 PyObject*
 bjam_define_action(PyObject* self, PyObject *args)
@@ -1726,17 +1769,17 @@
     int n;
     int i;
 
- if (!PyArg_ParseTuple(args, "ssO!i:define_action", &name, &body,
+ if (!PyArg_ParseTuple(args, "ssO!i:define_action", &name, &body,
                           &PyList_Type, &bindlist_python, &flags))
         return NULL;
-
+
     n = PyList_Size (bindlist_python);
     for (i = 0; i < n; ++i)
     {
         PyObject *next = PyList_GetItem(bindlist_python, i);
         if (!PyString_Check(next))
         {
- PyErr_SetString(PyExc_RuntimeError,
+ PyErr_SetString(PyExc_RuntimeError,
                             "bind list has non-string type");
             return NULL;
         }
@@ -1746,7 +1789,7 @@
     new_rule_actions(root_module(), name, newstr(body), bindlist, flags);
 
     Py_INCREF(Py_None);
- return Py_None;
+ return Py_None;
 }
 
 /* Returns the value of a variable in root Jam module. */
@@ -1786,7 +1829,7 @@
         char buf[32];
         get_source_line( f->procedure, &file, &line );
         sprintf( buf, "%d", line );
-
+
         /* PyTuple_SetItem steals reference. */
         PyTuple_SetItem(tuple, 0, PyString_FromString(file));
         PyTuple_SetItem(tuple, 1, PyString_FromString(buf));
@@ -1818,7 +1861,7 @@
     int exit_status = -1;
     int exit_status_opt = 0;
     int no_output_opt = 0;
-
+
     /* Process the variable args options. */
     {
         int a = 1;
@@ -1859,14 +1902,14 @@
     /* The command output is returned first. */
     result = list_new( L0, newstr(s.value) );
     string_free(&s);
-
+
     /* The command exit result next. */
     if ( exit_status_opt )
     {
         sprintf (buffer, "%d", exit_status);
         result = list_new( result, newstr( buffer ) );
     }
-
+
     return result;
 }
 

Modified: branches/proto/v4/tools/jam/src/rules.c
==============================================================================
--- branches/proto/v4/tools/jam/src/rules.c (original)
+++ branches/proto/v4/tools/jam/src/rules.c 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -137,6 +137,9 @@
             targethash = hashinit( sizeof( TARGET ), "targets" );
 
     /* Perforce added const everywhere. No time to merge that change. */
+#ifdef NT
+ targetname = short_path_to_long_path( (char*)targetname );
+#endif
         t->name = (char*)targetname;
 
         if( hashenter( targethash, (HASHDATA **)&t ) )

Modified: branches/proto/v4/tools/jam/test/action_status.jam
==============================================================================
--- branches/proto/v4/tools/jam/test/action_status.jam (original)
+++ branches/proto/v4/tools/jam/test/action_status.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -15,14 +15,13 @@
 }
 else
 {
- #~ actions .a. { $(ACTION) }
     actions quietly .a. { $(ACTION) }
-
+
     rule .a.
     {
         DEPENDS $(<) : $(>) ;
     }
-
+
     NOTFILE subtest ;
     .a. subtest_a : subtest ;
     DEPENDS all : subtest_a ;

Modified: branches/proto/v4/tools/jam/test/builtin_shell.jam
==============================================================================
--- branches/proto/v4/tools/jam/test/builtin_shell.jam (original)
+++ branches/proto/v4/tools/jam/test/builtin_shell.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -7,11 +7,11 @@
 local c = "date" ;
 if $(NT) { c = "PATH" ; }
 
-assert "" : (!=) : [ SHELL $(c) ] ;
-assert "" : (==) : [ SHELL $(c) : no-output ] ;
-assert "" 0 : (!=) : [ SHELL $(c) : exit-status ] ;
-assert "" 0 : (==) : [ SHELL $(c) : no-output : exit-status ] ;
-assert "" : (!=) : [ COMMAND $(c) ] ;
-assert "" : (==) : [ COMMAND $(c) : no-output ] ;
-assert "" 0 : (!=) : [ COMMAND $(c) : exit-status ] ;
-assert "" 0 : (==) : [ COMMAND $(c) : no-output : exit-status ] ;
+assert "" : (!=) : [ SHELL $(c) ] ;
+assert "" : (==) : [ SHELL $(c) : no-output ] ;
+assert "" 0 : (!=) : [ SHELL $(c) : exit-status ] ;
+assert "" 0 : (==) : [ SHELL $(c) : no-output : exit-status ] ;
+assert "" : (!=) : [ COMMAND $(c) ] ;
+assert "" : (==) : [ COMMAND $(c) : no-output ] ;
+assert "" 0 : (!=) : [ COMMAND $(c) : exit-status ] ;
+assert "" 0 : (==) : [ COMMAND $(c) : no-output : exit-status ] ;

Modified: branches/proto/v4/tools/jam/test/option_l.jam
==============================================================================
--- branches/proto/v4/tools/jam/test/option_l.jam (original)
+++ branches/proto/v4/tools/jam/test/option_l.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -5,6 +5,7 @@
 if ! $(BJAM_SUBTEST)
 {
     ECHO --- Testing -l option... ;
+
     assert "...found 2 targets...
 ...updating 1 target...
 .a. sleeper

Modified: branches/proto/v4/tools/jam/test/parallel_multifile_actions.jam
==============================================================================
--- branches/proto/v4/tools/jam/test/parallel_multifile_actions.jam (original)
+++ branches/proto/v4/tools/jam/test/parallel_multifile_actions.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -5,6 +5,7 @@
 if ! $(BJAM_SUBTEST)
 {
     ECHO --- Testing -jN parallel execution of multi-file actions... ;
+
     assert "...found 6 targets...
 ...updating 4 targets...
 .gen. g1.generated
@@ -41,7 +42,4 @@
     NOTFILE root ;
     DEPENDS g1.generated g2.generated : root ;
     DEPENDS all : u1.user u2.user ;
- #~ Work around... Remove when fixed...
- #~ DEPENDS g2.generated : g1.generated ;
- #~ INCLUDES g2.generated : g1.generated ;
 }

Modified: branches/proto/v4/tools/jam/test/test.jam
==============================================================================
--- branches/proto/v4/tools/jam/test/test.jam (original)
+++ branches/proto/v4/tools/jam/test/test.jam 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -5,16 +5,21 @@
 fail-count = 0 ;
 pass-count = 0 ;
 
+
 rule message ( message * )
 {
     local b = [ BACKTRACE ] ;
     ECHO "$(b[-4]):$(b[-3]):" $(message) ;
 }
+
+
 rule fail ( message * )
 {
     fail-count = [ CALC $(fail-count) + 1 ] ;
     message "error:" [FAILED] $(message) ;
 }
+
+
 rule pass ( message * )
 {
     pass-count = [ CALC $(pass-count) + 1 ] ;
@@ -23,6 +28,8 @@
         message "info:" [PASSED] $(message) ;
     }
 }
+
+
 rule assert ( expected * : test ? : obtained * )
 {
     test ?= "(==)" ;
@@ -41,8 +48,10 @@
     }
 }
 
+
 include action_status.jam ;
 include actions_quietly.jam ;
+include builtin_normalize_path.jam ;
 include builtin_shell.jam ;
 include builtin_w32_getregnames.jam ;
 include option_d2.jam ;

Modified: branches/proto/v4/tools/regression/src/process_jam_log.py
==============================================================================
--- branches/proto/v4/tools/regression/src/process_jam_log.py (original)
+++ branches/proto/v4/tools/regression/src/process_jam_log.py 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -40,6 +40,10 @@
         self.revision=None
         self.input = []
         ( _opt_, self.input ) = opt.parse_args(args,self)
+ if self.incremental:
+ run_type = 'incremental'
+ else:
+ run_type = 'full'
         self.results = xml.dom.minidom.parseString('''<?xml version="1.0" encoding="UTF-8"?>
 <test-run
   source="%(source)s"
@@ -55,11 +59,12 @@
             'runner' : self.runner,
             'platform' : self.platform,
             'tag' : self.tag,
- 'run-type' : 'incremental' if self.incremental else 'full',
+ 'run-type' : run_type,
             'revision' : self.revision,
             } )
         
         self.test = {}
+ self.target_to_test = {}
         self.target = {}
         self.parent = {}
         self.log = {}
@@ -146,15 +151,16 @@
         while test_node:
             test_name = test_node.getAttribute('name')
             self.test[test_name] = {
- 'library' : test_name.split('/',1)[0],
- 'test-name' : test_name.split('/',1)[1],
+ 'library' : '/'.join(test_name.split('/')[0:-1]),
+ 'test-name' : test_name.split('/')[-1],
                 'test-type' : test_node.getAttribute('type').lower(),
                 'test-program' : self.get_child_data(test_node,tag='source').strip(),
                 'target' : self.get_child_data(test_node,tag='target').strip(),
                 'info' : self.get_child_data(test_node,tag='info',strip=True)
                 }
             #~ Add a lookup for the test given the test target.
- self.target[self.test[test_name]['target']] = test_name
+ self.target_to_test[self.test[test_name]['target']] = test_name
+ #~ print "--- %s\n => %s" %(self.test[test_name]['target'],test_name)
             test_node = self.get_sibling(test_node.nextSibling,tag='test')
         return None
     
@@ -231,11 +237,15 @@
                             action_tag = 'run'
                     #~ The result sub-part we will add this result to.
                     result_node = self.get_child(log,tag=action_tag)
+ if action_node.getAttribute('status') == '0':
+ action_result = 'succeed'
+ else:
+ action_result = 'fail'
                     if not result_node:
                         #~ If we don't have one already, create it and add the result.
                         result_node = self.new_text(action_tag,result_data,
- result='succeed' if action_node.getAttribute('status') == '0' else 'fail',
- timestamp=action_node.getAttribute('start'))
+ result = action_result,
+ timestamp = action_node.getAttribute('start'))
                         log.appendChild(self.results.createTextNode("\n"))
                         log.appendChild(result_node)
                     else:
@@ -247,7 +257,7 @@
                             if action_node.getAttribute('status') != '0':
                                 result = 'fail'
                         else:
- result = 'succeed' if action_node.getAttribute('status') == '0' else 'fail'
+ result = action_result
                         result_node.setAttribute('result',result)
                         result_node.appendChild(self.results.createTextNode("\n"))
                         result_node.appendChild(self.results.createTextNode(result_data))
@@ -288,10 +298,12 @@
     #~ are the ones pre-declared in the --dump-test option. For libraries
     #~ we create a dummy test as needed.
     def get_test( self, node, type = None ):
- target = self.get_child_data(node,tag='jam-target')
- base = self.target[target]['name']
+ jam_target = self.get_child_data(node,tag='jam-target')
+ base = self.target[jam_target]['name']
+ target = jam_target
         while target in self.parent:
             target = self.parent[target]
+ #~ print "--- TEST: %s ==> %s" %(jam_target,target)
         #~ main-target-type is a precise indicator of what the build target is
         #~ proginally meant to be.
         main_type = self.get_child_data(self.get_child(node,tag='properties'),
@@ -308,7 +320,7 @@
                     }
             test = self.test[lib]
         else:
- test = self.test[self.target[self.target[target]['name']]]
+ test = self.test[self.target_to_test[self.target[target]['name']]]
         return (base,test)
     
     #~ Find, or create, the test-log node to add results to.
@@ -318,6 +330,10 @@
         target_directory = re.sub(r'.*[/\\]bin[.]v2[/\\]','',target_directory)
         target_directory = re.sub(r'[\\]','/',target_directory)
         if not target_directory in self.log:
+ if 'info' in test and test['info'] == 'always_show_run_output':
+ show_run_output = 'true'
+ else:
+ show_run_output = 'false'
             self.log[target_directory] = self.new_node('test-log',
                 library=test['library'],
                 test_name=test['test-name'],
@@ -325,7 +341,7 @@
                 test_program=test['test-program'],
                 toolset=self.get_toolset(node),
                 target_directory=target_directory,
- show_run_output='true' if 'info' in test and test['info'] == 'always_show_run_output' else 'false')
+ show_run_output=show_run_output)
         return self.log[target_directory]
     
     #~ The precise toolset from the build properties.
@@ -369,7 +385,10 @@
             if not data:
                 data = self.get_child(node,tag='#cdata-section')
             if data:
- data = data.data if not strip else data.data.strip()
+ if not strip:
+ data = data.data
+ else:
+ data = data.data.strip()
         if not data:
             data = default
         return data

Modified: branches/proto/v4/tools/regression/src/regression.py
==============================================================================
--- branches/proto/v4/tools/regression/src/regression.py (original)
+++ branches/proto/v4/tools/regression/src/regression.py 2008-05-08 17:41:48 EDT (Thu, 08 May 2008)
@@ -363,11 +363,6 @@
             f.write( '<p>Tests are run on %s platform.</p>' % self.platform_name() )
             f.close()
 
- if self.incremental:
- run_type = 'incremental'
- else:
- run_type = 'full'
-
         source = 'tarball'
         revision = ''
         svn_root_file = os.path.join( self.boost_root, '.svn' )
@@ -390,6 +385,10 @@
 
         if self.pjl_toolset != 'python':
             from collect_and_upload_logs import collect_logs
+ if self.incremental:
+ run_type = 'incremental'
+ else:
+ run_type = 'full'
             collect_logs(
                 self.regression_results,
                 self.runner, self.tag, self.platform, comment_path,
@@ -400,6 +399,10 @@
                 revision )
         else:
             from process_jam_log import BJamLog2Results
+ if self.incremental:
+ run_type = '--incremental'
+ else:
+ run_type = ''
             BJamLog2Results([
                 '--output='+os.path.join(self.regression_results,self.runner+'.xml'),
                 '--runner='+self.runner,
@@ -408,7 +411,7 @@
                 '--platform='+self.platform,
                 '--source='+source,
                 '--revision='+revision,
- '--incremental' if run_type == 'incremental' else '',
+ run_type,
                 self.regression_log
                 ])
             self.compress_file(


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