|
Boost-Commit : |
From: eric_at_[hidden]
Date: 2008-04-21 01:58:34
Author: eric_niebler
Date: 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
New Revision: 44680
URL: http://svn.boost.org/trac/boost/changeset/44680
Log:
Merged revisions 44564,44567-44570,44595,44597,44602-44612,44614-44615,44620-44640,44645-44646,44650-44657,44659-44660,44662-44663,44665-44676 via svnmerge from
https://svn.boost.org/svn/boost/trunk
................
r44564 | hkaiser | 2008-04-18 17:23:19 -0700 (Fri, 18 Apr 2008) | 1 line
Spirit.Qi: Fixed a big endian issue in tests/qi/binary.cpp
................
r44567 | hkaiser | 2008-04-18 17:52:54 -0700 (Fri, 18 Apr 2008) | 1 line
Wave: Added a missing header file.
................
r44568 | hkaiser | 2008-04-18 18:11:17 -0700 (Fri, 18 Apr 2008) | 1 line
Spirit: removed multi_pass tests from regression runs, these are not completed yet.
................
r44569 | djowel | 2008-04-18 19:13:57 -0700 (Fri, 18 Apr 2008) | 1 line
no-case for chsets
................
r44570 | djowel | 2008-04-18 19:14:11 -0700 (Fri, 18 Apr 2008) | 1 line
no-case for chsets
................
r44595 | johnmaddock | 2008-04-19 09:28:00 -0700 (Sat, 19 Apr 2008) | 1 line
Changed #includes to avoid circular dependencies between shared_ptr and TR1.
................
r44597 | hkaiser | 2008-04-19 09:41:29 -0700 (Sat, 19 Apr 2008) | 1 line
Spirit.Karma: disabled real_numerics tests for real_concept for now.
................
r44602 | hkaiser | 2008-04-19 12:59:59 -0700 (Sat, 19 Apr 2008) | 1 line
Wave: fixing compilation using Intel compilers
................
r44603 | hkaiser | 2008-04-19 13:03:21 -0700 (Sat, 19 Apr 2008) | 1 line
Wave: Added workaround for VC7.1
................
r44604 | hkaiser | 2008-04-19 13:09:11 -0700 (Sat, 19 Apr 2008) | 1 line
Wave: Applied a fix for HP Tru64 compiler
................
r44605 | hkaiser | 2008-04-19 13:22:39 -0700 (Sat, 19 Apr 2008) | 1 line
Spirit: renamed end_type to eoi_type (missed that while original renaming)
................
r44606 | bemandawes | 2008-04-19 14:13:59 -0700 (Sat, 19 Apr 2008) | 1 line
replace_extension -> change_extension name fix [Lothar May]
................
r44607 | hkaiser | 2008-04-19 14:15:37 -0700 (Sat, 19 Apr 2008) | 1 line
Wave: attempt to fix test runs
................
r44608 | hkaiser | 2008-04-19 18:42:27 -0700 (Sat, 19 Apr 2008) | 1 line
Spirit.Lex: First version of wrapped semantic actions.
................
r44609 | djowel | 2008-04-20 01:00:41 -0700 (Sun, 20 Apr 2008) | 1 line
add wchar test
................
r44610 | djowel | 2008-04-20 01:27:25 -0700 (Sun, 20 Apr 2008) | 1 line
various fixes
................
r44611 | djowel | 2008-04-20 01:27:41 -0700 (Sun, 20 Apr 2008) | 1 line
more tests
................
r44612 | johnmaddock | 2008-04-20 03:58:20 -0700 (Sun, 20 Apr 2008) | 4 lines
Moved real_concept and std_real_concept overloads of the rounding and truncation functions into the same namespace as the classes so that they can be found via ADL.
Updated the tests to cope with the change.
Updated library configuration to cope with the change.
Made sure that the rounding and truncation functions are all correctly forward declared.
................
r44614 | danieljames | 2008-04-20 05:10:56 -0700 (Sun, 20 Apr 2008) | 15 lines
Merge in fix for the swap tests, and rename allocator.
Merged revisions 44512-44515,44517-44536 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
................
r44512 | danieljames | 2008-04-17 20:03:00 +0100 (Thu, 17 Apr 2008) | 11 lines
Rename allocator.hpp.
................
r44536 | danieljames | 2008-04-18 11:27:50 +0100 (Fri, 18 Apr 2008) | 1 line
Check that hash_table_impl::swap isn't swapping with itself - which is causing the buffered functions to be set with the same value twice, resulting in an assertion.
................
................
r44615 | danieljames | 2008-04-20 05:11:22 -0700 (Sun, 20 Apr 2008) | 1 line
Remove some tabs.
................
r44620 | johnmaddock | 2008-04-20 05:53:37 -0700 (Sun, 20 Apr 2008) | 1 line
Added docs for new warning_disable.hpp header.
................
r44621 | johnmaddock | 2008-04-20 05:54:21 -0700 (Sun, 20 Apr 2008) | 1 line
Added new warning_disable.hpp header.
................
r44622 | hkaiser | 2008-04-20 06:00:21 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Karma: re-enabled real_numerics tests related to math::real_concept.
................
r44623 | hkaiser | 2008-04-20 06:13:42 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Changed wrap_action::phoenix_action to be a embedded function object. Same errors still...
................
r44624 | hkaiser | 2008-04-20 06:24:11 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Worked around a problem related to HP-UX_ia64_aCC.
................
r44625 | hkaiser | 2008-04-20 06:25:47 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Reverted wrap_action code to use Boost.Bind for now, just to avoid regression errors.
................
r44626 | hkaiser | 2008-04-20 06:30:15 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Added a workaround for missing WCHAR_MAX constant.
................
r44627 | hkaiser | 2008-04-20 06:33:53 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Added another workaround for wchar.h
................
r44628 | hkaiser | 2008-04-20 06:37:42 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Yet another wchar_t fix.
................
r44629 | hkaiser | 2008-04-20 06:45:06 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit: Added a missing header #include.
................
r44630 | hkaiser | 2008-04-20 06:46:10 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit: Added a missing header #include.
................
r44631 | hkaiser | 2008-04-20 06:51:15 -0700 (Sun, 20 Apr 2008) | 1 line
Added some parenthesis to disambiguate expressions.
................
r44632 | hkaiser | 2008-04-20 06:57:47 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit: Added a missing header #include.
................
r44633 | hkaiser | 2008-04-20 07:01:18 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit: Added a missing header #include.
................
r44634 | hkaiser | 2008-04-20 07:01:34 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit: Added a missing header #include.
................
r44635 | hkaiser | 2008-04-20 07:04:08 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Fixed a gcc4.3.0 compilation error.
................
r44636 | pdimov | 2008-04-20 07:59:12 -0700 (Sun, 20 Apr 2008) | 1 line
Atomic access added.
................
r44637 | hkaiser | 2008-04-20 08:27:30 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Qi: Fixed eol parser
................
r44638 | pdimov | 2008-04-20 08:37:08 -0700 (Sun, 20 Apr 2008) | 1 line
Factored out boost/detail/lightweight_thread.hpp.
................
r44639 | hkaiser | 2008-04-20 10:00:35 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Qi: Fixed lit parser
................
r44640 | pdimov | 2008-04-20 10:00:58 -0700 (Sun, 20 Apr 2008) | 1 line
sp_atomic_mt_test.cpp added.
................
r44645 | danieljames | 2008-04-20 11:30:21 -0700 (Sun, 20 Apr 2008) | 1 line
Initialise svnmerge for the doc branch.
................
r44646 | danieljames | 2008-04-20 11:35:31 -0700 (Sun, 20 Apr 2008) | 1 line
Fix svnmerge for the doc branch.
................
r44650 | danieljames | 2008-04-20 14:08:57 -0700 (Sun, 20 Apr 2008) | 1 line
Update an include.
................
r44651 | djowel | 2008-04-20 14:11:44 -0700 (Sun, 20 Apr 2008) | 1 line
problem fixed with lambda[f]
................
r44652 | hkaiser | 2008-04-20 14:27:28 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Fixed VC7.1 compilation issue
................
r44653 | hkaiser | 2008-04-20 14:28:20 -0700 (Sun, 20 Apr 2008) | 1 line
Wave: Updated iterator for change in multi_pass
................
r44654 | hkaiser | 2008-04-20 14:29:01 -0700 (Sun, 20 Apr 2008) | 1 line
Wave: Updated iterator for change in multi_pass
................
r44655 | hkaiser | 2008-04-20 14:39:36 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Fixed wrap_action
................
r44656 | hkaiser | 2008-04-20 14:44:25 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Cleaning up ...
................
r44657 | hkaiser | 2008-04-20 15:37:35 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: Updated examples.
................
r44659 | hkaiser | 2008-04-20 17:20:39 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Karma: Added actions test
................
r44660 | hkaiser | 2008-04-20 17:29:36 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex. Updated Lexer quickstart docs with new action prototypes
................
r44662 | chris_kohlhoff | 2008-04-20 18:23:42 -0700 (Sun, 20 Apr 2008) | 3 lines
Add ability to disable the uses of the typeid operator by defining
BOOST_NO_TYPEID or BOOST_ASIO_NO_TYPEID.
................
r44663 | chris_kohlhoff | 2008-04-20 18:27:48 -0700 (Sun, 20 Apr 2008) | 3 lines
Ensure that timer dispatching responsibility is correctly relinquished when
processing leftover interrupts from a previous run invocation.
................
r44665 | chris_kohlhoff | 2008-04-20 18:36:28 -0700 (Sun, 20 Apr 2008) | 3 lines
Enhance example to make it clear that invocation hooking can be used with
asynchronous operations.
................
r44666 | chris_kohlhoff | 2008-04-20 18:39:06 -0700 (Sun, 20 Apr 2008) | 3 lines
Improve efficiency of basic_streambuf::consume() by using a single call to
gbump() rather than calling sbumpc() in a loop.
................
r44667 | chris_kohlhoff | 2008-04-20 18:41:29 -0700 (Sun, 20 Apr 2008) | 2 lines
Update version number to match release.
................
r44668 | chris_kohlhoff | 2008-04-20 18:42:10 -0700 (Sun, 20 Apr 2008) | 2 lines
Fix infinite recursion in the ssl::stream's shutdown() implementation.
................
r44669 | hkaiser | 2008-04-20 19:01:31 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Qi: Added ~ for eoi and eol, added corresponding tests
................
r44670 | chris_kohlhoff | 2008-04-20 19:01:34 -0700 (Sun, 20 Apr 2008) | 2 lines
Improve documentation for the protected functions and data in basic_io_object<>.
................
r44671 | hkaiser | 2008-04-20 19:02:37 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Qi: Added new test to test Jamfile
................
r44672 | hkaiser | 2008-04-20 19:04:06 -0700 (Sun, 20 Apr 2008) | 1 line
Spirit.Lex: pending commits, fixed static lexer.
................
r44673 | chris_kohlhoff | 2008-04-20 21:02:37 -0700 (Sun, 20 Apr 2008) | 4 lines
Add a special null_buffers type that allows read and write operations to
be used to indicate the socket's readiness to read or write without
blocking.
................
r44674 | chris_kohlhoff | 2008-04-20 21:43:05 -0700 (Sun, 20 Apr 2008) | 2 lines
Add support for UNIX domain sockets.
................
r44675 | chris_kohlhoff | 2008-04-20 22:16:15 -0700 (Sun, 20 Apr 2008) | 2 lines
Add new wrapper classes for stream-oriented file descriptors on POSIX platforms.
................
r44676 | chris_kohlhoff | 2008-04-20 22:32:34 -0700 (Sun, 20 Apr 2008) | 2 lines
Add new wrapper classes for stream-oriented handles on Windows.
................
Added:
branches/proto/v4/boost/asio/detail/descriptor_ops.hpp
- copied unchanged from r44676, /trunk/boost/asio/detail/descriptor_ops.hpp
branches/proto/v4/boost/asio/detail/reactive_descriptor_service.hpp
- copied unchanged from r44676, /trunk/boost/asio/detail/reactive_descriptor_service.hpp
branches/proto/v4/boost/asio/detail/win_iocp_handle_service.hpp
- copied unchanged from r44676, /trunk/boost/asio/detail/win_iocp_handle_service.hpp
branches/proto/v4/boost/asio/local/
- copied from r44676, /trunk/boost/asio/local/
branches/proto/v4/boost/asio/local/basic_endpoint.hpp
- copied unchanged from r44676, /trunk/boost/asio/local/basic_endpoint.hpp
branches/proto/v4/boost/asio/local/connect_pair.hpp
- copied unchanged from r44676, /trunk/boost/asio/local/connect_pair.hpp
branches/proto/v4/boost/asio/local/datagram_protocol.hpp
- copied unchanged from r44676, /trunk/boost/asio/local/datagram_protocol.hpp
branches/proto/v4/boost/asio/local/stream_protocol.hpp
- copied unchanged from r44676, /trunk/boost/asio/local/stream_protocol.hpp
branches/proto/v4/boost/asio/posix/
- copied from r44676, /trunk/boost/asio/posix/
branches/proto/v4/boost/asio/posix/basic_descriptor.hpp
- copied unchanged from r44676, /trunk/boost/asio/posix/basic_descriptor.hpp
branches/proto/v4/boost/asio/posix/basic_stream_descriptor.hpp
- copied unchanged from r44676, /trunk/boost/asio/posix/basic_stream_descriptor.hpp
branches/proto/v4/boost/asio/posix/descriptor_base.hpp
- copied unchanged from r44676, /trunk/boost/asio/posix/descriptor_base.hpp
branches/proto/v4/boost/asio/posix/stream_descriptor.hpp
- copied unchanged from r44676, /trunk/boost/asio/posix/stream_descriptor.hpp
branches/proto/v4/boost/asio/posix/stream_descriptor_service.hpp
- copied unchanged from r44676, /trunk/boost/asio/posix/stream_descriptor_service.hpp
branches/proto/v4/boost/asio/windows/
- copied from r44676, /trunk/boost/asio/windows/
branches/proto/v4/boost/asio/windows/basic_handle.hpp
- copied unchanged from r44676, /trunk/boost/asio/windows/basic_handle.hpp
branches/proto/v4/boost/asio/windows/basic_stream_handle.hpp
- copied unchanged from r44676, /trunk/boost/asio/windows/basic_stream_handle.hpp
branches/proto/v4/boost/asio/windows/stream_handle.hpp
- copied unchanged from r44676, /trunk/boost/asio/windows/stream_handle.hpp
branches/proto/v4/boost/asio/windows/stream_handle_service.hpp
- copied unchanged from r44676, /trunk/boost/asio/windows/stream_handle_service.hpp
branches/proto/v4/boost/config/warning_disable.hpp
- copied unchanged from r44676, /trunk/boost/config/warning_disable.hpp
branches/proto/v4/boost/detail/lightweight_thread.hpp
- copied unchanged from r44676, /trunk/boost/detail/lightweight_thread.hpp
branches/proto/v4/boost/math/special_functions/detail/round_fwd.hpp
- copied unchanged from r44676, /trunk/boost/math/special_functions/detail/round_fwd.hpp
branches/proto/v4/boost/memory_order.hpp
- copied unchanged from r44676, /trunk/boost/memory_order.hpp
branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp
- copied unchanged from r44676, /trunk/boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp
branches/proto/v4/boost/spirit/home/qi/auxiliary/primitives.hpp
- copied unchanged from r44676, /trunk/boost/spirit/home/qi/auxiliary/primitives.hpp
branches/proto/v4/boost/unordered/detail/allocator_helpers.hpp
- copied unchanged from r44676, /trunk/boost/unordered/detail/allocator_helpers.hpp
branches/proto/v4/libs/asio/example/nonblocking/
- copied from r44676, /trunk/libs/asio/example/nonblocking/
branches/proto/v4/libs/asio/example/nonblocking/Jamfile
- copied unchanged from r44676, /trunk/libs/asio/example/nonblocking/Jamfile
branches/proto/v4/libs/asio/example/nonblocking/Jamfile.v2
- copied unchanged from r44676, /trunk/libs/asio/example/nonblocking/Jamfile.v2
branches/proto/v4/libs/asio/example/nonblocking/third_party_lib.cpp
- copied unchanged from r44676, /trunk/libs/asio/example/nonblocking/third_party_lib.cpp
branches/proto/v4/libs/asio/test/local/
- copied from r44676, /trunk/libs/asio/test/local/
branches/proto/v4/libs/asio/test/local/basic_endpoint.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/local/basic_endpoint.cpp
branches/proto/v4/libs/asio/test/local/connect_pair.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/local/connect_pair.cpp
branches/proto/v4/libs/asio/test/local/datagram_protocol.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/local/datagram_protocol.cpp
branches/proto/v4/libs/asio/test/local/stream_protocol.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/local/stream_protocol.cpp
branches/proto/v4/libs/asio/test/posix/
- copied from r44676, /trunk/libs/asio/test/posix/
branches/proto/v4/libs/asio/test/posix/basic_descriptor.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/posix/basic_descriptor.cpp
branches/proto/v4/libs/asio/test/posix/basic_stream_descriptor.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/posix/basic_stream_descriptor.cpp
branches/proto/v4/libs/asio/test/posix/descriptor_base.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/posix/descriptor_base.cpp
branches/proto/v4/libs/asio/test/posix/stream_descriptor.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/posix/stream_descriptor.cpp
branches/proto/v4/libs/asio/test/posix/stream_descriptor_service.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/posix/stream_descriptor_service.cpp
branches/proto/v4/libs/asio/test/windows/
- copied from r44676, /trunk/libs/asio/test/windows/
branches/proto/v4/libs/asio/test/windows/basic_handle.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/windows/basic_handle.cpp
branches/proto/v4/libs/asio/test/windows/basic_stream_handle.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/windows/basic_stream_handle.cpp
branches/proto/v4/libs/asio/test/windows/stream_handle.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/windows/stream_handle.cpp
branches/proto/v4/libs/asio/test/windows/stream_handle_service.cpp
- copied unchanged from r44676, /trunk/libs/asio/test/windows/stream_handle_service.cpp
branches/proto/v4/libs/smart_ptr/test/sp_atomic_mt_test.cpp
- copied unchanged from r44676, /trunk/libs/smart_ptr/test/sp_atomic_mt_test.cpp
branches/proto/v4/libs/smart_ptr/test/sp_atomic_test.cpp
- copied unchanged from r44676, /trunk/libs/smart_ptr/test/sp_atomic_test.cpp
branches/proto/v4/libs/spirit/test/karma/actions.cpp
- copied unchanged from r44676, /trunk/libs/spirit/test/karma/actions.cpp
branches/proto/v4/libs/spirit/test/qi/end.cpp
- copied unchanged from r44676, /trunk/libs/spirit/test/qi/end.cpp
Removed:
branches/proto/v4/boost/spirit/home/qi/char/primitives.hpp
branches/proto/v4/boost/unordered/detail/allocator.hpp
Properties modified:
branches/proto/v4/ (props changed)
Text files modified:
branches/proto/v4/boost/asio.hpp | 13 +
branches/proto/v4/boost/asio/basic_io_object.hpp | 12 +
branches/proto/v4/boost/asio/basic_streambuf.hpp | 8
branches/proto/v4/boost/asio/buffer.hpp | 27 +++
branches/proto/v4/boost/asio/detail/consuming_buffers.hpp | 20 ++
branches/proto/v4/boost/asio/detail/dev_poll_reactor.hpp | 20 +-
branches/proto/v4/boost/asio/detail/epoll_reactor.hpp | 14 +
branches/proto/v4/boost/asio/detail/kqueue_reactor.hpp | 14 +
branches/proto/v4/boost/asio/detail/reactive_socket_service.hpp | 180 +++++++++++++++++++++++++
branches/proto/v4/boost/asio/detail/select_reactor.hpp | 6
branches/proto/v4/boost/asio/detail/service_registry.hpp | 10 +
branches/proto/v4/boost/asio/detail/socket_ops.hpp | 12 +
branches/proto/v4/boost/asio/detail/socket_types.hpp | 2
branches/proto/v4/boost/asio/detail/win_iocp_io_service.hpp | 29 ++-
branches/proto/v4/boost/asio/detail/win_iocp_socket_service.hpp | 281 +++++++++++++++++++++++++++++++++++++++
branches/proto/v4/boost/asio/error.hpp | 3
branches/proto/v4/boost/asio/ssl/detail/openssl_operation.hpp | 9
branches/proto/v4/boost/asio/version.hpp | 2
branches/proto/v4/boost/detail/shared_count.hpp | 7
branches/proto/v4/boost/function_types/detail/pp_retag_default_cc/master.hpp | 4
branches/proto/v4/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp | 4
branches/proto/v4/boost/function_types/detail/pp_tags/master.hpp | 2
branches/proto/v4/boost/function_types/detail/pp_tags/preprocessed.hpp | 2
branches/proto/v4/boost/math/concepts/real_concept.hpp | 112 +++++----------
branches/proto/v4/boost/math/concepts/std_real_concept.hpp | 142 ++++++++++----------
branches/proto/v4/boost/math/special_functions/math_fwd.hpp | 39 +---
branches/proto/v4/boost/math/tools/config.hpp | 10 +
branches/proto/v4/boost/shared_ptr.hpp | 70 +++++++++
branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_functor.hpp | 39 ++++-
branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_iterator.hpp | 2
branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_lexer.hpp | 9
branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_static_functor.hpp | 44 +++++-
branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_static_lexer.hpp | 4
branches/proto/v4/boost/spirit/home/lex/lexer/token_def.hpp | 4
branches/proto/v4/boost/spirit/home/lex/lexer/token_set.hpp | 4
branches/proto/v4/boost/spirit/home/qi/auxiliary.hpp | 1
branches/proto/v4/boost/spirit/home/qi/auxiliary/meta_grammar.hpp | 41 +++++
branches/proto/v4/boost/spirit/home/qi/char.hpp | 1
branches/proto/v4/boost/spirit/home/qi/char/char.hpp | 99 +++++++++++--
branches/proto/v4/boost/spirit/home/qi/char/meta_grammar.hpp | 64 ++++----
branches/proto/v4/boost/spirit/home/support/component.hpp | 10
branches/proto/v4/boost/spirit/home/support/detail/lexer/consts.hpp | 9
branches/proto/v4/boost/spirit/home/support/detail/lexer/generator.hpp | 4
branches/proto/v4/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser.hpp | 4
branches/proto/v4/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_helper.hpp | 4
branches/proto/v4/boost/spirit/home/support/iterators/detail/combine_policies.hpp | 2
branches/proto/v4/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp | 1
branches/proto/v4/boost/spirit/home/support/placeholders.hpp | 2
branches/proto/v4/boost/unordered/detail/hash_table.hpp | 2
branches/proto/v4/boost/unordered/detail/hash_table_impl.hpp | 17 +
branches/proto/v4/boost/unordered/detail/move.hpp | 8
branches/proto/v4/boost/wave/cpplexer/cpp_lex_iterator.hpp | 9
branches/proto/v4/boost/wave/util/macro_helpers.hpp | 1
branches/proto/v4/libs/asio/doc/using.qbk | 7
branches/proto/v4/libs/asio/example/invocation/prioritised_handlers.cpp | 23 ++
branches/proto/v4/libs/asio/test/Jamfile | 13 +
branches/proto/v4/libs/asio/test/Jamfile.v2 | 26 +++
branches/proto/v4/libs/asio/test/ip/tcp.cpp | 15 ++
branches/proto/v4/libs/asio/test/ip/udp.cpp | 37 +++++
branches/proto/v4/libs/config/doc/guidelines.qbk | 26 +++
branches/proto/v4/libs/config/doc/html/boost_config/guidelines_for_boost_authors.html | 81 +++++++++++
branches/proto/v4/libs/config/doc/html/index.html | 4
branches/proto/v4/libs/filesystem/doc/reference.html | 4
branches/proto/v4/libs/math/test/compile_test/instantiate.hpp | 30 ++-
branches/proto/v4/libs/smart_ptr/test/Jamfile.v2 | 1
branches/proto/v4/libs/smart_ptr/test/shared_ptr_mt_test.cpp | 139 +++----------------
branches/proto/v4/libs/smart_ptr/test/weak_ptr_mt_test.cpp | 132 ++---------------
branches/proto/v4/libs/spirit/doc/lex/lexer_quickstart2.qbk | 49 +++---
branches/proto/v4/libs/spirit/example/lex/static_lexer/word_count_generate.cpp | 2
branches/proto/v4/libs/spirit/example/lex/static_lexer/word_count_static.hpp | 10
branches/proto/v4/libs/spirit/example/lex/word_count_lexer.cpp | 9
branches/proto/v4/libs/spirit/test/Jamfile | 7
branches/proto/v4/libs/spirit/test/karma/test.hpp | 1
branches/proto/v4/libs/spirit/test/qi/actions.cpp | 10
branches/proto/v4/libs/spirit/test/qi/binary.cpp | 8
branches/proto/v4/libs/spirit/test/qi/char.cpp | 32 ----
branches/proto/v4/libs/spirit/test/qi/no_case.cpp | 9 +
branches/proto/v4/libs/unordered/test/objects/memory.hpp | 2
branches/proto/v4/libs/wave/samples/cpp_tokens/slex_iterator.hpp | 4
branches/proto/v4/libs/wave/samples/list_includes/lexertl_iterator.hpp | 6
branches/proto/v4/libs/wave/test/build/Jamfile.v2 | 2
81 files changed, 1479 insertions(+), 649 deletions(-)
Modified: branches/proto/v4/boost/asio.hpp
==============================================================================
--- branches/proto/v4/boost/asio.hpp (original)
+++ branches/proto/v4/boost/asio.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -58,7 +58,16 @@
#include <boost/asio/ip/v6_only.hpp>
#include <boost/asio/is_read_buffered.hpp>
#include <boost/asio/is_write_buffered.hpp>
+#include <boost/asio/local/basic_endpoint.hpp>
+#include <boost/asio/local/connect_pair.hpp>
+#include <boost/asio/local/datagram_protocol.hpp>
+#include <boost/asio/local/stream_protocol.hpp>
#include <boost/asio/placeholders.hpp>
+#include <boost/asio/posix/basic_descriptor.hpp>
+#include <boost/asio/posix/basic_stream_descriptor.hpp>
+#include <boost/asio/posix/descriptor_base.hpp>
+#include <boost/asio/posix/stream_descriptor.hpp>
+#include <boost/asio/posix/stream_descriptor_service.hpp>
#include <boost/asio/read.hpp>
#include <boost/asio/read_until.hpp>
#include <boost/asio/socket_acceptor_service.hpp>
@@ -68,6 +77,10 @@
#include <boost/asio/streambuf.hpp>
#include <boost/asio/time_traits.hpp>
#include <boost/asio/version.hpp>
+#include <boost/asio/windows/basic_handle.hpp>
+#include <boost/asio/windows/basic_stream_handle.hpp>
+#include <boost/asio/windows/stream_handle.hpp>
+#include <boost/asio/windows/stream_handle_service.hpp>
#include <boost/asio/write.hpp>
#endif // BOOST_ASIO_HPP
Modified: branches/proto/v4/boost/asio/basic_io_object.hpp
==============================================================================
--- branches/proto/v4/boost/asio/basic_io_object.hpp (original)
+++ branches/proto/v4/boost/asio/basic_io_object.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -64,6 +64,10 @@
protected:
/// Construct a basic_io_object.
+ /**
+ * Performs:
+ * @code service.construct(implementation); @endcode
+ */
explicit basic_io_object(boost::asio::io_service& io_service)
: service(boost::asio::use_service<IoObjectService>(io_service))
{
@@ -71,15 +75,19 @@
}
/// Protected destructor to prevent deletion through this type.
+ /**
+ * Performs:
+ * @code service.destroy(implementation); @endcode
+ */
~basic_io_object()
{
service.destroy(implementation);
}
- // The backend service implementation.
+ /// The service associated with the I/O object.
service_type& service;
- // The underlying native implementation.
+ /// The underlying implementation of the I/O object.
implementation_type implementation;
};
Modified: branches/proto/v4/boost/asio/basic_streambuf.hpp
==============================================================================
--- branches/proto/v4/boost/asio/basic_streambuf.hpp (original)
+++ branches/proto/v4/boost/asio/basic_streambuf.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -101,11 +101,9 @@
/// Move the start of the get area by the specified number of characters.
void consume(std::size_t n)
{
- while (n > 0)
- {
- sbumpc();
- --n;
- }
+ if (gptr() + n > pptr())
+ n = pptr() - gptr();
+ gbump(static_cast<int>(n));
}
protected:
Modified: branches/proto/v4/boost/asio/buffer.hpp
==============================================================================
--- branches/proto/v4/boost/asio/buffer.hpp (original)
+++ branches/proto/v4/boost/asio/buffer.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -379,6 +379,33 @@
}
};
+/// An implementation of both the ConstBufferSequence and MutableBufferSequence
+/// concepts to represent a null buffer sequence.
+class null_buffers
+{
+public:
+ /// The type for each element in the list of buffers.
+ typedef mutable_buffer value_type;
+
+ /// A random-access iterator type that may be used to read elements.
+ typedef const mutable_buffer* const_iterator;
+
+ /// Get a random-access iterator to the first element.
+ const_iterator begin() const
+ {
+ return &buf_;
+ }
+
+ /// Get a random-access iterator for one past the last element.
+ const_iterator end() const
+ {
+ return &buf_;
+ }
+
+private:
+ mutable_buffer buf_;
+};
+
#if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING)
namespace detail {
Modified: branches/proto/v4/boost/asio/detail/consuming_buffers.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/consuming_buffers.hpp (original)
+++ branches/proto/v4/boost/asio/detail/consuming_buffers.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -24,6 +24,8 @@
#include <boost/iterator/iterator_facade.hpp>
#include <boost/asio/detail/pop_options.hpp>
+#include <boost/asio/buffer.hpp>
+
namespace boost {
namespace asio {
namespace detail {
@@ -198,6 +200,24 @@
typename Buffers::const_iterator begin_remainder_;
};
+// Specialisation for null_buffers to ensure that the null_buffers type is
+// always passed through to the underlying read or write operation.
+template <typename Buffer>
+class consuming_buffers<Buffer, boost::asio::null_buffers>
+ : public boost::asio::null_buffers
+{
+public:
+ consuming_buffers(const boost::asio::null_buffers&)
+ {
+ // No-op.
+ }
+
+ void consume(std::size_t)
+ {
+ // No-op.
+ }
+};
+
} // namespace detail
} // namespace asio
} // namespace boost
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -128,16 +128,18 @@
// 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, Handler handler)
+ void start_read_op(socket_type descriptor, Handler handler,
+ bool allow_speculative_read = true)
{
boost::asio::detail::mutex::scoped_lock lock(mutex_);
if (shutdown_)
return;
- if (!read_op_queue_.has_operation(descriptor))
- if (handler(boost::system::error_code()))
- return;
+ if (allow_speculative_read)
+ if (!read_op_queue_.has_operation(descriptor))
+ if (handler(boost::system::error_code()))
+ return;
if (read_op_queue_.enqueue_operation(descriptor, handler))
{
@@ -154,16 +156,18 @@
// 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, Handler handler)
+ void start_write_op(socket_type descriptor, Handler handler,
+ bool allow_speculative_write = true)
{
boost::asio::detail::mutex::scoped_lock lock(mutex_);
if (shutdown_)
return;
- if (!write_op_queue_.has_operation(descriptor))
- if (handler(boost::system::error_code()))
- return;
+ if (allow_speculative_write)
+ if (!write_op_queue_.has_operation(descriptor))
+ if (handler(boost::system::error_code()))
+ return;
if (write_op_queue_.enqueue_operation(descriptor, handler))
{
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -135,14 +135,17 @@
// 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, Handler handler)
+ void start_read_op(socket_type descriptor, Handler handler,
+ bool allow_speculative_read = true)
{
boost::asio::detail::mutex::scoped_lock lock(mutex_);
if (shutdown_)
return;
- if (!read_op_queue_.has_operation(descriptor))
+ if (!allow_speculative_read)
+ need_epoll_wait_ = true;
+ else if (!read_op_queue_.has_operation(descriptor))
if (handler(boost::system::error_code()))
return;
@@ -171,14 +174,17 @@
// 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, Handler handler)
+ void start_write_op(socket_type descriptor, Handler handler,
+ bool allow_speculative_write = true)
{
boost::asio::detail::mutex::scoped_lock lock(mutex_);
if (shutdown_)
return;
- if (!write_op_queue_.has_operation(descriptor))
+ if (!allow_speculative_write)
+ need_epoll_wait_ = true;
+ else if (!write_op_queue_.has_operation(descriptor))
if (handler(boost::system::error_code()))
return;
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -135,14 +135,17 @@
// 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, Handler handler)
+ void start_read_op(socket_type descriptor, Handler handler,
+ bool allow_speculative_read = true)
{
boost::asio::detail::mutex::scoped_lock lock(mutex_);
if (shutdown_)
return;
- if (!read_op_queue_.has_operation(descriptor))
+ if (!allow_speculative_read)
+ need_kqueue_wait_ = true;
+ else if (!read_op_queue_.has_operation(descriptor))
if (handler(boost::system::error_code()))
return;
@@ -162,14 +165,17 @@
// 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, Handler handler)
+ void start_write_op(socket_type descriptor, Handler handler,
+ bool allow_speculative_write = true)
{
boost::asio::detail::mutex::scoped_lock lock(mutex_);
if (shutdown_)
return;
- if (!write_op_queue_.has_operation(descriptor))
+ if (!allow_speculative_write)
+ need_kqueue_wait_ = true;
+ else if (!write_op_queue_.has_operation(descriptor))
if (handler(boost::system::error_code()))
return;
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -559,6 +559,22 @@
}
}
+ // Wait until data can be sent without blocking.
+ size_t send(implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, boost::system::error_code& ec)
+ {
+ if (!is_open(impl))
+ {
+ ec = boost::asio::error::bad_descriptor;
+ return 0;
+ }
+
+ // Wait for socket to become ready.
+ socket_ops::poll_write(impl.socket_, ec);
+
+ return 0;
+ }
+
template <typename ConstBufferSequence, typename Handler>
class send_handler
{
@@ -673,6 +689,45 @@
}
}
+ template <typename Handler>
+ class null_buffers_handler
+ {
+ public:
+ null_buffers_handler(boost::asio::io_service& io_service, Handler handler)
+ : work_(io_service),
+ handler_(handler)
+ {
+ }
+
+ bool operator()(const boost::system::error_code& result)
+ {
+ work_.get_io_service().post(bind_handler(handler_, result, 0));
+ return true;
+ }
+
+ private:
+ boost::asio::io_service::work work_;
+ Handler handler_;
+ };
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler>
+ void async_send(implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, Handler handler)
+ {
+ if (!is_open(impl))
+ {
+ this->get_io_service().post(bind_handler(handler,
+ boost::asio::error::bad_descriptor, 0));
+ }
+ else
+ {
+ reactor_.start_write_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler),
+ false);
+ }
+ }
+
// Send a datagram to the specified endpoint. Returns the number of bytes
// sent.
template <typename ConstBufferSequence>
@@ -734,6 +789,23 @@
}
}
+ // Wait until data can be sent without blocking.
+ size_t send_to(implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, const endpoint_type&,
+ boost::system::error_code& ec)
+ {
+ if (!is_open(impl))
+ {
+ ec = boost::asio::error::bad_descriptor;
+ return 0;
+ }
+
+ // Wait for socket to become ready.
+ socket_ops::poll_write(impl.socket_, ec);
+
+ return 0;
+ }
+
template <typename ConstBufferSequence, typename Handler>
class send_to_handler
{
@@ -832,6 +904,24 @@
}
}
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler>
+ void async_send_to(implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, const endpoint_type&, Handler handler)
+ {
+ if (!is_open(impl))
+ {
+ this->get_io_service().post(bind_handler(handler,
+ boost::asio::error::bad_descriptor, 0));
+ }
+ else
+ {
+ reactor_.start_write_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler),
+ false);
+ }
+ }
+
// Receive some data from the peer. Returns the number of bytes received.
template <typename MutableBufferSequence>
size_t receive(implementation_type& impl,
@@ -907,6 +997,23 @@
}
}
+ // Wait until data can be received without blocking.
+ size_t receive(implementation_type& impl,
+ const null_buffers& buffers,
+ socket_base::message_flags, boost::system::error_code& ec)
+ {
+ if (!is_open(impl))
+ {
+ ec = boost::asio::error::bad_descriptor;
+ return 0;
+ }
+
+ // Wait for socket to become ready.
+ socket_ops::poll_read(impl.socket_, ec);
+
+ return 0;
+ }
+
template <typename MutableBufferSequence, typename Handler>
class receive_handler
{
@@ -1033,6 +1140,29 @@
}
}
+ // Wait until data can be received without blocking.
+ template <typename Handler>
+ void async_receive(implementation_type& impl, const null_buffers&,
+ socket_base::message_flags flags, Handler handler)
+ {
+ if (!is_open(impl))
+ {
+ this->get_io_service().post(bind_handler(handler,
+ boost::asio::error::bad_descriptor, 0));
+ }
+ else if (flags & socket_base::message_out_of_band)
+ {
+ reactor_.start_except_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler));
+ }
+ else
+ {
+ reactor_.start_read_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler),
+ false);
+ }
+ }
+
// Receive a datagram with the endpoint of the sender. Returns the number of
// bytes received.
template <typename MutableBufferSequence>
@@ -1106,6 +1236,26 @@
}
}
+ // Wait until data can be received without blocking.
+ size_t receive_from(implementation_type& impl,
+ const null_buffers& buffers, endpoint_type& sender_endpoint,
+ socket_base::message_flags, boost::system::error_code& ec)
+ {
+ if (!is_open(impl))
+ {
+ ec = boost::asio::error::bad_descriptor;
+ return 0;
+ }
+
+ // Wait for socket to become ready.
+ socket_ops::poll_read(impl.socket_, ec);
+
+ // Reset endpoint since it can be given no sensible value at this time.
+ sender_endpoint = endpoint_type();
+
+ return 0;
+ }
+
template <typename MutableBufferSequence, typename Handler>
class receive_from_handler
{
@@ -1209,6 +1359,36 @@
}
}
+ // Wait until data can be received without blocking.
+ template <typename Handler>
+ void async_receive_from(implementation_type& impl,
+ const null_buffers&, endpoint_type& sender_endpoint,
+ socket_base::message_flags flags, Handler handler)
+ {
+ if (!is_open(impl))
+ {
+ this->get_io_service().post(bind_handler(handler,
+ boost::asio::error::bad_descriptor, 0));
+ }
+ else
+ {
+ // Reset endpoint since it can be given no sensible value at this time.
+ sender_endpoint = endpoint_type();
+
+ if (flags & socket_base::message_out_of_band)
+ {
+ reactor_.start_except_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler));
+ }
+ else
+ {
+ reactor_.start_read_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler),
+ false);
+ }
+ }
+ }
+
// Accept a new connection.
template <typename Socket>
boost::system::error_code accept(implementation_type& impl,
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -115,7 +115,8 @@
// 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, Handler handler)
+ void start_read_op(socket_type descriptor, Handler handler,
+ bool /*allow_speculative_read*/ = true)
{
boost::asio::detail::mutex::scoped_lock lock(mutex_);
if (!shutdown_)
@@ -126,7 +127,8 @@
// 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, Handler handler)
+ void start_write_op(socket_type descriptor, Handler handler,
+ bool /*allow_speculative_write*/ = true)
{
boost::asio::detail::mutex::scoped_lock lock(mutex_);
if (!shutdown_)
Modified: branches/proto/v4/boost/asio/detail/service_registry.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/service_registry.hpp (original)
+++ branches/proto/v4/boost/asio/detail/service_registry.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -27,6 +27,12 @@
#include <boost/asio/detail/noncopyable.hpp>
#include <boost/asio/detail/service_id.hpp>
+#if defined(BOOST_NO_TYPEID)
+# if !defined(BOOST_ASIO_NO_TYPEID)
+# define BOOST_ASIO_NO_TYPEID
+# endif // !defined(BOOST_ASIO_NO_TYPEID)
+#endif // defined(BOOST_NO_TYPEID)
+
namespace boost {
namespace asio {
namespace detail {
@@ -157,6 +163,7 @@
service.id_ = &id;
}
+#if !defined(BOOST_ASIO_NO_TYPEID)
// Set a service's id.
template <typename Service>
void init_service_id(boost::asio::io_service::service& service,
@@ -165,6 +172,7 @@
service.type_info_ = &typeid(Service);
service.id_ = 0;
}
+#endif // !defined(BOOST_ASIO_NO_TYPEID)
// Check if a service matches the given id.
static bool service_id_matches(
@@ -174,6 +182,7 @@
return service.id_ == &id;
}
+#if !defined(BOOST_ASIO_NO_TYPEID)
// Check if a service matches the given id.
template <typename Service>
static bool service_id_matches(
@@ -182,6 +191,7 @@
{
return service.type_info_ != 0 && *service.type_info_ == typeid(Service);
}
+#endif // !defined(BOOST_ASIO_NO_TYPEID)
// Mutex to protect access to internal data.
mutable boost::asio::detail::mutex mutex_;
Modified: branches/proto/v4/boost/asio/detail/socket_ops.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/socket_ops.hpp (original)
+++ branches/proto/v4/boost/asio/detail/socket_ops.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -176,6 +176,18 @@
return result;
}
+inline int socketpair(int af, int type, int protocol,
+ socket_type sv[2], boost::system::error_code& ec)
+{
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+ ec = boost::asio::error::operation_not_supported;
+ return -1;
+#else
+ clear_error(ec);
+ return error_wrapper(::socketpair(af, type, protocol, sv), ec);
+#endif
+}
+
inline int listen(socket_type s, int backlog, boost::system::error_code& ec)
{
clear_error(ec);
Modified: branches/proto/v4/boost/asio/detail/socket_types.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/socket_types.hpp (original)
+++ branches/proto/v4/boost/asio/detail/socket_types.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -99,6 +99,7 @@
# endif
# include <sys/socket.h>
# include <sys/uio.h>
+# include <sys/un.h>
# include <netinet/in.h>
# include <netinet/tcp.h>
# include <arpa/inet.h>
@@ -176,6 +177,7 @@
typedef ipv6_mreq in6_mreq_type;
typedef sockaddr_in6 sockaddr_in6_type;
typedef sockaddr_storage sockaddr_storage_type;
+typedef sockaddr_un sockaddr_un_type;
typedef addrinfo addrinfo_type;
typedef int ioctl_arg_type;
typedef uint32_t u_long_type;
Modified: branches/proto/v4/boost/asio/detail/win_iocp_io_service.hpp
==============================================================================
--- branches/proto/v4/boost/asio/detail/win_iocp_io_service.hpp (original)
+++ branches/proto/v4/boost/asio/detail/win_iocp_io_service.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -150,9 +150,20 @@
}
// Register a handle with the IO completion port.
- void register_handle(HANDLE handle)
+ boost::system::error_code register_handle(
+ HANDLE handle, boost::system::error_code& ec)
{
- ::CreateIoCompletionPort(handle, iocp_.handle, 0, 0);
+ if (::CreateIoCompletionPort(handle, iocp_.handle, 0, 0) == 0)
+ {
+ DWORD last_error = ::GetLastError();
+ ec = boost::system::error_code(last_error,
+ boost::asio::error::get_system_category());
+ }
+ else
+ {
+ ec = boost::system::error_code();
+ }
+ return ec;
}
// Run the event loop until stopped or no more work.
@@ -505,16 +516,18 @@
}
else
{
+ // Relinquish responsibility for dispatching timers. If the io_service
+ // is not being stopped then the thread will get an opportunity to
+ // reacquire timer responsibility on the next loop iteration.
+ if (dispatching_timers)
+ {
+ ::InterlockedCompareExchange(&timer_thread_, 0, this_thread_id);
+ }
+
// The stopped_ flag is always checked to ensure that any leftover
// interrupts from a previous run invocation are ignored.
if (::InterlockedExchangeAdd(&stopped_, 0) != 0)
{
- // Relinquish responsibility for dispatching timers.
- if (dispatching_timers)
- {
- ::InterlockedCompareExchange(&timer_thread_, 0, this_thread_id);
- }
-
// Wake up next thread that is blocked on GetQueuedCompletionStatus.
if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, 0))
{
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -24,6 +24,7 @@
#include <boost/asio/detail/push_options.hpp>
#include <cstring>
#include <boost/shared_ptr.hpp>
+#include <boost/type_traits/is_same.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/asio/detail/pop_options.hpp>
@@ -252,7 +253,8 @@
return ec;
HANDLE sock_as_handle = reinterpret_cast<HANDLE>(sock.get());
- iocp_service_.register_handle(sock_as_handle);
+ if (iocp_service_.register_handle(sock_as_handle, ec))
+ return ec;
impl.socket_ = sock.release();
impl.flags_ = 0;
@@ -273,7 +275,8 @@
return ec;
}
- iocp_service_.register_handle(native_socket.as_handle());
+ if (iocp_service_.register_handle(native_socket.as_handle(), ec))
+ return ec;
impl.socket_ = native_socket;
impl.flags_ = 0;
@@ -700,6 +703,22 @@
return bytes_transferred;
}
+ // Wait until data can be sent without blocking.
+ size_t send(implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, boost::system::error_code& ec)
+ {
+ if (!is_open(impl))
+ {
+ ec = boost::asio::error::bad_descriptor;
+ return 0;
+ }
+
+ // Wait for socket to become ready.
+ socket_ops::poll_write(impl.socket_, ec);
+
+ return 0;
+ }
+
template <typename ConstBufferSequence, typename Handler>
class send_operation
: public operation
@@ -858,6 +877,57 @@
}
}
+ template <typename Handler>
+ class null_buffers_handler
+ {
+ public:
+ null_buffers_handler(boost::asio::io_service& io_service, Handler handler)
+ : work_(io_service),
+ handler_(handler)
+ {
+ }
+
+ bool operator()(const boost::system::error_code& result)
+ {
+ work_.get_io_service().post(bind_handler(handler_, result, 0));
+ return true;
+ }
+
+ private:
+ boost::asio::io_service::work work_;
+ Handler handler_;
+ };
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler>
+ void async_send(implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, Handler handler)
+ {
+ if (!is_open(impl))
+ {
+ this->get_io_service().post(bind_handler(handler,
+ boost::asio::error::bad_descriptor, 0));
+ }
+ else
+ {
+ // Check if the reactor was already obtained from the io_service.
+ reactor_type* reactor = static_cast<reactor_type*>(
+ interlocked_compare_exchange_pointer(
+ reinterpret_cast<void**>(&reactor_), 0, 0));
+ if (!reactor)
+ {
+ reactor = &(boost::asio::use_service<reactor_type>(
+ this->get_io_service()));
+ interlocked_exchange_pointer(
+ reinterpret_cast<void**>(&reactor_), reactor);
+ }
+
+ reactor->start_write_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler),
+ false);
+ }
+ }
+
// Send a datagram to the specified endpoint. Returns the number of bytes
// sent.
template <typename ConstBufferSequence>
@@ -902,6 +972,23 @@
return bytes_transferred;
}
+ // Wait until data can be sent without blocking.
+ size_t send_to(implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, const endpoint_type&,
+ boost::system::error_code& ec)
+ {
+ if (!is_open(impl))
+ {
+ ec = boost::asio::error::bad_descriptor;
+ return 0;
+ }
+
+ // Wait for socket to become ready.
+ socket_ops::poll_write(impl.socket_, ec);
+
+ return 0;
+ }
+
template <typename ConstBufferSequence, typename Handler>
class send_to_operation
: public operation
@@ -1038,6 +1125,36 @@
}
}
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler>
+ void async_send_to(implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, const endpoint_type&, Handler handler)
+ {
+ if (!is_open(impl))
+ {
+ this->get_io_service().post(bind_handler(handler,
+ boost::asio::error::bad_descriptor, 0));
+ }
+ else
+ {
+ // Check if the reactor was already obtained from the io_service.
+ reactor_type* reactor = static_cast<reactor_type*>(
+ interlocked_compare_exchange_pointer(
+ reinterpret_cast<void**>(&reactor_), 0, 0));
+ if (!reactor)
+ {
+ reactor = &(boost::asio::use_service<reactor_type>(
+ this->get_io_service()));
+ interlocked_exchange_pointer(
+ reinterpret_cast<void**>(&reactor_), reactor);
+ }
+
+ reactor->start_write_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler),
+ false);
+ }
+ }
+
// Receive some data from the peer. Returns the number of bytes received.
template <typename MutableBufferSequence>
size_t receive(implementation_type& impl,
@@ -1097,6 +1214,23 @@
return bytes_transferred;
}
+ // Wait until data can be received without blocking.
+ size_t receive(implementation_type& impl,
+ const null_buffers& buffers,
+ socket_base::message_flags, boost::system::error_code& ec)
+ {
+ if (!is_open(impl))
+ {
+ ec = boost::asio::error::bad_descriptor;
+ return 0;
+ }
+
+ // Wait for socket to become ready.
+ socket_ops::poll_read(impl.socket_, ec);
+
+ return 0;
+ }
+
template <typename MutableBufferSequence, typename Handler>
class receive_operation
: public operation
@@ -1157,7 +1291,8 @@
}
// Check for connection closed.
- else if (!ec && bytes_transferred == 0)
+ else if (!ec && bytes_transferred == 0
+ && !boost::is_same<MutableBufferSequence, null_buffers>::value)
{
ec = boost::asio::error::eof;
}
@@ -1262,6 +1397,84 @@
}
}
+ // Wait until data can be received without blocking.
+ template <typename Handler>
+ void async_receive(implementation_type& impl, const null_buffers& buffers,
+ socket_base::message_flags flags, Handler handler)
+ {
+ if (!is_open(impl))
+ {
+ this->get_io_service().post(bind_handler(handler,
+ boost::asio::error::bad_descriptor, 0));
+ }
+ else if (impl.protocol_.type() == SOCK_STREAM)
+ {
+ // For stream sockets on Windows, we may issue a 0-byte overlapped
+ // WSARecv to wait until there is data available on the socket.
+
+#if defined(BOOST_ASIO_ENABLE_CANCELIO)
+ // Update the ID of the thread from which cancellation is safe.
+ if (impl.safe_cancellation_thread_id_ == 0)
+ impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId();
+ else if (impl.safe_cancellation_thread_id_ != ::GetCurrentThreadId())
+ impl.safe_cancellation_thread_id_ = ~DWORD(0);
+#endif // defined(BOOST_ASIO_ENABLE_CANCELIO)
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef receive_operation<null_buffers, Handler> value_type;
+ typedef handler_alloc_traits<Handler, value_type> alloc_traits;
+ raw_handler_ptr<alloc_traits> raw_ptr(handler);
+ handler_ptr<alloc_traits> ptr(raw_ptr, iocp_service_,
+ impl.cancel_token_, buffers, handler);
+
+ // Issue a receive operation with an empty buffer.
+ ::WSABUF buf = { 0, 0 };
+ DWORD bytes_transferred = 0;
+ DWORD recv_flags = flags;
+ int result = ::WSARecv(impl.socket_, &buf, 1,
+ &bytes_transferred, &recv_flags, ptr.get(), 0);
+ DWORD last_error = ::WSAGetLastError();
+ if (result != 0 && last_error != WSA_IO_PENDING)
+ {
+ boost::asio::io_service::work work(this->get_io_service());
+ ptr.reset();
+ boost::system::error_code ec(last_error,
+ boost::asio::error::get_system_category());
+ iocp_service_.post(bind_handler(handler, ec, bytes_transferred));
+ }
+ else
+ {
+ ptr.release();
+ }
+ }
+ else
+ {
+ // Check if the reactor was already obtained from the io_service.
+ reactor_type* reactor = static_cast<reactor_type*>(
+ interlocked_compare_exchange_pointer(
+ reinterpret_cast<void**>(&reactor_), 0, 0));
+ if (!reactor)
+ {
+ reactor = &(boost::asio::use_service<reactor_type>(
+ this->get_io_service()));
+ interlocked_exchange_pointer(
+ reinterpret_cast<void**>(&reactor_), reactor);
+ }
+
+ if (flags & socket_base::message_out_of_band)
+ {
+ reactor->start_except_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler));
+ }
+ else
+ {
+ reactor->start_read_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler),
+ false);
+ }
+ }
+ }
+
// Receive a datagram with the endpoint of the sender. Returns the number of
// bytes received.
template <typename MutableBufferSequence>
@@ -1315,6 +1528,26 @@
return bytes_transferred;
}
+ // Wait until data can be received without blocking.
+ size_t receive_from(implementation_type& impl,
+ const null_buffers& buffers, endpoint_type& sender_endpoint,
+ socket_base::message_flags, boost::system::error_code& ec)
+ {
+ if (!is_open(impl))
+ {
+ ec = boost::asio::error::bad_descriptor;
+ return 0;
+ }
+
+ // Wait for socket to become ready.
+ socket_ops::poll_read(impl.socket_, ec);
+
+ // Reset endpoint since it can be given no sensible value at this time.
+ sender_endpoint = endpoint_type();
+
+ return 0;
+ }
+
template <typename MutableBufferSequence, typename Handler>
class receive_from_operation
: public operation
@@ -1473,6 +1706,48 @@
}
}
+ // Wait until data can be received without blocking.
+ template <typename Handler>
+ void async_receive_from(implementation_type& impl,
+ const null_buffers&, endpoint_type& sender_endpoint,
+ socket_base::message_flags flags, Handler handler)
+ {
+ if (!is_open(impl))
+ {
+ this->get_io_service().post(bind_handler(handler,
+ boost::asio::error::bad_descriptor, 0));
+ }
+ else
+ {
+ // Check if the reactor was already obtained from the io_service.
+ reactor_type* reactor = static_cast<reactor_type*>(
+ interlocked_compare_exchange_pointer(
+ reinterpret_cast<void**>(&reactor_), 0, 0));
+ if (!reactor)
+ {
+ reactor = &(boost::asio::use_service<reactor_type>(
+ this->get_io_service()));
+ interlocked_exchange_pointer(
+ reinterpret_cast<void**>(&reactor_), reactor);
+ }
+
+ // Reset endpoint since it can be given no sensible value at this time.
+ sender_endpoint = endpoint_type();
+
+ if (flags & socket_base::message_out_of_band)
+ {
+ reactor->start_except_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler));
+ }
+ else
+ {
+ reactor->start_read_op(impl.socket_,
+ null_buffers_handler<Handler>(this->get_io_service(), handler),
+ false);
+ }
+ }
+ }
+
// Accept a new connection.
template <typename Socket>
boost::system::error_code accept(implementation_type& impl, Socket& peer,
Modified: branches/proto/v4/boost/asio/error.hpp
==============================================================================
--- branches/proto/v4/boost/asio/error.hpp (original)
+++ branches/proto/v4/boost/asio/error.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -106,6 +106,9 @@
/// Message too long.
message_size = BOOST_ASIO_SOCKET_ERROR(EMSGSIZE),
+ /// The name was too long.
+ name_too_long = BOOST_ASIO_SOCKET_ERROR(ENAMETOOLONG),
+
/// Network is down.
network_down = BOOST_ASIO_SOCKET_ERROR(ENETDOWN),
Modified: branches/proto/v4/boost/asio/ssl/detail/openssl_operation.hpp
==============================================================================
--- branches/proto/v4/boost/asio/ssl/detail/openssl_operation.hpp (original)
+++ branches/proto/v4/boost/asio/ssl/detail/openssl_operation.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -169,14 +169,11 @@
((::SSL_get_shutdown( session_ ) & SSL_SENT_SHUTDOWN) ==
SSL_SENT_SHUTDOWN);
- if (is_shut_down_sent && is_shut_down_received && is_operation_done)
+ if (is_shut_down_sent && is_shut_down_received && is_operation_done && !is_write_needed)
// SSL connection is shut down cleanly
return handler_(boost::system::error_code(), 1);
- if (is_shut_down_received && !is_write_needed)
- return handler_(boost::asio::error::eof, 0);
-
- if (is_shut_down_received)
+ if (is_shut_down_received && !is_operation_done)
// Shutdown has been requested, while we were reading or writing...
// abort our action...
return handler_(boost::asio::error::shut_down, 0);
@@ -226,7 +223,7 @@
return start();
}
- else if (is_read_needed)
+ else if (is_read_needed || (is_shut_down_sent && !is_shut_down_received))
{
return read_();
}
Modified: branches/proto/v4/boost/asio/version.hpp
==============================================================================
--- branches/proto/v4/boost/asio/version.hpp (original)
+++ branches/proto/v4/boost/asio/version.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -18,6 +18,6 @@
// BOOST_ASIO_VERSION % 100 is the sub-minor version
// BOOST_ASIO_VERSION / 100 % 1000 is the minor version
// BOOST_ASIO_VERSION / 100000 is the major version
-#define BOOST_ASIO_VERSION 309 // 0.3.9
+#define BOOST_ASIO_VERSION 100000 // 1.0.0
#endif // BOOST_ASIO_VERSION_HPP
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -28,8 +28,11 @@
#include <boost/detail/bad_weak_ptr.hpp>
#include <boost/detail/sp_counted_base.hpp>
#include <boost/detail/sp_counted_impl.hpp>
-
-#include <memory> // std::auto_ptr
+// 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
+// rather than including <memory> directly:
+#include <boost/config/no_tr1/memory.hpp> // std::auto_ptr
#include <functional> // std::less
#include <new> // std::bad_alloc
Modified: branches/proto/v4/boost/function_types/detail/pp_retag_default_cc/master.hpp
==============================================================================
--- branches/proto/v4/boost/function_types/detail/pp_retag_default_cc/master.hpp (original)
+++ branches/proto/v4/boost/function_types/detail/pp_retag_default_cc/master.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -30,8 +30,8 @@
# include BOOST_PP_ASSIGN_SLOT(1)
BOOST_STATIC_CONSTANT(bits_t, value = (
- ::boost::function_types::detail::bits<Tag>::value & BOOST_FT_default_cc
- | ::boost::function_types::detail::bits<RefTag>::value & BOOST_PP_SLOT(1)
+ (::boost::function_types::detail::bits<Tag>::value & BOOST_FT_default_cc)
+ | (::boost::function_types::detail::bits<RefTag>::value & BOOST_PP_SLOT(1))
));
};
Modified: branches/proto/v4/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp
==============================================================================
--- branches/proto/v4/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp (original)
+++ branches/proto/v4/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -15,8 +15,8 @@
template<class Tag, class RefTag> struct selector_bits
{
BOOST_STATIC_CONSTANT(bits_t, value = (
-::boost::function_types::detail::bits<Tag> ::value & 0x00008000
-| ::boost::function_types::detail::bits<RefTag> ::value & 802
+(::boost::function_types::detail::bits<Tag> ::value & 0x00008000)
+| (::boost::function_types::detail::bits<RefTag> ::value & 802)
));
};
template<bits_t SelectorBits> struct default_cc_tag;
Modified: branches/proto/v4/boost/function_types/detail/pp_tags/master.hpp
==============================================================================
--- branches/proto/v4/boost/function_types/detail/pp_tags/master.hpp (original)
+++ branches/proto/v4/boost/function_types/detail/pp_tags/master.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -82,7 +82,7 @@
);
BOOST_STATIC_CONSTANT(bits_t, combined_bits =
- LHS_bits & ~RHS_mask | RHS_bits
+ (LHS_bits & ~RHS_mask) | RHS_bits
);
BOOST_STATIC_CONSTANT(bits_t, combined_mask =
Modified: branches/proto/v4/boost/function_types/detail/pp_tags/preprocessed.hpp
==============================================================================
--- branches/proto/v4/boost/function_types/detail/pp_tags/preprocessed.hpp (original)
+++ branches/proto/v4/boost/function_types/detail/pp_tags/preprocessed.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -53,7 +53,7 @@
RHS_bits == (LHS_bits & RHS_mask & (RHS_bits | ~0x000000ff))
);
BOOST_STATIC_CONSTANT(bits_t, combined_bits =
-LHS_bits & ~RHS_mask | RHS_bits
+(LHS_bits & ~RHS_mask) | RHS_bits
);
BOOST_STATIC_CONSTANT(bits_t, combined_mask =
LHS_mask | RHS_mask
Modified: branches/proto/v4/boost/math/concepts/real_concept.hpp
==============================================================================
--- branches/proto/v4/boost/math/concepts/real_concept.hpp (original)
+++ branches/proto/v4/boost/math/concepts/real_concept.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -237,6 +237,47 @@
inline real_concept tanh(real_concept a)
{ return std::tanh(a.value()); }
+//
+// Conversion and truncation routines:
+//
+template <class Policy>
+inline int iround(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::iround(v.value(), pol); }
+inline int iround(const concepts::real_concept& v)
+{ return boost::math::iround(v.value(), policies::policy<>()); }
+template <class Policy>
+inline long lround(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::lround(v.value(), pol); }
+inline long lround(const concepts::real_concept& v)
+{ return boost::math::lround(v.value(), policies::policy<>()); }
+
+#ifdef BOOST_HAS_LONG_LONG
+template <class Policy>
+inline long long llround(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::llround(v.value(), pol); }
+inline long long llround(const concepts::real_concept& v)
+{ return boost::math::llround(v.value(), policies::policy<>()); }
+#endif
+
+template <class Policy>
+inline int itrunc(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::itrunc(v.value(), pol); }
+inline int itrunc(const concepts::real_concept& v)
+{ return boost::math::itrunc(v.value(), policies::policy<>()); }
+template <class Policy>
+inline long ltrunc(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::ltrunc(v.value(), pol); }
+inline long ltrunc(const concepts::real_concept& v)
+{ return boost::math::ltrunc(v.value(), policies::policy<>()); }
+
+#ifdef BOOST_HAS_LONG_LONG
+template <class Policy>
+inline long long lltrunc(const concepts::real_concept& v, const Policy& pol)
+{ return boost::math::lltrunc(v.value(), pol); }
+inline long long lltrunc(const concepts::real_concept& v)
+{ return boost::math::lltrunc(v.value(), policies::policy<>()); }
+#endif
+
// Streaming:
template <class charT, class traits>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const real_concept& a)
@@ -324,77 +365,6 @@
} // namespace tools
-//
-// Conversion and truncation routines:
-//
-template <class Policy>
-inline int iround(const concepts::real_concept& v, const Policy& pol)
-{
- return iround(v.value(), pol);
-}
-inline int iround(const concepts::real_concept& v)
-{
- return iround(v.value(), policies::policy<>());
-}
-
-template <class Policy>
-inline long lround(const concepts::real_concept& v, const Policy& pol)
-{
- return lround(v.value(), pol);
-}
-inline long lround(const concepts::real_concept& v)
-{
- return lround(v.value(), policies::policy<>());
-}
-
-#ifdef BOOST_HAS_LONG_LONG
-
-template <class Policy>
-inline long long llround(const concepts::real_concept& v, const Policy& pol)
-{
- return llround(v.value(), pol);
-}
-inline long long llround(const concepts::real_concept& v)
-{
- return llround(v.value(), policies::policy<>());
-}
-
-#endif
-
-template <class Policy>
-inline int itrunc(const concepts::real_concept& v, const Policy& pol)
-{
- return itrunc(v.value(), pol);
-}
-inline int itrunc(const concepts::real_concept& v)
-{
- return itrunc(v.value(), policies::policy<>());
-}
-
-template <class Policy>
-inline long ltrunc(const concepts::real_concept& v, const Policy& pol)
-{
- return ltrunc(v.value(), pol);
-}
-inline long ltrunc(const concepts::real_concept& v)
-{
- return ltrunc(v.value(), policies::policy<>());
-}
-
-#ifdef BOOST_HAS_LONG_LONG
-
-template <class Policy>
-inline long long lltrunc(const concepts::real_concept& v, const Policy& pol)
-{
- return lltrunc(v.value(), pol);
-}
-inline long long lltrunc(const concepts::real_concept& v)
-{
- return lltrunc(v.value(), policies::policy<>());
-}
-
-#endif
-
#if defined(__SGI_STL_PORT)
//
// We shouldn't really need these type casts any more, but there are some
Modified: branches/proto/v4/boost/math/concepts/std_real_concept.hpp
==============================================================================
--- branches/proto/v4/boost/math/concepts/std_real_concept.hpp (original)
+++ branches/proto/v4/boost/math/concepts/std_real_concept.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -223,86 +223,27 @@
namespace boost{ namespace math{ namespace concepts{
-// Streaming:
-template <class charT, class traits>
-inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const std_real_concept& a)
-{
- return os << a.value();
-}
-template <class charT, class traits>
-inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, traits>& is, std_real_concept& a)
-{
- std_real_concept_base_type v;
- is >> v;
- a = v;
- return is;
-}
-
-} // namespace concepts
-
-namespace tools
-{
-
-template <>
-inline concepts::std_real_concept max_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
-{
- return max_value<concepts::std_real_concept_base_type>();
-}
-
-template <>
-inline concepts::std_real_concept min_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
-{
- return min_value<concepts::std_real_concept_base_type>();
-}
-
-template <>
-inline concepts::std_real_concept log_max_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
-{
- return log_max_value<concepts::std_real_concept_base_type>();
-}
-
-template <>
-inline concepts::std_real_concept log_min_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
-{
- return log_min_value<concepts::std_real_concept_base_type>();
-}
-
-template <>
-inline concepts::std_real_concept epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
-{
- return tools::epsilon<concepts::std_real_concept_base_type>();
-}
-
-template <>
-inline int digits<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
-{ // Assume number of significand bits is same as std_real_concept_base_type,
- // unless std::numeric_limits<T>::is_specialized to provide digits.
- return digits<concepts::std_real_concept_base_type>();
-}
-
-} // namespace tools
-
//
// Conversion and truncation routines:
//
template <class Policy>
inline int iround(const concepts::std_real_concept& v, const Policy& pol)
{
- return iround(v.value(), pol);
+ return boost::math::iround(v.value(), pol);
}
inline int iround(const concepts::std_real_concept& v)
{
- return iround(v.value(), policies::policy<>());
+ return boost::math::iround(v.value(), policies::policy<>());
}
template <class Policy>
inline long lround(const concepts::std_real_concept& v, const Policy& pol)
{
- return lround(v.value(), pol);
+ return boost::math::lround(v.value(), pol);
}
inline long lround(const concepts::std_real_concept& v)
{
- return lround(v.value(), policies::policy<>());
+ return boost::math::lround(v.value(), policies::policy<>());
}
#ifdef BOOST_HAS_LONG_LONG
@@ -310,11 +251,11 @@
template <class Policy>
inline long long llround(const concepts::std_real_concept& v, const Policy& pol)
{
- return llround(v.value(), pol);
+ return boost::math::llround(v.value(), pol);
}
inline long long llround(const concepts::std_real_concept& v)
{
- return llround(v.value(), policies::policy<>());
+ return boost::math::llround(v.value(), policies::policy<>());
}
#endif
@@ -322,21 +263,21 @@
template <class Policy>
inline int itrunc(const concepts::std_real_concept& v, const Policy& pol)
{
- return itrunc(v.value(), pol);
+ return boost::math::itrunc(v.value(), pol);
}
inline int itrunc(const concepts::std_real_concept& v)
{
- return itrunc(v.value(), policies::policy<>());
+ return boost::math::itrunc(v.value(), policies::policy<>());
}
template <class Policy>
inline long ltrunc(const concepts::std_real_concept& v, const Policy& pol)
{
- return ltrunc(v.value(), pol);
+ return boost::math::ltrunc(v.value(), pol);
}
inline long ltrunc(const concepts::std_real_concept& v)
{
- return ltrunc(v.value(), policies::policy<>());
+ return boost::math::ltrunc(v.value(), policies::policy<>());
}
#ifdef BOOST_HAS_LONG_LONG
@@ -344,15 +285,74 @@
template <class Policy>
inline long long lltrunc(const concepts::std_real_concept& v, const Policy& pol)
{
- return lltrunc(v.value(), pol);
+ return boost::math::lltrunc(v.value(), pol);
}
inline long long lltrunc(const concepts::std_real_concept& v)
{
- return lltrunc(v.value(), policies::policy<>());
+ return boost::math::lltrunc(v.value(), policies::policy<>());
}
#endif
+// Streaming:
+template <class charT, class traits>
+inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const std_real_concept& a)
+{
+ return os << a.value();
+}
+template <class charT, class traits>
+inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, traits>& is, std_real_concept& a)
+{
+ std_real_concept_base_type v;
+ is >> v;
+ a = v;
+ return is;
+}
+
+} // namespace concepts
+
+namespace tools
+{
+
+template <>
+inline concepts::std_real_concept max_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+ return max_value<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline concepts::std_real_concept min_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+ return min_value<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline concepts::std_real_concept log_max_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+ return log_max_value<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline concepts::std_real_concept log_min_value<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+ return log_min_value<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline concepts::std_real_concept epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{
+ return tools::epsilon<concepts::std_real_concept_base_type>();
+}
+
+template <>
+inline int digits<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+{ // Assume number of significand bits is same as std_real_concept_base_type,
+ // unless std::numeric_limits<T>::is_specialized to provide digits.
+ return digits<concepts::std_real_concept_base_type>();
+}
+
+} // namespace tools
+
} // namespace math
} // namespace boost
Modified: branches/proto/v4/boost/math/special_functions/math_fwd.hpp
==============================================================================
--- branches/proto/v4/boost/math/special_functions/math_fwd.hpp (original)
+++ branches/proto/v4/boost/math/special_functions/math_fwd.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -23,6 +23,7 @@
#pragma once
#endif
+#include <boost/math/special_functions/detail/round_fwd.hpp>
#include <boost/math/tools/promotion.hpp> // for argument promotion.
#include <boost/math/policies/policy.hpp>
#include <boost/mpl/comparison.hpp>
@@ -656,20 +657,6 @@
template <class T>
typename tools::promote_args<T>::type zeta(T s);
- template <class T, class Policy>
- T trunc(const T& v, const Policy& pol);
- template <class T>
- T trunc(const T& v);
- template <class T, class Policy>
- int itrunc(const T& v, const Policy& pol);
- template <class T>
- int itrunc(const T& v);
- template <class T, class Policy>
- long ltrunc(const T& v, const Policy& pol);
- template <class T>
- long ltrunc(const T& v);
-
-
} // namespace math
} // namespace boost
@@ -677,13 +664,13 @@
#define BOOST_MATH_DETAIL_LL_FUNC(Policy)\
\
template <class T>\
- inline T modf(const T& v, long long* ipart){ return boost::math::modf(v, ipart, Policy()); }\
+ inline T modf(const T& v, long long* ipart){ using boost::math::modf; return modf(v, ipart, Policy()); }\
\
template <class T>\
- inline long long lltrunc(const T& v){ return boost::math::lltrunc(v, Policy()); }\
+ inline long long lltrunc(const T& v){ using boost::math::lltrunc; return lltrunc(v, Policy()); }\
\
template <class T>\
- inline long long llround(const T& v){ return boost::math::llround(v, Policy()); }\
+ inline long long llround(const T& v){ using boost::math::llround; return llround(v, Policy()); }\
#else
#define BOOST_MATH_DETAIL_LL_FUNC(Policy)
@@ -988,31 +975,31 @@
inline typename boost::math::tools::promote_args<T>::type zeta(T s){ return boost::math::zeta(s, Policy()); }\
\
template <class T>\
- inline T round(const T& v){ return boost::math::round(v, Policy()); }\
+ inline T round(const T& v){ using boost::math::round; return round(v, Policy()); }\
\
template <class T>\
- inline int iround(const T& v){ return boost::math::iround(v, Policy()); }\
+ inline int iround(const T& v){ using boost::math::iround; return iround(v, Policy()); }\
\
template <class T>\
- inline long lround(const T& v){ return boost::math::lround(v, Policy()); }\
+ inline long lround(const T& v){ using boost::math::lround; return lround(v, Policy()); }\
\
template <class T>\
- inline T trunc(const T& v){ return boost::math::trunc(v, Policy()); }\
+ inline T trunc(const T& v){ using boost::math::trunc; return trunc(v, Policy()); }\
\
template <class T>\
- inline int itrunc(const T& v){ return boost::math::itrunc(v, Policy()); }\
+ inline int itrunc(const T& v){ using boost::math::itrunc; return itrunc(v, Policy()); }\
\
template <class T>\
- inline long ltrunc(const T& v){ return boost::math::ltrunc(v, Policy()); }\
+ inline long ltrunc(const T& v){ using boost::math::ltrunc; return ltrunc(v, Policy()); }\
\
template <class T>\
- inline T modf(const T& v, T* ipart){ return boost::math::modf(v, ipart, Policy()); }\
+ inline T modf(const T& v, T* ipart){ using boost::math::modf; return modf(v, ipart, Policy()); }\
\
template <class T>\
- inline T modf(const T& v, int* ipart){ return boost::math::modf(v, ipart, Policy()); }\
+ inline T modf(const T& v, int* ipart){ using boost::math::modf; return modf(v, ipart, Policy()); }\
\
template <class T>\
- inline T modf(const T& v, long* ipart){ return boost::math::modf(v, ipart, Policy()); }\
+ inline T modf(const T& v, long* ipart){ using boost::math::modf; return modf(v, ipart, Policy()); }\
\
template <int N, class T>\
inline typename boost::math::tools::promote_args<T>::type pow(T v){ return boost::math::pow<N>(v, Policy()); }\
Modified: branches/proto/v4/boost/math/tools/config.hpp
==============================================================================
--- branches/proto/v4/boost/math/tools/config.hpp (original)
+++ branches/proto/v4/boost/math/tools/config.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -21,6 +21,7 @@
#endif
#include <boost/math/tools/user.hpp>
+#include <boost/math/special_functions/detail/round_fwd.hpp>
#if defined(__CYGWIN__) || defined(__FreeBSD__) || defined(__hppa)
# define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
@@ -189,7 +190,14 @@
using std::ceil;\
using std::floor;\
using std::log10;\
- using std::sqrt;
+ using std::sqrt;\
+ using boost::math::round;\
+ using boost::math::iround;\
+ using boost::math::lround;\
+ using boost::math::trunc;\
+ using boost::math::itrunc;\
+ using boost::math::ltrunc;\
+ using boost::math::modf;
namespace boost{ namespace math{
Modified: branches/proto/v4/boost/shared_ptr.hpp
==============================================================================
--- branches/proto/v4/boost/shared_ptr.hpp (original)
+++ branches/proto/v4/boost/shared_ptr.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -20,7 +20,11 @@
#include <boost/detail/shared_ptr_nmt.hpp>
#else
-#include <memory> // for std::auto_ptr
+// 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
+// rather than including <memory> directly:
+#include <boost/config/no_tr1/memory.hpp> // std::auto_ptr
#include <boost/assert.hpp>
#include <boost/checked_delete.hpp>
@@ -28,6 +32,11 @@
#include <boost/detail/shared_count.hpp>
#include <boost/detail/workaround.hpp>
+#if !defined(BOOST_SP_NO_ATOMIC_ACCESS)
+#include <boost/detail/spinlock_pool.hpp>
+#include <boost/memory_order.hpp>
+#endif
+
#include <algorithm> // for std::swap
#include <functional> // for std::less
#include <typeinfo> // for std::bad_cast
@@ -468,6 +477,65 @@
return pn.get_deleter( ti );
}
+ // atomic access
+
+#if !defined(BOOST_SP_NO_ATOMIC_ACCESS)
+
+ shared_ptr<T> atomic_load( memory_order /*mo*/ = memory_order_seq_cst ) const
+ {
+ boost::detail::spinlock_pool<2>::scoped_lock lock( this );
+ return *this;
+ }
+
+ void atomic_store( shared_ptr<T> r, memory_order /*mo*/ = memory_order_seq_cst )
+ {
+ boost::detail::spinlock_pool<2>::scoped_lock lock( this );
+ swap( r );
+ }
+
+ shared_ptr<T> atomic_swap( shared_ptr<T> r, memory_order /*mo*/ = memory_order_seq_cst )
+ {
+ boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( this );
+
+ sp.lock();
+ swap( r );
+ sp.unlock();
+
+ return r; // return std::move(r)
+ }
+
+ bool atomic_compare_swap( shared_ptr<T> & v, shared_ptr<T> w )
+ {
+ boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( this );
+
+ sp.lock();
+
+ if( px == v.px && pn == v.pn )
+ {
+ swap( w );
+
+ sp.unlock();
+
+ return true;
+ }
+ else
+ {
+ shared_ptr tmp( *this );
+
+ sp.unlock();
+
+ tmp.swap( v );
+ return false;
+ }
+ }
+
+ inline bool atomic_compare_swap( shared_ptr<T> & v, shared_ptr<T> w, memory_order /*success*/, memory_order /*failure*/ )
+ {
+ return atomic_compare_swap( v, w ); // std::move( w )
+ }
+
+#endif
+
// Tasteless as this may seem, making all members public allows member templates
// to work in the absence of member template friends. (Matthew Langston)
Modified: branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_functor.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_functor.hpp (original)
+++ branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_functor.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -20,8 +20,10 @@
#include <boost/spirit/home/support/detail/lexer/rules.hpp>
#include <boost/spirit/home/support/detail/lexer/state_machine.hpp>
#include <boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp>
#if 0 != __COMO_VERSION__ || !BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+#define BOOST_SPIRIT_STATIC_EOF 1
#define BOOST_SPIRIT_EOF_PREFIX static
#else
#define BOOST_SPIRIT_EOF_PREFIX
@@ -47,6 +49,10 @@
typedef unused_type semantic_actions_type;
+ typedef
+ detail::wrap_action<unused_type, iterpair_type, Data>
+ wrap_action_type;
+
// initialize the shared data
template <typename IterData>
Data (IterData const& data_, Iterator& first_, Iterator const& last_)
@@ -83,7 +89,7 @@
: Data<Iterator, mpl::false_, mpl::false_>
{
typedef Data<Iterator, mpl::false_, mpl::false_> base_type;
-
+
// initialize the shared data
template <typename IterData>
Data (IterData const& data_, Iterator& first_, Iterator const& last_)
@@ -127,11 +133,15 @@
boost::detail::iterator_traits<Iterator>::value_type
char_type;
- typedef void functor_type(iterpair_type, std::size_t, Data&, bool&);
+ typedef void functor_type(iterpair_type, std::size_t, bool&, Data&);
typedef boost::function<functor_type> functor_wrapper_type;
typedef std::multimap<std::size_t, functor_wrapper_type>
semantic_actions_type;
+ typedef
+ detail::wrap_action<functor_wrapper_type, iterpair_type, Data>
+ wrap_action_type;
+
template <typename IterData>
Data (IterData const& data_, Iterator& first_, Iterator const& last_)
: base_type(data_, first_, last_),
@@ -154,7 +164,7 @@
std::pair<iterator_type, iterator_type> p = actions.equal_range(id);
while (p.first != p.second)
{
- ((*p.first).second)(itp, id, *this, match);
+ ((*p.first).second)(itp, id, match, *this);
if (!match)
return false; // return a 'no-match'
++p.first;
@@ -230,9 +240,9 @@
public:
lexertl_functor()
-#if 0 != __DECCXX_VER || BOOST_INTEL_CXX_VERSION > 900 || defined(__PGI)
+#if defined(__PGI)
: eof()
-#endif // 0 != __DECCXX_VER
+#endif
{}
///////////////////////////////////////////////////////////////////////
@@ -247,12 +257,20 @@
typedef Iterator iterator_type;
typedef typename shared::semantic_actions_type semantic_actions_type;
+ // this is needed to wrap the semantic actions in a proper way
+ typedef typename shared::wrap_action_type wrap_action_type;
+
+ ///////////////////////////////////////////////////////////////////////
template <typename MultiPass>
static result_type& get_next(MultiPass& mp, result_type& result)
{
shared& data = mp.shared->ftor;
if (data.first == data.last)
+#if defined(BOOST_SPIRIT_STATIC_EOF)
return result = eof;
+#else
+ return result = mp.ftor.eof;
+#endif
Iterator end = data.first;
std::size_t id = data.next(end);
@@ -270,7 +288,11 @@
result = result_type(0);
}
else if (0 == id) { // EOF reached
+#if defined(BOOST_SPIRIT_STATIC_EOF)
result = eof;
+#else
+ result = mp.ftor.eof;
+#endif
}
else {
#if defined(BOOST_SPIRIT_LEXERTL_DEBUG)
@@ -330,13 +352,13 @@
return mp.shared->ftor.rules.state(statename);
}
- // we don't need this
+ // we don't need this, but it must be there
template <typename MultiPass>
static void destroy(MultiPass const& mp)
{}
};
-#if 0 != __COMO_VERSION__ || !BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+#if defined(BOOST_SPIRIT_STATIC_EOF)
///////////////////////////////////////////////////////////////////////////
// eof token
///////////////////////////////////////////////////////////////////////////
@@ -348,10 +370,11 @@
Token, Iterator, SupportsActors, SupportsState>::eof =
typename lexertl_functor<
Token, Iterator, SupportsActors, SupportsState>::result_type();
-#endif // 0 != __COMO_VERSION__
+#endif
}}}
#undef BOOST_SPIRIT_EOF_PREFIX
+#undef BOOST_SPIRIT_STATIC_EOF
#endif
Modified: branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_iterator.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_iterator.hpp (original)
+++ branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_iterator.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -54,7 +54,7 @@
typedef multi_pass_policies::split_std_deque storage_policy;
typedef multi_pass_policies::default_policy<
- input_policy, ownership_policy, check_policy, storage_policy>
+ ownership_policy, check_policy, input_policy, storage_policy>
policy_type;
typedef spirit::multi_pass<functor_data_type, policy_type> type;
};
Modified: branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_lexer.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_lexer.hpp (original)
+++ branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_lexer.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -65,7 +65,10 @@
{
std::basic_string<Char> result(1, ch);
if (detail::must_escape(ch))
- result.insert(0, 1, '\\');
+ {
+ typedef typename std::basic_string<Char>::size_type size_type;
+ result.insert((size_type)0, 1, '\\');
+ }
return result;
}
}
@@ -293,7 +296,9 @@
typename Functor::semantic_actions_type::value_type
value_type;
- actions.insert(value_type(id, act));
+ typedef typename Functor::wrap_action_type wrapper_type;
+
+ actions.insert(value_type(id, wrapper_type::call(act)));
}
bool init_dfa() const
Modified: branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_static_functor.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_static_functor.hpp (original)
+++ branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_static_functor.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -20,8 +20,10 @@
#include <boost/spirit/home/support/detail/lexer/rules.hpp>
#include <boost/spirit/home/support/detail/lexer/state_machine.hpp>
#include <boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp>
#if 0 != __COMO_VERSION__ || !BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+#define BOOST_SPIRIT_STATIC_EOF 1
#define BOOST_SPIRIT_EOF_PREFIX static
#else
#define BOOST_SPIRIT_EOF_PREFIX
@@ -50,6 +52,10 @@
typedef unused_type semantic_actions_type;
+ typedef
+ detail::wrap_action<unused_type, iterpair_type, Data>
+ wrap_action_type;
+
// initialize the shared data
template <typename IterData>
Data (IterData const& data_, Iterator& first_, Iterator const& last_)
@@ -121,11 +127,15 @@
boost::detail::iterator_traits<Iterator>::value_type
char_type;
- typedef void functor_type(iterpair_type, std::size_t, Data&, bool&);
+ typedef void functor_type(iterpair_type, std::size_t, bool&, Data&);
typedef boost::function<functor_type> functor_wrapper_type;
typedef std::multimap<std::size_t, functor_wrapper_type>
semantic_actions_type;
+ typedef
+ detail::wrap_action<functor_wrapper_type, iterpair_type, Data>
+ wrap_action_type;
+
template <typename IterData>
Data (IterData const& data_, Iterator& first_, Iterator const& last_)
: base_type(data_, first_, last_),
@@ -148,7 +158,7 @@
std::pair<iterator_type, iterator_type> p = actions.equal_range(id);
while (p.first != p.second)
{
- ((*p.first).second)(itp, id, *this, match);
+ ((*p.first).second)(itp, id, match, *this);
if (!match)
return false; // return a 'no-match'
++p.first;
@@ -224,9 +234,9 @@
public:
lexertl_static_functor()
-#if 0 != __DECCXX_VER || BOOST_INTEL_CXX_VERSION > 900
- , eof()
-#endif // 0 != __DECCXX_VER
+#if defined(__PGI)
+ : eof()
+#endif
{}
///////////////////////////////////////////////////////////////////////
@@ -242,12 +252,20 @@
typedef typename shared::semantic_actions_type semantic_actions_type;
typedef typename shared::next_token_functor next_token_functor;
+ // this is needed to wrap the semantic actions in a proper way
+ typedef typename shared::wrap_action_type wrap_action_type;
+
+ ///////////////////////////////////////////////////////////////////////
template <typename MultiPass>
- result_type& operator()(MultiPass& mp, result_type& result)
+ static result_type& get_next(MultiPass& mp, result_type& result)
{
shared& data = mp.shared->ftor;
if (data.first == data.last)
+#if defined(BOOST_SPIRIT_STATIC_EOF)
return result = eof;
+#else
+ return result = mp.ftor.eof;
+#endif
Iterator end = data.first;
std::size_t id = data.next(end);
@@ -265,7 +283,11 @@
return result = result_type(0);
}
else if (0 == id) { // EOF reached
+#if defined(BOOST_SPIRIT_STATIC_EOF)
return result = eof;
+#else
+ return result = mp.ftor.eof;
+#endif
}
#if defined(BOOST_SPIRIT_LEXERTL_DEBUG)
@@ -320,9 +342,14 @@
{
return mp.shared->ftor.rules.state(statename);
}
+
+ // we don't need this, but it must be there
+ template <typename MultiPass>
+ static void destroy(MultiPass const& mp)
+ {}
};
-#if 0 != __COMO_VERSION__ || !BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+#if defined(BOOST_SPIRIT_STATIC_EOF)
///////////////////////////////////////////////////////////////////////////
// eof token
///////////////////////////////////////////////////////////////////////////
@@ -334,10 +361,11 @@
Token, Iterator, SupportsActors, SupportsState>::eof =
typename lexertl_static_functor<
Token, Iterator, SupportsActors, SupportsState>::result_type();
-#endif // 0 != __COMO_VERSION__
+#endif
}}}
#undef BOOST_SPIRIT_EOF_PREFIX
+#undef BOOST_SPIRIT_STATIC_EOF
#endif
Modified: branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_static_lexer.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_static_lexer.hpp (original)
+++ branches/proto/v4/boost/spirit/home/lex/lexer/lexertl/lexertl_static_lexer.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -69,6 +69,9 @@
typedef std::basic_string<char_type> string_type;
public:
+ typedef Token token_type;
+ typedef typename Token::id_type id_type;
+
// interface for token definition management
void add_token (char_type const* state, string_type const& tokendef,
std::size_t token_id)
@@ -167,6 +170,7 @@
// Every lexer type to be used as a lexer for Spirit has to conform to
// a public interface
typedef Token token_type;
+ typedef typename Token::id_type id_type;
typedef TokenSet token_set;
typedef lexertl_iterator<Functor> iterator_type;
Modified: branches/proto/v4/boost/spirit/home/lex/lexer/token_def.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/lex/lexer/token_def.hpp (original)
+++ branches/proto/v4/boost/spirit/home/lex/lexer/token_def.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -69,8 +69,8 @@
{
private:
// initialize proto base class
- typedef terminal_holder<token_def*, token_def> terminal_holder;
- typedef typename proto::terminal<terminal_holder>::type tag;
+ typedef terminal_holder<token_def*, token_def> terminal_holder_;
+ typedef typename proto::terminal<terminal_holder_>::type tag;
typedef proto::extends<tag, token_def> base_type;
tag make_tag()
Modified: branches/proto/v4/boost/spirit/home/lex/lexer/token_set.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/lex/lexer/token_set.hpp (original)
+++ branches/proto/v4/boost/spirit/home/lex/lexer/token_set.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -46,8 +46,8 @@
typedef TokenSet base_token_set;
// initialize proto base class
- typedef terminal_holder<token_set*, token_set> terminal_holder;
- typedef typename proto::terminal<terminal_holder>::type tag;
+ typedef terminal_holder<token_set*, token_set> terminal_holder_;
+ typedef typename proto::terminal<terminal_holder_>::type tag;
typedef proto::extends<tag, token_set> base_type;
tag make_tag()
Modified: branches/proto/v4/boost/spirit/home/qi/auxiliary.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/qi/auxiliary.hpp (original)
+++ branches/proto/v4/boost/spirit/home/qi/auxiliary.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -13,6 +13,7 @@
#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
#include <boost/spirit/home/qi/auxiliary/functor.hpp>
#include <boost/spirit/home/qi/auxiliary/functor_director.hpp>
+#include <boost/spirit/home/qi/auxiliary/primitives.hpp>
#include <boost/spirit/home/qi/auxiliary/meta_grammar.hpp>
#endif
Modified: branches/proto/v4/boost/spirit/home/qi/auxiliary/meta_grammar.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/qi/auxiliary/meta_grammar.hpp (original)
+++ branches/proto/v4/boost/spirit/home/qi/auxiliary/meta_grammar.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -30,6 +30,13 @@
struct lazy_parser;
struct functor_director;
+ struct eol_director;
+ struct eoi_director;
+
+ template <typename Positive>
+ struct negated_end_director;
+
+ ///////////////////////////////////////////////////////////////////////////
template <typename Expr, typename Enable>
struct is_valid_expr;
@@ -41,7 +48,7 @@
///////////////////////////////////////////////////////////////////////////
// none, eps and eps(f)
- struct auxiliary_meta_grammar
+ struct auxiliary_meta_grammar1
: proto::or_<
meta_grammar::empty_terminal_rule<
qi::domain, tag::none, none>
@@ -60,6 +67,38 @@
{
};
+ // eol, eoi
+ struct auxiliary_end_meta_grammar
+ : proto::or_<
+ meta_grammar::terminal_rule<qi::domain, tag::eol, eol_director>
+ , meta_grammar::terminal_rule<qi::domain, tag::eoi, eoi_director>
+ >
+ {
+ };
+
+ struct negated_auxiliary_end_meta_grammar
+ : proto::or_<
+ auxiliary_end_meta_grammar
+ , meta_grammar::compose_single<
+ proto::unary_expr<
+ proto::tag::complement
+ , negated_auxiliary_end_meta_grammar
+ >
+ , qi::domain
+ , negated_end_director<mpl::_>
+ >
+ >
+ {
+ };
+
+ struct auxiliary_meta_grammar
+ : proto::or_<
+ auxiliary_meta_grammar1
+ , negated_auxiliary_end_meta_grammar
+ >
+ {
+ };
+
///////////////////////////////////////////////////////////////////////////
// These specializations non-intrusively hooks into the RD meta-grammar.
// (see qi/meta_grammar.hpp)
Modified: branches/proto/v4/boost/spirit/home/qi/char.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/qi/char.hpp (original)
+++ branches/proto/v4/boost/spirit/home/qi/char.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -10,7 +10,6 @@
#include <boost/spirit/home/qi/char/char_parser.hpp>
#include <boost/spirit/home/qi/char/char.hpp>
#include <boost/spirit/home/qi/char/char_class.hpp>
-#include <boost/spirit/home/qi/char/primitives.hpp>
#include <boost/spirit/home/qi/char/meta_grammar.hpp>
#endif
Modified: branches/proto/v4/boost/spirit/home/qi/char/char.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/qi/char/char.hpp (original)
+++ branches/proto/v4/boost/spirit/home/qi/char/char.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -17,6 +17,8 @@
#include <boost/spirit/home/support/detail/to_narrow.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/remove_reference.hpp>
+#include <boost/foreach.hpp>
+#include <boost/mpl/print.hpp>
namespace boost { namespace spirit { namespace qi
{
@@ -51,24 +53,22 @@
typedef unused_type type; // literal parsers have no attribute
};
- template <typename Char_, typename CharParam>
- static bool test_impl(Char_ ch, CharParam param)
+ template <typename CharParam>
+ static CharParam get_char(CharParam ch)
{
- // tests plain chars
- return ch == param;
+ return ch;
}
- template <typename Char_, typename CharParam>
- static bool test_impl(Char_ const* ch, CharParam param)
+ template <typename CharParam>
+ static CharParam get_char(CharParam const* str)
{
- // tests single char null terminated strings
- return *ch == param;
+ return *str;
}
template <typename Component, typename CharParam, typename Context>
static bool test(Component const& component, CharParam ch, Context&)
{
- return test_impl(fusion::at_c<0>(component.elements), ch);
+ return get_char(fusion::at_c<0>(component.elements)) == ch;
}
template <typename Component>
@@ -76,7 +76,7 @@
{
return std::string("'")
+ spirit::detail::to_narrow_char(
- fusion::at_c<0>(component.elements))
+ get_char(fusion::at_c<0>(component.elements)))
+ '\'';
}
};
@@ -203,11 +203,21 @@
typedef unused_type type; // literal parsers have no attribute
};
+ static Char get_char(Char ch)
+ {
+ return ch;
+ }
+
+ static Char get_char(Char const* str)
+ {
+ return *str;
+ }
+
template <typename Component, typename CharParam, typename Context>
static bool test(Component const& component, CharParam ch, Context&)
{
- return fusion::at_c<0>(component.elements) == ch
- || fusion::at_c<1>(component.elements) == ch
+ return get_char(fusion::at_c<0>(component.elements)) == ch
+ || get_char(fusion::at_c<1>(component.elements)) == ch
;
}
@@ -215,9 +225,13 @@
static std::string what(Component const& component)
{
std::string result;
- result += std::string("'") + fusion::at_c<0>(component.elements) + '\'';
+ result += std::string("'")
+ + spirit::detail::to_narrow_char(
+ get_char(fusion::at_c<0>(component.elements))) + '\'';
result += " or ";
- result += std::string("'") + fusion::at_c<1>(component.elements) + '\'';
+ result += std::string("'") +
+ spirit::detail::to_narrow_char(
+ get_char(fusion::at_c<1>(component.elements))) + '\'';
return result;
}
};
@@ -253,11 +267,56 @@
return result;
}
};
+
+ template <typename Char, typename Elements>
+ struct char_set_component;
}}}
namespace boost { namespace spirit { namespace traits
{
///////////////////////////////////////////////////////////////////////////
+ // char_set_component generator
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Char, typename Elements, typename Modifier>
+ struct make_component<qi::domain, qi::char_set<Char>, Elements, Modifier
+ , typename disable_if<
+ is_member_of_modifier<Modifier, spirit::char_class::no_case_base_tag>
+ >::type
+ > : mpl::identity<qi::char_set_component<Char, Elements> >
+ {
+ static qi::char_set_component<Char, Elements>
+ call(Elements const& elements)
+ {
+ return qi::char_set_component<Char, Elements>(
+ fusion::at_c<0>(elements));
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // no_case char_set_component generator
+ ///////////////////////////////////////////////////////////////////////////
+ template <
+ typename Domain, typename Elements, typename Modifier, typename Char
+ >
+ struct make_modified_component<
+ Domain, qi::char_set<Char>, Elements, Modifier
+ , typename enable_if<
+ is_member_of_modifier<Modifier, spirit::char_class::no_case_base_tag>
+ >::type
+ >
+ {
+ typedef qi::char_set_component<Char, Elements> type;
+ typedef typename Modifier::char_set char_set;
+
+ static type
+ call(Elements const& elements)
+ {
+ return qi::char_set_component<Char, Elements>(
+ fusion::at_c<0>(elements), char_set());
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
// no_case_literal_char generator
///////////////////////////////////////////////////////////////////////////
template <
@@ -275,12 +334,22 @@
component<qi::domain, qi::no_case_literal_char<Char>, vector_type>
type;
+ static Char get_char(Char ch)
+ {
+ return ch;
+ }
+
+ static Char get_char(Char const* str)
+ {
+ return *str;
+ }
+
static type
call(Elements const& elements)
{
typedef typename Modifier::char_set char_set;
- Char ch = fusion::at_c<0>(elements);
+ Char ch = get_char(fusion::at_c<0>(elements));
vector_type v(
char_set::tolower(ch)
, char_set::toupper(ch)
Modified: branches/proto/v4/boost/spirit/home/qi/char/meta_grammar.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/qi/char/meta_grammar.hpp (original)
+++ branches/proto/v4/boost/spirit/home/qi/char/meta_grammar.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -18,30 +18,6 @@
namespace boost { namespace spirit { namespace qi
{
- template <typename Char>
- struct char_set;
-
- template <typename Char, typename Elements>
- struct char_set_component;
-}}}
-
-namespace boost { namespace spirit { namespace traits
-{
- template <typename Char, typename Elements, typename Modifier>
- struct make_component<qi::domain, qi::char_set<Char>, Elements, Modifier>
- : mpl::identity<qi::char_set_component<Char, Elements> >
- {
- static qi::char_set_component<Char, Elements>
- call(Elements const& elements)
- {
- return qi::char_set_component<Char, Elements>(
- fusion::at_c<0>(elements));
- }
- };
-}}}
-
-namespace boost { namespace spirit { namespace qi
-{
///////////////////////////////////////////////////////////////////////////
// forwards
///////////////////////////////////////////////////////////////////////////
@@ -64,12 +40,9 @@
template <typename Tag>
struct char_class;
- struct eol_director;
- struct eoi_director;
-
- ///////////////////////////////////////////////////////////////////////////
struct char_meta_grammar;
+ ///////////////////////////////////////////////////////////////////////////
template <typename Expr, typename Enable>
struct is_valid_expr;
@@ -243,6 +216,39 @@
}
}
+ template <typename CharSetClass> // no-case version
+ char_set_component(Char const* definition, CharSetClass)
+ : ptr(new detail::basic_chset<Char>())
+ {
+ Char ch = *definition++;
+ while (ch)
+ {
+ Char next = *definition++;
+ if (next == '-')
+ {
+ next = *definition++;
+ if (next == 0)
+ {
+ ptr->set(CharSetClass::tolower(ch));
+ ptr->set(CharSetClass::tolower('-'));
+ ptr->set(CharSetClass::toupper(ch));
+ ptr->set(CharSetClass::toupper('-'));
+ break;
+ }
+ ptr->set(CharSetClass::tolower(ch)
+ , CharSetClass::tolower(next));
+ ptr->set(CharSetClass::toupper(ch)
+ , CharSetClass::toupper(next));
+ }
+ else
+ {
+ ptr->set(CharSetClass::tolower(ch));
+ ptr->set(CharSetClass::toupper(ch));
+ }
+ ch = next;
+ }
+ }
+
boost::shared_ptr<detail::basic_chset<Char> > ptr;
};
@@ -341,8 +347,6 @@
, qi::domain
, char_class<mpl::_>
>
- , meta_grammar::terminal_rule<qi::domain, tag::eol, eol_director>
- , meta_grammar::terminal_rule<qi::domain, tag::eoi, eoi_director>
>
{};
Deleted: branches/proto/v4/boost/spirit/home/qi/char/primitives.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/qi/char/primitives.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
+++ (empty file)
@@ -1,96 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2008 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)
-==============================================================================*/
-
-#if !defined(BOOST_SPIRIT_PRIMITIVES_APR_17_2008_0751PM)
-#define BOOST_SPIRIT_PRIMITIVES_APR_17_2008_0751PM
-
-///////////////////////////////////////////////////////////////////////////////
-namespace boost { namespace spirit { namespace qi
-{
- ///////////////////////////////////////////////////////////////////////////
- // the eol_director matches line endings
- ///////////////////////////////////////////////////////////////////////////
- struct eol_director
- {
- template <typename Component, typename Context, typename Iterator>
- struct attribute
- {
- typedef unused_type type;
- };
-
- template <
- typename Component
- , typename Iterator, typename Context
- , typename Skipper, typename Attribute>
- static bool parse(
- Component const& component
- , Iterator& first, Iterator const& last
- , Context& context, Skipper const& skipper
- , Attribute& attr)
- {
- qi::skip(first, last, skipper);
-
- bool matched = false;
- if (first != last && *first == '\r') // CR
- {
- matched = true;
- ++first;
- }
- if (first != last && *first == '\n') // LF
- {
- matched = true;
- ++first;
- }
-
- return matched;
- }
-
- template <typename Component>
- static std::string what(Component const&)
- {
- return "eol";
- }
- };
-
- ///////////////////////////////////////////////////////////////////////////
- // the eoi_director matches the end of the input
- ///////////////////////////////////////////////////////////////////////////
- struct eoi_director
- {
- template <typename Component, typename Context, typename Iterator>
- struct attribute
- {
- typedef unused_type type;
- };
-
- template <
- typename Component
- , typename Iterator, typename Context
- , typename Skipper, typename Attribute>
- static bool parse(
- Component const& component
- , Iterator& first, Iterator const& last
- , Context& context, Skipper const& skipper
- , Attribute& attr)
- {
- qi::skip(first, last, skipper);
- return first == last;
- }
-
- template <typename Component>
- static std::string what(Component const&)
- {
- return "eoi";
- }
- };
-
-///////////////////////////////////////////////////////////////////////////////
-}}}
-
-#endif
-
-
Modified: branches/proto/v4/boost/spirit/home/support/component.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/component.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/component.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -191,7 +191,7 @@
namespace result_of
{
template <
- typename Domain, typename Expr, typename State = unused_type,
+ typename Domain, typename Expr, typename State = unused_type,
typename Visitor = unused_type
>
struct as_component
@@ -208,7 +208,7 @@
// special case for arrays
template <
- typename Domain, typename T, int N,
+ typename Domain, typename T, int N,
typename State, typename Visitor>
struct as_component<Domain, T[N], State, Visitor>
{
@@ -243,8 +243,8 @@
inline typename result_of::as_component<Domain, Expr>::type
as_component(Domain, Expr const& xpr, State const& state, Visitor& visitor)
{
- typedef typename
- result_of::as_component<Domain, Expr, State, Visitor>::grammar
+ typedef typename
+ result_of::as_component<Domain, Expr, State, Visitor>::grammar
grammar;
return grammar()(proto::as_expr(xpr), state, visitor);
};
@@ -271,7 +271,7 @@
{
template <
typename Domain, typename Director
- , typename Elements, typename Modifier>
+ , typename Elements, typename Modifier, typename Enable = void>
struct make_component
: mpl::identity<component<Domain, Director, Elements> >
{
Modified: branches/proto/v4/boost/spirit/home/support/detail/lexer/consts.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/detail/lexer/consts.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/detail/lexer/consts.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -6,8 +6,9 @@
#ifndef BOOST_LEXER_CONSTS_H
#define BOOST_LEXER_CONSTS_H
-#include "size_t.hpp"
-#include <wchar.h>
+#include <boost/config.hpp>
+#include <boost/integer_traits.hpp>
+#include <boost/spirit/home/support/detail/lexer/size_t.hpp>
namespace boost
{
@@ -20,7 +21,9 @@
const std::size_t max_macro_len = 20;
const std::size_t num_chars = 256;
- const std::size_t num_wchar_ts = WCHAR_MAX < 0x110000 ? WCHAR_MAX : 0x110000;
+ const std::size_t num_wchar_ts =
+ (boost::integer_traits<wchar_t>::const_max < 0x110000) ?
+ boost::integer_traits<wchar_t>::const_max : 0x110000;
const std::size_t null_token = static_cast<std::size_t> (~0);
const std::size_t bol_token = static_cast<std::size_t> (~1);
const std::size_t eol_token = static_cast<std::size_t> (~2);
Modified: branches/proto/v4/boost/spirit/home/support/detail/lexer/generator.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/detail/lexer/generator.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/detail/lexer/generator.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -6,6 +6,7 @@
#ifndef BOOST_LEXER_GENERATOR_HPP
#define BOOST_LEXER_GENERATOR_HPP
+#include <cstring> // memcmp
#include "char_traits.hpp"
#include "partition/charset.hpp"
#include "partition/equivset.hpp"
@@ -754,7 +755,8 @@
continue;
}
- if (::memcmp (first_, second_, sizeof(std::size_t) *
+ using namespace std; // some systems have memcmp in namespace std
+ if (memcmp (first_, second_, sizeof(std::size_t) *
dfa_alphabet_) == 0)
{
index_set_.insert (curr_index_);
Modified: branches/proto/v4/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -7,6 +7,7 @@
#define BOOST_LEXER_RE_TOKENISER_HPP
#include <map>
+#include <cstring> // memcpy
#include "num_token.hpp"
#include "../../runtime_error.hpp"
#include "../../size_t.hpp"
@@ -421,7 +422,8 @@
}
token_.set (num_token::MACRO, null_token);
- ::memcpy (token_._macro, start_, len_ * sizeof(CharT));
+ using namespace std; // some systems have memcpy in namespace std
+ memcpy (token_._macro, start_, len_ * sizeof(CharT));
token_._macro[len_] = 0;
}
};
Modified: branches/proto/v4/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_helper.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_helper.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/detail/lexer/parser/tokeniser/re_tokeniser_helper.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -6,6 +6,8 @@
#ifndef BOOST_LEXER_RE_TOKENISER_HELPER_H
#define BOOST_LEXER_RE_TOKENISER_HELPER_H
+#include <cstring> // for strlen
+
#include "../../char_traits.hpp"
#include "../../size_t.hpp"
#include "re_tokeniser_state.hpp"
@@ -190,6 +192,7 @@
if (str_)
{
+ using namespace std; // some systems have strlen in namespace std
str_len_ = strlen (str_);
}
else
@@ -229,6 +232,7 @@
if (str_)
{
+ using namespace std; // some systems have wcslen in namespace std
str_len_ = wcslen (str_);
}
else
Modified: branches/proto/v4/boost/spirit/home/support/iterators/detail/combine_policies.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/iterators/detail/combine_policies.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/iterators/detail/combine_policies.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -414,7 +414,7 @@
// multi_pass template, combining 4 separate policies into one. Any other
// multi_pass policy class needs to follow the scheme as shown below.
template<
- typename Input, typename Ownership, typename Checking,
+ typename Ownership, typename Checking, typename Input,
typename Storage
>
struct default_policy
Modified: branches/proto/v4/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp
==============================================================================
--- branches/proto/v4/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp (original)
+++ branches/proto/v4/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -154,7 +154,6 @@
return ftor;
}
- protected:
mutable functor_type ftor;
};
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -83,7 +83,7 @@
typedef proto::terminal<tag::lit>::type lit_type;
typedef proto::terminal<tag::wlit>::type wlit_type;
typedef proto::terminal<tag::eol>::type eol_type;
- typedef proto::terminal<tag::eoi>::type end_type;
+ typedef proto::terminal<tag::eoi>::type eoi_type;
typedef proto::terminal<tag::bin>::type bin_type;
typedef proto::terminal<tag::oct>::type oct_type;
Deleted: branches/proto/v4/boost/unordered/detail/allocator.hpp
==============================================================================
--- branches/proto/v4/boost/unordered/detail/allocator.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
+++ (empty file)
@@ -1,237 +0,0 @@
-
-// Copyright 2005-2008 Daniel James.
-// 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)
-
-#ifndef BOOST_UNORDERED_DETAIL_ALLOCATOR_UTILITIES_HPP_INCLUDED
-#define BOOST_UNORDERED_DETAIL_ALLOCATOR_UTILITIES_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp>
-
-#if (defined(BOOST_NO_STD_ALLOCATOR) || defined(BOOST_DINKUMWARE_STDLIB)) \
- && !defined(__BORLANDC__)
-# define BOOST_UNORDERED_USE_ALLOCATOR_UTILITIES
-#endif
-
-#if defined(BOOST_UNORDERED_USE_ALLOCATOR_UTILITIES)
-# include <boost/detail/allocator_utilities.hpp>
-#endif
-
-#include <boost/mpl/aux_/config/eti.hpp>
-
-namespace boost {
- namespace unordered_detail {
-
-#if defined(BOOST_UNORDERED_USE_ALLOCATOR_UTILITIES)
- template <class Alloc, class T>
- struct rebind_wrap : ::boost::detail::allocator::rebind_to<Alloc, T> {};
-#else
- template <class Alloc, class T>
- struct rebind_wrap
- {
- typedef BOOST_DEDUCED_TYPENAME
- Alloc::BOOST_NESTED_TEMPLATE rebind<T>::other
- type;
- };
-#endif
-
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- template <class T>
- inline void reset(T& x) { x = T(); }
-
- template <class Ptr>
- inline Ptr null_ptr() { return Ptr(); }
-#else
- template <class T>
- inline void reset_impl(T& x, ...) { x = T(); }
- template <class T>
- inline void reset_impl(T*& x, int) { x = 0; }
- template <class T>
- inline void reset(T& x) { reset_impl(x); }
-
- template <class Ptr>
- inline Ptr null_ptr() { Ptr x; reset(x); return x; }
-#endif
-
- // Work around for Microsoft's ETI bug.
-
- template <class Allocator> struct allocator_value_type
- {
- typedef BOOST_DEDUCED_TYPENAME Allocator::value_type type;
- };
-
- template <class Allocator> struct allocator_pointer
- {
- typedef BOOST_DEDUCED_TYPENAME Allocator::pointer type;
- };
-
- template <class Allocator> struct allocator_const_pointer
- {
- typedef BOOST_DEDUCED_TYPENAME Allocator::const_pointer type;
- };
-
- template <class Allocator> struct allocator_reference
- {
- typedef BOOST_DEDUCED_TYPENAME Allocator::reference type;
- };
-
- template <class Allocator> struct allocator_const_reference
- {
- typedef BOOST_DEDUCED_TYPENAME Allocator::const_reference type;
- };
-
-#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
-
- template <>
- struct allocator_value_type<int>
- {
- typedef int type;
- };
-
- template <>
- struct allocator_pointer<int>
- {
- typedef int type;
- };
-
- template <>
- struct allocator_const_pointer<int>
- {
- typedef int type;
- };
-
- template <>
- struct allocator_reference<int>
- {
- typedef int type;
- };
-
- template <>
- struct allocator_const_reference<int>
- {
- typedef int type;
- };
-
-#endif
-
- template <class Allocator>
- struct allocator_constructor
- {
- typedef BOOST_DEDUCED_TYPENAME allocator_value_type<Allocator>::type value_type;
- typedef BOOST_DEDUCED_TYPENAME allocator_pointer<Allocator>::type pointer;
-
- Allocator& alloc_;
- pointer ptr_;
- bool constructed_;
-
- allocator_constructor(Allocator& a)
- : alloc_(a), ptr_(), constructed_(false)
- {
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- unordered_detail::reset(ptr_);
-#endif
- }
-
- ~allocator_constructor() {
- if(ptr_) {
- if(constructed_) alloc_.destroy(ptr_);
- alloc_.deallocate(ptr_, 1);
- }
- }
-
- template <class V>
- void construct(V const& v) {
- BOOST_ASSERT(!ptr_ && !constructed_);
- ptr_ = alloc_.allocate(1);
- alloc_.construct(ptr_, value_type(v));
- constructed_ = true;
- }
-
- void construct(value_type const& v) {
- BOOST_ASSERT(!ptr_ && !constructed_);
- ptr_ = alloc_.allocate(1);
- alloc_.construct(ptr_, v);
- constructed_ = true;
- }
-
- pointer get() const
- {
- return ptr_;
- }
-
- // no throw
- pointer release()
- {
- pointer p = ptr_;
- constructed_ = false;
- unordered_detail::reset(ptr_);
- return p;
- }
- };
-
- template <class Allocator>
- struct allocator_array_constructor
- {
- typedef BOOST_DEDUCED_TYPENAME allocator_pointer<Allocator>::type pointer;
-
- Allocator& alloc_;
- pointer ptr_;
- pointer constructed_;
- std::size_t length_;
-
- allocator_array_constructor(Allocator& a)
- : alloc_(a), ptr_(), constructed_(), length_(0)
- {
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- unordered_detail::reset(constructed_);
- unordered_detail::reset(ptr_);
-#endif
- }
-
- ~allocator_array_constructor() {
- if (ptr_) {
- for(pointer p = ptr_; p != constructed_; ++p)
- alloc_.destroy(p);
-
- alloc_.deallocate(ptr_, length_);
- }
- }
-
- template <class V>
- void construct(V const& v, std::size_t l)
- {
- BOOST_ASSERT(!ptr_);
- length_ = l;
- ptr_ = alloc_.allocate(length_);
- pointer end = ptr_ + static_cast<std::ptrdiff_t>(length_);
- for(constructed_ = ptr_; constructed_ != end; ++constructed_)
- alloc_.construct(constructed_, v);
- }
-
- pointer get() const
- {
- return ptr_;
- }
-
- pointer release()
- {
- pointer p(ptr_);
- unordered_detail::reset(ptr_);
- return p;
- }
- private:
- allocator_array_constructor(allocator_array_constructor const&);
- allocator_array_constructor& operator=(allocator_array_constructor const&);
- };
- }
-}
-
-#if defined(BOOST_UNORDERED_USE_ALLOCATOR_UTILITIES)
-# undef BOOST_UNORDERED_USE_ALLOCATOR_UTILITIES
-#endif
-
-#endif
Modified: branches/proto/v4/boost/unordered/detail/hash_table.hpp
==============================================================================
--- branches/proto/v4/boost/unordered/detail/hash_table.hpp (original)
+++ branches/proto/v4/boost/unordered/detail/hash_table.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -24,7 +24,7 @@
#include <boost/limits.hpp>
#include <boost/assert.hpp>
#include <boost/static_assert.hpp>
-#include <boost/unordered/detail/allocator.hpp>
+#include <boost/unordered/detail/allocator_helpers.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/and.hpp>
Modified: branches/proto/v4/boost/unordered/detail/hash_table_impl.hpp
==============================================================================
--- branches/proto/v4/boost/unordered/detail/hash_table_impl.hpp (original)
+++ branches/proto/v4/boost/unordered/detail/hash_table_impl.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -694,7 +694,7 @@
BOOST_ASSERT(base == end.bucket_);
split_group(end.node_);
-
+
link_ptr ptr(base->next_);
base->next_ = end.node_;
@@ -1147,7 +1147,7 @@
//
// Swap's behaviour when allocators aren't equal is in dispute, for
// details see:
- //
+ //
// http://unordered.nfshost.com/doc/html/unordered/rationale.html#swapping_containers_with_unequal_allocators
//
// ----------------------------------------------------------------
@@ -1159,6 +1159,13 @@
void swap(BOOST_UNORDERED_TABLE& x)
{
+ // The swap code can work when swapping a container with itself
+ // but it triggers an assertion in buffered_functions.
+ // At the moment, I'd rather leave that assertion in and add a
+ // check here, rather than remove the assertion. I might change
+ // this at a later date.
+ if(this == &x) return;
+
// These can throw, but they only affect the function objects
// that aren't in use so it is strongly exception safe, via.
// double buffering.
@@ -1669,7 +1676,7 @@
size_type hash_value = hash_function()(k);
bucket_ptr bucket = data_.bucket_from_hash(hash_value);
link_ptr pos = find_iterator(bucket, k);
-
+
if (BOOST_UNORDERED_BORLAND_BOOL(pos)) {
// Found an existing key, return it (no throw).
return std::pair<iterator_base, bool>(
@@ -1744,7 +1751,7 @@
size_type hash_value = hash_function()(extract_key(*i));
bucket_ptr bucket = data_.bucket_from_hash(hash_value);
link_ptr pos = find_iterator(bucket, extract_key(*i));
-
+
if (!BOOST_UNORDERED_BORLAND_BOOL(pos)) {
// Doesn't already exist, add to bucket.
// Side effects only in this block.
@@ -1871,7 +1878,7 @@
};
// Iterators
-
+
template <typename Alloc> class BOOST_UNORDERED_ITERATOR;
template <typename Alloc> class BOOST_UNORDERED_CONST_ITERATOR;
template <typename Alloc> class BOOST_UNORDERED_LOCAL_ITERATOR;
Modified: branches/proto/v4/boost/unordered/detail/move.hpp
==============================================================================
--- branches/proto/v4/boost/unordered/detail/move.hpp (original)
+++ branches/proto/v4/boost/unordered/detail/move.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -69,14 +69,14 @@
/*************************************************************************************************/
/*
- REVISIT (sparent_at_[hidden]): This is a work around for Boost 1.34.1 and VC++ 2008 where
- boost::is_convertible<T, T> fails to compile.
+ REVISIT (sparent_at_[hidden]): This is a work around for Boost 1.34.1 and VC++ 2008 where
+ boost::is_convertible<T, T> fails to compile.
*/
template <typename T, typename U>
struct is_convertible : boost::mpl::or_<
- boost::is_same<T, U>,
- boost::is_convertible<T, U>
+ boost::is_same<T, U>,
+ boost::is_convertible<T, U>
> { };
/*************************************************************************************************/
Modified: branches/proto/v4/boost/wave/cpplexer/cpp_lex_iterator.hpp
==============================================================================
--- branches/proto/v4/boost/wave/cpplexer/cpp_lex_iterator.hpp (original)
+++ branches/proto/v4/boost/wave/cpplexer/cpp_lex_iterator.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -57,11 +57,16 @@
public:
lex_iterator_functor_shim()
-#if 0 != __DECCXX_VER || BOOST_INTEL_CXX_VERSION > 900 || defined(__PGI)
+#if /*0 != __DECCXX_VER || */defined(__PGI)
: eof()
#endif
{}
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+ lex_iterator_functor_shim& operator= (lex_iterator_functor_shim const& rhs)
+ { return *this; } // nothing to do here
+#endif
+
// interface to the multi_pass_policies::split_functor_input policy
typedef TokenT result_type;
typedef lex_iterator_functor_shim unique;
@@ -153,7 +158,7 @@
typedef boost::spirit::multi_pass_policies::split_std_deque storage_policy;
typedef boost::spirit::multi_pass_policies::default_policy<
- input_policy, ownership_policy, check_policy, storage_policy>
+ ownership_policy, check_policy, input_policy, storage_policy>
policy_type;
typedef boost::spirit::multi_pass<functor_data_type, policy_type> type;
};
Modified: branches/proto/v4/boost/wave/util/macro_helpers.hpp
==============================================================================
--- branches/proto/v4/boost/wave/util/macro_helpers.hpp (original)
+++ branches/proto/v4/boost/wave/util/macro_helpers.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -17,6 +17,7 @@
#include <boost/wave/wave_config.hpp>
#include <boost/wave/token_ids.hpp>
#include <boost/wave/cpplexer/validate_universal_char.hpp>
+#include <boost/wave/util/unput_queue_iterator.hpp>
// this must occur after all of the includes and before any code appears
#ifdef BOOST_HAS_ABI_HEADERS
Modified: branches/proto/v4/libs/asio/doc/using.qbk
==============================================================================
--- branches/proto/v4/libs/asio/doc/using.qbk (original)
+++ branches/proto/v4/libs/asio/doc/using.qbk 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -255,6 +255,13 @@
cancel the outstanding operations and close the socket.
]
]
+ [
+ [`BOOST_ASIO_NO_TYPEID`]
+ [
+ Disables uses of the `typeid` operator in Boost.Asio. Defined
+ automatically if `BOOST_NO_TYPEID` is defined.
+ ]
+ ]
]
[endsect]
Modified: branches/proto/v4/libs/asio/example/invocation/prioritised_handlers.cpp
==============================================================================
--- branches/proto/v4/libs/asio/example/invocation/prioritised_handlers.cpp (original)
+++ branches/proto/v4/libs/asio/example/invocation/prioritised_handlers.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -13,6 +13,8 @@
#include <iostream>
#include <queue>
+using boost::asio::ip::tcp;
+
class handler_priority_queue
{
public:
@@ -108,12 +110,12 @@
//----------------------------------------------------------------------
-void high_priority_handler()
+void high_priority_handler(const boost::system::error_code& /*ec*/)
{
std::cout << "High priority handler\n";
}
-void middle_priority_handler()
+void middle_priority_handler(const boost::system::error_code& /*ec*/)
{
std::cout << "Middle priority handler\n";
}
@@ -129,9 +131,22 @@
handler_priority_queue pri_queue;
+ // Post a completion handler to be run immediately.
io_service.post(pri_queue.wrap(0, low_priority_handler));
- io_service.post(pri_queue.wrap(100, high_priority_handler));
- io_service.post(pri_queue.wrap(42, middle_priority_handler));
+
+ // Start an asynchronous accept that will complete immediately.
+ tcp::endpoint endpoint(boost::asio::ip::address_v4::loopback(), 0);
+ tcp::acceptor acceptor(io_service, endpoint);
+ tcp::socket server_socket(io_service);
+ acceptor.async_accept(server_socket,
+ pri_queue.wrap(100, high_priority_handler));
+ tcp::socket client_socket(io_service);
+ client_socket.connect(acceptor.local_endpoint());
+
+ // Set a deadline timer to expire immediately.
+ boost::asio::deadline_timer timer(io_service);
+ timer.expires_at(boost::posix_time::neg_infin);
+ timer.async_wait(pri_queue.wrap(42, middle_priority_handler));
while (io_service.run_one())
{
Modified: branches/proto/v4/libs/asio/test/Jamfile
==============================================================================
--- branches/proto/v4/libs/asio/test/Jamfile (original)
+++ branches/proto/v4/libs/asio/test/Jamfile 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -69,7 +69,16 @@
[ run ip/v6_only.cpp <template>asio_unit_test ]
[ run is_read_buffered.cpp <template>asio_unit_test ]
[ run is_write_buffered.cpp <template>asio_unit_test ]
+ [ run local/basic_endpoint.cpp <template>asio_unit_test ]
+ [ run local/connect_pair.cpp <template>asio_unit_test ]
+ [ run local/datagram_protocol.cpp <template>asio_unit_test ]
+ [ run local/stream_protocol.cpp <template>asio_unit_test ]
[ run placeholders.cpp <template>asio_unit_test ]
+ [ run posix/basic_descriptor.cpp <template>asio_unit_test ]
+ [ run posix/basic_stream_descriptor.cpp <template>asio_unit_test ]
+ [ run posix/descriptor_base.cpp <template>asio_unit_test ]
+ [ run posix/stream_descriptor.cpp <template>asio_unit_test ]
+ [ run posix/stream_descriptor_service.cpp <template>asio_unit_test ]
[ run read.cpp <template>asio_unit_test ]
[ run read_until.cpp <template>asio_unit_test ]
[ run socket_acceptor_service.cpp <template>asio_unit_test ]
@@ -77,5 +86,9 @@
[ run strand.cpp <template>asio_unit_test ]
[ run stream_socket_service.cpp <template>asio_unit_test ]
[ run time_traits.cpp <template>asio_unit_test ]
+ [ run windows/basic_handle.cpp <template>asio_unit_test ]
+ [ run windows/basic_stream_handle.cpp <template>asio_unit_test ]
+ [ run windows/stream_handle.cpp <template>asio_unit_test ]
+ [ run windows/stream_handle_service.cpp <template>asio_unit_test ]
[ run write.cpp <template>asio_unit_test ]
;
Modified: branches/proto/v4/libs/asio/test/Jamfile.v2
==============================================================================
--- branches/proto/v4/libs/asio/test/Jamfile.v2 (original)
+++ branches/proto/v4/libs/asio/test/Jamfile.v2 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -116,8 +116,26 @@
[ run is_read_buffered.cpp : : : $(USE_SELECT) : is_read_buffered_select ]
[ run is_write_buffered.cpp ]
[ run is_write_buffered.cpp : : : $(USE_SELECT) : is_write_buffered_select ]
+ [ link local/basic_endpoint.cpp : : local_basic_endpoint ]
+ [ link local/basic_endpoint.cpp : $(USE_SELECT) : local_basic_endpoint_select ]
+ [ link local/connect_pair.cpp : : local_connect_pair ]
+ [ link local/connect_pair.cpp : $(USE_SELECT) : local_connect_pair_select ]
+ [ link local/datagram_protocol.cpp : : local_datagram_protocol ]
+ [ link local/datagram_protocol.cpp : $(USE_SELECT) : local_datagram_protocol_select ]
+ [ link local/stream_protocol.cpp : : local_stream_protocol ]
+ [ link local/stream_protocol.cpp : $(USE_SELECT) : local_stream_protocol_select ]
[ link placeholders.cpp ]
[ link placeholders.cpp : $(USE_SELECT) : placeholders_select ]
+ [ link posix/basic_descriptor.cpp : : posix_basic_descriptor ]
+ [ link posix/basic_descriptor.cpp : $(USE_SELECT) : posix_basic_descriptor_select ]
+ [ link posix/basic_stream_descriptor.cpp : : posix_basic_stream_descriptor ]
+ [ link posix/basic_stream_descriptor.cpp : $(USE_SELECT) : posix_basic_stream_descriptor_select ]
+ [ link posix/descriptor_base.cpp : : posix_descriptor_base ]
+ [ link posix/descriptor_base.cpp : $(USE_SELECT) : posix_descriptor_base_select ]
+ [ link posix/stream_descriptor.cpp : : posix_stream_descriptor ]
+ [ link posix/stream_descriptor.cpp : $(USE_SELECT) : posix_stream_descriptor_select ]
+ [ link posix/stream_descriptor_service.cpp : : posix_stream_descriptor_service ]
+ [ link posix/stream_descriptor_service.cpp : $(USE_SELECT) : posix_stream_descriptor_service_select ]
[ run read.cpp ]
[ run read.cpp : : : $(USE_SELECT) : read_select ]
[ run read_until.cpp ]
@@ -132,6 +150,14 @@
[ link stream_socket_service.cpp : $(USE_SELECT) : stream_socket_service_select ]
[ link time_traits.cpp ]
[ link time_traits.cpp : $(USE_SELECT) : time_traits_select ]
+ [ link windows/basic_handle.cpp : : windows_basic_handle ]
+ [ link windows/basic_handle.cpp : $(USE_SELECT) : windows_basic_handle_select ]
+ [ link windows/basic_stream_handle.cpp : : windows_basic_stream_handle ]
+ [ link windows/basic_stream_handle.cpp : $(USE_SELECT) : windows_basic_stream_handle_select ]
+ [ link windows/stream_handle.cpp : : windows_stream_handle ]
+ [ link windows/stream_handle.cpp : $(USE_SELECT) : windows_stream_handle_select ]
+ [ link windows/stream_handle_service.cpp : : windows_stream_handle_service ]
+ [ link windows/stream_handle_service.cpp : $(USE_SELECT) : windows_stream_handle_service_select ]
[ run write.cpp ]
[ run write.cpp : : : $(USE_SELECT) : write_select ]
;
Modified: branches/proto/v4/libs/asio/test/ip/tcp.cpp
==============================================================================
--- branches/proto/v4/libs/asio/test/ip/tcp.cpp (original)
+++ branches/proto/v4/libs/asio/test/ip/tcp.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -239,36 +239,51 @@
socket1.send(buffer(mutable_char_buffer));
socket1.send(buffer(const_char_buffer));
+ socket1.send(null_buffers());
socket1.send(buffer(mutable_char_buffer), in_flags);
socket1.send(buffer(const_char_buffer), in_flags);
+ socket1.send(null_buffers(), in_flags);
socket1.send(buffer(mutable_char_buffer), in_flags, ec);
socket1.send(buffer(const_char_buffer), in_flags, ec);
+ socket1.send(null_buffers(), in_flags, ec);
socket1.async_send(buffer(mutable_char_buffer), send_handler);
socket1.async_send(buffer(const_char_buffer), send_handler);
+ socket1.async_send(null_buffers(), send_handler);
socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler);
socket1.async_send(buffer(const_char_buffer), in_flags, send_handler);
+ socket1.async_send(null_buffers(), in_flags, send_handler);
socket1.receive(buffer(mutable_char_buffer));
+ socket1.receive(null_buffers());
socket1.receive(buffer(mutable_char_buffer), in_flags);
+ socket1.receive(null_buffers(), in_flags);
socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.receive(null_buffers(), in_flags, ec);
socket1.async_receive(buffer(mutable_char_buffer), receive_handler);
+ socket1.async_receive(null_buffers(), receive_handler);
socket1.async_receive(buffer(mutable_char_buffer), in_flags,
receive_handler);
+ socket1.async_receive(null_buffers(), in_flags, receive_handler);
socket1.write_some(buffer(mutable_char_buffer));
socket1.write_some(buffer(const_char_buffer));
+ socket1.write_some(null_buffers());
socket1.write_some(buffer(mutable_char_buffer), ec);
socket1.write_some(buffer(const_char_buffer), ec);
+ socket1.write_some(null_buffers(), ec);
socket1.async_write_some(buffer(mutable_char_buffer), write_some_handler);
socket1.async_write_some(buffer(const_char_buffer), write_some_handler);
+ socket1.async_write_some(null_buffers(), write_some_handler);
socket1.read_some(buffer(mutable_char_buffer));
socket1.read_some(buffer(mutable_char_buffer), ec);
+ socket1.read_some(null_buffers(), ec);
socket1.async_read_some(buffer(mutable_char_buffer), read_some_handler);
+ socket1.async_read_some(null_buffers(), read_some_handler);
}
catch (std::exception&)
{
Modified: branches/proto/v4/libs/asio/test/ip/udp.cpp
==============================================================================
--- branches/proto/v4/libs/asio/test/ip/udp.cpp (original)
+++ branches/proto/v4/libs/asio/test/ip/udp.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -144,15 +144,20 @@
socket1.send(buffer(mutable_char_buffer));
socket1.send(buffer(const_char_buffer));
+ socket1.send(null_buffers());
socket1.send(buffer(mutable_char_buffer), in_flags);
socket1.send(buffer(const_char_buffer), in_flags);
+ socket1.send(null_buffers(), in_flags);
socket1.send(buffer(mutable_char_buffer), in_flags, ec);
socket1.send(buffer(const_char_buffer), in_flags, ec);
+ socket1.send(null_buffers(), in_flags, ec);
socket1.async_send(buffer(mutable_char_buffer), send_handler);
socket1.async_send(buffer(const_char_buffer), send_handler);
+ socket1.async_send(null_buffers(), send_handler);
socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler);
socket1.async_send(buffer(const_char_buffer), in_flags, send_handler);
+ socket1.async_send(null_buffers(), in_flags, send_handler);
socket1.send_to(buffer(mutable_char_buffer),
ip::udp::endpoint(ip::udp::v4(), 0));
@@ -162,6 +167,10 @@
ip::udp::endpoint(ip::udp::v4(), 0));
socket1.send_to(buffer(const_char_buffer),
ip::udp::endpoint(ip::udp::v6(), 0));
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0));
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0));
socket1.send_to(buffer(mutable_char_buffer),
ip::udp::endpoint(ip::udp::v4(), 0), in_flags);
socket1.send_to(buffer(mutable_char_buffer),
@@ -170,6 +179,10 @@
ip::udp::endpoint(ip::udp::v4(), 0), in_flags);
socket1.send_to(buffer(const_char_buffer),
ip::udp::endpoint(ip::udp::v6(), 0), in_flags);
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags);
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags);
socket1.send_to(buffer(mutable_char_buffer),
ip::udp::endpoint(ip::udp::v4(), 0), in_flags, ec);
socket1.send_to(buffer(mutable_char_buffer),
@@ -178,6 +191,10 @@
ip::udp::endpoint(ip::udp::v4(), 0), in_flags, ec);
socket1.send_to(buffer(const_char_buffer),
ip::udp::endpoint(ip::udp::v6(), 0), in_flags, ec);
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, ec);
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, ec);
socket1.async_send_to(buffer(mutable_char_buffer),
ip::udp::endpoint(ip::udp::v4(), 0), send_handler);
@@ -187,6 +204,10 @@
ip::udp::endpoint(ip::udp::v4(), 0), send_handler);
socket1.async_send_to(buffer(const_char_buffer),
ip::udp::endpoint(ip::udp::v6(), 0), send_handler);
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), send_handler);
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), send_handler);
socket1.async_send_to(buffer(mutable_char_buffer),
ip::udp::endpoint(ip::udp::v4(), 0), in_flags, send_handler);
socket1.async_send_to(buffer(mutable_char_buffer),
@@ -195,24 +216,40 @@
ip::udp::endpoint(ip::udp::v4(), 0), in_flags, send_handler);
socket1.async_send_to(buffer(const_char_buffer),
ip::udp::endpoint(ip::udp::v6(), 0), in_flags, send_handler);
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, send_handler);
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, send_handler);
socket1.receive(buffer(mutable_char_buffer));
+ socket1.receive(null_buffers());
socket1.receive(buffer(mutable_char_buffer), in_flags);
+ socket1.receive(null_buffers(), in_flags);
socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.receive(null_buffers(), in_flags, ec);
socket1.async_receive(buffer(mutable_char_buffer), receive_handler);
+ socket1.async_receive(null_buffers(), receive_handler);
socket1.async_receive(buffer(mutable_char_buffer), in_flags,
receive_handler);
+ socket1.async_receive(null_buffers(), in_flags, receive_handler);
ip::udp::endpoint endpoint;
socket1.receive_from(buffer(mutable_char_buffer), endpoint);
+ socket1.receive_from(null_buffers(), endpoint);
socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags);
+ socket1.receive_from(null_buffers(), endpoint, in_flags);
socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags, ec);
+ socket1.receive_from(null_buffers(), endpoint, in_flags, ec);
socket1.async_receive_from(buffer(mutable_char_buffer),
endpoint, receive_handler);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, receive_handler);
socket1.async_receive_from(buffer(mutable_char_buffer),
endpoint, in_flags, receive_handler);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, receive_handler);
}
catch (std::exception&)
{
Modified: branches/proto/v4/libs/config/doc/guidelines.qbk
==============================================================================
--- branches/proto/v4/libs/config/doc/guidelines.qbk (original)
+++ branches/proto/v4/libs/config/doc/guidelines.qbk 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -59,6 +59,32 @@
majority of compilers, such as namespaces, exceptions, RTTI, or templates.
+[section:warnings Disabling Compiler Warings]
+
+The header `<boost/config/warning_disable.hpp>` can be used to disable
+certain compiler warings that are hard or impossible to otherwise remove.
+
+Note that:
+
+* This header [*['should never be included by another Boost header]], it should
+only ever be used by a library source file or a test case.
+* The header should be included [*['before you include any other header]].
+* This header only disables warnings that are hard or impossible to otherwise
+ deal with, and which are typically emitted by one compiler only, or
+ in one compilers own standard library headers.
+
+Currently it disables the following warnings:
+
+[table
+[[Compiler][Warning]]
+[[Visual C++ 8 and later][[@http://msdn2.microsoft.com/en-us/library/ttcz0bys(VS.80).aspx C4996]: Error 'function': was declared deprecated]]
+[[Intel C++][Warning 1786: relates to the use of "deprecated" standard
+ library functions rather like C4996 in Visual C++.]]
+]
+
+[endsect]
+
+
[section Adding New Defect Macros]
When you need to add a new defect macro -either to fix a problem with an
Modified: branches/proto/v4/libs/config/doc/html/boost_config/guidelines_for_boost_authors.html
==============================================================================
--- branches/proto/v4/libs/config/doc/html/boost_config/guidelines_for_boost_authors.html (original)
+++ branches/proto/v4/libs/config/doc/html/boost_config/guidelines_for_boost_authors.html 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -28,6 +28,8 @@
Boost Authors</a>
</h2></div></div></div>
<div class="toc"><dl>
+<dt><span class="section"><a href="guidelines_for_boost_authors.html#boost_config.guidelines_for_boost_authors.warnings">
+ Disabling Compiler Warings</a></span></dt>
<dt><span class="section"><a href="guidelines_for_boost_authors.html#boost_config.guidelines_for_boost_authors.adding_new_defect_macros">Adding
New Defect Macros</a></span></dt>
<dt><span class="section"><a href="guidelines_for_boost_authors.html#boost_config.guidelines_for_boost_authors.adding_new_feature_test_macros">Adding
@@ -103,6 +105,85 @@
</ul></div>
<div class="section" lang="en">
<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_config.guidelines_for_boost_authors.warnings"></a><a href="guidelines_for_boost_authors.html#boost_config.guidelines_for_boost_authors.warnings" title="Disabling Compiler Warings">
+ Disabling Compiler Warings</a>
+</h3></div></div></div>
+<p>
+ The header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">/</span><span class="identifier">warning_disable</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
+ can be used to disable certain compiler warings that are hard or impossible
+ to otherwise remove.
+ </p>
+<p>
+ Note that:
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ This header <span class="bold"><strong><span class="emphasis"><em>should never be included by
+ another Boost header</em></span></strong></span>, it should only ever be used
+ by a library source file or a test case.
+ </li>
+<li>
+ The header should be included <span class="bold"><strong><span class="emphasis"><em>before you
+ include any other header</em></span></strong></span>.
+ </li>
+<li>
+ This header only disables warnings that are hard or impossible to otherwise
+ deal with, and which are typically emitted by one compiler only, or in
+ one compilers own standard library headers.
+ </li>
+</ul></div>
+<p>
+ Currently it disables the following warnings:
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Compiler
+ </p>
+ </th>
+<th>
+ <p>
+ Warning
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ Visual C++ 8 and later
+ </p>
+ </td>
+<td>
+ <p>
+ C4996:
+ Error 'function': was declared deprecated
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ Intel C++
+ </p>
+ </td>
+<td>
+ <p>
+ Warning 1786: relates to the use of "deprecated" standard
+ library functions rather like C4996 in Visual C++.
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
<a name="boost_config.guidelines_for_boost_authors.adding_new_defect_macros"></a><a href="guidelines_for_boost_authors.html#boost_config.guidelines_for_boost_authors.adding_new_defect_macros" title="Adding New Defect Macros">Adding
New Defect Macros</a>
</h3></div></div></div>
Modified: branches/proto/v4/libs/config/doc/html/index.html
==============================================================================
--- branches/proto/v4/libs/config/doc/html/index.html (original)
+++ branches/proto/v4/libs/config/doc/html/index.html 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -73,6 +73,8 @@
<dt><span class="section"><a href="boost_config/guidelines_for_boost_authors.html">Guidelines for
Boost Authors</a></span></dt>
<dd><dl>
+<dt><span class="section"><a href="boost_config/guidelines_for_boost_authors.html#boost_config.guidelines_for_boost_authors.warnings">
+ Disabling Compiler Warings</a></span></dt>
<dt><span class="section"><a href="boost_config/guidelines_for_boost_authors.html#boost_config.guidelines_for_boost_authors.adding_new_defect_macros">Adding
New Defect Macros</a></span></dt>
<dt><span class="section"><a href="boost_config/guidelines_for_boost_authors.html#boost_config.guidelines_for_boost_authors.adding_new_feature_test_macros">Adding
@@ -958,7 +960,7 @@
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"><p><small>Last revised: April 04, 2008 at 08:46:37 GMT</small></p></td>
+<td align="left"><p><small>Last revised: April 20, 2008 at 12:51:56 GMT</small></p></td>
<td align="right"><div class="copyright-footer"></div></td>
</tr></table>
<hr>
Modified: branches/proto/v4/libs/filesystem/doc/reference.html
==============================================================================
--- branches/proto/v4/libs/filesystem/doc/reference.html (original)
+++ branches/proto/v4/libs/filesystem/doc/reference.html 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -2294,7 +2294,7 @@
p.leaf()</code>.</p>
</blockquote>
<pre>template <class Path>
- Path replace_extension(const Path & p, const typename Path::string_type & new_extension);</pre>
+ Path change_extension(const Path & p, const typename Path::string_type & new_extension);</pre>
<blockquote>
<p><i>Postcondition:</i> <code>basename(<i>return_value</i>) == basename(p) &&
extension(<i>return_value</i>) == new_extension</code> </p>
@@ -3057,7 +3057,7 @@
<p>Distributed under the Boost Software License, Version 1.0. See
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p>
<p>Revised
-<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->18 March 2008<!--webbot bot="Timestamp" endspan i-checksum="27357" --></p>
+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->19 April 2008<!--webbot bot="Timestamp" endspan i-checksum="28399" --></p>
</body>
Modified: branches/proto/v4/libs/math/test/compile_test/instantiate.hpp
==============================================================================
--- branches/proto/v4/libs/math/test/compile_test/instantiate.hpp (original)
+++ branches/proto/v4/libs/math/test/compile_test/instantiate.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -347,19 +347,25 @@
boost::math::expint(i, i, pol);
boost::math::zeta(v1, pol);
boost::math::zeta(i, pol);
- boost::math::trunc(v1, pol);
- boost::math::itrunc(v1, pol);
- boost::math::ltrunc(v1, pol);
- boost::math::round(v1, pol);
- boost::math::iround(v1, pol);
- boost::math::lround(v1, pol);
- boost::math::modf(v1, &v1, pol);
- boost::math::modf(v1, &i, pol);
- boost::math::modf(v1, &l, pol);
+ //
+ // These next functions are intended to be found via ADL:
+ //
+ BOOST_MATH_STD_USING
+ trunc(v1, pol);
+ itrunc(v1, pol);
+ ltrunc(v1, pol);
+ round(v1, pol);
+ iround(v1, pol);
+ lround(v1, pol);
+ modf(v1, &v1, pol);
+ modf(v1, &i, pol);
+ modf(v1, &l, pol);
#ifdef BOOST_HAS_LONG_LONG
- boost::math::lltrunc(v1, pol);
- boost::math::llround(v1, pol);
- boost::math::modf(v1, &ll, pol);
+ using boost::math::lltrunc;
+ using boost::math::llround;
+ lltrunc(v1, pol);
+ llround(v1, pol);
+ modf(v1, &ll, pol);
#endif
boost::math::pow<2>(v1, pol);
//
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -44,5 +44,6 @@
[ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ]
[ run spinlock_pool_test.cpp ]
[ run sp_accept_owner_test.cpp ]
+ [ run sp_atomic_test.cpp ]
;
}
Modified: branches/proto/v4/libs/smart_ptr/test/shared_ptr_mt_test.cpp
==============================================================================
--- branches/proto/v4/libs/smart_ptr/test/shared_ptr_mt_test.cpp (original)
+++ branches/proto/v4/libs/smart_ptr/test/shared_ptr_mt_test.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -7,167 +7,76 @@
#pragma warning(disable: 4514) // unreferenced inline removed
#endif
-//
// shared_ptr_mt_test.cpp - tests shared_ptr with multiple threads
//
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+// 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)
-//
+// 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/shared_ptr.hpp>
#include <boost/bind.hpp>
#include <vector>
-#include <memory>
-#include <stdexcept>
#include <cstdio>
#include <ctime>
-// 'portable' thread framework
-
-class abstract_thread
-{
-public:
-
- virtual ~abstract_thread() {}
- virtual void run() = 0;
-};
-
-#if !defined(BOOST_HAS_PTHREADS) && defined(BOOST_HAS_WINTHREADS)
-
-char const * title = "Using Windows threads";
-
-#include <windows.h>
-#include <process.h>
+#include <boost/detail/lightweight_thread.hpp>
-typedef HANDLE pthread_t;
+//
-unsigned __stdcall common_thread_routine(void * pv)
-{
- abstract_thread * pt = static_cast<abstract_thread *>(pv);
- pt->run();
- delete pt;
- return 0;
-}
+int const n = 1024 * 1024;
-int pthread_create(pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg)
+void test( boost::shared_ptr<int> const & pi )
{
- HANDLE h = (HANDLE)_beginthreadex(0, 0, start_routine, arg, 0, 0);
+ std::vector< boost::shared_ptr<int> > v;
- if(h != 0)
+ for( int i = 0; i < n; ++i )
{
- *thread = h;
- return 0;
- }
- else
- {
- return 1; // return errno;
+ v.push_back( pi );
}
}
-int pthread_join(pthread_t thread, void ** /*value_ptr*/)
-{
- ::WaitForSingleObject(thread, INFINITE);
- ::CloseHandle(thread);
- return 0;
-}
+int const m = 16; // threads
-#else
+#if defined( BOOST_HAS_PTHREADS )
-char const * title = "Using POSIX threads";
+char const * thmodel = "POSIX";
-#include <pthread.h>
+#else
-extern "C" void * common_thread_routine(void * pv)
-{
- abstract_thread * pt = static_cast<abstract_thread *>(pv);
- pt->run();
- delete pt;
- return 0;
-}
+char const * thmodel = "Windows";
#endif
-//
-
-template<class F> class thread: public abstract_thread
-{
-public:
-
- explicit thread(F f): f_(f)
- {
- }
-
- void run()
- {
- f_();
- }
-
-private:
-
- F f_;
-};
-
-template<class F> pthread_t createThread(F f)
-{
- std::auto_ptr<abstract_thread> p(new thread<F>(f));
-
- pthread_t r;
-
- if(pthread_create(&r, 0, common_thread_routine, p.get()) == 0)
- {
- p.release();
- return r;
- }
-
- throw std::runtime_error("createThread failed.");
-}
-
-//
-
-int const n = 1024 * 1024;
-
-void test(boost::shared_ptr<int> const & pi)
-{
- std::vector< boost::shared_ptr<int> > v;
-
- for(int i = 0; i < n; ++i)
- {
- v.push_back(pi);
- }
-}
-
-int const m = 16; // threads
-
int main()
{
using namespace std; // printf, clock_t, clock
- printf("%s: %d threads, %d iterations: ", title, m, n);
+ printf( "Using %s threads: %d threads, %d iterations: ", thmodel, m, n );
- boost::shared_ptr<int> pi(new int(42));
+ boost::shared_ptr<int> pi( new int(42) );
clock_t t = clock();
- pthread_t a[m];
+ pthread_t a[ m ];
- for(int i = 0; i < m; ++i)
+ for( int i = 0; i < m; ++i )
{
- a[i] = createThread( boost::bind(test, pi) );
+ boost::detail::lw_thread_create( a[ i ], boost::bind( test, pi ) );
}
- for(int j = 0; j < m; ++j)
+ for( int j = 0; j < m; ++j )
{
- pthread_join(a[j], 0);
+ pthread_join( a[j], 0 );
}
t = clock() - t;
- printf("\n\n%.3f seconds.\n", static_cast<double>(t) / CLOCKS_PER_SEC);
+ printf( "\n\n%.3f seconds.\n", static_cast<double>(t) / CLOCKS_PER_SEC );
return 0;
}
Modified: branches/proto/v4/libs/smart_ptr/test/weak_ptr_mt_test.cpp
==============================================================================
--- branches/proto/v4/libs/smart_ptr/test/weak_ptr_mt_test.cpp (original)
+++ branches/proto/v4/libs/smart_ptr/test/weak_ptr_mt_test.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -7,128 +7,26 @@
#pragma warning(disable: 4514) // unreferenced inline removed
#endif
-//
// weak_ptr_mt_test.cpp
//
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
-// Copyright 2005 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)
+// Copyright 2005, 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
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/bind.hpp>
#include <vector>
-#include <memory>
-#include <stdexcept>
#include <cstdio>
#include <ctime>
#include <cstdlib>
-// 'portable' thread framework
-
-class abstract_thread
-{
-public:
-
- virtual ~abstract_thread() {}
- virtual void run() = 0;
-};
-
-#if !defined(BOOST_HAS_PTHREADS) && defined(BOOST_HAS_WINTHREADS)
-
-char const * title = "Using Windows threads";
-
-#include <windows.h>
-#include <process.h>
-
-typedef HANDLE pthread_t;
-
-unsigned __stdcall common_thread_routine(void * pv)
-{
- abstract_thread * pt = static_cast<abstract_thread *>(pv);
- pt->run();
- delete pt;
- return 0;
-}
-
-int pthread_create(pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg)
-{
- HANDLE h = (HANDLE)_beginthreadex(0, 0, start_routine, arg, 0, 0);
-
- if(h != 0)
- {
- *thread = h;
- return 0;
- }
- else
- {
- return 1; // return errno;
- }
-}
-
-int pthread_join(pthread_t thread, void ** /*value_ptr*/)
-{
- ::WaitForSingleObject(thread, INFINITE);
- ::CloseHandle(thread);
- return 0;
-}
-
-#else
-
-char const * title = "Using POSIX threads";
-
-#include <pthread.h>
-
-extern "C" void * common_thread_routine(void * pv)
-{
- abstract_thread * pt = static_cast<abstract_thread *>(pv);
- pt->run();
- delete pt;
- return 0;
-}
-
-#endif
-
-//
-
-template<class F> class thread: public abstract_thread
-{
-public:
-
- explicit thread(F f): f_(f)
- {
- }
-
- void run()
- {
- f_();
- }
-
-private:
-
- F f_;
-};
-
-template<class F> pthread_t createThread(F f)
-{
- std::auto_ptr<abstract_thread> p(new thread<F>(f));
-
- pthread_t r;
-
- if(pthread_create(&r, 0, common_thread_routine, p.get()) == 0)
- {
- p.release();
- return r;
- }
-
- throw std::runtime_error("createThread failed.");
-}
+#include <boost/detail/lightweight_thread.hpp>
//
@@ -177,11 +75,21 @@
printf( "\n%d locks, %d forced rebinds, %d normal rebinds.", s, f, r );
}
+#if defined( BOOST_HAS_PTHREADS )
+
+char const * thmodel = "POSIX";
+
+#else
+
+char const * thmodel = "Windows";
+
+#endif
+
int main()
{
using namespace std; // printf, clock_t, clock
- printf("%s: %d threads, %d * %d iterations: ", title, m, n, k );
+ printf("Using %s threads: %d threads, %d * %d iterations: ", thmodel, m, n, k );
std::vector< boost::shared_ptr<int> > v( k );
@@ -192,16 +100,16 @@
clock_t t = clock();
- pthread_t a[m];
+ pthread_t a[ m ];
- for(int i = 0; i < m; ++i)
+ for( int i = 0; i < m; ++i )
{
- a[i] = createThread( boost::bind( test, v ) );
+ boost::detail::lw_thread_create( a[ i ], boost::bind( test, v ) );
}
v.resize( 0 ); // kill original copies
- for(int j = 0; j < m; ++j)
+ for( int j = 0; j < m; ++j )
{
pthread_join( a[j], 0 );
}
Modified: branches/proto/v4/libs/spirit/doc/lex/lexer_quickstart2.qbk
==============================================================================
--- branches/proto/v4/libs/spirit/doc/lex/lexer_quickstart2.qbk (original)
+++ branches/proto/v4/libs/spirit/doc/lex/lexer_quickstart2.qbk 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -58,11 +58,11 @@
brackets will be executed whenever the corresponding token has been matched by
the lexical analyzer. This is very similar to __flex__, where the action code
associated with a token definition gets executed after the recognition of a
-matching input sequence. The code above uses functors constructed using
-__phoenix2__, but it is possible to insert any C++ functor as long as it
-exposes the interface:
+matching input sequence. The code above uses function objects constructed using
+__phoenix2__, but it is possible to insert any C++ function or function object
+as long as it exposes the interface:
- void f (Range r, std::size_t id, Context& ctx, bool& matched);
+ void f (Range r, Idtype id, bool& matched, Context& ctx);
[variablelist where:
[[`Range r`] [This is a `boost::iterator_range` holding two
@@ -71,36 +71,35 @@
held iterators is the same as specified while
defining the type of the `lexertl_lexer<...>`
(its first template parameter).]]
- [[`std::size_t id`] [This is the token id for the matched token.]]
+ [[`Idtype id`] [This is the token id of the type `std::size_t`
+ for the matched token.]]
+ [[`bool& matched`] [This boolean value is pre/initialized to `true`.
+ If the functor sets it to `false` the lexer
+ stops calling any semantic actions attached to
+ this token and behaves as if the token have not
+ been matched in the first place.]]
[[`Context& ctx`] [This is a reference to a lexer specific,
unspecified type, providing the context for the
current lexer state. It can be used to access
different internal data items and is needed for
lexer state control from inside a semantic
action.]]
- [[`bool& matched`] [This boolean value is pre/initialized to `true`.
- If the functor sets it to `false` the lexer
- stops calling any semantic actions attached to
- this token and behaves as if the token have not
- been matched in the first place.]]
]
-Even if it is possible to write your own functor implementations, the preferred
-way of defining lexer semantic actions is to use __phoenix2__. In this case you
-can access the three parameters described in the table above by using the
-predefined __phoenix2__ placeholders: `_1` for the iterator range, `_2` for the
-token id, `_3` for the reference to the lexer state, and `_4` for the reference
-to the boolean value signaling the outcome of the semantic action.
-
-[important All placeholders (`_1`, `_2`, etc.) used in /lexer/ semantic
- actions in conjunction with functors created based on __phoenix2__
- need to be imported from the `namespace boost::phoenix::arg_names`
- (and *not* `namespace boost::spirit::arg_names`, which is
- different from using placeholders in __qi__ or __karma__).
- Using the wrong placeholders leads to subtle compilation errors
- which are difficult to backtrack to their cause.
-]
+When using a C++ function as the semantic action the following prototypes are
+allowed as well:
+ void f (Range r, Idtype id, bool& matched);
+ void f (Range r, Idtype id);
+ void f (Range r);
+
+Even if it is possible to write your own function object implementations (i.e.
+using Boost.Lambda or Boost.Bind), the preferred way of defining lexer semantic
+actions is to use __phoenix2__. In this case you can access the four parameters
+described in the table above by using the predefined __spirit__ placeholders:
+`_1` for the iterator range, `_2` for the token id, `_3` for the reference
+to the boolean value signaling the outcome of the semantic action, and `_4` for
+the reference to the internal lexer context.
[heading Associating Token Definitions with the Lexer]
Modified: branches/proto/v4/libs/spirit/example/lex/static_lexer/word_count_generate.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/example/lex/static_lexer/word_count_generate.cpp (original)
+++ branches/proto/v4/libs/spirit/example/lex/static_lexer/word_count_generate.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -14,7 +14,7 @@
// #define BOOST_SPIRIT_LEXERTL_DEBUG
#include <boost/spirit/include/lex_lexer_lexertl.hpp>
-#include <boost/spirit/lex/lexer/lexertl/lexertl_generate_static.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/lexertl_generate_static.hpp>
#include <fstream>
Modified: branches/proto/v4/libs/spirit/example/lex/static_lexer/word_count_static.hpp
==============================================================================
--- branches/proto/v4/libs/spirit/example/lex/static_lexer/word_count_static.hpp (original)
+++ branches/proto/v4/libs/spirit/example/lex/static_lexer/word_count_static.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -4,11 +4,11 @@
// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// Auto-generated by boost::lexer
-#if !defined(BOOST_SPIRIT_LEXER_NEXT_TOKEN_Feb_13_2008_12_01_20)
-#define BOOST_SPIRIT_LEXER_NEXT_TOKEN_Feb_13_2008_12_01_20
+#if !defined(BOOST_SPIRIT_LEXER_NEXT_TOKEN_Apr_20_2008_17_34_03)
+#define BOOST_SPIRIT_LEXER_NEXT_TOKEN_Apr_20_2008_17_34_03
#include <boost/detail/iterator.hpp>
-#include <boost/spirit/support/detail/lexer/char_traits.hpp>
+#include <boost/spirit/home/support/detail/lexer/char_traits.hpp>
// the generated table of state names and the tokenizer have to be
// defined in the boost::spirit::lex::static namespace
@@ -63,8 +63,8 @@
static const std::size_t dfa_[45] = {0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 3,
4, 2, 1, 65536, 0, 0, 0, 0,
- 0, 0, 2, 1, 65537, 0, 0, 0,
- 0, 0, 0, 0, 1, 65538, 0, 0,
+ 0, 0, 2, 1, 10, 0, 0, 0,
+ 0, 0, 0, 0, 1, 65537, 0, 0,
0, 0, 0, 0, 0};
if (start_token_ == end_) return 0;
Modified: branches/proto/v4/libs/spirit/example/lex/word_count_lexer.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/example/lex/word_count_lexer.cpp (original)
+++ branches/proto/v4/libs/spirit/example/lex/word_count_lexer.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -33,6 +33,7 @@
// #define BOOST_SPIRIT_LEXERTL_DEBUG
//[wcl_includes
+#include <boost/spirit/include/support_argument.hpp>
#include <boost/spirit/include/lex_lexer_lexertl.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_statement.hpp>
@@ -71,13 +72,7 @@
{
using boost::phoenix::ref;
using boost::phoenix::distance;
-
- // Note that all placeholders used in lexer semantic actions in
- // conjunction with functors created based on Phoenix2 need to be from
- // the namespace boost::phoenix::arg_names (not spirit::arg_names).
- // Using the wrong placeholders leads to subtle compilation errors
- // which are difficult to backtrack to their cause.
- using boost::phoenix::arg_names::_1;
+ using boost::spirit::arg_names::_1;
// associate tokens with the lexer
self = word [++ref(w), ref(c) += distance(_1)]
Modified: branches/proto/v4/libs/spirit/test/Jamfile
==============================================================================
--- branches/proto/v4/libs/spirit/test/Jamfile (original)
+++ branches/proto/v4/libs/spirit/test/Jamfile 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -48,11 +48,13 @@
[ run qi/match_manip.cpp : : : : ]
[ run qi/binary.cpp : : : : ]
[ run qi/debug.cpp : : : : ]
+ [ run qi/end.cpp : : : : ]
[ compile-fail qi/grammar_fail.cpp : : ]
[ compile-fail qi/rule_fail.cpp : : ]
# run Karma tests
+ [ run karma/actions.cpp : : : : karma_actions ]
[ run karma/alternative.cpp : : : : karma_alternative ]
[ run karma/binary.cpp : : : : karma_binary ]
[ run karma/case_handling.cpp : : : : ]
@@ -81,8 +83,9 @@
# run support tests
[ run support/hold_any.cpp : : : : ]
- [ run support/multi_pass_compile.cpp : : : : ]
- [ run support/multi_pass.cpp : : : : ]
+# the multi_pass tests are not completed yet
+# [ run support/multi_pass_compile.cpp : : : : ]
+# [ run support/multi_pass.cpp : : : : ]
# run lexer tests
[ run lex/lexertl1.cpp : : : : ]
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -6,6 +6,7 @@
#if !defined(BOOST_SPIRIT_KARMA_TEST_FEB_23_2007_1221PM)
#define BOOST_SPIRIT_KARMA_TEST_FEB_23_2007_1221PM
+#include <cstring>
#include <string>
#include <iterator>
#include <iostream>
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-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -8,6 +8,7 @@
#include <boost/spirit/include/qi.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
+#include <cstring>
using namespace boost::spirit;
@@ -44,11 +45,12 @@
}
{
- char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
- qi::parse(s1, e1, '{' >> int_[fun2] >> '}');
+ // $$$ uncomment me! $$$
+ //~ char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
+ //~ qi::parse(s1, e1, '{' >> int_[fun2] >> '}');
- int ii;
- boost::spirit::detail::action_dispatch(fun2, ii, ii);
+ //~ int ii;
+ //~ boost::spirit::detail::action_dispatch(fun2, ii, ii);
}
{
Modified: branches/proto/v4/libs/spirit/test/qi/binary.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/test/qi/binary.cpp (original)
+++ branches/proto/v4/libs/spirit/test/qi/binary.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -60,11 +60,11 @@
qword(0x0807060504030201LL)));
#endif
#else
- BOOST_TEST(test("\x01", 1, byte(0x01)));
- BOOST_TEST(test("\x01\x02", 2, word(0x0102)));
- BOOST_TEST(test("\x01\x02\x03\x04", 4, dword(0x01020304)));
+ BOOST_TEST(test("\x01", byte(0x01)));
+ BOOST_TEST(test("\x01\x02", word(0x0102)));
+ BOOST_TEST(test("\x01\x02\x03\x04", dword(0x01020304)));
#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
+ BOOST_TEST(test("\x01\x02\x03\x04\x05\x06\x07\x08",
qword(0x0102030405060708LL)));
#endif
#endif
Modified: branches/proto/v4/libs/spirit/test/qi/char.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/test/qi/char.cpp (original)
+++ branches/proto/v4/libs/spirit/test/qi/char.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -23,8 +23,6 @@
using namespace boost::spirit::ascii;
using boost::spirit::char_;
using boost::spirit::wchar;
- using boost::spirit::eol;
- using boost::spirit::eoi;
{
BOOST_TEST(test("x", 'x'));
@@ -116,36 +114,6 @@
BOOST_TEST((test("x", char_(val('x')))));
BOOST_TEST((test("h", char_(val('a'), val('n')))));
}
-
- { // eol
- BOOST_TEST(test("\r", eol));
- BOOST_TEST(test("\r\n", eol));
- BOOST_TEST(test("\n", eol));
- BOOST_TEST(!test("\b", eol));
-
- BOOST_TEST(test(" \r", eol, char_(' ')));
- BOOST_TEST(test(" \r\n", eol, char_(' ')));
- BOOST_TEST(test(" \n", eol, char_(' ')));
- BOOST_TEST(!test(" \b", eol, char_(' ')));
-
- BOOST_TEST(test(L"\r", eol));
- BOOST_TEST(test(L"\r\n", eol));
- BOOST_TEST(test(L"\n", eol));
- BOOST_TEST(!test(L"\b", eol));
-
- BOOST_TEST(test(L" \r", eol, wchar(L' ')));
- BOOST_TEST(test(L" \r\n", eol, wchar(L' ')));
- BOOST_TEST(test(L" \n", eol, wchar(L' ')));
- BOOST_TEST(!test(L" \b", eol, wchar(L' ')));
- }
-
- { // eoi
- BOOST_TEST(test("", eoi));
- BOOST_TEST(!test("a", eoi));
-
- BOOST_TEST(test(" ", eoi, space));
- BOOST_TEST(!test(" a", eoi, space));
- }
return boost::report_errors();
}
Modified: branches/proto/v4/libs/spirit/test/qi/no_case.cpp
==============================================================================
--- branches/proto/v4/libs/spirit/test/qi/no_case.cpp (original)
+++ branches/proto/v4/libs/spirit/test/qi/no_case.cpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -91,5 +91,14 @@
BOOST_TEST(!test(":", no_case[upper]));
}
+ {
+ using namespace boost::spirit::standard;
+ // chsets
+ BOOST_TEST(test("x", no_case[char_("a-z")]));
+ BOOST_TEST(test("X", no_case[char_("a-z")]));
+ BOOST_TEST(test(L"X", no_case[wchar(L"a-z")]));
+ BOOST_TEST(test(L"X", no_case[wchar(L"X")]));
+ }
+
return boost::report_errors();
}
Modified: branches/proto/v4/libs/unordered/test/objects/memory.hpp
==============================================================================
--- branches/proto/v4/libs/unordered/test/objects/memory.hpp (original)
+++ branches/proto/v4/libs/unordered/test/objects/memory.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -10,7 +10,7 @@
#include <map>
#include <boost/mpl/apply.hpp>
#include <boost/assert.hpp>
-#include <boost/unordered/detail/allocator.hpp>
+#include <boost/unordered/detail/allocator_helpers.hpp>
#include <boost/mpl/aux_/config/eti.hpp>
#include "../helpers/test.hpp"
Modified: branches/proto/v4/libs/wave/samples/cpp_tokens/slex_iterator.hpp
==============================================================================
--- branches/proto/v4/libs/wave/samples/cpp_tokens/slex_iterator.hpp (original)
+++ branches/proto/v4/libs/wave/samples/cpp_tokens/slex_iterator.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -52,7 +52,7 @@
public:
slex_iterator_functor_shim()
-#if 0 != __DECCXX_VER || BOOST_INTEL_CXX_VERSION > 900 || defined(__PGI)
+#if /*0 != __DECCXX_VER || */defined(__PGI)
: eof()
#endif // 0 != __DECCXX_VER
{}
@@ -151,7 +151,7 @@
typedef boost::spirit::multi_pass_policies::split_std_deque storage_policy;
typedef boost::spirit::multi_pass_policies::default_policy<
- input_policy, ownership_policy, check_policy, storage_policy>
+ ownership_policy, check_policy, input_policy, storage_policy>
policy_type;
typedef boost::spirit::multi_pass<functor_data_type, policy_type> type;
};
Modified: branches/proto/v4/libs/wave/samples/list_includes/lexertl_iterator.hpp
==============================================================================
--- branches/proto/v4/libs/wave/samples/list_includes/lexertl_iterator.hpp (original)
+++ branches/proto/v4/libs/wave/samples/list_includes/lexertl_iterator.hpp 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -25,7 +25,7 @@
#include "lexertl_interface.hpp"
-#if 0 != __COMO_VERSION__
+#if 0 != __COMO_VERSION__ || !BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
#define BOOST_WAVE_EOF_PREFIX static
#else
#define BOOST_WAVE_EOF_PREFIX
@@ -54,7 +54,7 @@
wave::language_support language)
: functor_ptr(lexertl_input_interface<TokenT>
::new_lexer(first, last, pos, language))
-#if 0 != __DECCXX_VER
+#if 0 != __DECCXX_VER || defined(__PGI)
, eof()
#endif // 0 != __DECCXX_VER
{}
@@ -88,7 +88,7 @@
boost::shared_ptr<lex_input_interface<TokenT> > functor_ptr;
};
-#if 0 != __COMO_VERSION__
+#if 0 != __COMO_VERSION__ || !BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
///////////////////////////////////////////////////////////////////////////////
// eof token
template <typename TokenT>
Modified: branches/proto/v4/libs/wave/test/build/Jamfile.v2
==============================================================================
--- branches/proto/v4/libs/wave/test/build/Jamfile.v2 (original)
+++ branches/proto/v4/libs/wave/test/build/Jamfile.v2 2008-04-21 01:58:26 EDT (Mon, 21 Apr 2008)
@@ -21,7 +21,7 @@
SOURCES = $(SOURCE_STATIC) $(SOURCES_DYNAMIC)
;
-path-constant TESTWAVE_DIR : ../testwave/testfiles
+path-constant TESTWAVE_DIR : $(BOOST_ROOT)/libs/wave/test/testwave/testfiles
;
#
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