[boost-doc-zh] r377 committed - 升级至1.41.0,第三批,libs/目录下f-g子目录

  • From: boost-doc-zh@xxxxxxxxxxxxxx
  • To: boost-doc-zh-notify@xxxxxxxxxxxxx
  • Date: Mon, 08 Feb 2010 09:02:25 +0000

Revision: 377
Author: alai04
Date: Mon Feb  8 01:01:45 2010
Log: 升级至1.41.0,第三批,libs/目录下f-g子目录
http://code.google.com/p/boost-doc-zh/source/detail?r=377

Added:
 /trunk/libs/function_types/doc/Jamfile
 /trunk/libs/function_types/doc/function_types.qbk
 /trunk/libs/functional/hash/examples/Jamfile.v2
 /trunk/libs/functional/hash/test
 /trunk/libs/functional/hash/test/Jamfile.v2
 /trunk/libs/functional/hash/test/compile_time.hpp
 /trunk/libs/functional/hash/test/config.hpp
 /trunk/libs/functional/hash/test/container_fwd_test.cpp
 /trunk/libs/functional/hash/test/extensions_hpp_test.cpp
 /trunk/libs/functional/hash/test/hash_built_in_array_test.cpp
 /trunk/libs/functional/hash/test/hash_complex_test.cpp
 /trunk/libs/functional/hash/test/hash_custom_test.cpp
 /trunk/libs/functional/hash/test/hash_deque_test.cpp
 /trunk/libs/functional/hash/test/hash_float_test.cpp
 /trunk/libs/functional/hash/test/hash_float_test.hpp
 /trunk/libs/functional/hash/test/hash_friend_test.cpp
 /trunk/libs/functional/hash/test/hash_function_pointer_test.cpp
 /trunk/libs/functional/hash/test/hash_fwd_test.hpp
 /trunk/libs/functional/hash/test/hash_fwd_test_1.cpp
 /trunk/libs/functional/hash/test/hash_fwd_test_2.cpp
 /trunk/libs/functional/hash/test/hash_global_namespace_test.cpp
 /trunk/libs/functional/hash/test/hash_list_test.cpp
 /trunk/libs/functional/hash/test/hash_long_double_test.cpp
 /trunk/libs/functional/hash/test/hash_map_test.cpp
 /trunk/libs/functional/hash/test/hash_map_test.hpp
 /trunk/libs/functional/hash/test/hash_no_ext_fail_test.cpp
 /trunk/libs/functional/hash/test/hash_no_ext_macro_1.cpp
 /trunk/libs/functional/hash/test/hash_no_ext_macro_2.cpp
 /trunk/libs/functional/hash/test/hash_number_test.cpp
 /trunk/libs/functional/hash/test/hash_pointer_test.cpp
 /trunk/libs/functional/hash/test/hash_range_test.cpp
 /trunk/libs/functional/hash/test/hash_sequence_test.hpp
 /trunk/libs/functional/hash/test/hash_set_test.cpp
 /trunk/libs/functional/hash/test/hash_set_test.hpp
 /trunk/libs/functional/hash/test/hash_string_test.cpp
 /trunk/libs/functional/hash/test/hash_value_array_test.cpp
 /trunk/libs/functional/hash/test/hash_vector_test.cpp
 /trunk/libs/functional/hash/test/link_ext_test.cpp
 /trunk/libs/functional/hash/test/link_no_ext_test.cpp
 /trunk/libs/functional/hash/test/link_test.cpp
 /trunk/libs/functional/hash/test/link_test_2.cpp
 /trunk/libs/functional/hash/test/namespace_fail_test.cpp
 /trunk/libs/fusion/changelist.txt
 /trunk/libs/fusion/doc/Jamfile
 /trunk/libs/fusion/doc/acknowledgements.qbk
 /trunk/libs/fusion/doc/adapted.qbk
 /trunk/libs/fusion/doc/algorithm.qbk
 /trunk/libs/fusion/doc/changelog.qbk
 /trunk/libs/fusion/doc/container.qbk
 /trunk/libs/fusion/doc/extension.qbk
 /trunk/libs/fusion/doc/functional.qbk
 /trunk/libs/fusion/doc/fusion.qbk
/trunk/libs/fusion/doc/html/fusion/iterator/concepts/associative_iterator.html
 /trunk/libs/fusion/doc/html/fusion/iterator/functions/deref_data.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/deref_data.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/key_of.html
/trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/value_of_data.html
 /trunk/libs/fusion/doc/introduction.qbk
 /trunk/libs/fusion/doc/iterator.qbk
 /trunk/libs/fusion/doc/notes.qbk
 /trunk/libs/fusion/doc/organization.qbk
 /trunk/libs/fusion/doc/preface.qbk
 /trunk/libs/fusion/doc/quick_start.qbk
 /trunk/libs/fusion/doc/references.qbk
 /trunk/libs/fusion/doc/sequence.qbk
 /trunk/libs/fusion/doc/support.qbk
 /trunk/libs/fusion/doc/tuple.qbk
 /trunk/libs/fusion/doc/view.qbk
 /trunk/libs/fusion/example
 /trunk/libs/fusion/example/cookbook
 /trunk/libs/fusion/example/cookbook/do_the_bind.cpp
 /trunk/libs/fusion/example/cookbook/fill_em_up.cpp
 /trunk/libs/fusion/example/extension
 /trunk/libs/fusion/example/extension/Jamfile
 /trunk/libs/fusion/example/extension/detail
 /trunk/libs/fusion/example/extension/detail/advance_impl.hpp
 /trunk/libs/fusion/example/extension/detail/at_impl.hpp
 /trunk/libs/fusion/example/extension/detail/at_key_impl.hpp
 /trunk/libs/fusion/example/extension/detail/begin_impl.hpp
 /trunk/libs/fusion/example/extension/detail/category_of_impl.hpp
 /trunk/libs/fusion/example/extension/detail/deref_data_impl.hpp
 /trunk/libs/fusion/example/extension/detail/deref_impl.hpp
 /trunk/libs/fusion/example/extension/detail/distance_impl.hpp
 /trunk/libs/fusion/example/extension/detail/end_impl.hpp
 /trunk/libs/fusion/example/extension/detail/equal_to_impl.hpp
 /trunk/libs/fusion/example/extension/detail/has_key_impl.hpp
 /trunk/libs/fusion/example/extension/detail/is_sequence_impl.hpp
 /trunk/libs/fusion/example/extension/detail/is_view_impl.hpp
 /trunk/libs/fusion/example/extension/detail/key_of_impl.hpp
 /trunk/libs/fusion/example/extension/detail/next_impl.hpp
 /trunk/libs/fusion/example/extension/detail/prior_impl.hpp
 /trunk/libs/fusion/example/extension/detail/size_impl.hpp
 /trunk/libs/fusion/example/extension/detail/value_at_impl.hpp
 /trunk/libs/fusion/example/extension/detail/value_at_key_impl.hpp
 /trunk/libs/fusion/example/extension/detail/value_of_data_impl.hpp
 /trunk/libs/fusion/example/extension/detail/value_of_impl.hpp
 /trunk/libs/fusion/example/extension/example_struct.hpp
 /trunk/libs/fusion/example/extension/example_struct_iterator.hpp
 /trunk/libs/fusion/example/extension/example_struct_type.hpp
 /trunk/libs/fusion/example/extension/tag_of.hpp
 /trunk/libs/fusion/example/extension/test_example.cpp
 /trunk/libs/fusion/example/extension/triple.cpp
 /trunk/libs/fusion/example/performance
 /trunk/libs/fusion/example/performance/Jamfile
 /trunk/libs/fusion/example/performance/accumulate.cpp
 /trunk/libs/fusion/example/performance/functional.cpp
 /trunk/libs/fusion/example/performance/inner_product.cpp
 /trunk/libs/fusion/example/performance/inner_product2.cpp
 /trunk/libs/fusion/example/performance/measure.hpp
 /trunk/libs/fusion/example/performance/sequence_efficiency.cpp
 /trunk/libs/fusion/example/performance/timings.txt
 /trunk/libs/fusion/example/performance/zip_efficiency.cpp
 /trunk/libs/fusion/test
 /trunk/libs/fusion/test/Jamfile
 /trunk/libs/fusion/test/algorithm
 /trunk/libs/fusion/test/algorithm/all.cpp
 /trunk/libs/fusion/test/algorithm/any.cpp
 /trunk/libs/fusion/test/algorithm/clear.cpp
 /trunk/libs/fusion/test/algorithm/count.cpp
 /trunk/libs/fusion/test/algorithm/count_if.cpp
 /trunk/libs/fusion/test/algorithm/erase.cpp
 /trunk/libs/fusion/test/algorithm/erase_key.cpp
 /trunk/libs/fusion/test/algorithm/ext_
 /trunk/libs/fusion/test/algorithm/ext_/find_if_s.cpp
 /trunk/libs/fusion/test/algorithm/ext_/for_each_s.cpp
 /trunk/libs/fusion/test/algorithm/filter.cpp
 /trunk/libs/fusion/test/algorithm/filter_if.cpp
 /trunk/libs/fusion/test/algorithm/find.cpp
 /trunk/libs/fusion/test/algorithm/find_if.cpp
 /trunk/libs/fusion/test/algorithm/fold.cpp
 /trunk/libs/fusion/test/algorithm/for_each.cpp
 /trunk/libs/fusion/test/algorithm/insert.cpp
 /trunk/libs/fusion/test/algorithm/insert_range.cpp
 /trunk/libs/fusion/test/algorithm/join.cpp
 /trunk/libs/fusion/test/algorithm/none.cpp
 /trunk/libs/fusion/test/algorithm/pop_back.cpp
 /trunk/libs/fusion/test/algorithm/pop_front.cpp
 /trunk/libs/fusion/test/algorithm/push_back.cpp
 /trunk/libs/fusion/test/algorithm/push_front.cpp
 /trunk/libs/fusion/test/algorithm/remove.cpp
 /trunk/libs/fusion/test/algorithm/remove_if.cpp
 /trunk/libs/fusion/test/algorithm/replace.cpp
 /trunk/libs/fusion/test/algorithm/replace_if.cpp
 /trunk/libs/fusion/test/algorithm/reverse.cpp
 /trunk/libs/fusion/test/algorithm/transform.cpp
 /trunk/libs/fusion/test/algorithm/zip.cpp
 /trunk/libs/fusion/test/algorithm/zip2.cpp
 /trunk/libs/fusion/test/algorithm/zip_ignore.cpp
 /trunk/libs/fusion/test/compile_time
 /trunk/libs/fusion/test/compile_time/Makefile
 /trunk/libs/fusion/test/compile_time/driver.hpp
 /trunk/libs/fusion/test/compile_time/fold.cpp
 /trunk/libs/fusion/test/compile_time/transform.cpp
 /trunk/libs/fusion/test/compile_time/vector_construction.cpp
 /trunk/libs/fusion/test/compile_time/vector_intrinsic.cpp
 /trunk/libs/fusion/test/compile_time/vector_iteration.cpp
 /trunk/libs/fusion/test/functional
 /trunk/libs/fusion/test/functional/fused.cpp
 /trunk/libs/fusion/test/functional/fused_function_object.cpp
 /trunk/libs/fusion/test/functional/fused_procedure.cpp
 /trunk/libs/fusion/test/functional/invoke.cpp
 /trunk/libs/fusion/test/functional/invoke_function_object.cpp
 /trunk/libs/fusion/test/functional/invoke_procedure.cpp
 /trunk/libs/fusion/test/functional/make_fused.cpp
 /trunk/libs/fusion/test/functional/make_fused_function_object.cpp
 /trunk/libs/fusion/test/functional/make_fused_procedure.cpp
 /trunk/libs/fusion/test/functional/make_unfused.cpp
 /trunk/libs/fusion/test/functional/make_unfused_generic.cpp
 /trunk/libs/fusion/test/functional/make_unfused_lvalue_args.cpp
 /trunk/libs/fusion/test/functional/make_unfused_rvalue_args.cpp
 /trunk/libs/fusion/test/functional/unfused.cpp
 /trunk/libs/fusion/test/functional/unfused_generic.cpp
 /trunk/libs/fusion/test/functional/unfused_lvalue_args.cpp
 /trunk/libs/fusion/test/functional/unfused_rvalue_args.cpp
 /trunk/libs/fusion/test/functional/unfused_typed.cpp
 /trunk/libs/fusion/test/sequence
 /trunk/libs/fusion/test/sequence/adapt_assoc_struct.cpp
 /trunk/libs/fusion/test/sequence/adapt_struct.cpp
 /trunk/libs/fusion/test/sequence/array.cpp
 /trunk/libs/fusion/test/sequence/as_list.cpp
 /trunk/libs/fusion/test/sequence/as_map.cpp
 /trunk/libs/fusion/test/sequence/as_set.cpp
 /trunk/libs/fusion/test/sequence/as_vector.cpp
 /trunk/libs/fusion/test/sequence/back_extended_deque.cpp
 /trunk/libs/fusion/test/sequence/boost_tuple.cpp
 /trunk/libs/fusion/test/sequence/comparison.hpp
 /trunk/libs/fusion/test/sequence/cons.cpp
 /trunk/libs/fusion/test/sequence/construction.hpp
 /trunk/libs/fusion/test/sequence/copy.hpp
 /trunk/libs/fusion/test/sequence/deduce_sequence.cpp
 /trunk/libs/fusion/test/sequence/deque_comparison.cpp
 /trunk/libs/fusion/test/sequence/deque_construction.cpp
 /trunk/libs/fusion/test/sequence/deque_copy.cpp
 /trunk/libs/fusion/test/sequence/deque_iterator.cpp
 /trunk/libs/fusion/test/sequence/deque_make.cpp
 /trunk/libs/fusion/test/sequence/deque_misc.cpp
 /trunk/libs/fusion/test/sequence/deque_mutate.cpp
 /trunk/libs/fusion/test/sequence/deque_tie.cpp
 /trunk/libs/fusion/test/sequence/deque_value_at.cpp
 /trunk/libs/fusion/test/sequence/ext_
 /trunk/libs/fusion/test/sequence/ext_/iterator_range_s.cpp
 /trunk/libs/fusion/test/sequence/filter_view.cpp
 /trunk/libs/fusion/test/sequence/front_extended_deque.cpp
 /trunk/libs/fusion/test/sequence/io.cpp
 /trunk/libs/fusion/test/sequence/iterator.hpp
 /trunk/libs/fusion/test/sequence/iterator_range.cpp
 /trunk/libs/fusion/test/sequence/joint_view.cpp
 /trunk/libs/fusion/test/sequence/list_comparison.cpp
 /trunk/libs/fusion/test/sequence/list_construction.cpp
 /trunk/libs/fusion/test/sequence/list_copy.cpp
 /trunk/libs/fusion/test/sequence/list_iterator.cpp
 /trunk/libs/fusion/test/sequence/list_make.cpp
 /trunk/libs/fusion/test/sequence/list_misc.cpp
 /trunk/libs/fusion/test/sequence/list_mutate.cpp
 /trunk/libs/fusion/test/sequence/list_tie.cpp
 /trunk/libs/fusion/test/sequence/list_value_at.cpp
 /trunk/libs/fusion/test/sequence/make.hpp
 /trunk/libs/fusion/test/sequence/make_list.cpp
 /trunk/libs/fusion/test/sequence/make_vector.cpp
 /trunk/libs/fusion/test/sequence/map.cpp
 /trunk/libs/fusion/test/sequence/map_tie.cpp
 /trunk/libs/fusion/test/sequence/misc.hpp
 /trunk/libs/fusion/test/sequence/mutate.hpp
 /trunk/libs/fusion/test/sequence/nview.cpp
 /trunk/libs/fusion/test/sequence/repetitive_view.cpp
 /trunk/libs/fusion/test/sequence/reverse_view.cpp
 /trunk/libs/fusion/test/sequence/set.cpp
 /trunk/libs/fusion/test/sequence/single_view.cpp
 /trunk/libs/fusion/test/sequence/std_pair.cpp
 /trunk/libs/fusion/test/sequence/swap.cpp
 /trunk/libs/fusion/test/sequence/test_deduce_sequence.cpp
 /trunk/libs/fusion/test/sequence/tie.hpp
 /trunk/libs/fusion/test/sequence/tr1_tuple_auto_conv.cpp
 /trunk/libs/fusion/test/sequence/transform_view.cpp
 /trunk/libs/fusion/test/sequence/tuple_comparison.cpp
 /trunk/libs/fusion/test/sequence/tuple_construction.cpp
 /trunk/libs/fusion/test/sequence/tuple_copy.cpp
 /trunk/libs/fusion/test/sequence/tuple_element.cpp
 /trunk/libs/fusion/test/sequence/tuple_make.cpp
 /trunk/libs/fusion/test/sequence/tuple_misc.cpp
 /trunk/libs/fusion/test/sequence/tuple_mutate.cpp
 /trunk/libs/fusion/test/sequence/tuple_tie.cpp
 /trunk/libs/fusion/test/sequence/value_at.hpp
 /trunk/libs/fusion/test/sequence/vector_comparison.cpp
 /trunk/libs/fusion/test/sequence/vector_construction.cpp
 /trunk/libs/fusion/test/sequence/vector_copy.cpp
 /trunk/libs/fusion/test/sequence/vector_iterator.cpp
 /trunk/libs/fusion/test/sequence/vector_make.cpp
 /trunk/libs/fusion/test/sequence/vector_misc.cpp
 /trunk/libs/fusion/test/sequence/vector_mutate.cpp
 /trunk/libs/fusion/test/sequence/vector_n.cpp
 /trunk/libs/fusion/test/sequence/vector_tie.cpp
 /trunk/libs/fusion/test/sequence/vector_value_at.cpp
 /trunk/libs/fusion/test/sequence/zip_view.cpp
 /trunk/libs/fusion/test/sequence/zip_view2.cpp
 /trunk/libs/fusion/test/sequence/zip_view_ignore.cpp
 /trunk/libs/fusion/todo.txt
 /trunk/libs/gil/test
 /trunk/libs/gil/test/Jamfile.v2
 /trunk/libs/gil/test/Makefile
 /trunk/libs/gil/test/channel.cpp
 /trunk/libs/gil/test/error_if.cpp
 /trunk/libs/gil/test/gil_reference_checksums.txt
 /trunk/libs/gil/test/image.cpp
 /trunk/libs/gil/test/image_io.cpp
 /trunk/libs/gil/test/main.cpp
 /trunk/libs/gil/test/performance.cpp
 /trunk/libs/gil/test/pixel.cpp
 /trunk/libs/gil/test/pixel_iterator.cpp
 /trunk/libs/gil/test/sample_image.cpp
 /trunk/libs/graph_parallel/example
 /trunk/libs/graph_parallel/example/Jamfile.v2
 /trunk/libs/graph_parallel/example/breadth_first_search.cpp
 /trunk/libs/graph_parallel/example/dijkstra_shortest_paths.cpp
 /trunk/libs/graph_parallel/test
 /trunk/libs/graph_parallel/test/Jamfile.v2
 /trunk/libs/graph_parallel/test/adjlist_build_test.cpp
 /trunk/libs/graph_parallel/test/adjlist_redist_test.cpp
 /trunk/libs/graph_parallel/test/adjlist_remove_test.cpp
 /trunk/libs/graph_parallel/test/algorithm_performance.cpp
 /trunk/libs/graph_parallel/test/distributed_adjacency_list_test.cpp
 /trunk/libs/graph_parallel/test/distributed_betweenness_centrality_test.cpp
 /trunk/libs/graph_parallel/test/distributed_connected_components_test.cpp
 /trunk/libs/graph_parallel/test/distributed_csr_algorithm_test.cpp
 /trunk/libs/graph_parallel/test/distributed_csr_test.cpp
 /trunk/libs/graph_parallel/test/distributed_dfs_test.cpp
 /trunk/libs/graph_parallel/test/distributed_dimacs_reader.cpp
 /trunk/libs/graph_parallel/test/distributed_graph_coloring_test.cpp
 /trunk/libs/graph_parallel/test/distributed_mst_test.cpp
 /trunk/libs/graph_parallel/test/distributed_page_rank_test.cpp
 /trunk/libs/graph_parallel/test/distributed_property_map_test.cpp
 /trunk/libs/graph_parallel/test/distributed_queue_test.cpp
 /trunk/libs/graph_parallel/test/distributed_rmat_cc.cpp
 /trunk/libs/graph_parallel/test/distributed_rmat_cc_ps.cpp
 /trunk/libs/graph_parallel/test/distributed_rmat_pagerank.cpp
 /trunk/libs/graph_parallel/test/distributed_shortest_paths_test.cpp
 /trunk/libs/graph_parallel/test/distributed_st_connected_test.cpp
 /trunk/libs/graph_parallel/test/distributed_strong_components_test.cpp
 /trunk/libs/graph_parallel/test/hohberg_biconnected_components_test.cpp
 /trunk/libs/graph_parallel/test/mesh_generator_test.cpp
 /trunk/libs/graph_parallel/test/named_vertices_hash_test.cpp
 /trunk/libs/graph_parallel/test/named_vertices_seq.cpp
 /trunk/libs/graph_parallel/test/named_vertices_test.cpp
 /trunk/libs/graph_parallel/test/process_group_serialization.cpp
 /trunk/libs/graph_parallel/test/ssca.cpp
Modified:
 /trunk/libs/functional/hash/doc/changes.qbk
 /trunk/libs/functional/hash/examples/books.cpp
 /trunk/libs/functional/hash/examples/books.hpp
 /trunk/libs/functional/hash/examples/point.cpp
 /trunk/libs/functional/hash/examples/portable.cpp
 /trunk/libs/fusion/doc/html/fusion/acknowledgements.html
 /trunk/libs/fusion/doc/html/fusion/adapted/adapt_assoc.html
 /trunk/libs/fusion/doc/html/fusion/adapted/adapt_struct.html
 /trunk/libs/fusion/doc/html/fusion/adapted/boost__array.html
 /trunk/libs/fusion/doc/html/fusion/adapted/boost__tuple.html
 /trunk/libs/fusion/doc/html/fusion/adapted/mpl_sequence.html
 /trunk/libs/fusion/doc/html/fusion/adapted/std__pair.html
 /trunk/libs/fusion/doc/html/fusion/adapted.html
/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions/accumulate.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions/fold.html
/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions/for_each.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions.html
/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions/accumulate.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions/fold.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions/for_each.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/iteration.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/all.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/any.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/count.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/count_if.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/find.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/find_if.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/none.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/all.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/any.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/count.html
/trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/count_if.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/find.html
/trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/find_if.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/none.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/query.html
/trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/clear.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/erase.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/erase_key.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/filter.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/filter_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/insert.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/insert_range.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/join.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/pop_back.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/pop_front.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/push_back.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/push_front.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/remove.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/remove_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/replace.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/replace_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/reverse.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/transform.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/zip.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions.html
/trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/clear.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/erase.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/erase_key.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/filter.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/filter_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/insert.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/insert_range.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/join.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/pop_back.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/pop_front.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/push_back.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/push_front.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/remove.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/remove_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/replace.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/replace_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/reverse.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/transform.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/zip.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions.html
 /trunk/libs/fusion/doc/html/fusion/algorithm/transformation.html
 /trunk/libs/fusion/doc/html/fusion/algorithm.html
 /trunk/libs/fusion/doc/html/fusion/change_log.html
 /trunk/libs/fusion/doc/html/fusion/container/cons.html
/trunk/libs/fusion/doc/html/fusion/container/conversion/functions/as_list.html /trunk/libs/fusion/doc/html/fusion/container/conversion/functions/as_map.html /trunk/libs/fusion/doc/html/fusion/container/conversion/functions/as_set.html /trunk/libs/fusion/doc/html/fusion/container/conversion/functions/as_vector.html
 /trunk/libs/fusion/doc/html/fusion/container/conversion/functions.html
/trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions/as_list.html /trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions/as_map.html /trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions/as_set.html /trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions/as_vector.html
 /trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions.html
 /trunk/libs/fusion/doc/html/fusion/container/conversion.html
/trunk/libs/fusion/doc/html/fusion/container/generation/functions/list_tie.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_cons.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_list.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_map.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_set.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_vector.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/map_tie.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/tiers.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/vector_tie.html
 /trunk/libs/fusion/doc/html/fusion/container/generation/functions.html
/trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/list_tie.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_cons.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_list.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_map.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_set.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_vector.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/map_tie.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/vector_tie.html
 /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions.html
 /trunk/libs/fusion/doc/html/fusion/container/generation.html
 /trunk/libs/fusion/doc/html/fusion/container/list.html
 /trunk/libs/fusion/doc/html/fusion/container/map.html
 /trunk/libs/fusion/doc/html/fusion/container/set.html
 /trunk/libs/fusion/doc/html/fusion/container/vector.html
 /trunk/libs/fusion/doc/html/fusion/container.html
 /trunk/libs/fusion/doc/html/fusion/extension/ext_full.html
 /trunk/libs/fusion/doc/html/fusion/extension/iterator_facade.html
 /trunk/libs/fusion/doc/html/fusion/extension/sequence_facade.html
 /trunk/libs/fusion/doc/html/fusion/extension.html
 /trunk/libs/fusion/doc/html/fusion/functional/adapters/fused.html
/trunk/libs/fusion/doc/html/fusion/functional/adapters/fused_function_object.html
 /trunk/libs/fusion/doc/html/fusion/functional/adapters/fused_procedure.html
 /trunk/libs/fusion/doc/html/fusion/functional/adapters/limits.html
 /trunk/libs/fusion/doc/html/fusion/functional/adapters/unfused.html
 /trunk/libs/fusion/doc/html/fusion/functional/adapters/unfused_typed.html
 /trunk/libs/fusion/doc/html/fusion/functional/adapters.html
 /trunk/libs/fusion/doc/html/fusion/functional/concepts/callable.html
 /trunk/libs/fusion/doc/html/fusion/functional/concepts/def_callable.html
 /trunk/libs/fusion/doc/html/fusion/functional/concepts/poly.html
 /trunk/libs/fusion/doc/html/fusion/functional/concepts/reg_callable.html
 /trunk/libs/fusion/doc/html/fusion/functional/concepts.html
/trunk/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html /trunk/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused_fobj.html /trunk/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused_proc.html /trunk/libs/fusion/doc/html/fusion/functional/generation/functions/mk_unfused.html
 /trunk/libs/fusion/doc/html/fusion/functional/generation/functions.html
/trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions/mk_fused.html /trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions/mk_fused_fobj.html /trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions/mk_fused_proc.html /trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions/mk_unfused.html
 /trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions.html
 /trunk/libs/fusion/doc/html/fusion/functional/generation.html
/trunk/libs/fusion/doc/html/fusion/functional/invocation/functions/invoke.html /trunk/libs/fusion/doc/html/fusion/functional/invocation/functions/invoke_fobj.html /trunk/libs/fusion/doc/html/fusion/functional/invocation/functions/invoke_proc.html
 /trunk/libs/fusion/doc/html/fusion/functional/invocation/functions.html
 /trunk/libs/fusion/doc/html/fusion/functional/invocation/limits.html
/trunk/libs/fusion/doc/html/fusion/functional/invocation/metafunctions/invoke.html /trunk/libs/fusion/doc/html/fusion/functional/invocation/metafunctions/invoke_fobj.html /trunk/libs/fusion/doc/html/fusion/functional/invocation/metafunctions/invoke_proc.html
 /trunk/libs/fusion/doc/html/fusion/functional/invocation/metafunctions.html
 /trunk/libs/fusion/doc/html/fusion/functional/invocation.html
 /trunk/libs/fusion/doc/html/fusion/functional.html
 /trunk/libs/fusion/doc/html/fusion/introduction.html
/trunk/libs/fusion/doc/html/fusion/iterator/concepts/bidirectional_iterator.html
 /trunk/libs/fusion/doc/html/fusion/iterator/concepts/forward_iterator.html
/trunk/libs/fusion/doc/html/fusion/iterator/concepts/random_access_iterator.html
 /trunk/libs/fusion/doc/html/fusion/iterator/concepts.html
 /trunk/libs/fusion/doc/html/fusion/iterator/functions/advance.html
 /trunk/libs/fusion/doc/html/fusion/iterator/functions/advance_c.html
 /trunk/libs/fusion/doc/html/fusion/iterator/functions/deref.html
 /trunk/libs/fusion/doc/html/fusion/iterator/functions/distance.html
 /trunk/libs/fusion/doc/html/fusion/iterator/functions/next.html
 /trunk/libs/fusion/doc/html/fusion/iterator/functions/prior.html
 /trunk/libs/fusion/doc/html/fusion/iterator/functions.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/advance.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/advance_c.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/deref.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/distance.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/equal_to.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/next.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/prior.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/value_of.html
 /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions.html
 /trunk/libs/fusion/doc/html/fusion/iterator/operator/operator_equality.html
/trunk/libs/fusion/doc/html/fusion/iterator/operator/operator_inequality.html /trunk/libs/fusion/doc/html/fusion/iterator/operator/operator_unary_star.html
 /trunk/libs/fusion/doc/html/fusion/iterator/operator.html
 /trunk/libs/fusion/doc/html/fusion/iterator.html
 /trunk/libs/fusion/doc/html/fusion/notes.html
 /trunk/libs/fusion/doc/html/fusion/organization.html
 /trunk/libs/fusion/doc/html/fusion/preface.html
 /trunk/libs/fusion/doc/html/fusion/quick_start.html
 /trunk/libs/fusion/doc/html/fusion/references.html
/trunk/libs/fusion/doc/html/fusion/sequence/concepts/associative_sequence.html /trunk/libs/fusion/doc/html/fusion/sequence/concepts/bidirectional_sequence.html
 /trunk/libs/fusion/doc/html/fusion/sequence/concepts/forward_sequence.html
/trunk/libs/fusion/doc/html/fusion/sequence/concepts/random_access_sequence.html
 /trunk/libs/fusion/doc/html/fusion/sequence/concepts.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/at.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/at_c.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/at_key.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/back.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/begin.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/empty.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/end.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/front.html
/trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/has_key.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/size.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/swap.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/at.html
/trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/at_c.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/at_key.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/back.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/begin.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/empty.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/end.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/front.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/has_key.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/size.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/swap.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/value_at.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_c.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_key.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions.html
 /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic.html
 /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/equal.html
/trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/greater_than.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/greater_than_equal.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/less_than.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/less_than_equal.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/not_equal.html
 /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison.html
 /trunk/libs/fusion/doc/html/fusion/sequence/operator/i_o/in.html
 /trunk/libs/fusion/doc/html/fusion/sequence/operator/i_o/out.html
 /trunk/libs/fusion/doc/html/fusion/sequence/operator/i_o.html
 /trunk/libs/fusion/doc/html/fusion/sequence/operator.html
 /trunk/libs/fusion/doc/html/fusion/sequence.html
 /trunk/libs/fusion/doc/html/fusion/support/category_of.html
 /trunk/libs/fusion/doc/html/fusion/support/deduce.html
 /trunk/libs/fusion/doc/html/fusion/support/deduce_sequence.html
 /trunk/libs/fusion/doc/html/fusion/support/is_sequence.html
 /trunk/libs/fusion/doc/html/fusion/support/is_view.html
 /trunk/libs/fusion/doc/html/fusion/support/pair.html
 /trunk/libs/fusion/doc/html/fusion/support/tag_of.html
 /trunk/libs/fusion/doc/html/fusion/support.html
/trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/construction.html /trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/element_access.html /trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/relational_operators.html /trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/tuple_creation_functions.html /trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/tuple_helper_classes.html
 /trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple.html
 /trunk/libs/fusion/doc/html/fusion/tuple/pairs.html
 /trunk/libs/fusion/doc/html/fusion/tuple.html
 /trunk/libs/fusion/doc/html/fusion/view/filter_view.html
 /trunk/libs/fusion/doc/html/fusion/view/iterator_range.html
 /trunk/libs/fusion/doc/html/fusion/view/joint_view.html
 /trunk/libs/fusion/doc/html/fusion/view/nview.html
 /trunk/libs/fusion/doc/html/fusion/view/reverse_view.html
 /trunk/libs/fusion/doc/html/fusion/view/single_view.html
 /trunk/libs/fusion/doc/html/fusion/view/transform_view.html
 /trunk/libs/fusion/doc/html/fusion/view/zip_view.html
 /trunk/libs/fusion/doc/html/fusion/view.html
 /trunk/libs/fusion/doc/html/index.html
 /trunk/libs/graph/doc/astar_search.html
 /trunk/libs/graph/doc/compressed_sparse_row.html
 /trunk/libs/graph/doc/graph_concepts.html
 /trunk/libs/graph/doc/known_problems.html
 /trunk/libs/graph/doc/kolmogorov_max_flow.html
 /trunk/libs/graph/doc/prim_minimum_spanning_tree.html
 /trunk/libs/graph/doc/table_of_contents.html
 /trunk/libs/graph/doc/transitive_closure.html
 /trunk/libs/graph/example/labeled_graph.cpp
 /trunk/libs/graph_parallel/index.html

=======================================
--- /dev/null
+++ /trunk/libs/function_types/doc/Jamfile      Mon Feb  8 01:01:45 2010
@@ -0,0 +1,23 @@
+
+# (C) Copyright Tobias Schwinger
+#
+# Use modification and distribution are subject to the boost Software License,
+# Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+using quickbook ;
+
+xml function_types : function_types.qbk ;
+boostbook standalone
+    :
+        function_types
+    :
+        <xsl:param>boost.root=../../../..
+        <xsl:param>boost.libraries=../../../libraries.htm
+        <xsl:param>html.stylesheet=../../../../doc/html/boostbook.css
+        <xsl:param>chunk.first.sections=1
+        <xsl:param>chunk.section.depth=2
+        <xsl:param>generate.section.toc.level=2
+        <xsl:param>toc.section.depth=1
+        <xsl:param>toc.max.depth=1
+    ;
+
=======================================
--- /dev/null
+++ /trunk/libs/function_types/doc/function_types.qbk Mon Feb 8 01:01:45 2010
@@ -0,0 +1,1105 @@
+[library Boost.FunctionTypes
+  [quickbook 1.3]
+  [version 2.5]
+  [authors [Schwinger, Tobias]]
+  [copyright 2004-2007 Tobias Schwinger]
+  [license
+        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])
+  ]
+  [purpose Meta-programming support library]
+  [category template]
+  [category generic]
+  [last-revision $Date: 2009-11-20 05:13:51 -0500 (Fri, 20 Nov 2009) $]
+]
+
+[def __unspecified__ /unspecified/]
+
+[def __mpl__ [@../../../mpl/index.html MPL]]
+[def __mpl_integral_constant__ __mpl__ - [@../../../mpl/doc/refmanual/integral-constant.html Integral Constant]] +[def __mpl_fwd_seq__ __mpl__ - [@../../../mpl/doc/refmanual/forward-sequence.html Forward Sequence]] +[def __mpl_fb_ext_ra_seq__ __mpl__ - [@../../../mpl/doc/refmanual/front-extensible-sequence.html Front] / [@../../../mpl/doc/refmanual/back-extensible-sequence.html Back ][@../../../mpl/doc/refmanual/extensible-sequence.html Extensible ][@../../../mpl/doc/refmanual/random-access-sequence.html Random Access Sequence]] +[def __mpl_lambda_expression__ __mpl__ - [@../../../mpl/doc/refmanual/lambda-expression.html Lambda Expression]]
+
+[def __is_function [link boost_functiontypes.reference.classification.is_function is_function]] +[def __is_function_pointer [link boost_functiontypes.reference.classification.is_function_pointer is_function_pointer]] +[def __is_function_reference [link boost_functiontypes.reference.classification.is_function_reference is_function_reference]] +[def __is_member_function_pointer [link boost_functiontypes.reference.classification.is_member_function_pointer is_member_function_pointer]] +[def __is_callable_builtin [link boost_functiontypes.reference.classification.is_callable_builtin is_callable_builtin]] +[def __is_nonmember_callable_builtin [link boost_functiontypes.reference.classification.is_nonmember_callable_builtin is_nonmember_callable_builtin]]
+
+[def __components [link boost_functiontypes.reference.decomposition.components components]] +[def __parameter_types [link boost_functiontypes.reference.decomposition.parameter_types parameter_types]] +[def __function_arity [link boost_functiontypes.reference.decomposition.function_arity function_arity]] +[def __result_type [link boost_functiontypes.reference.decomposition.result_type result_type]]
+
+[def __function_type [link boost_functiontypes.reference.synthesis.function_type function_type]] +[def __function_pointer [link boost_functiontypes.reference.synthesis.function_pointer function_pointer]] +[def __function_reference [link boost_functiontypes.reference.synthesis.function_reference function_reference] +[def __member_function_pointer [link boost_functiontypes.reference.synthesis.member_function_pointer member_function_pointer]]
+
+[def __null_tag [link boost_functiontypes.reference.tag_types.null_tag null_tag]]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:introduction Introduction]
+
+Boost.FunctionTypes provides functionality to classify, decompose and synthesize
+function, function pointer, function reference and pointer to member types.
+
+We collectively refer to these types as /callable builtin/ types.
+
+In particular, the library can be used to:
+
+* test whether a type is a specific callable, builtin type,
+* extract all component properties from callable, builtin types, and
+* create callable, builtin types from specified properties.
+
+The library is designed to work well with other Boost libraries and uses
+well-accepted concepts introduced by Boost and TR1.
+
+Templates that encapsulate boolean or numeric properties define a static member
+constant called [^value].
+
+  __is_function_pointer< bool(*)(int) >::value // == true
+
+  __function_arity< bool(*)(int) >::value // == 1
+
+Templates that encapsulate properties that are single types contain a type
+member called [^type].
+
+  __function_type< mpl::vector<bool,int> >::type // is bool(int)
+
+  __result_type< bool(&)(int) >::type // is bool
+
+Templates that encapsulate properties that are type lists model an
+MPL-compatible type sequence.
+
+  __parameter_types< bool(int) > // models an MPL sequence
+
+[endsect]
+
+[section:use_cases Use Cases]
+
+Generic libraries that accept callable arguments are common in C++.
+Accepting a callable argument of builin type often involves a lot of repetitive
+code because the accepting function is overloaded for different function
+arities. Further, member functions may have [^const]/[^volatile]-qualifiers, +a function may take a variable number of (additional, POD-typed) arguments (such +as [^printf]) and several C++ implementations encode a calling convention with +each function's type to allow calls across language or (sub-)system boundaries.
+
+  template<typename R>
+  void accept_function(R(* func)());
+
+  template<typename R>
+  void accept_function(R(& func)());
+
+  template<typename R, typename C>
+  void accept_function(R(C::* func)());
+
+  template<typename R, typename C>
+  void accept_function(R(C::* func)() const);
+
+  template<typename R, typename C>
+  void accept_function(R(C::* func)() volatile);
+
+  template<typename R, typename C>
+  void accept_function(R(C::* func)() const volatile);
+
+  template<typename R>
+  void accept_function(R(* func)(...));
+
+  template<typename R>
+  void accept_function(R(& func)(...));
+
+  template<typename R, typename C>
+  void accept_function(R(C::* func)(...));
+
+  template<typename R, typename C>
+  void accept_function(R(C::* func)(...) const);
+
+  template<typename R, typename C>
+  void accept_function(R(C::* func)(...) volatile);
+
+  template<typename R, typename C>
+  void accept_function(R(C::* func)(...) const volatile);
+
+  // ...
+
+  // needs to be repeated for every additional function parameter
+  // times the number of possible calling conventions
+
+The "overloading approach" obviously does not scale well: There might be several +functions that accept callable arguments in one library and client code might
+end up using several libraries that use this pattern.
+On the developer side, library developers spend their time solving the same
+problem, working around the same portability issues, and apply similar
+optimizations to keep the compilation time down.
+
+Using Boost.FunctionTypes it is possible to write a single function template
+instead:
+
+  template<typename F>
+  void accept_function(F f)
+  {
+    // ... use Boost.FunctionTypes to analyse F
+  }
+
+The combination with a tuples library that provides an invoker component, such +as [@../../../fusion/index.html Boost.Fusion], allows to build flexible callback
+facilities that are entirely free of repetitive code as shown by the
+[@../../../function_types/example/interpreter.hpp interpreter example].
+
+When taking the address of an overloaded function or function template, the
+type of the function must be known from the context the expression is used
+in. The code below shows three examples for choosing the [^float(float)]
+overload of [^std::abs].
+
+  float (*ptr_absf)(float) = & std::abs;
+
+
+  void foo(float(*func)(float));
+
+  void bar()
+  {
+    foo(& std::abs);
+  }
+
+
+  std::transform(b, e, o, static_cast<float(*)(float)>(& std::abs));
+
+The library's type synthesis capabilities can be used to automate overload
+selection and instantiation of function templates. Given an overloaded function
+template
+
+  template<typename R, typename T0>
+  R overloaded(T0);
+
+  template<typename R, typename T0, typename T1>
+  R overloaded(T0,T1);
+
+  template<typename R. typename T0, typename T1, typename T2>
+  R overloaded(T0,T1,T2);
+
+we can pick any of the three overloads and instantiate the template with
+template arguments from a type sequence in a single expression:
+
+  static_cast<__function_pointer<Seq>::type>(& overloaded)
+
+This technique can be occasionally more flexible than template argument
+deduction from a function call because the exact types from the sequence
+are used to specialize the template (including possibly cv-qualified
+reference types and the result type). It is applied twice in the
+[@../../../function_types/example/interface.hpp interface example].
+
+Another interersting property of callable, builtin types is that they can be
+valid types for non-type template parameters. This way, a function can be
+pinpointed at compile time, allowing the compiler to eliminate the call by
+inlining.
+The [@../../../function_types/example/fast_mem_fn.hpp fast_mem_fn example]
+exploits this characteristic and implements a potentially inlining version of
+[@../../../bind/mem_fn.html boost::mem_fn]
+limited to member functions that are known at compile time.
+
+[endsect]
+
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+[section:about_tag_types About Tag Types]
+
+Boost.FunctionTypes uses tag types to encode properties that are not types
+per se, such as calling convention or whether a function is variadic or cv-
+qualified.
+
+These tags can be used to determine whether one property of a type has a
+particular value.
+
+  is_function<int(...), variadic>::value // == true
+  is_function<int()   , variadic>::value // == false
+
+A compound property tag describes a combination of possible values of different
+properties.
+The type [^components<F>], where [^F] is a callable builtin type, is a compound
+property tag that describes [^F].
+The [^tag] class template can be used to combine property tags.
+
+  tag<non_const,default_cc> // combination of two properties
+
+When several values for the same property are specified in [^tag]'s argument
+list, only the rightmost one is used; others are ignored.
+
+ tag<components<F>, default_cc> // overrides F's calling convention property
+
+When compound property tag is specified to analyse a type, all of its component
+properties must match.
+
+  is_member_function_pointer< F, tag<const_qualified,default_cc> >::value
+  // true for
+  //   F = void(a_class::*)() const
+  // false for
+  //   F = void(a_class::*)()
+  //   F = void(__fastcall a_class::*)() const
+
+Default values are selected for properties not specified by the tag in the
+context of type synthesis.
+
+  // given S = mpl::vector<int,a_class const &>
+
+  member_function_pointer<S>::type // is int (a_class::*)() const
+  // note: the cv-qualification is picked based on the class type,
+  // a nonvariadic signature and the default calling convention
+  // are used
+
+  member_function_pointer<S,non_const>::type // is int (a_class::*)()
+  // no const qualification, as explicitly specified by the tag type
+
+[endsect]
+
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:reference Reference]
+
+
+[section:classification Class templates for type classification]
+
+[section:is_function is_function]
+
+  template<typename T, typename Tag = __null_tag>
+  struct is_function;
+
+[*Header]
+
+  #include <boost/function_types/is_function.hpp>
+
+[variablelist
+  [[[^T]][Type to analyze]]
+  [[[^Tag]][Further properties required for a positive result]]
+  [[[^is_function<T,Tag>]][Predicate value as __mpl_integral_constant__]]
+  [[[^is_function<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a function, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_function_pointer is_function_pointer]
+
+  template<typename T, typename Tag = __null_tag>
+  struct is_function_pointer;
+
+[*Header]
+
+  #include <boost/function_types/is_function_pointer.hpp>
+
+[variablelist
+  [[[^T]][Type to analyze]]
+  [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_function_pointer<T,Tag>]][Predicate value __mpl_integral_constant__]]
+  [[[^is_function_pointer<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a function pointer, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_function_reference is_function_reference]
+
+  template<typename T, typename Tag = __null_tag>
+  struct is_function_reference;
+
+[*Header]
+
+  #include <boost/function_types/is_function_reference.hpp>
+
+[variablelist
+  [[[^T]][Type to analyze]]
+  [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_function_reference<T,Tag>]][Predicate value __mpl_integral_constant__]]
+  [[[^is_function_reference<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a function reference, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_member_pointer is_member_pointer]
+
+  template<typename T, typename Tag = __null_tag>
+  struct is_member_pointer;
+
+[*Header]
+
+  #include <boost/function_types/is_member_pointer.hpp>
+
+[variablelist
+  [[[^T]][Type to analyze]]
+  [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_member_pointer<T,Tag>]][Predicate value __mpl_integral_constant__]]
+  [[[^is_member_pointer<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a pointer to member (object or function)
+type, possibly with additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_member_object_pointer is_member_object_pointer]
+
+  template<typename T>
+  struct is_member_object_pointer;
+
+[*Header]
+
+  #include <boost/function_types/is_member_object_pointer.hpp>
+
+[variablelist
+  [[[^T]][Type to analyze]]
+ [[[^is_member_object_pointer<T>]][Predicate value __mpl_integral_constant__]]
+  [[[^is_member_object_pointer<T>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a pointer to member object type.
+
+[endsect]
+
+
+[section:is_member_function_pointer is_member_function_pointer]
+
+  template<typename T, typename Tag = __null_tag>
+  struct is_member_function_pointer;
+
+[*Header]
+
+  #include <boost/function_types/is_member_function_pointer.hpp>
+
+[variablelist
+  [[[^T]][Type to analyze]]
+  [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_member_function_pointer<T,Tag>]][Predicate value __mpl_integral_constant__]]
+  [[[^is_member_function_pointer<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a member function pointer, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_callable_builtin is_callable_builtin]
+
+  template<typename T, typename Tag = __null_tag>
+  struct is_callable_builtin;
+
+[*Header]
+
+  #include <boost/function_types/is_callable_builtin.hpp>
+
+[variablelist
+  [[[^T]][Type to analyze]]
+  [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_callable_builtin<T,Tag>]][Predicate value as __mpl_integral_constant__]]
+  [[[^is_callable_builtin<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a callable builtin, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+
+[section:is_nonmember_callable_builtin is_nonmember_callable_builtin]
+
+  template<typename T, typename Tag = __null_tag>
+  struct is_nonmember_callable_builtin;
+
+[*Header]
+
+  #include <boost/function_types/is_nonmember_callable_builtin.hpp>
+
+[variablelist
+  [[[^T]][Type to analyze]]
+  [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_nonmember_callable_builtin<T,Tag>]][Predicate value as __mpl_integral_constant__]] + [[[^is_nonmember_callable_builtin<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a callable builtin that is not a
+member function pointer, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[endsect] [/ Class templates for type classification ]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:decomposition Class templates for type decomposition]
+
+
+[section:result_type result_type]
+
+  template<typename F>
+  struct result_type;
+
+[*Header]
+
+  #include <boost/function_types/result_type.hpp>
+
+[variablelist
+  [[[^F]][Type to analyze]]
+  [[[^result_type<F>::type]][Result type of [^F]]]
+]
+
+Extracts the result type of a callable, builtin type.
+
+If [^F] is no callable, builtin type, any attempt to access the
+[^type] member results in a compile error.
+
+[endsect]
+
+
+[section:parameter_types parameter_types]
+
+  template<typename F, class ClassTransform = add_reference<_> >
+  struct parameter_types;
+
+[*Header]
+
+  #include <boost/function_types/parameter_types.hpp>
+
+[variablelist
+  [[[^F]][Type to analyze]]
+  [[[^ClassTransform]]
+   [__mpl_lambda_expression__ to transform the
+    class type if [^F] is a member function pointer]]
+
+  [[[^parameter_types<F,ClassTransform>]]
+   [__mpl_fb_ext_ra_seq__ of parameter types]]
+]
+
+Extracts the parameter types of a callable, builtin type.
+
+If [^F] is no callable, builtin type, any attempt to access the
+sequence results in a compile error.
+
+[endsect]
+
+
+[section:function_arity function_arity]
+
+  template<typename F>
+  struct function_arity;
+
+[*Header]
+
+  #include <boost/function_types/function_arity.hpp>
+
+[variablelist
+  [[[^F]][Callable builtin type]]
+  [[[^function_arity<F>]][Function arity as __mpl_integral_constant__]]
+  [[[^function_arity<F>::value]][Constant value of the function arity]]
+]
+
+Extracts the function arity, that is the number of parameters.
+The hidden [^this] of member function pointers counts, in other words
+the arity value is always greater than or equal to one if [^F] is a
+member function pointer.
+
+If [^F] is no callable, builtin type, any attempt to access the
+value results in a compile error.
+
+[endsect]
+
+
+[section:components components]
+
+  template<typename T, class ClassTransform = add_reference<_> >
+  struct components;
+
+[*Header]
+
+  #include <boost/function_types/components.hpp>
+
+[variablelist
+  [[[^T]][Type to analyze]]
+  [[[^ClassTransform]]
+   [__mpl_lambda_expression__ to transform the
+    class type if [^T] is a member function pointer]]
+
+  [[[^components<T,ClassTransform>]]
+   [__mpl_fb_ext_ra_seq__ of all
+     component types and property tag]]
+  [[[^components<T,ClassTransform>::types]]
+   [Decorated MPL Sequence, exposed for optimization]]
+]
+
+Extracts all properties of a callable builtin type, that is the result type,
+followed by the parameter types (including the type of [^this] for member
+function pointers).
+
+If [^T] is no callable builtin type, the component types are an empty
+sequence and the Tag's meaning is equivalent to the [^__null_tag].
+
+[endsect]
+
+[endsect] [/ Class templates for type decomposition]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:synthesis Class templates for type synthesis]
+
+
+[section:function_type function_type]
+
+  template<typename Types, typename Tag = __null_tag>
+  struct function_type;
+
+[*Header]
+
+  #include <boost/function_types/function_type.hpp>
+
+[variablelist
+ [[[^Types]][Component types in form of an __mpl_fwd_seq__ or another callable, builtin type]]
+  [[[^Tag]][Further properties]]
+  [[[^function_type<Types,Tag>::type]][Synthesized type]]
+]
+
+Synthesizes a function type from given properties.
+
+If the template parameters do not describe a valid type, any attempt
+to access the [^type] member will result in a compile error.
+
+[endsect]
+
+
+[section:function_pointer function_pointer]
+
+  template<typename Types, typename Tag = __null_tag>
+  struct function_pointer;
+
+[*Header]
+
+  #include <boost/function_types/function_pointer.hpp>
+
+[variablelist
+ [[[^Types]][Component types in form of an __mpl_fwd_seq__ or another callable, builtin type]]
+  [[[^Tag]][Further properties]]
+  [[[^function_pointer<Types,Tag>::type]][Synthesized type]]
+]
+
+Synthesizes a function pointer type from given properties.
+
+If the template parameters do not describe a valid type, any attempt
+to access the [^type] member will result in a compile error.
+
+[endsect]
+
+
+[section:function_reference function_reference]
+
+  template<typename Types, typename Tag = __null_tag>
+  struct function_reference;
+
+[*Header]
+
+  #include <boost/function_types/function_reference.hpp>
+
+[variablelist
+ [[[^Types]][Component types in form of an __mpl_fwd_seq__ or another callable, builtin type]]
+  [[[^Tag]][Further properties]]
+  [[[^function_reference<Types,Tag>::type]][Synthesized type]]
+]
+
+Synthesizes a function reference type from given properties.
+
+If the template parameters do not describe a valid type, any attempt
+to access the [^type] member will result in a compile error.
+
+[endsect]
+
+
+[section:member_function_pointer member_function_pointer]
+
+  template<typename Types, typename Tag = __null_tag>
+  struct member_function_pointer;
+
+[*Header]
+
+  #include <boost/function_types/member_function_pointer.hpp>
+
+[variablelist
+ [[[^Types]][Component types in form of an __mpl_fwd_seq__ or another callable, builtin type]]
+  [[[^Tag]][Further properties]]
+  [[[^member_function_pointer<Types,Tag>::type]][Synthesized type]]
+]
+
+Synthesizes a member function pointer type from given properties.
+
+An optional reference or possibly cv-qualified pointer is removed from
+the second type in the sequence to determine the the class type.
+The cv-qualification of the resulting type applies to the member
+function, unless otherwise explicitly specified by the property tag.
+
+If the template parameters do not describe a valid type, any attempt
+to access the [^type] member will result in a compile error.
+
+[endsect]
+
+
+[endsect] [/ Class templates for type synthesis ]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:tag_types Tag Types]
+
+[section:variadic variadic]
+
+  typedef __unspecified__ variadic;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type takes a variable number of arguments through
+an ellipsis parameter (such as [^printf]).
+
+[endsect]
+
+[section:non_variadic non_variadic]
+
+  typedef __unspecified__ non_variadic;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type does not have an ellipsis parameter.
+
+[endsect]
+
+[section:default_cc default_cc]
+
+  typedef __unspecified__ default_cc;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type encodes the default calling convention.
+
+[endsect]
+
+[section:const_qualified const_qualified]
+
+  typedef __unspecified__ const_qualified;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type is const qualified.
+
+[endsect]
+
+[section:non_const non_const]
+
+  typedef __unspecified__ non_const;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type is not const qualified.
+
+[endsect]
+
+[section:volatile_qualified volatile_qualified]
+
+  typedef __unspecified__ volatile_qualified;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type is volatile qualified.
+
+[endsect]
+
+[section:non_volatile non_volatile]
+
+  typedef __unspecified__ non_volatile;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type is not volatile qualified.
+
+[endsect]
+
+[section:non_cv non_cv]
+
+  typedef __unspecified__ non_cv;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type is neither const nor volatile qualified.
+Equivalent to `__tag<__non_const,__non_volatile>`, but involves
+fewer template instantiations when evaluated.
+
+[endsect]
+
+[section:const_non_volatile const_non_volatile]
+
+  typedef __unspecified__ const_non_volatile;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type is const but not volatile qualified.
+Equivalent to `__tag<__const_qualified,__non_volatile>`, but involves
+fewer template instantiations when evaluated.
+
+[endsect]
+
+[section:volatile_non_const volatile_non_const]
+
+  typedef __unspecified__ volatile_non_const;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type is volatile but not const qualified.
+Equivalent to `__tag<__volatile_qualified,__non_const>`, but involves
+fewer template instantiations when evaluated.
+
+[endsect]
+
+[section:cv_qualfied cv_qualfied]
+
+  typedef __unspecified__ cv_qualified;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States that a function type is both const and volatile qualified.
+Equivalent to `__tag<__const_qualified,__volatile_qualified>`, but involves
+fewer template instantiations when evaluated.
+
+[endsect]
+
+[section:null_tag null_tag]
+
+  typedef __unspecified__ null_tag;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+States nothing.
+
+[endsect]
+
+[section:tag tag]
+
+  template<class Tag1, class Tag2,
+      class Tag3 = null_tag, class Tag4 = null_tag>
+  struct tag;
+
+[*Header]
+
+  #include <boost/function_types/property_tags.hpp>
+
+[variablelist
+  [[[^Tag['N]]][Property tag]]
+  [[[^tag<Tag1,Tag2...>]][Compound property tag]]
+]
+
+Combination of up to four property tags. If the arguments describe different
+values for the same property the value of the rightmost argument is used.
+
+[endsect]
+
+[endsect] [/ Tag Types]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:macros Macros]
+
+[section:BOOST_FT_MAX_ARITY BOOST_FT_MAX_ARITY]
+
+Expands to a numeric value that describes the maximum function arity
+supported by the library.
+
+Defaults to 20 if not explicitly defined by the user before inclusion
+of the first library header.
+
+[endsect]
+
+
+
+[*The following macros do not need to be defined, unless to configure
+the library to work with a compiler and/or calling convention not covered by +the auto-detection mechanism in [^boost/function_types/config/compiler.hpp].]
+
+
+[section:BOOST_FT_CC_NAMES BOOST_FT_CC_NAMES]
+
+Expands to a [@../../../preprocessor/doc/data/sequences.html sequence] of
+ternary [@../../../preprocessor/doc/data/tuples.html tuples] (these data
+types are defined in the [@../../../preprocessor/doc/index.html
+documentation of the Boost Preprocessor library]).
+Each sequence element describes one calling convention specifier.
+The first element in each tuple is the macro suffix for
+[link boost_functiontypes.reference.macros.BOOST_FT_CC [^BOOST_FT\_CC\_*]],
+the second element is the name of the tag that describes the calling
+convention and the third is the name of the specifier.
+The specifier is allowed to be an empty string, so the third tuple element
+is either [@../../../preprocessor/doc/ref/empty.html [^BOOST_PP_EMPTY]] or
+[@../../../preprocessor/doc/ref/identity.html [^BOOST_PP_IDENTITY]][^(['name])].
+
+Define this macro to extend the set of possible names for custom calling
+conventions. The macro expands to nothing by default.
+
+The following names are predefined by the library and must not occur in the
+definition of [^BOOST_FT_CC_NAMES]:
+
+  #define BOOST_FT_BUILTIN_CC_NAMES \
+    (( IMPLICIT           , implicit_cc , BOOST_PP_EMPTY                ))\
+    (( CDECL              , cdecl_cc    , BOOST_PP_IDENTITY(__cdecl   ) ))\
+    (( STDCALL            , stdcall_cc  , BOOST_PP_IDENTITY(__stdcall ) ))\
+    (( PASCAL             , pascal_cc   , BOOST_PP_IDENTITY(pascal    ) ))\
+    (( FASTCALL           , fastcall_cc , BOOST_PP_IDENTITY(__fastcall) ))\
+    (( CLRCALL            , clrcall_cc  , BOOST_PP_IDENTITY(__clrcall ) ))\
+    (( THISCALL           , thiscall_cc , BOOST_PP_IDENTITY(__thiscall) ))\
+    (( IMPLICIT_THISCALL  , thiscall_cc , BOOST_PP_EMPTY                ))
+  // Don't get confused by the last line, here (thiscall can't be specified
+  // explicitly prior to MSVC 8).
+
+[endsect]
+
+[section:BOOST_FT_CC BOOST_FT\_CC\_*]
+
+Enables a specific calling convention. * denotes the macro suffix, as
+defined by
+[link boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES [^BOOST_FT_CC_NAMES]]
+or
+[link boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES [^BOOST_FT_BUILTIN_CC_NAMES]].
+
+The macro expands to a list of restrictions, separated by the [^|] character.
+Possible items are:
+
+* callable_builtin
+* member
+* non_member
+* variadic
+* non_variadic
+
+If no such macro is defined for a particular calling convention, it is disabled.
+Example:
+
+  #define BOOST_FT_CC_STDCALL non_variadic|callable_builtin
+  // enables stdcall calling convention for all non-variadic,
+  // callable, builtin types
+
+[endsect]
+
+[section:BOOST_FT_COMMON_X86_CCs BOOST_FT_COMMON_X86_CCs]
+
+Defining this macro causes the following macros to be defined, if not defined
+already:
+
+  #define BOOST_FT_CC_CDECL BOOST_FT_COMMON_X86_CCs
+  #define BOOST_FT_CC_STDCALL non_variadic|BOOST_FT_COMMON_X86_CCs
+  #define BOOST_FT_CC_FASTCALL non_variadic|BOOST_FT_COMMON_X86_CCs
+
+[endsect]
+
+[section:BOOST_FT_SYNTAX BOOST_FT_SYNTAX]
+
+This macro allows to change the syntax of callable builtin types.
+It is useful to handle the compiler specific placement of the calling
+convention specifier.
+
+The default definition is as follows:
+
+  #define BOOST_FT_SYNTAX(result,lparen,cc_spec,type_mod,name,rparen) \
+            result() lparen() cc_spec() type_mod() name() rparen()
+
+[endsect]
+
+[section:BOOST_FT_NULLARY_PARAM BOOST_FT_NULLARY_PARAM]
+
+Set to [^void] for compilers that insist on a [^void] parameter for
+nullary function types, empty by default.
+
+[endsect]
+
+[section:BOOST_FT_NO_CV_FUNC_SUPPORT BOOST_FT_NO_CV_FUNC_SUPPORT]
+
+Disables support for cv-qualified function types.
+Cv-qualified function types are illegal by the current standard
+version, but there is a pending defect report on that issue.
+It defaults to [^1] until the standard changes, setting this macro
+to [^0] may not work.
+
+[endsect]
+
+
+
+[*The following macros are useful for testing when changing the source code of
+the library.]
+
+
+
+[section:BOOST_FT_PREPROCESSING_MODE BOOST_FT_PREPROCESSING_MODE]
+
+Makes the compiler preprocess as much as possible of the library code
+(rather than loading already-preprocessed header files) if defined.
+
+[endsect]
+
+[section:BOOST_FT_CC_PREPROCESSING BOOST_FT_CC_PREPROCESSING]
+
+Makes the compiler preprocess the loop over possible names for custom
+calling conventions (rather than loading an already-preprocessed header
+file) if defined.
+
+This macro is defined automatically if
+[link boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES [^BOOST_FT_CC_NAMES]]
+has been defined.
+
+[endsect]
+
+[endsect]
+
+[endsect]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:rationale Rationale]
+
***The diff for this file has been truncated for email.***
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/examples/Jamfile.v2     Mon Feb  8 01:01:45 2010
@@ -0,0 +1,8 @@
+
+# Copyright Daniel James 2005. Use, modification, and distribution are
+# subject to 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)
+
+run books.cpp ;
+run point.cpp ;
+run portable.cpp ;
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/Jamfile.v2 Mon Feb  8 01:01:45 2010
@@ -0,0 +1,67 @@
+
+# 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)
+
+import testing ;
+
+project hash-tests
+    : requirements
+        <warnings>all
+        <toolset>intel:<warnings>on
+        <toolset>intel:<cxxflags>-strict-ansi
+ <toolset>gcc:<cxxflags>"-pedantic -Wstrict-aliasing -fstrict-aliasing -Wextra -Wsign-promo -Wunused-parameter" + <toolset>darwin:<cxxflags>"-pedantic -Wstrict-aliasing -fstrict-aliasing -Wextra -Wsign-promo -Wunused-parameter"
+        <toolset>msvc:<warnings-as-errors>on
+        #<toolset>gcc:<warnings-as-errors>on
+        #<toolset>darwin:<warnings-as-errors>on
+    ;
+
+test-suite functional/hash
+    :
+        [ run hash_fwd_test_1.cpp ]
+        [ run hash_fwd_test_2.cpp ]
+        [ run hash_number_test.cpp ]
+        [ run hash_pointer_test.cpp ]
+        [ run hash_function_pointer_test.cpp ]
+        [ run hash_float_test.cpp : : : <test-info>always_show_run_output ]
+ [ run hash_long_double_test.cpp : : : <test-info>always_show_run_output ]
+        [ run hash_string_test.cpp ]
+        [ run hash_range_test.cpp ]
+        [ run hash_custom_test.cpp ]
+        [ run hash_global_namespace_test.cpp ]
+        [ run hash_friend_test.cpp ]
+        [ run hash_built_in_array_test.cpp ]
+        [ run hash_value_array_test.cpp ]
+        [ run hash_vector_test.cpp ]
+        [ run hash_list_test.cpp ]
+        [ run hash_deque_test.cpp ]
+        [ run hash_set_test.cpp ]
+        [ run hash_map_test.cpp ]
+        [ run hash_complex_test.cpp ]
+        [ run link_test.cpp link_test_2.cpp ]
+        [ run link_ext_test.cpp link_no_ext_test.cpp ]
+        [ run extensions_hpp_test.cpp ]
+        [ run container_fwd_test.cpp ]
+        [ run container_fwd_test.cpp : :
+            :   <toolset>gcc:<define>_GLIBCXX_DEBUG
+                <toolset>darwin:<define>_GLIBCXX_DEBUG
+            :   container_fwd_gcc_debug ]
+        [ compile-fail hash_no_ext_fail_test.cpp ]
+        [ compile-fail namespace_fail_test.cpp ]
+        [ run hash_no_ext_macro_1.cpp ]
+        [ run hash_no_ext_macro_2.cpp ]
+    ;
+
+test-suite functional/hash_no_ext
+    :
+ [ run hash_number_test.cpp : : : <define>BOOST_HASH_NO_EXTENSIONS : no_ext_number_test ] + [ run hash_pointer_test.cpp : : : <define>BOOST_HASH_NO_EXTENSIONS : no_ext_pointer_test ] + [ run hash_function_pointer_test.cpp : : : <define>BOOST_HASH_NO_EXTENSIONS : no_ext_function_pointer_test ] + [ run hash_float_test.cpp : : : <define>BOOST_HASH_NO_EXTENSIONS : no_ext_float_test ] + [ run hash_long_double_test.cpp : : : <define>BOOST_HASH_NO_EXTENSIONS : no_ext_long_double_test ] + [ run hash_string_test.cpp : : : <define>BOOST_HASH_NO_EXTENSIONS : no_ext_string_test ] + [ run link_test.cpp link_test_2.cpp : : : <define>BOOST_HASH_NO_EXTENSIONS : no_ext_link_test ]
+    ;
+
+build-project ../examples ;
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/compile_time.hpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,16 @@
+
+// Copyright 2005-2009 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)
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+
+template <class T>
+void compile_time_tests(T*)
+{
+    BOOST_STATIC_ASSERT((boost::is_base_and_derived<
+ std::unary_function<T, std::size_t>, HASH_NAMESPACE::hash<T>
::value));
+}
+
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/config.hpp Mon Feb  8 01:01:45 2010
@@ -0,0 +1,21 @@
+
+// Copyright 2005-2009 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)
+
+#if defined(TEST_STD)
+#  define TEST_STD_INCLUDES
+#  define HASH_NAMESPACE std
+#else
+#  define HASH_NAMESPACE boost
+#  if !defined(BOOST_HASH_NO_EXTENSIONS)
+#    define TEST_EXTENSIONS
+#  endif
+#endif
+
+#if defined(_WIN32_WCE)
+// The standard windows mobile headers trigger this warning so I disable it
+// before doing anything else.
+#pragma warning(disable:4201)   // nonstandard extension used :
+                                // nameless struct/union
+#endif
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/container_fwd_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,114 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#include <boost/functional/detail/container_fwd.hpp>
+
+#if BOOST_WORKAROUND(__GNUC__, < 3) && \
+    !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+template <class charT, class Allocator>
+static void test(
+ std::basic_string<charT, std::string_char_traits<charT>, Allocator> const&)
+{
+}
+#else
+template <class charT, class Allocator>
+static void test(
+    std::basic_string<charT, std::char_traits<charT>, Allocator> const&)
+{
+}
+#endif
+
+template <class T, class Allocator>
+static void test(std::deque<T, Allocator> const&)
+{
+}
+
+template <class T, class Allocator>
+static void test(std::list<T, Allocator> const&)
+{
+}
+
+template <class T, class Allocator>
+static void test(std::vector<T, Allocator> const&)
+{
+}
+
+template <class Key, class T, class Compare, class Allocator>
+static void test(std::map<Key, T, Compare, Allocator> const&)
+{
+}
+
+template <class Key, class T, class Compare, class Allocator>
+static void test(std::multimap<Key, T, Compare, Allocator> const&)
+{
+}
+
+template <class Key, class Compare, class Allocator>
+static void test(std::set<Key, Compare, Allocator> const&)
+{
+}
+
+template <class Key, class Compare, class Allocator>
+static void test(std::multiset<Key, Compare, Allocator> const&)
+{
+}
+
+template <std::size_t N>
+static void test(std::bitset<N> const&)
+{
+}
+
+template <class T>
+static void test(std::complex<T> const&)
+{
+}
+
+template <class X, class Y>
+static void test(std::pair<X, Y> const&)
+{
+}
+
+#include <deque>
+#include <list>
+#include <vector>
+#include <map>
+#include <set>
+#include <bitset>
+#include <string>
+#include <complex>
+#include <utility>
+
+int main()
+{
+    std::deque<int> x1;
+    std::list<std::string> x2;
+    std::vector<float> x3;
+    std::vector<bool> x4;
+    std::map<int, int> x5;
+    std::multimap<float, int*> x6;
+    std::set<std::string> x7;
+    std::multiset<std::vector<int> > x8;
+    std::bitset<10> x9;
+    std::string x10;
+    std::complex<double> x11;
+    std::pair<std::list<int>, char***> x12;
+
+    test(x1);
+    test(x2);
+    test(x3);
+    test(x4);
+    test(x5);
+    test(x6);
+    test(x7);
+    test(x8);
+    test(x9);
+    test(x10);
+    test(x11);
+    test(x12);
+
+    return 0;
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/extensions_hpp_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,19 @@
+
+// Copyright 2009 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)
+
+// Check that boost/functional/hash/extensions.hpp works okay.
+//
+// It probably should be in boost/functional/hash/detail, but since it isn't it
+// should work.
+
+#include "./config.hpp"
+
+#include <boost/functional/hash/extensions.hpp>
+
+int main() {
+    int x[2] = { 2, 3 };
+    boost::hash<int[2]> hf;
+    hf(x);
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_built_in_array_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,75 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef TEST_EXTENSIONS
+
+void array_int_test()
+{
+    const int length1 = 25;
+    int array1[25] = {
+        26, -43, 32, 65, 45,
+        12, 67, 32, 12, 23,
+        0, 0, 0, 0, 0,
+        8, -12, 23, 65, 45,
+        -1, 93, -54, 987, 3
+    };
+    HASH_NAMESPACE::hash<int[25]> hasher1;
+
+    const int length2 = 1;
+    int array2[1] = {3};
+    HASH_NAMESPACE::hash<int[1]> hasher2;
+
+    const int length3 = 2;
+    int array3[2] = {2, 3};
+    HASH_NAMESPACE::hash<int[2]> hasher3;
+
+    BOOST_TEST(hasher1(array1)
+            == HASH_NAMESPACE::hash_range(array1, array1 + length1));
+    BOOST_TEST(hasher2(array2)
+            == HASH_NAMESPACE::hash_range(array2, array2 + length2));
+    BOOST_TEST(hasher3(array3)
+            == HASH_NAMESPACE::hash_range(array3, array3 + length3));
+}
+
+void two_dimensional_array_test()
+{
+    int array[3][2] = {{-5, 6}, {7, -3}, {26, 1}};
+    HASH_NAMESPACE::hash<int[3][2]> hasher;
+
+    std::size_t seed1 = 0;
+    for(int i = 0; i < 3; ++i)
+    {
+        std::size_t seed2 = 0;
+        for(int j = 0; j < 2; ++j)
+            HASH_NAMESPACE::hash_combine(seed2, array[i][j]);
+        HASH_NAMESPACE::hash_combine(seed1, seed2);
+    }
+
+    BOOST_TEST(hasher(array) == seed1);
+ BOOST_TEST(hasher(array) == HASH_NAMESPACE::hash_range(array, array + 3));
+}
+
+#endif // TEST_EXTENSIONS
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    array_int_test();
+    two_dimensional_array_test();
+#endif
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_complex_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,106 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#if !defined(TEST_EXTENSIONS)
+
+int main() {}
+
+#else
+
+#ifdef TEST_STD_INCLUDES
+#  include <functional>
+#else
+#  include <boost/functional/hash.hpp>
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#if defined(BOOST_MSVC)
+#pragma warning(disable:4244)   // conversion from 'unsigned long' to
+                                // 'unsigned short', possible loss of data
+#pragma warning(disable:4245)   // conversion from 'int' to
+                                // 'const unsigned short',
+                                // signed/unsigned mismatch
+#pragma warning(disable:4305)   // truncation from 'double' to
+                                // 'const std::complex<float>::_Ty'
+#pragma warning(disable:4309)   // truncation of constant value
+#pragma warning(disable:4512) // assignment operator could not be generated
+#if BOOST_MSVC < 1400
+#pragma warning(disable:4267) // conversion from 'size_t' to 'unsigned int',
+                                // possible loss of data
+#endif
+#endif
+
+#include <complex>
+#include <sstream>
+#include <boost/limits.hpp>
+
+template <class T>
+void generic_complex_tests(std::complex<T> v)
+{
+    HASH_NAMESPACE::hash<std::complex<T> > complex_hasher;
+
+    BOOST_TEST(complex_hasher(v) == complex_hasher(v));
+
+    HASH_NAMESPACE::hash<T> real_hasher;
+    T real = v.real();
+    T imag = v.imag();
+
+    BOOST_TEST(real_hasher(real) == complex_hasher(std::complex<T>(real)));
+
+    if(imag != 0 && real_hasher(real) == complex_hasher(v)) {
+        std::ostringstream os;
+        os<<"real_hasher("<<real<<") == complex_hasher("
+            <<v.real()<<" + "<<v.imag()<<"i) == "
+            <<real_hasher(real)<<" (This might not be a bug).";
+        BOOST_ERROR(os.str().c_str());
+    }
+}
+
+template <class Float>
+void complex_float_tests(Float*)
+{
+    typedef std::complex<Float> complex;
+    generic_complex_tests(complex(0,0));
+    generic_complex_tests(complex(0.5,0));
+    generic_complex_tests(complex(25,0));
+    generic_complex_tests(complex(25,0));
+    generic_complex_tests(complex(-67.5324535,56.23578678));
+}
+
+template <class Integer>
+void complex_integral_tests(Integer*)
+{
+    typedef std::complex<Integer> complex;
+    generic_complex_tests(complex(0,0));
+    generic_complex_tests(complex(15342,124));
+    generic_complex_tests(complex(25,54356));
+    generic_complex_tests(complex(5325,2346));
+    generic_complex_tests(complex(-243897,-49923874));
+    generic_complex_tests(complex(-543,763));
+}
+
+int main()
+{
+    // I've comments out the short and unsigned short tests
+    // as they cause warnings and don't really test
+    // anything that the other tests already deal with.
+
+    complex_float_tests((float*) 0);
+    complex_float_tests((double*) 0);
+    complex_float_tests((long double*) 0);
+    //complex_integral_tests((short*) 0);
+    complex_integral_tests((int*) 0);
+    complex_integral_tests((long*) 0);
+    //complex_integral_tests((unsigned short*) 0);
+    complex_integral_tests((unsigned int*) 0);
+    complex_integral_tests((unsigned long*) 0);
+
+    return boost::report_errors();
+}
+
+#endif // TEST_EXTENSIONS
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_custom_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,100 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+#include <boost/config.hpp>
+#include <cstddef>
+
+namespace test
+{
+    struct custom
+    {
+        int value_;
+
+        std::size_t hash() const
+        {
+            return value_ * 10;
+        }
+
+#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+        friend std::size_t hash_value(custom const& x )
+        {
+            return x.hash();
+        }
+#endif
+
+        custom(int x) : value_(x) {}
+    };
+}
+
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+namespace boost
+{
+    std::size_t hash_value(test::custom x)
+    {
+        return x.hash();
+    }
+}
+#endif
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef TEST_EXTENSIONS
+
+#include <vector>
+#include <string>
+#include <cctype>
+
+void custom_tests()
+{
+    HASH_NAMESPACE::hash<test::custom> custom_hasher;
+    BOOST_TEST(custom_hasher(10) == 100u);
+    test::custom x(55);
+    BOOST_TEST(custom_hasher(x) == 550u);
+
+    {
+        using namespace HASH_NAMESPACE;
+        BOOST_TEST(custom_hasher(x) == hash_value(x));
+    }
+
+    std::vector<test::custom> custom_vector;
+    custom_vector.push_back(5);
+    custom_vector.push_back(25);
+    custom_vector.push_back(35);
+
+    std::size_t seed = 0;
+    HASH_NAMESPACE::hash_combine(seed, test::custom(5));
+    HASH_NAMESPACE::hash_combine(seed, test::custom(25));
+    HASH_NAMESPACE::hash_combine(seed, test::custom(35));
+
+    std::size_t seed2 = 0;
+    HASH_NAMESPACE::hash_combine(seed2, 50u);
+    HASH_NAMESPACE::hash_combine(seed2, 250u);
+    HASH_NAMESPACE::hash_combine(seed2, 350u);
+
+    BOOST_TEST(seed == HASH_NAMESPACE::hash_range(
+        custom_vector.begin(), custom_vector.end()));
+    BOOST_TEST(seed == seed2);
+}
+
+#endif // TEST_EXTENSIONS
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    custom_tests();
+#endif
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_deque_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,35 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef TEST_EXTENSIONS
+
+#include <deque>
+
+using std::deque;
+#define CONTAINER_TYPE deque
+#include "./hash_sequence_test.hpp"
+
+#endif // TEST_EXTENSIONS
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    deque_tests::deque_hash_integer_tests();
+#endif
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_float_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,18 @@
+
+// Copyright 2005-2009 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)
+
+#include "hash_float_test.hpp"
+
+int main()
+{
+    std::cerr<<"Compiler: "<<BOOST_COMPILER<<"\n";
+    std::cerr<<"Platform: "<<BOOST_PLATFORM<<"\n";
+    std::cerr<<"Library: "<<BOOST_STDLIB<<"\n\n";
+
+    float_tests("float", (float*) 0);
+    float_tests("double", (double*) 0);
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_float_test.hpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,288 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_STD_INCLUDES
+#  include <functional>
+#else
+#  include <boost/functional/hash.hpp>
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#include <cmath>
+#include <boost/functional/hash/detail/limits.hpp>
+#include <boost/functional/hash/detail/float_functions.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <iostream>
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable:4127)   // conditional expression is constant
+#pragma warning(disable:4723)   // conditional expression is constant
+#if BOOST_MSVC < 1400
+#pragma warning(disable:4267) // conversion from 'size_t' to 'unsigned int',
+                                // possible loss of data
+#endif
+#endif
+
+char const* float_type(float*) { return "float"; }
+char const* float_type(double*) { return "double"; }
+char const* float_type(long double*) { return "long double"; }
+
+template <class T>
+void float_tests(char const* name, T* = 0)
+{
+    std::cerr
+        <<  "\n"
+        <<  "Testing " BOOST_STRINGIZE(HASH_NAMESPACE) "::hash<"
+        <<  name
+        <<  ">\n"
+        <<  "\n"
+        <<  "boost::hash_detail::limits<T>::digits = "
+        <<  boost::hash_detail::limits<T>::digits<< "\n"
+        <<  "boost::hash_detail::limits<int>::digits = "
+        <<  boost::hash_detail::limits<int>::digits<< "\n"
+        <<  "boost::hash_detail::limits<std::size_t>::digits = "
+        <<  boost::hash_detail::limits<std::size_t>::digits
+        <<  "\n"
+        <<  "\n"
+        <<  "boost::hash_detail::call_ldexp<T>::float_type = "
+        <<  float_type(static_cast<BOOST_DEDUCED_TYPENAME
+                boost::hash_detail::call_ldexp<T>::float_type*>(0))
+        <<  "\n"
+        <<  "boost::hash_detail::call_frexp<T>::float_type = "
+        <<  float_type(static_cast<BOOST_DEDUCED_TYPENAME
+                boost::hash_detail::call_frexp<T>::float_type*>(0))
+        <<  "\n"
+        <<  "boost::hash_detail::select_hash_type<T>::type = "
+        <<  float_type(static_cast<BOOST_DEDUCED_TYPENAME
+                boost::hash_detail::select_hash_type<T>::type*>(0))
+        <<  "\n"
+        <<  "\n"
+        ;
+
+    HASH_NAMESPACE::hash<T> x1;
+
+    T zero = 0;
+    T minus_zero = (T) -1 * zero;
+
+    BOOST_TEST(zero == minus_zero);
+    BOOST_TEST(x1(zero) == x1(minus_zero));
+
+#if defined(TEST_EXTENSIONS)
+    BOOST_TEST(x1(zero) == HASH_NAMESPACE::hash_value(zero));
+    BOOST_TEST(x1(minus_zero) == HASH_NAMESPACE::hash_value(minus_zero));
+#endif
+
+    using namespace std;
+
+// Doing anything with infinity causes borland to crash.
+#if defined(__BORLANDC__)
+    std::cerr
+ << "Not running infinity checks on Borland, as it causes it to crash."
+            "\n";
+#else
+    if(boost::hash_detail::limits<T>::has_infinity) {
+        T infinity = -log(zero);
+        T infinity2 = (T) 1. / zero;
+        T infinity3 = (T) -1. / minus_zero;
+        T infinity4 = boost::hash_detail::limits<T>::infinity();
+
+        T minus_infinity = log(zero);
+        T minus_infinity2 = (T) -1. / zero;
+        T minus_infinity3 = (T) 1. / minus_zero;
+
+#if defined(TEST_EXTENSIONS)
+        BOOST_TEST(x1(infinity) == HASH_NAMESPACE::hash_value(infinity));
+        BOOST_TEST(x1(minus_infinity)
+                == HASH_NAMESPACE::hash_value(minus_infinity));
+#endif
+
+        if(infinity == infinity2)
+            BOOST_TEST(x1(infinity) == x1(infinity2));
+        if(infinity == infinity3)
+            BOOST_TEST(x1(infinity) == x1(infinity3));
+        if(infinity == infinity4)
+            BOOST_TEST(x1(infinity) == x1(infinity4));
+
+        if(minus_infinity == minus_infinity2)
+            BOOST_TEST(x1(minus_infinity) == x1(minus_infinity2));
+        if(minus_infinity == minus_infinity3)
+            BOOST_TEST(x1(minus_infinity) == x1(minus_infinity3));
+
+        BOOST_TEST(infinity != minus_infinity);
+
+        if(x1(infinity) == x1(minus_infinity)) {
+ std::cerr<<"x1(infinity) == x1(-infinity) == "<<x1(infinity)<<"\n";
+        }
+
+        // This should really be 'has_denorm == denorm_present' but some
+        // compilers don't have 'denorm_present'. See also a later use.
+        if(boost::hash_detail::limits<T>::has_denorm) {
+ if(x1(boost::hash_detail::limits<T>::denorm_min()) == x1(infinity))
+            {
+                std::cerr
+                    <<  "x1(denorm_min) == x1(infinity) == "
+                    <<  x1(infinity)
+                    <<  "\n";
+            }
+
+            if(x1(boost::hash_detail::limits<T>::denorm_min()) ==
+                x1(minus_infinity))
+            {
+                std::cerr
+                    <<  "x1(denorm_min) == x1(-infinity) == "
+                    <<  x1(minus_infinity)
+                    <<  "\n";
+            }
+        }
+
+        if(boost::hash_detail::limits<T>::has_quiet_NaN) {
+ if(x1(boost::hash_detail::limits<T>::quiet_NaN()) == x1(infinity))
+            {
+                std::cerr
+                    <<  "x1(quiet_NaN) == x1(infinity) == "
+                    <<  x1(infinity)
+                    <<  "\n";
+            }
+
+            if(x1(boost::hash_detail::limits<T>::quiet_NaN()) ==
+                x1(minus_infinity))
+            {
+                std::cerr
+                    <<  "x1(quiet_NaN) == x1(-infinity) == "
+                    <<  x1(minus_infinity)
+                    <<  "\n";
+            }
+        }
+    }
+#endif
+
+    T max = (boost::hash_detail::limits<T>::max)();
+    T half_max = max / 2;
+    T quarter_max = max / 4;
+    T three_quarter_max = max - quarter_max;
+
+    // Check the limits::max is in range.
+    BOOST_TEST(max != half_max);
+    BOOST_TEST(max != quarter_max);
+    BOOST_TEST(max != three_quarter_max);
+    BOOST_TEST(half_max != quarter_max);
+    BOOST_TEST(half_max != three_quarter_max);
+    BOOST_TEST(quarter_max != three_quarter_max);
+
+#if defined(TEST_EXTENSIONS)
+    BOOST_TEST(x1(max) == HASH_NAMESPACE::hash_value(max));
+    BOOST_TEST(x1(half_max) == HASH_NAMESPACE::hash_value(half_max));
+    BOOST_TEST(x1(quarter_max) == HASH_NAMESPACE::hash_value(quarter_max));
+    BOOST_TEST(x1(three_quarter_max) ==
+        HASH_NAMESPACE::hash_value(three_quarter_max));
+#endif
+
+ // The '!=' tests could legitimately fail, but with my hash it indicates a
+    // bug.
+    BOOST_TEST(x1(max) == x1(max));
+    BOOST_TEST(x1(max) != x1(quarter_max));
+    BOOST_TEST(x1(max) != x1(half_max));
+    BOOST_TEST(x1(max) != x1(three_quarter_max));
+    BOOST_TEST(x1(quarter_max) == x1(quarter_max));
+    BOOST_TEST(x1(quarter_max) != x1(half_max));
+    BOOST_TEST(x1(quarter_max) != x1(three_quarter_max));
+    BOOST_TEST(x1(half_max) == x1(half_max));
+    BOOST_TEST(x1(half_max) != x1(three_quarter_max));
+    BOOST_TEST(x1(three_quarter_max) == x1(three_quarter_max));
+
+// Intel with gcc stdlib sometimes segfaults on calls to asin and acos.
+#if !((defined(__INTEL_COMPILER) || defined(__ICL) || \
+        defined(__ICC) || defined(__ECC)) && \
+    (defined(__GLIBCPP__) || defined(__GLIBCXX__)))
+    T v1 = asin((T) 1);
+    T v2 = acos((T) 0);
+    if(v1 == v2)
+        BOOST_TEST(x1(v1) == x1(v2));
+
+#if defined(TEST_EXTENSIONS)
+    BOOST_TEST(x1(v1) == HASH_NAMESPACE::hash_value(v1));
+    BOOST_TEST(x1(v2) == HASH_NAMESPACE::hash_value(v2));
+#endif
+
+#endif
+
+#if defined(TEST_EXTENSIONS)
+    BOOST_TEST(x1(boost::hash_detail::limits<T>::epsilon()) ==
+            HASH_NAMESPACE::hash_value(
+                boost::hash_detail::limits<T>::epsilon()));
+#endif
+
+    BOOST_TEST(boost::hash_detail::limits<T>::epsilon() != (T) 0);
+    if(x1(boost::hash_detail::limits<T>::epsilon()) == x1((T) 0))
+        std::cerr<<"x1(epsilon) == x1(0) == "<<x1((T) 0)<<"\n";
+
+    BOOST_TEST(-boost::hash_detail::limits<T>::epsilon() != (T) 0);
+    if(x1(-boost::hash_detail::limits<T>::epsilon()) == x1((T) 0))
+        std::cerr<<"x1(-epsilon) == x1(0) == "<<x1((T) 0)<<"\n";
+
+    BOOST_TEST((T) 1 + boost::hash_detail::limits<T>::epsilon() != (T) 1);
+    if(x1((T) 1 + boost::hash_detail::limits<T>::epsilon()) == x1((T) 1))
+        std::cerr<<"x1(1 + epsilon) == x1(1) == "<<x1((T) 1)<<"\n";
+
+    BOOST_TEST((T) 1 - boost::hash_detail::limits<T>::epsilon() != (T) 1);
+    if(x1((T) 1 - boost::hash_detail::limits<T>::epsilon()) == x1((T) 1))
+        std::cerr<<"x1(1 - epsilon) == x1(1) == "<<x1((T) 1)<<"\n";
+
+ BOOST_TEST((T) -1 + boost::hash_detail::limits<T>::epsilon() != (T) -1);
+    if(x1((T) -1 + boost::hash_detail::limits<T>::epsilon()) == x1((T) -1))
+        std::cerr<<"x1(-1 + epsilon) == x1(-1) == "<<x1((T) -1)<<"\n";
+
+ BOOST_TEST((T) -1 - boost::hash_detail::limits<T>::epsilon() != (T) -1);
+    if(x1((T) -1 - boost::hash_detail::limits<T>::epsilon()) == x1((T) -1))
+        std::cerr<<"x1(-1 - epsilon) == x1(-1) == "<<x1((T) -1)<<"\n";
+
+    // As before.
+    if(boost::hash_detail::limits<T>::has_denorm) {
+        if(x1(boost::hash_detail::limits<T>::denorm_min()) == x1(zero)) {
+            std::cerr<<"x1(denorm_min) == x1(zero) == "<<x1(zero)<<"\n";
+        }
+#if !BOOST_WORKAROUND(__DECCXX_VER,<70190006) && defined(TEST_EXTENSIONS)
+ // The Tru64/CXX standard library prior to 7.1 contains a bug in the + // specialization of boost::hash_detail::limits::denorm_min() for long
+        // doubles which causes this test to fail.
+        if(x1(boost::hash_detail::limits<T>::denorm_min()) !=
+            HASH_NAMESPACE::hash_value(
+                boost::hash_detail::limits<T>::denorm_min()))
+        {
+            std::cerr
+                <<  "x1(boost::hash_detail::limits<T>::denorm_min()) = "
+                <<  x1(boost::hash_detail::limits<T>::denorm_min())
+ << "\nhash_value(boost::hash_detail::limits<T>::denorm_min())"
+                    " = "
+                <<  HASH_NAMESPACE::hash_value(
+                        boost::hash_detail::limits<T>::denorm_min())
+                <<  "\nx1(0) = "
+                <<  x1(0)
+                <<  "\n";
+        }
+#endif
+    }
+
+// NaN also causes borland to crash.
+#if !defined(__BORLANDC__) && defined(TEST_EXTENSIONS)
+    if(boost::hash_detail::limits<T>::has_quiet_NaN) {
+        if(x1(boost::hash_detail::limits<T>::quiet_NaN()) == x1(1.0)) {
+            std::cerr<<"x1(quiet_NaN) == x1(1.0) == "<<x1(1.0)<<"\n";
+        }
+        BOOST_TEST(x1(boost::hash_detail::limits<T>::quiet_NaN()) ==
+            HASH_NAMESPACE::hash_value(
+                boost::hash_detail::limits<T>::quiet_NaN()));
+    }
+#endif
+}
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_friend_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,103 @@
+
+// Copyright 2006-2009 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)
+
+#include "./config.hpp"
+
+#include <boost/config.hpp>
+#include <cstddef>
+
+namespace test
+{
+    template <class T>
+    struct custom
+    {
+        int value_;
+
+        std::size_t hash() const
+        {
+            return value_ * 10;
+        }
+
+#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+        friend std::size_t hash_value(custom const& x)
+        {
+            return x.hash();
+        }
+#endif
+
+        custom(int x) : value_(x) {}
+    };
+}
+
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+namespace boost
+{
+    template <class T>
+    std::size_t hash_value(test::custom<T> x)
+    {
+        return x.hash();
+    }
+}
+#endif
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef TEST_EXTENSIONS
+
+#include <vector>
+#include <string>
+#include <cctype>
+
+void custom_tests()
+{
+    HASH_NAMESPACE::hash<test::custom<int> > custom_hasher;
+    BOOST_TEST(custom_hasher(10) == 100u);
+    test::custom<int> x(55);
+    BOOST_TEST(custom_hasher(x) == 550u);
+
+    {
+        using namespace HASH_NAMESPACE;
+        BOOST_TEST(custom_hasher(x) == hash_value(x));
+    }
+
+    std::vector<test::custom<int> > custom_vector;
+    custom_vector.push_back(5);
+    custom_vector.push_back(25);
+    custom_vector.push_back(35);
+
+    std::size_t seed = 0;
+    HASH_NAMESPACE::hash_combine(seed, test::custom<int>(5));
+    HASH_NAMESPACE::hash_combine(seed, test::custom<int>(25));
+    HASH_NAMESPACE::hash_combine(seed, test::custom<int>(35));
+
+    std::size_t seed2 = 0;
+    HASH_NAMESPACE::hash_combine(seed2, 50u);
+    HASH_NAMESPACE::hash_combine(seed2, 250u);
+    HASH_NAMESPACE::hash_combine(seed2, 350u);
+
+    BOOST_TEST(seed == HASH_NAMESPACE::hash_range(
+        custom_vector.begin(), custom_vector.end()));
+    BOOST_TEST(seed == seed2);
+}
+
+#endif // TEST_EXTENSIONS
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    custom_tests();
+#endif
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_function_pointer_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,61 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_STD_INCLUDES
+#  include <functional>
+#else
+#  include <boost/functional/hash.hpp>
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+
+#include "./compile_time.hpp"
+
+void void_func1() { static int x = 1; ++x; }
+void void_func2() { static int x = 2; --x; }
+int int_func1(int) { return 0; }
+int int_func2(int) { return 1; }
+
+void function_pointer_tests()
+{
+    compile_time_tests((void(**)()) 0);
+    compile_time_tests((int(**)(int)) 0);
+
+    HASH_NAMESPACE::hash<void(*)()> hasher_void;
+    HASH_NAMESPACE::hash<int(*)(int)> hasher_int;
+
+    BOOST_TEST(&void_func1 != &void_func2);
+    BOOST_TEST(&int_func1 != &int_func2);
+
+    BOOST_TEST(hasher_void(0) == hasher_void(0));
+    BOOST_TEST(hasher_void(&void_func1) == hasher_void(&void_func1));
+    BOOST_TEST(hasher_void(&void_func1) != hasher_void(&void_func2));
+    BOOST_TEST(hasher_void(&void_func1) != hasher_void(0));
+    BOOST_TEST(hasher_int(0) == hasher_int(0));
+    BOOST_TEST(hasher_int(&int_func1) == hasher_int(&int_func1));
+    BOOST_TEST(hasher_int(&int_func1) != hasher_int(&int_func2));
+    BOOST_TEST(hasher_int(&int_func1) != hasher_int(0));
+#if defined(TEST_EXTENSIONS)
+    BOOST_TEST(hasher_void(&void_func1)
+            == HASH_NAMESPACE::hash_value(&void_func1));
+    BOOST_TEST(hasher_int(&int_func1)
+            == HASH_NAMESPACE::hash_value(&int_func1));
+
+    // This isn't specified in Peter's proposal:
+    BOOST_TEST(hasher_void(0) == 0);
+#endif
+}
+
+int main()
+{
+    function_pointer_tests();
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_fwd_test.hpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,104 @@
+
+// Copyright 2006-2009 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)
+
+#include "./config.hpp"
+
+#if defined(TEST_EXTENSIONS) && !defined(TEST_STD_INCLUDES)
+#include <boost/functional/hash_fwd.hpp>
+
+#include <boost/config.hpp>
+#include <cstddef>
+#include <vector>
+
+namespace test {
+
+    template <class T>
+    struct test_type1
+    {
+        T value;
+        test_type1(T const& x) : value(x) {}
+    };
+
+#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+    template <class T>
+    std::size_t hash_value(test_type1<T> const& x)
+    {
+        HASH_NAMESPACE::hash<T> hasher;
+        return hasher(x.value);
+    }
+#endif
+
+    template <class T>
+    struct test_type2
+    {
+        T value1, value2;
+        test_type2(T const& x, T const& y) : value1(x), value2(y) {}
+    };
+
+#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+    template <class T>
+    std::size_t hash_value(test_type2<T> const& x)
+    {
+        std::size_t seed = 0;
+        HASH_NAMESPACE::hash_combine(seed, x.value1);
+        HASH_NAMESPACE::hash_combine(seed, x.value2);
+        return seed;
+    }
+#endif
+
+    template <class T>
+    struct test_type3
+    {
+        std::vector<T> values;
+        test_type3(typename std::vector<T>::iterator x,
+                typename std::vector<T>::iterator y) : values(x, y) {}
+    };
+
+#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+    template <class T>
+    std::size_t hash_value(test_type3<T> const& x)
+    {
+        std::size_t seed =
+            HASH_NAMESPACE::hash_range(x.values.begin(), x.values.end());
+        HASH_NAMESPACE::hash_range(seed, x.values.begin(), x.values.end());
+        return seed;
+    }
+#endif
+
+}
+
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+
+namespace boost
+{
+    template <class T>
+    std::size_t hash_value(test::test_type1<T> const& x)
+    {
+        HASH_NAMESPACE::hash<T> hasher;
+        return hasher(x.value);
+    }
+
+    template <class T>
+    std::size_t hash_value(test::test_type2<T> const& x)
+    {
+        std::size_t seed = 0;
+        HASH_NAMESPACE::hash_combine(seed, x.value1);
+        HASH_NAMESPACE::hash_combine(seed, x.value2);
+        return seed;
+    }
+
+    template <class T>
+    std::size_t hash_value(test::test_type3<T> const& x)
+    {
+        std::size_t seed =
+            HASH_NAMESPACE::hash_range(x.values.begin(), x.values.end());
+        HASH_NAMESPACE::hash_range(seed, x.values.begin(), x.values.end());
+        return seed;
+    }
+}
+
+#endif
+
+#endif
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_fwd_test_1.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,96 @@
+
+// Copyright 2006-2009 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)
+
+// This checks that template code implemented using hash_fwd will work.
+
+#include "./config.hpp"
+
+#include "./hash_fwd_test.hpp"
+
+#include <boost/detail/lightweight_test.hpp>
+
+#if defined(TEST_EXTENSIONS) && !defined(TEST_STD_INCLUDES)
+
+#include <boost/functional/hash.hpp>
+#include <string>
+
+void fwd_test1()
+{
+    test::test_type1<int> x(5);
+    test::test_type1<std::string> y("Test");
+
+    HASH_NAMESPACE::hash<int> hasher_int;
+    HASH_NAMESPACE::hash<std::string> hasher_string;
+    HASH_NAMESPACE::hash<test::test_type1<int> > hasher_test_int;
+ HASH_NAMESPACE::hash<test::test_type1<std::string> > hasher_test_string;
+
+    BOOST_TEST(hasher_int(5) == hasher_test_int(x));
+    BOOST_TEST(hasher_string("Test") == hasher_test_string(y));
+}
+
+void fwd_test2()
+{
+    test::test_type2<int> x(5, 10);
+    test::test_type2<std::string> y("Test1", "Test2");
+
+    std::size_t seed1 = 0;
+    HASH_NAMESPACE::hash_combine(seed1, 5);
+    HASH_NAMESPACE::hash_combine(seed1, 10);
+
+    std::size_t seed2 = 0;
+    HASH_NAMESPACE::hash_combine(seed2, std::string("Test1"));
+    HASH_NAMESPACE::hash_combine(seed2, std::string("Test2"));
+
+    HASH_NAMESPACE::hash<test::test_type2<int> > hasher_test_int;
+ HASH_NAMESPACE::hash<test::test_type2<std::string> > hasher_test_string;
+
+    BOOST_TEST(seed1 == hasher_test_int(x));
+    BOOST_TEST(seed2 == hasher_test_string(y));
+}
+
+void fwd_test3()
+{
+    std::vector<int> values1;
+    values1.push_back(10);
+    values1.push_back(15);
+    values1.push_back(20);
+    values1.push_back(3);
+
+    std::vector<std::string> values2;
+    values2.push_back("Chico");
+    values2.push_back("Groucho");
+    values2.push_back("Harpo");
+    values2.push_back("Gummo");
+    values2.push_back("Zeppo");
+
+    test::test_type3<int> x(values1.begin(), values1.end());
+    test::test_type3<std::string> y(values2.begin(), values2.end());
+
+    std::size_t seed1 =
+        HASH_NAMESPACE::hash_range(values1.begin(), values1.end());
+    HASH_NAMESPACE::hash_range(seed1, values1.begin(), values1.end());
+
+    std::size_t seed2 =
+        HASH_NAMESPACE::hash_range(values2.begin(), values2.end());
+    HASH_NAMESPACE::hash_range(seed2, values2.begin(), values2.end());
+
+    HASH_NAMESPACE::hash<test::test_type3<int> > hasher_test_int;
+ HASH_NAMESPACE::hash<test::test_type3<std::string> > hasher_test_string;
+
+    BOOST_TEST(seed1 == hasher_test_int(x));
+    BOOST_TEST(seed2 == hasher_test_string(y));
+}
+
+#endif
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    fwd_test1();
+    fwd_test2();
+    fwd_test3();
+#endif
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_fwd_test_2.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,47 @@
+
+// Copyright 2006-2009 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)
+
+// This test just makes sure a header which uses hash_fwd can compile without
+// the main hash headers.
+
+#include "./config.hpp"
+
+#if !defined(TEST_EXTENSIONS) || defined(TEST_STD_INCLUDES)
+
+int main() {}
+
+#else
+
+#include "./hash_fwd_test.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+template <class T> void unused(T const&) {}
+
+void fwd_test()
+{
+    test::test_type1<int> x1(3);
+    test::test_type1<std::string> y1("Black");
+    test::test_type2<int> x2(25, 16);
+    test::test_type2<std::string> y2("White", "Green");
+
+    std::vector<int> empty;
+    std::vector<std::string> empty2;
+
+    test::test_type3<int> x3(empty.begin(), empty.end());
+    test::test_type3<std::string> y3(empty2.begin(), empty2.end());
+
+    // Prevent gcc warnings:
+    unused(x1); unused(x2); unused(x3);
+    unused(y1); unused(y2); unused(y3);
+}
+
+int main()
+{
+    fwd_test();
+
+    return boost::report_errors();
+}
+
+#endif // defined(TEST_EXTENSIONS) && !defined(TEST_STD_INCLUDES)
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_global_namespace_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,103 @@
+
+// Copyright 2006-2009 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)
+
+// This test demonstrates an ADL bug in Borland 5.5 where ADL isn't performed
+// in the global namespace.
+
+#include "./config.hpp"
+
+#include <boost/config.hpp>
+#include <cstddef>
+
+struct custom
+{
+    int value_;
+
+    std::size_t hash() const
+    {
+        return value_ * 10;
+    }
+
+#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+    friend std::size_t hash_value(custom const& x )
+    {
+        return x.hash();
+    }
+#endif
+
+    custom(int x) : value_(x) {}
+};
+
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
+namespace boost
+{
+    std::size_t hash_value(custom x)
+    {
+        return x.hash();
+    }
+}
+#endif
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef TEST_EXTENSIONS
+
+#include <vector>
+#include <string>
+#include <cctype>
+
+void custom_tests()
+{
+    HASH_NAMESPACE::hash<custom> custom_hasher;
+    BOOST_TEST(custom_hasher(10) == 100u);
+    custom x(55);
+    BOOST_TEST(custom_hasher(x) == 550u);
+
+    {
+        using namespace HASH_NAMESPACE;
+        BOOST_TEST(custom_hasher(x) == hash_value(x));
+    }
+
+    std::vector<custom> custom_vector;
+    custom_vector.push_back(5);
+    custom_vector.push_back(25);
+    custom_vector.push_back(35);
+
+    std::size_t seed = 0;
+    HASH_NAMESPACE::hash_combine(seed, custom(5));
+    HASH_NAMESPACE::hash_combine(seed, custom(25));
+    HASH_NAMESPACE::hash_combine(seed, custom(35));
+
+    std::size_t seed2 = 0;
+    HASH_NAMESPACE::hash_combine(seed2, 50u);
+    HASH_NAMESPACE::hash_combine(seed2, 250u);
+    HASH_NAMESPACE::hash_combine(seed2, 350u);
+
+    BOOST_TEST(seed == HASH_NAMESPACE::hash_range(
+        custom_vector.begin(), custom_vector.end()));
+    BOOST_TEST(seed == seed2);
+}
+
+#endif // TEST_EXTENSIONS
+
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    custom_tests();
+#endif
+    return boost::report_errors();
+}
+
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_list_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,35 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef TEST_EXTENSIONS
+
+#include <list>
+
+using std::list;
+#define CONTAINER_TYPE list
+#include "./hash_sequence_test.hpp"
+
+#endif // TEST_EXTENSIONS
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    list_tests::list_hash_integer_tests();
+#endif
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_long_double_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,17 @@
+
+// Copyright 2005-2009 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)
+
+#include "hash_float_test.hpp"
+
+int main()
+{
+    std::cerr<<"Compiler: "<<BOOST_COMPILER<<"\n";
+    std::cerr<<"Platform: "<<BOOST_PLATFORM<<"\n";
+    std::cerr<<"Library: "<<BOOST_STDLIB<<"\n\n";
+
+    float_tests("long double", (long double*) 0);
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_map_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,40 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#include <map>
+
+#ifdef TEST_EXTENSIONS
+
+using std::map;
+#define CONTAINER_TYPE map
+#include "./hash_map_test.hpp"
+
+using std::multimap;
+#define CONTAINER_TYPE multimap
+#include "./hash_map_test.hpp"
+
+#endif // TEST_EXTENSTIONS
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    map_tests::map_hash_integer_tests();
+    multimap_tests::multimap_hash_integer_tests();
+#endif
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_map_test.hpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,76 @@
+
+// Copyright 2005-2009 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)
+
+#if !defined(CONTAINER_TYPE)
+#error "CONTAINER_TYPE not defined"
+#else
+
+#include <boost/preprocessor/cat.hpp>
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable:4244) // conversion from 'int' to 'float'
+#pragma warning(disable:4245) // signed/unsigned mismatch
+#endif
+
+namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
+{
+    template <class T>
+    void integer_tests(T* = 0)
+    {
+        const int number_of_containers = 10;
+        T containers[number_of_containers];
+        typedef BOOST_DEDUCED_TYPENAME T::value_type pair;
+        typedef BOOST_DEDUCED_TYPENAME T::key_type key;
+        typedef BOOST_DEDUCED_TYPENAME T::mapped_type value;
+
+        for(int i = 0; i < 5; ++i) {
+            for(int j = 0; j < i; ++j)
+                containers[i].insert(pair(key(0), value(0)));
+        }
+
+        containers[6].insert(pair(key(1),value(0)));
+        containers[7].insert(pair(key(1),value(0)));
+        containers[7].insert(pair(key(1),value(0)));
+        containers[8].insert(pair(key(-1),value(1)));
+        containers[9].insert(pair(key(-1),value(3)));
+        containers[9].insert(pair(key(-1),value(3)));
+
+        HASH_NAMESPACE::hash<T> hasher;
+
+        for(int i2 = 0; i2 < number_of_containers; ++i2) {
+            BOOST_TEST(hasher(containers[i2]) == hasher(containers[i2]));
+
+            BOOST_TEST(hasher(containers[i2]) ==
+                    HASH_NAMESPACE::hash_value(containers[i2]));
+
+            BOOST_TEST(hasher(containers[i2])
+                    == HASH_NAMESPACE::hash_range(
+                        containers[i2].begin(), containers[i2].end()));
+
+            for(int j2 = i2 + 1; j2 < number_of_containers; ++j2) {
+                BOOST_TEST(
+                        (containers[i2] == containers[j2]) ==
+                        (hasher(containers[i2]) == hasher(containers[j2]))
+                        );
+            }
+        }
+    }
+
+    void BOOST_PP_CAT(CONTAINER_TYPE, _hash_integer_tests())
+    {
+        integer_tests((CONTAINER_TYPE<char, unsigned char>*) 0);
+        integer_tests((CONTAINER_TYPE<int, float>*) 0);
+        integer_tests((CONTAINER_TYPE<unsigned long, unsigned long>*) 0);
+        integer_tests((CONTAINER_TYPE<double, short>*) 0);
+    }
+}
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#undef CONTAINER_TYPE
+#endif
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_no_ext_fail_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,28 @@
+
+// Copyright 2006-2009 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)
+
+#include "./config.hpp"
+
+// Simple test to make sure BOOST_HASH_NO_EXTENSIONS does disable extensions
+// (or at least one of them).
+#if !defined(BOOST_HASH_NO_EXTENSIONS)
+#  define BOOST_HASH_NO_EXTENSIONS
+#endif
+
+#ifdef TEST_STD_INCLUDES
+#  include <functional>
+#else
+#  include <boost/functional/hash.hpp>
+#endif
+
+template <class T> void ignore(T const&) {}
+
+int main()
+{
+    HASH_NAMESPACE::hash< int[10] > hasher;
+    ignore(hasher);
+
+    return 0;
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_no_ext_macro_1.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,37 @@
+
+// Copyright 2006-2009 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)
+
+#include "./config.hpp"
+
+#if defined(TEST_EXTENSIONS)
+
+// Include header without BOOST_HASH_NO_EXTENSIONS defined
+#  if defined(BOOST_HASH_NO_EXTENSIONS)
+#    undef BOOST_HASH_NO_EXTENSIONS
+#  endif
+#  include <boost/functional/hash.hpp>
+
+// Include header with BOOST_HASH_NO_EXTENSIONS defined
+#  define BOOST_HASH_NO_EXTENSIONS
+#  include <boost/functional/hash.hpp>
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+#include <deque>
+
+int main()
+{
+#if defined(TEST_EXTENSIONS)
+    std::deque<int> x;
+
+    x.push_back(1);
+    x.push_back(2);
+
+    HASH_NAMESPACE::hash<std::deque<int> > hasher;
+    BOOST_TEST(hasher(x) == HASH_NAMESPACE::hash_value(x));
+#endif
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_no_ext_macro_2.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,37 @@
+
+// Copyright 2006-2009 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)
+
+#include "./config.hpp"
+
+#if defined(TEST_EXTENSIONS)
+
+// Include header with BOOST_HASH_NO_EXTENSIONS defined
+#  if !defined(BOOST_HASH_NO_EXTENSIONS)
+#    define BOOST_HASH_NO_EXTENSIONS
+#  endif
+#  include <boost/functional/hash.hpp>
+
+// Include header without BOOST_HASH_NO_EXTENSIONS defined
+#  undef BOOST_HASH_NO_EXTENSIONS
+#  include <boost/functional/hash.hpp>
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+#include <map>
+
+int main()
+{
+#if defined(TEST_EXTENSIONS)
+    std::map<int, int> x;
+
+    x.insert(std::map<int, int>::value_type(53, -42));
+    x.insert(std::map<int, int>::value_type(14, -75));
+
+    HASH_NAMESPACE::hash<std::map<int, int> > hasher;
+    BOOST_TEST(hasher(x) == HASH_NAMESPACE::hash_value(x));
+#endif
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_number_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,173 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_STD_INCLUDES
+#  include <functional>
+#else
+#  include <boost/functional/hash.hpp>
+#endif
+
+#include <iostream>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/functional/hash/detail/limits.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+
+#include "./compile_time.hpp"
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable:4127) // conditional expression is constant
+#pragma warning(disable:4309) // truncation of constant value
+#pragma warning(disable:4310) // cast truncates constant value
+#endif
+
+template <class T>
+void numeric_test(T*)
+{
+    typedef boost::hash_detail::limits<T> limits;
+
+    compile_time_tests((T*) 0);
+
+    HASH_NAMESPACE::hash<T> x1;
+    HASH_NAMESPACE::hash<T> x2;
+
+    T v1 = (T) -5;
+    BOOST_TEST(x1(v1) == x2(v1));
+    BOOST_TEST(x1(T(-5)) == x2(T(-5)));
+    BOOST_TEST(x1(T(0)) == x2(T(0)));
+    BOOST_TEST(x1(T(10)) == x2(T(10)));
+    BOOST_TEST(x1(T(25)) == x2(T(25)));
+    BOOST_TEST(x1(T(5) - T(5)) == x2(T(0)));
+    BOOST_TEST(x1(T(6) + T(4)) == x2(T(10)));
+
+#if defined(TEST_EXTENSIONS)
+    BOOST_TEST(x1(T(-5)) == HASH_NAMESPACE::hash_value(T(-5)));
+    BOOST_TEST(x1(T(0)) == HASH_NAMESPACE::hash_value(T(0)));
+    BOOST_TEST(x1(T(10)) == HASH_NAMESPACE::hash_value(T(10)));
+    BOOST_TEST(x1(T(25)) == HASH_NAMESPACE::hash_value(T(25)));
+
+    if (limits::is_integer)
+    {
+        if(limits::is_signed ||
+ limits::digits <= boost::hash_detail::limits<std::size_t>::digits)
+        {
+ BOOST_TEST(HASH_NAMESPACE::hash_value(T(-5)) == (std::size_t)T(-5));
+        }
+        BOOST_TEST(HASH_NAMESPACE::hash_value(T(0)) == (std::size_t)T(0u));
+ BOOST_TEST(HASH_NAMESPACE::hash_value(T(10)) == (std::size_t)T(10u)); + BOOST_TEST(HASH_NAMESPACE::hash_value(T(25)) == (std::size_t)T(25u));
+    }
+#endif
+}
+
+template <class T>
+void limits_test(T*)
+{
+    typedef boost::hash_detail::limits<T> limits;
+
+    if(limits::is_specialized)
+    {
+        HASH_NAMESPACE::hash<T> x1;
+        HASH_NAMESPACE::hash<T> x2;
+
+        T min_value = (limits::min)();
+        T max_value = (limits::max)();
+
+        BOOST_TEST(x1(min_value) == x2((limits::min)()));
+        BOOST_TEST(x1(max_value) == x2((limits::max)()));
+
+#if defined(TEST_EXTENSIONS)
+        BOOST_TEST(x1(min_value) == HASH_NAMESPACE::hash_value(min_value));
+        BOOST_TEST(x1(max_value) == HASH_NAMESPACE::hash_value(max_value));
+
+        if (limits::is_integer)
+        {
+            BOOST_TEST(HASH_NAMESPACE::hash_value(min_value)
+                    == std::size_t(min_value));
+            BOOST_TEST(HASH_NAMESPACE::hash_value(max_value)
+                    == std::size_t(max_value));
+        }
+#endif
+    }
+}
+
+template <class T>
+void poor_quality_tests(T*)
+{
+    typedef boost::hash_detail::limits<T> limits;
+
+    HASH_NAMESPACE::hash<T> x1;
+    HASH_NAMESPACE::hash<T> x2;
+
+ // A hash function can legally fail these tests, but it'll not be a good
+    // sign.
+    if(T(1) != T(-1))
+        BOOST_TEST(x1(T(1)) !=  x2(T(-1)));
+    if(T(1) != T(2))
+        BOOST_TEST(x1(T(1)) !=  x2(T(2)));
+    if((limits::max)() != (limits::max)() - 1)
+        BOOST_TEST(x1((limits::max)()) != x2((limits::max)() - 1));
+}
+
+void bool_test()
+{
+    HASH_NAMESPACE::hash<bool> x1;
+    HASH_NAMESPACE::hash<bool> x2;
+
+    BOOST_TEST(x1(true) == x2(true));
+    BOOST_TEST(x1(false) == x2(false));
+    BOOST_TEST(x1(true) != x2(false));
+    BOOST_TEST(x1(false) != x2(true));
+}
+
+#define NUMERIC_TEST(type, name) \
+    std::cerr<<"Testing: " BOOST_STRINGIZE(name) "\n"; \
+    numeric_test((type*) 0); \
+    limits_test((type*) 0); \
+    poor_quality_tests((type*) 0);
+#define NUMERIC_TEST_NO_LIMITS(type, name) \
+    std::cerr<<"Testing: " BOOST_STRINGIZE(name) "\n"; \
+    numeric_test((type*) 0); \
+    poor_quality_tests((type*) 0);
+
+int main()
+{
+    NUMERIC_TEST(char, char)
+    NUMERIC_TEST(signed char, schar)
+    NUMERIC_TEST(unsigned char, uchar)
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    NUMERIC_TEST(wchar_t, wchar)
+#endif
+    NUMERIC_TEST(short, short)
+    NUMERIC_TEST(unsigned short, ushort)
+    NUMERIC_TEST(int, int)
+    NUMERIC_TEST(unsigned int, uint)
+    NUMERIC_TEST(long, hash_long)
+    NUMERIC_TEST(unsigned long, ulong)
+
+#if defined(BOOST_HAS_LONG_LONG)
+    NUMERIC_TEST_NO_LIMITS(boost::long_long_type, long_long)
+    NUMERIC_TEST_NO_LIMITS(boost::ulong_long_type, ulong_long)
+#endif
+
+    NUMERIC_TEST(float, float)
+    NUMERIC_TEST(double, double)
+
+    NUMERIC_TEST(std::size_t, size_t)
+    NUMERIC_TEST(std::ptrdiff_t, ptrdiff_t)
+
+    bool_test();
+
+    return boost::report_errors();
+}
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_pointer_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,49 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_STD_INCLUDES
+#  include <functional>
+#else
+#  include <boost/functional/hash.hpp>
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/limits.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+
+#include "./compile_time.hpp"
+
+void pointer_tests()
+{
+    compile_time_tests((int**) 0);
+    compile_time_tests((void**) 0);
+
+    HASH_NAMESPACE::hash<int*> x1;
+    HASH_NAMESPACE::hash<int*> x2;
+
+    int int1;
+    int int2;
+
+    BOOST_TEST(x1(0) == x2(0));
+    BOOST_TEST(x1(&int1) == x2(&int1));
+    BOOST_TEST(x1(&int2) == x2(&int2));
+#if defined(TEST_EXTENSIONS)
+    BOOST_TEST(x1(&int1) == HASH_NAMESPACE::hash_value(&int1));
+    BOOST_TEST(x1(&int2) == HASH_NAMESPACE::hash_value(&int2));
+
+    // This isn't specified in Peter's proposal:
+    BOOST_TEST(x1(0) == 0);
+#endif
+}
+
+int main()
+{
+    pointer_tests();
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_range_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,88 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#if !defined(TEST_EXTENSIONS)
+
+int main() {}
+
+#else
+
+#ifdef TEST_STD_INCLUDES
+#  include <functional>
+#else
+#  include <boost/functional/hash.hpp>
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/limits.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <vector>
+
+void hash_range_tests()
+{
+    std::vector<int> empty, values1, values2, values3, values4, values5;
+    values1.push_back(0);
+    values2.push_back(10);
+    values3.push_back(10);
+    values3.push_back(20);
+    values4.push_back(15);
+    values4.push_back(75);
+    values5.push_back(10);
+    values5.push_back(20);
+    values5.push_back(15);
+    values5.push_back(75);
+    values5.push_back(10);
+    values5.push_back(20);
+
+    std::vector<int> x;
+
+    std::size_t x_seed = 0;
+    BOOST_TEST(x_seed == HASH_NAMESPACE::hash_range(x.begin(), x.end()));
+
+    BOOST_TEST(HASH_NAMESPACE::hash_range(empty.begin(), empty.end())
+        == HASH_NAMESPACE::hash_range(x.begin(), x.end()));
+    BOOST_TEST(HASH_NAMESPACE::hash_range(empty.begin(), empty.end())
+        != HASH_NAMESPACE::hash_range(values1.begin(), values1.end()));
+
+    x.push_back(10);
+    HASH_NAMESPACE::hash_combine(x_seed, 10);
+    BOOST_TEST(x_seed == HASH_NAMESPACE::hash_range(x.begin(), x.end()));
+
+    BOOST_TEST(HASH_NAMESPACE::hash_range(empty.begin(), empty.end())
+        != HASH_NAMESPACE::hash_range(x.begin(), x.end()));
+    BOOST_TEST(HASH_NAMESPACE::hash_range(values2.begin(), values2.end())
+        == HASH_NAMESPACE::hash_range(x.begin(), x.end()));
+
+    x.push_back(20);
+    HASH_NAMESPACE::hash_combine(x_seed, 20);
+    BOOST_TEST(x_seed == HASH_NAMESPACE::hash_range(x.begin(), x.end()));
+
+    BOOST_TEST(HASH_NAMESPACE::hash_range(empty.begin(), empty.end())
+        != HASH_NAMESPACE::hash_range(x.begin(), x.end()));
+    BOOST_TEST(HASH_NAMESPACE::hash_range(values2.begin(), values2.end())
+        != HASH_NAMESPACE::hash_range(x.begin(), x.end()));
+    BOOST_TEST(HASH_NAMESPACE::hash_range(values3.begin(), values3.end())
+        == HASH_NAMESPACE::hash_range(x.begin(), x.end()));
+
+    std::size_t seed =
+        HASH_NAMESPACE::hash_range(values3.begin(), values3.end());
+    HASH_NAMESPACE::hash_range(seed, values4.begin(), values4.end());
+    HASH_NAMESPACE::hash_range(seed, x.begin(), x.end());
+    BOOST_TEST(seed ==
+        HASH_NAMESPACE::hash_range(values5.begin(), values5.end()));
+}
+
+int main()
+{
+    hash_range_tests();
+
+    return boost::report_errors();
+}
+
+#endif // TEST_EXTESNIONS
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_sequence_test.hpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,76 @@
+
+// Copyright 2005-2009 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)
+
+#if !defined(CONTAINER_TYPE)
+#error "CONTAINER_TYPE not defined"
+#else
+
+#include <boost/preprocessor/cat.hpp>
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable:4245) // signed/unsigned mismatch
+#endif
+
+namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
+{
+    template <class T>
+    void integer_tests(T* = 0)
+    {
+        const int number_of_containers = 11;
+        T containers[number_of_containers];
+
+        for(int i = 0; i < 5; ++i) {
+            for(int j = 0; j < i; ++j)
+                containers[i].push_back(0);
+        }
+
+        containers[5].push_back(1);
+        containers[6].push_back(1);
+        containers[6].push_back(1);
+        containers[7].push_back(-1);
+        containers[8].push_back(-1);
+        containers[8].push_back(-1);
+        containers[9].push_back(1);
+        containers[9].push_back(-1);
+        containers[10].push_back(-1);
+        containers[10].push_back(1);
+
+        HASH_NAMESPACE::hash<T> hasher;
+
+        for(int i2 = 0; i2 < number_of_containers; ++i2) {
+            BOOST_TEST(hasher(containers[i2]) == hasher(containers[i2]));
+
+            BOOST_TEST(hasher(containers[i2]) ==
+                    HASH_NAMESPACE::hash_value(containers[i2]));
+
+            BOOST_TEST(hasher(containers[i2])
+                    == HASH_NAMESPACE::hash_range(
+                        containers[i2].begin(), containers[i2].end()));
+
+            for(int j2 = i2 + 1; j2 < number_of_containers; ++j2) {
+                BOOST_TEST(
+                        (containers[i2] == containers[j2]) ==
+                        (hasher(containers[i2]) == hasher(containers[j2]))
+                        );
+            }
+        }
+    }
+
+    void BOOST_PP_CAT(CONTAINER_TYPE, _hash_integer_tests())
+    {
+        integer_tests((CONTAINER_TYPE<char>*) 0);
+        integer_tests((CONTAINER_TYPE<int>*) 0);
+        integer_tests((CONTAINER_TYPE<unsigned long>*) 0);
+        integer_tests((CONTAINER_TYPE<double>*) 0);
+    }
+}
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#undef CONTAINER_TYPE
+#endif
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_set_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,40 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef TEST_EXTENSIONS
+
+#include <set>
+
+using std::set;
+#define CONTAINER_TYPE set
+#include "./hash_set_test.hpp"
+
+using std::multiset;
+#define CONTAINER_TYPE multiset
+#include "./hash_set_test.hpp"
+
+#endif
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    set_tests::set_hash_integer_tests();
+    multiset_tests::multiset_hash_integer_tests();
+#endif
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_set_test.hpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,79 @@
+
+// Copyright 2005-2009 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)
+
+#if !defined(CONTAINER_TYPE)
+#error "CONTAINER_TYPE not defined"
+#else
+
+#include <boost/preprocessor/cat.hpp>
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable:4245) // signed/unsigned mismatch
+#endif
+
+namespace BOOST_PP_CAT(CONTAINER_TYPE, _tests)
+{
+    template <class T>
+    void integer_tests(T* = 0)
+    {
+        const int number_of_containers = 12;
+        T containers[number_of_containers];
+
+        for(int i = 0; i < 5; ++i) {
+            for(int j = 0; j < i; ++j)
+                containers[i].insert(0);
+        }
+
+        containers[6].insert(1);
+        containers[7].insert(1);
+        containers[7].insert(1);
+        containers[8].insert(-1);
+        containers[9].insert(-1);
+        containers[9].insert(-1);
+        containers[10].insert(-1);
+        containers[10].insert(1);
+        containers[11].insert(1);
+        containers[11].insert(2);
+        containers[11].insert(3);
+        containers[11].insert(4);
+        containers[11].insert(5);
+
+        HASH_NAMESPACE::hash<T> hasher;
+
+        for(int i2 = 0; i2 < number_of_containers; ++i2) {
+            BOOST_TEST(hasher(containers[i2]) == hasher(containers[i2]));
+
+            BOOST_TEST(hasher(containers[i2]) ==
+                    HASH_NAMESPACE::hash_value(containers[i2]));
+
+            BOOST_TEST(hasher(containers[i2])
+                    == HASH_NAMESPACE::hash_range(
+                        containers[i2].begin(), containers[i2].end()));
+
+            for(int j2 = i2 + 1; j2 < number_of_containers; ++j2) {
+                BOOST_TEST(
+                        (containers[i2] == containers[j2]) ==
+                        (hasher(containers[i2]) == hasher(containers[j2]))
+                        );
+            }
+        }
+    }
+
+    void BOOST_PP_CAT(CONTAINER_TYPE, _hash_integer_tests())
+    {
+        integer_tests((CONTAINER_TYPE<char>*) 0);
+        integer_tests((CONTAINER_TYPE<int>*) 0);
+        integer_tests((CONTAINER_TYPE<unsigned long>*) 0);
+        integer_tests((CONTAINER_TYPE<double>*) 0);
+    }
+}
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#undef CONTAINER_TYPE
+#endif
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_string_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,77 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_STD_INCLUDES
+#  include <functional>
+#else
+#  include <boost/functional/hash.hpp>
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <string>
+
+#include "./compile_time.hpp"
+
+void string_tests()
+{
+    compile_time_tests((std::string*) 0);
+
+    HASH_NAMESPACE::hash<std::string> x1;
+    HASH_NAMESPACE::hash<std::string> x2;
+
+    BOOST_TEST(x1("Hello") == x2(std::string("Hel") + "lo"));
+    BOOST_TEST(x1("") == x2(std::string()));
+
+#if defined(TEST_EXTENSIONS)
+    std::string value1;
+    std::string value2("Hello");
+
+    BOOST_TEST(x1(value1) == HASH_NAMESPACE::hash_value(value1));
+    BOOST_TEST(x1(value2) == HASH_NAMESPACE::hash_value(value2));
+    BOOST_TEST(HASH_NAMESPACE::hash_value(value1) ==
+            HASH_NAMESPACE::hash_range(value1.begin(), value1.end()));
+    BOOST_TEST(HASH_NAMESPACE::hash_value(value2) ==
+            HASH_NAMESPACE::hash_range(value2.begin(), value2.end()));
+#endif
+}
+
+#if !defined(BOOST_NO_STD_WSTRING)
+void wstring_tests()
+{
+    compile_time_tests((std::wstring*) 0);
+
+    HASH_NAMESPACE::hash<std::wstring> x1;
+    HASH_NAMESPACE::hash<std::wstring> x2;
+
+    BOOST_TEST(x1(L"Hello") == x2(std::wstring(L"Hel") + L"lo"));
+    BOOST_TEST(x1(L"") == x2(std::wstring()));
+
+#if defined(TEST_EXTENSIONS)
+    std::wstring value1;
+    std::wstring value2(L"Hello");
+
+    BOOST_TEST(x1(value1) == HASH_NAMESPACE::hash_value(value1));
+    BOOST_TEST(x1(value2) == HASH_NAMESPACE::hash_value(value2));
+    BOOST_TEST(HASH_NAMESPACE::hash_value(value1) ==
+            HASH_NAMESPACE::hash_range(value1.begin(), value1.end()));
+    BOOST_TEST(HASH_NAMESPACE::hash_value(value2) ==
+            HASH_NAMESPACE::hash_range(value2.begin(), value2.end()));
+#endif
+}
+#endif
+
+int main()
+{
+    string_tests();
+#if !defined(BOOST_NO_STD_WSTRING)
+    wstring_tests();
+#endif
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_value_array_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,64 @@
+
+// Copyright 2005-2009 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)
+
+// On some compilers hash_value isn't available for arrays, so I test it
+// separately from the main array tests.
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef TEST_EXTENSIONS
+
+void array_int_test()
+{
+    const int array1[25] = {
+        26, -43, 32, 65, 45,
+        12, 67, 32, 12, 23,
+        0, 0, 0, 0, 0,
+        8, -12, 23, 65, 45,
+        -1, 93, -54, 987, 3
+    };
+    HASH_NAMESPACE::hash<int[25]> hasher1;
+
+    int array2[1] = {3};
+    HASH_NAMESPACE::hash<int[1]> hasher2;
+
+    int array3[2] = {2, 3};
+    HASH_NAMESPACE::hash<int[2]> hasher3;
+
+    BOOST_TEST(hasher1(array1) == HASH_NAMESPACE::hash_value(array1));
+    BOOST_TEST(hasher2(array2) == HASH_NAMESPACE::hash_value(array2));
+    BOOST_TEST(hasher3(array3) == HASH_NAMESPACE::hash_value(array3));
+}
+
+void two_dimensional_array_test()
+{
+    int array[3][2] = {{-5, 6}, {7, -3}, {26, 1}};
+    HASH_NAMESPACE::hash<int[3][2]> hasher;
+
+    BOOST_TEST(hasher(array) == HASH_NAMESPACE::hash_value(array));
+}
+
+#endif
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    array_int_test();
+    two_dimensional_array_test();
+#endif
+
+    return boost::report_errors();
+}
+
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/hash_vector_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,35 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#ifdef TEST_EXTENSIONS
+#  ifdef TEST_STD_INCLUDES
+#    include <functional>
+#  else
+#    include <boost/functional/hash.hpp>
+#  endif
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef TEST_EXTENSIONS
+
+#include <vector>
+
+using std::vector;
+#define CONTAINER_TYPE vector
+#include "./hash_sequence_test.hpp"
+
+#endif // TEST_EXTENSIONS
+
+int main()
+{
+#ifdef TEST_EXTENSIONS
+    vector_tests::vector_hash_integer_tests();
+#endif
+
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/link_ext_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,33 @@
+
+// Copyright 2006-2009 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)
+
+#include "./config.hpp"
+
+#define HASH_NAMESPACE boost
+#include <boost/functional/hash.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+
+int f(std::size_t hash1, int* x1) {
+
+    // Check that HASH_NAMESPACE::hash<int*> works in both files.
+    HASH_NAMESPACE::hash<int*> ptr_hasher;
+    BOOST_TEST(hash1 == ptr_hasher(x1));
+
+#if defined(TEST_EXTENSIONS)
+
+    // Check that std::vector<std::size_t> is avaiable in this file.
+    std::vector<std::size_t> x;
+    x.push_back(*x1);
+    HASH_NAMESPACE::hash<std::vector<std::size_t> > vector_hasher;
+    return vector_hasher(x) != HASH_NAMESPACE::hash_value(x);
+
+#else
+
+    return 0;
+
+#endif
+}
+
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/link_no_ext_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,20 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#define HASH_NAMESPACE boost
+#define BOOST_HASH_NO_EXTENSIONS
+#include <boost/functional/hash.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+extern int f(std::size_t, int*);
+
+int main() {
+    HASH_NAMESPACE::hash<int*> ptr_hasher;
+    int x = 55;
+    BOOST_TEST(!f(ptr_hasher(&x), &x));
+    return boost::report_errors();
+}
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/link_test.cpp      Mon Feb  8 01:01:45 2010
@@ -0,0 +1,11 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#include <boost/functional/hash.hpp>
+
+extern int f();
+int main() { return f(); }
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/link_test_2.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,10 @@
+
+// Copyright 2005-2009 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)
+
+#include "./config.hpp"
+
+#include <boost/functional/hash.hpp>
+
+int f() { return 0; }
=======================================
--- /dev/null
+++ /trunk/libs/functional/hash/test/namespace_fail_test.cpp Mon Feb 8 01:01:45 2010
@@ -0,0 +1,16 @@
+
+// Copyright 2009 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)
+
+// Check that I haven't inadvertantly pulled namespace std into the global
+// namespace.
+
+#include "./config.hpp"
+
+#include <list>
+#include <boost/functional/hash.hpp>
+
+typedef list<int> foo;
+
+int main() {}
=======================================
--- /dev/null
+++ /trunk/libs/fusion/changelist.txt   Mon Feb  8 01:01:45 2010
@@ -0,0 +1,10 @@
+Interface Changes
+
+- June 12, 2009: vector0 is now vector0<> as per Boost Trac Ticket #1608
+  to follow MPL more closely.
+- September 24, 2009: added nview and friends
+- October 12, 2009: the accumulator is the first argument to the functor of
+  fold and accumulate. Fixes Boost Trac Ticket #2355.
+- October 30, 2009: Added support for associative iterators & views.
+  Renamed associative_sequence_tag to associative_tag. Fixes Boost Trac
+  Ticket #3473.
=======================================
--- /dev/null
+++ /trunk/libs/fusion/doc/Jamfile      Mon Feb  8 01:01:45 2010
@@ -0,0 +1,30 @@
+#==============================================================================
+#    Copyright (c) 2003-2007 Joel de Guzman
+#
+#   Use, modification and distribution is subject to 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)
+#==============================================================================
+project boost/libs/fusion/doc ;
+import boostbook : boostbook ;
+using quickbook ;
+
+path-constant images_location : html ;
+
+boostbook quickbook
+    :
+        fusion.qbk
+    :
+        <xsl:param>boost.root=../../../..
+        <xsl:param>boost.libraries=../../../libraries.htm
+        <xsl:param>html.stylesheet=../../../../doc/html/boostbook.css
+        <xsl:param>chunk.section.depth=4
+        <xsl:param>chunk.first.sections=1
+        <xsl:param>toc.section.depth=3
+        <xsl:param>toc.max.depth=3
+        <xsl:param>generate.section.toc.level=4
+ <format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/fusion/doc/html
+        <format>pdf:<xsl:param>img.src.path=$(images_location)/
+    ;
+
+
=======================================
--- /dev/null
+++ /trunk/libs/fusion/doc/acknowledgements.qbk Mon Feb  8 01:01:45 2010
@@ -0,0 +1,23 @@
+[/==============================================================================
+    Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
+
+    Use, modification and distribution is subject to 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)
+===============================================================================/]
+[section Acknowledgements]
+
+Special thanks to David Abrahams, Douglas Gregor, Hartmut Kaiser, Aleksey
+Gurtovoy, Peder Holt, Daniel Wallin, Jaakko Jarvi, Jeremiah Willcock, Dan
+Marsden, Eric Niebler, Joao Abecasis and Andy Little. These people are
+instrumental in the design and development of Fusion.
+
+Special thanks to Ronald Garcia, the review manager and to all the people in the +boost community who participated in the review: Andreas Pokorny, Andreas Huber, +Jeff Flinn, David Abrahams, Pedro Lamarao, Larry Evans, Ryan Gallagher, Andy +Little, Gennadiy Rozental, Tobias Schwinger, Joao Abecasis, Eric Niebler, Oleg +Abrosimov, Gary Powell, Eric Friedman, Darren Cook, Martin Bonner and Douglas
+Gregor.
+
+[endsect]
+
=======================================
--- /dev/null
+++ /trunk/libs/fusion/doc/adapted.qbk  Mon Feb  8 01:01:45 2010
@@ -0,0 +1,257 @@
+[/==============================================================================
+    Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
+
+    Use, modification and distribution is subject to 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)
+===============================================================================/]
+[section Adapted]
+
+Fusion provides a couple of adapters for other sequences such as
+`std::pair`, __mpl__ sequences, and `boost::array`. These adapters are
+written using Fusion's non-intrusive __extension__ mechanism. If you wish
+to use these sequences with fusion, simply include the necessary files and
+they will be regarded as first-class, fully conforming fusion sequences.
+
+Fusion also provides various schemes to make it easy for the user to adapt
+various data structures, non-intrusively, as full fledged Fusion sequences.
+
+[heading Header]
+
+    #include <boost/fusion/adapted.hpp>
+    #include <boost/fusion/include/adapted.hpp>
+
+Fusion sequences may also be adapted as fully conforming __mpl__ sequences (see +__intrinsics__). That way, we can have 2-way adaptation to and from __mpl__ and +Fusion. To make Fusion sequences fully conforming __mpl__ sequences, include:
+
+    #include <boost/fusion/mpl.hpp>
+
+If you want bi-directional adaptation to and from __mpl__ and Fusion, simply
+include:
+
+    #include <boost/fusion/include/mpl.hpp>
+
+The header includes all the necessary headers.
+
+[section std::pair]
+
+This module provides adapters for `std::pair`. Including the module header
+makes `std::pair` a fully conforming __random_access_sequence__.
+
+[heading Header]
+
+    #include <boost/fusion/adapted/std_pair.hpp>
+    #include <boost/fusion/include/std_pair.hpp>
+
+[heading Model of]
+
+* __random_access_sequence__
+
+[heading Example]
+
+    std::pair<int, std::string> p(123, "Hola!!!");
+    std::cout << __at_c__<0>(p) << std::endl;
+    std::cout << __at_c__<1>(p) << std::endl;
+    std::cout << p << std::endl;
+
+[heading See also]
+
+__std_pair_doc__, __tr1_tuple_pair__
+
+[endsect]
+
+[section mpl sequence]
+
+This module provides adapters for __mpl__ sequences. Including the module
+header makes all __mpl__ sequences fully conforming fusion sequences.
+
+[heading Header]
+
+    #include <boost/fusion/adapted/mpl.hpp>
+    #include <boost/fusion/include/mpl.hpp>
+
+[heading Model of]
+
+* __forward_sequence__ (If the __mpl__ sequence is a forward sequence.)
+* __bidirectional_sequence__ (If the __mpl__ sequence is a bidirectional sequence.) +* __random_access_sequence__ (If the __mpl__ sequence is a random access sequence.)
+
+[heading Example]
+
+    mpl::vector_c<int, 123, 456> vec_c;
+    fusion::vector2<int, long> v(vec_c);
+    std::cout << __at_c__<0>(v) << std::endl;
+    std::cout << __at_c__<1>(v) << std::endl;
+
+    v = mpl::vector_c<int, 456, 789>();
+    std::cout << __at_c__<0>(v) << std::endl;
+    std::cout << __at_c__<1>(v) << std::endl;
+
+[heading See also]
+
+__mpl__
+
+[endsect]
+
+[section boost::array]
+
+This module provides adapters for `boost::array`. Including the module
+header makes `boost::array` a fully conforming __random_access_sequence__.
+
+[heading Header]
+
+    #include <boost/fusion/adapted/array.hpp>
+    #include <boost/fusion/include/array.hpp>
+
+[heading Model of]
+
+* __random_access_sequence__
+
+[heading Example]
+
+    boost::array<int,3> arr = {{1,2,3}};
+
+    std::cout << *__begin__(arr) << std::endl;
+    std::cout << *__next__(__begin__(arr)) << std::endl;
+    std::cout << *__advance_c__<2>(__begin__(arr)) << std::endl;
+    std::cout << *__prior__(__end__(arr)) << std::endl;
+    std::cout << __at_c__<2>(arr) << std::endl;
+
+[heading See also]
+
+__boost_array_library__
+
+[endsect]
+
+[section boost::tuple]
+This module provides adapters for `boost::tuple`. Including the module
+header makes `boost::tuple` a fully conforming __forward_sequence__.
+
+[heading Header]
+
+    #include <boost/fusion/adapted/boost_tuple.hpp>
+    #include <boost/fusion/include/boost_tuple.hpp>
+
+[heading Model of]
+
+* __forward_sequence__
+
+[heading Example]
+
+    boost::tuple<int,std::string> example_tuple(101, "hello");
+    std::cout << *boost::fusion::begin(example_tuple) << '\n';
+ std::cout << *boost::fusion::next(boost::fusion::begin(example_tuple)) << '\n';
+
+[heading See also]
+
+__boost_tuple_library__
+
+[endsect]
+
+[section:adapt_struct BOOST_FUSION_ADAPT_STRUCT]
+
+[heading Description]
+BOOST_FUSION_ADAPT_STRUCT is a macro that can be used to generate all the
+necessary boilerplate to make an arbitrary struct into a __random_access_sequence__.
+
+[heading Synopsis]
+    BOOST_FUSION_ADAPT_STRUCT(
+        struct_name,
+        (member_type0, member_name0)
+        (member_type1, member_name1)
+        ...
+        )
+
+[heading Semantics]
+
+The above macro generates the necessary code to adapt `struct_name`
+as a model of __random_access_sequence__. The sequence of `(member_typeN, member_nameN)`
+pairs declare the type and names of each of the struct members that will be
+part of the sequence.
+
+The macro should be used at global scope, and `struct_name` should be the fully
+namespace qualified name of the struct to be converted.
+
+[heading Header]
+
+    #include <boost/fusion/adapted/struct/adapt_struct.hpp>
+    #include <boost/fusion/include/adapt_struct.hpp>
+
+[heading Example]
+    namespace demo
+    {
+        struct employee
+        {
+            std::string name;
+            int age;
+        };
+    }
+
+    // demo::employee is now a Fusion sequence
+    BOOST_FUSION_ADAPT_STRUCT(
+        demo::employee,
+        (std::string, name)
+        (int, age))
+
+[endsect]
+
+[section:adapt_assoc BOOST_FUSION_ADAPT_ASSOC_STRUCT]
+
+[heading Description]
+BOOST_FUSION_ADAPT_ASSOC_STRUCT is a macro that can be used to generate all the +necessary boilerplate to make an arbitrary struct into a model of __random_access_sequence__
+and __associative_sequence__.
+
+[heading Synopsis]
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT(
+        struct_name,
+        (member_type0, member_name0, key_type0)
+        (member_type1, member_name1, key_type1)
+        ...
+        )
+
+[heading Semantics]
+
+The above macro generates the necessary code to adapt `struct_name`
+as a model of __random_access_sequence__ and __associative_sequence__.
+The sequence of `(member_typeN, member_nameN, key_typeN)`
+triples declare the type, name and key type of each of the struct members
+that will be part of the sequence.
+
+The macro should be used at global scope, and `struct_name` should be the fully
+namespace qualified name of the struct to be converted.
+
+[heading Header]
+
+    #include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp>
+    #include <boost/fusion/include/adapt_assoc_struct.hpp>
+
+[heading Example]
+    namespace demo
+    {
+        struct employee
+        {
+            std::string name;
+            int age;
+        };
+    }
+
+    namespace keys
+    {
+        struct name;
+        struct age;
+    }
+
+    // demo::employee is now a Fusion sequence
+    // It is also an associative sequence with
+    // keys keys::name and keys::age present.
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT(
+        demo::employee,
+        (std::string, name, keys::name)
+        (int, age, keys::age))
+
+
+[endsect]
+
+[endsect]
=======================================
--- /dev/null
+++ /trunk/libs/fusion/doc/algorithm.qbk        Mon Feb  8 01:01:45 2010
@@ -0,0 +1,2620 @@
+[/==============================================================================
+    Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
+
+    Use, modification and distribution is subject to 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)
+===============================================================================/]
+[section Algorithm]
+
+[heading Lazy Evaluation]
+
+Unlike __mpl__, Fusion algorithms are lazy and non sequence-type
+preserving. What does that mean? It means that when you operate on a
+sequence through a Fusion algorithm that returns a sequence, the sequence
+returned may not be of the same class as the original. This is by design.
+Runtime efficiency is given a high priority. Like __mpl__, and unlike
+__stl__, fusion algorithms are functional in nature such that algorithms
+are non mutating (no side effects). However, due to the high cost of
+returning full sequences such as vectors and lists, /Views/ are returned
+from Fusion algorithms instead. For example, the __transform__ algorithm
+does not actually return a transformed version of the original sequence.
+__transform__ returns a __transform_view__. This view holds a reference to
+the original sequence plus the transform function. Iteration over the
+__transform_view__ will apply the transform function over the sequence
+elements on demand. This /lazy/ evaluation scheme allows us to chain as
+many algorithms as we want without incurring a high runtime penalty.
+
+[heading Sequence Extension]
+
+The /lazy/ evaluation scheme where __algorithms__ return __views__ also
+allows operations such as __push_back__ to be totally generic. In Fusion,
+__push_back__ is actually a generic algorithm that works on all sequences.
+Given an input sequence `s` and a value `x`, Fusion's __push_back__
+algorithm simply returns a __joint_view__: a view that holds a reference to
+the original sequence `s` and the value `x`. Functions that were once
+sequence specific and need to be implemented N times over N different
+sequences are now implemented only once. That is to say that Fusion
+sequences are cheaply extensible. However, an important caveat is that the
+result of a sequence extending operation like __push_back__ does not retain
+the properties of the original sequence such as associativity of __set__(s).
+To regain the original sequence, __conversion__ functions are provided. You
+may use one of the __conversion__ functions to convert back to the original
+sequence type.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm.hpp>
+    #include <boost/fusion/include/algorithm.hpp>
+
+[section Iteration]
+
+The iteration algorithms provide the fundamental algorithms for traversing
+a sequence repeatedly applying an operation to its elements.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/iteration.hpp>
+    #include <boost/fusion/include/iteration.hpp>
+
+[section Functions]
+
+[section fold]
+
+[heading Description]
+For a sequence `seq`, initial state `initial_state`, and binary function object or function pointer `f`, fold returns the result of the repeated application of binary `f` to the result of the previous `f` invocation (`inital_state` if it is the first call) and each element of `seq`.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename State,
+        typename F
+        >
+    typename __result_of_fold__<Sequence, State, F>::type fold(
+        Sequence& seq, State const& initial_state, F const& f);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+ [[`seq`][A model of __forward_sequence__, `f(s,e)` must be a valid expression for current state `s`, and each element `e` in `seq`][Operation's argument]]
+    [[`initial_state`][Any type][Initial state]]
+ [[`f`][`__boost_result_of_call__<F(S,E)>::type` is the return type of `f(s,e)` current state `s` of type `S`, and for each element `e` of type `E` in `seq`][Operation's argument]]
+]
+
+[heading Expression Semantics]
+    fold(seq, initial_state, f);
+
+[*Return type]: Any type
+
+[*Semantics]: Equivalent to `f(... f(f(initial_state,e1),e2) ...eN)` where `e1 ...eN` are the elements of `seq`.
+
+[heading Complexity]
+Linear, exactly `__result_of_size__<Sequence>::value` applications of `f`.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/iteration/fold.hpp>
+    #include <boost/fusion/include/fold.hpp>
+
+[heading Example]
+    struct make_string
+    {
+        typedef std::string result_type;
+
+        template<typename T>
+        std::string operator()(const std::string& str, const T& t) const
+        {
+            return str + boost::lexical_cast<std::string>(t);
+        }
+    };
+    ...
+    const __vector__<int,int> vec(1,2);
+    assert(__fold__(vec,std::string(""), make_string()) == "12");
+
+[endsect]
+
+[section accumulate]
+
+[heading Description]
+For a sequence `seq`, initial state `initial_state`, and binary function object or function pointer `f`, accumulate returns the result of the repeated application of binary `f` to the result of the previous `f` invocation (`inital_state` if it is the first call) and each element of `seq`.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename State,
+        typename F
+        >
+    typename __result_of_accumulate__<Sequence, State, F>::type accumulate(
+        Sequence& seq, State const& initial_state, F const& f);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+ [[`seq`][A model of __forward_sequence__, `f(s,e)` must be a valid expression for current state `s`, and each element `e` in `seq`][Operation's argument]]
+    [[`initial_state`][Any type][Initial state]]
+ [[`f`][`__boost_result_of_call__<F(S,E)>::type` is the return type of `f(s,e)` current state `s` of type `S`, and for each element `e` of type `E` in `seq`][Operation's argument]]
+]
+
+[heading Expression Semantics]
+    accumulate(seq, initial_state, f);
+
+[*Return type]: Any type
+
+[*Semantics]: Equivalent to `f(... f(f(initial_state,e1),e2) ...eN)` where `e1 ...eN` are the elements of `seq`.
+
+[heading Complexity]
+Linear, exactly `__result_of_size__<Sequence>::value` applications of `f`.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/iteration/accumulate.hpp>
+    #include <boost/fusion/include/accumulate.hpp>
+
+[heading Example]
+    struct make_string
+    {
+        typedef std::string result_type;
+
+        template<typename T>
+        std::string operator()(const std::string& str, const T& t) const
+        {
+            return str + boost::lexical_cast<std::string>(t);
+        }
+    };
+    ...
+    const __vector__<int,int> vec(1,2);
+    assert(__accumulate__(vec,std::string(""), make_string()) == "12");
+
+[endsect]
+
+[section for_each]
+
+[heading Description]
+Applies a unary function object to each element of a sequence.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename F
+        >
+    typename __result_of_for_each__<Sequence, F>::type for_each(
+        Sequence& seq, F const& f);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+ [[`seq`][A model of __forward_sequence__, `f(e)` must be a valid expression for each element `e` in `seq`][Operation's argument]]
+    [[`f`][A unary __reg_callable_obj__][Operation's argument]]
+]
+
+[heading Expression Semantics]
+    __for_each__(seq, f);
+
+[*Return type]: `void`
+
+[*Semantics]: Calls `f(e)` for each element `e` in `seq`.
+
+[heading Complexity]
+Linear, exactly `__result_of_size__<Sequence>::value` applications of `f`.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/iteration/for_each.hpp>
+    #include <boost/fusion/include/for_each.hpp>
+
+[heading Example]
+    struct increment
+    {
+        template<typename T>
+        void operator()(T& t) const
+        {
+            ++t;
+        }
+    };
+    ...
+    __vector__<int,int> vec(1,2);
+    __for_each__(vec, increment());
+    assert(vec == __make_vector__(2,3));
+
+[endsect]
+
+[endsect]
+
+[section Metafunctions]
+
+[section fold]
+
+[heading Description]
+Returns the result type of __fold__.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename State,
+        typename F>
+    struct fold
+    {
+        typedef __unspecified__ type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [Description]]
+ [[`Sequence`] [A model of __forward_sequence__] [The sequence to iterate]] + [[`State`] [Any type] [The initial state for the first application of `F`]] + [[`F`] [`__boost_result_of_call__<F(S,E)>::type` is the return type of `f(s,e)` for current state `s` of type `S`, and for each element `e` of type `E` in `seq`] [The operation to be applied on forward traversal]]
+]
+
+[heading Expression Semantics]
+    __result_of_fold__<Sequence, State, F>::type
+
+[*Return type]: Any type
+
+[*Semantics]: Returns the result of applying `fold` to a sequence of type `Sequence`, with an initial state of
+type `State` and binary function object or function pointer of type `F`.
+
+[heading Complexity]
+Linear, exactly `__result_of_size__<Sequence>::value` applications of `F`.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/iteration/fold.hpp>
+    #include <boost/fusion/include/fold.hpp>
+
+[endsect]
+
+[section accumulate]
+
+[heading Description]
+Returns the result type of __accumulate__.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename State,
+        typename F>
+    struct accumulate
+    {
+        typedef __unspecified__ type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [Description]]
+ [[`Sequence`] [A model of __forward_sequence__] [The sequence to iterate]] + [[`State`] [Any type] [The initial state for the first application of `F`]] + [[`F`] [`__boost_result_of_call__<F(S,E)>::type` is the return type of `f(s,e)` for current state `s` of type `S`, and for each element `e` of type `E` in `seq`] [The operation to be applied on forward traversal]]
+]
+
+[heading Expression Semantics]
+    __result_of_accumulate__<Sequence, State, F>::type
+
+[*Return type]: Any type
+
+[*Semantics]: Returns the result of applying `accumulate` to a sequence of type `Sequence`, with an initial state of
+type `State` and binary function object or function pointer of type `F`.
+
+[heading Complexity]
+Linear, exactly `__result_of_size__<Sequence>::value` applications of `F`.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/iteration/accumulate.hpp>
+    #include <boost/fusion/include/accumulate.hpp>
+
+[endsect]
+
+[section for_each]
+A metafunction returning the result type of applying __for_each__ to a sequence. The
+return type of __for_each__ is always `void`.
+
+[heading Description]
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename F
+    >
+    struct for_each
+    {
+        typedef void type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [Description]]
+    [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]]
+    [[`F`]    [Any type] [Operation's argument]]
+]
+
+[heading Expression Semantics]
+    __result_of_for_each__<Sequence, F>::type
+
+[*Return type]: `void`.
+
+[*Semantics]: Returns the return type of __for_each__ for a sequence of type `Sequence` and a unary function object `F`.
+The return type is always `void`.
+
+[heading Complexity]
+Constant.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/iteration/for_each.hpp>
+    #include <boost/fusion/include/for_each.hpp>
+
+[endsect]
+
+[endsect]
+
+[endsect]
+
+[section Query]
+The query algorithms provide support for searching and analyzing sequences.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query.hpp>
+    #include <boost/fusion/include/query.hpp>
+
+[section Functions]
+
+[section any]
+
+[heading Description]
+For a sequence `seq` and unary function object `f`, `any` returns true if `f` returns true for at least one element of `seq`.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename F
+        >
+    typename __result_of_any__<Sequence,F>::type any(
+        Sequence const& seq, F f);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+ [[`seq`][A model of __forward_sequence__, `f(e)` must be a valid expression, convertible to `bool`, for each element `e` in `seq`][The sequence to search]]
+    [[`f`][A unary function object][The search predicate]]
+]
+
+[heading Expression semantics]
+    __any__(seq, f);
+
+[*Return type]: `bool`
+
+[*Semantics]: Returns true if and only if `f(e)` evaluates to `true` for some element `e` in `seq`.
+
+[heading Complexity]
+Linear. At most `__result_of_size__<Sequence>::value` comparisons.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/any.hpp>
+    #include <boost/fusion/include/any.hpp>
+
+[heading Example]
+    struct odd
+    {
+        template<typename T>
+        bool operator()(T t) const
+        {
+            return t % 2;
+        }
+    };
+    ...
+    assert(__any__(__make_vector__(1,2), odd()));
+    assert(!__any__(__make_vector__(2,4), odd()));
+
+[endsect]
+
+[section all]
+
+[heading Description]
+For a sequence `seq` and unary function object `f`, `all` returns true if `f` returns true for every element of `seq`.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename F
+        >
+    typename __result_of_all__<Sequence,F>::type all(
+        Sequence const& seq, F f);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+ [[`seq`][A model of __forward_sequence__, `f(e)` is a valid expression, convertible to `bool`, for every element `e` in `seq`][The sequence to search]]
+    [[`f`][A unary function object][The search predicate]]
+]
+
+[heading Expression Semantics]
+    __all__(seq, f);
+
+[*Return type]: `bool`
+
+[*Semantics]: Returns true if and only if `f(e)` evaluates to `true` for every element `e` in `seq`.
+
+[heading Complexity]
+Linear. At most `__result_of_size__<Sequence>::value` comparisons.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/all.hpp>
+    #include <boost/fusion/include/all.hpp>
+
+[heading Example]
+    struct odd
+    {
+        template<typename T>
+        bool operator()(T t) const
+        {
+            return t % 2;
+        }
+    };
+    ...
+    assert(__all__(__make_vector__(1,3), odd()));
+    assert(!__all__(__make_vector__(1,2), odd()));
+
+[endsect]
+
+[section none]
+
+[heading Description]
+For a sequence `seq` and unary function object `f`, `none` returns true if `f` returns false for every element of `seq`.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename F
+        >
+    typename __result_of_none__<Sequence,F>::type none(
+        Sequence const& seq, F f);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+ [[`seq`][A model of __forward_sequence__, `f(e)` is a valid expression, convertible to `bool`, for every element `e` in `seq`][The sequence to search]]
+    [[`f`][A unary function object][The search predicate]]
+]
+
+[heading Expression Semantics]
+    __none__(seq, f);
+
+[*Return type]: `bool`
+
+[*Semantics]: Returns true if and only if `f(e)` evaluates to `false` for every element `e` in `seq`. Result equivalent to `!any(seq, f)`.
+
+[heading Complexity]
+Linear. At most `__result_of_size__<Sequence>::value` comparisons.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/none.hpp>
+    #include <boost/fusion/include/none.hpp>
+
+[heading Example]
+    struct odd
+    {
+        template<typename T>
+        bool operator()(T t) const
+        {
+            return t % 2;
+        }
+    };
+    ...
+    assert(__none__(__make_vector__(2,4), odd()));
+    assert(!__none__(__make_vector__(1,2), odd()));
+
+[endsect]
+
+[section find]
+
+[heading Description]
+Finds the first element of a given type within a sequence.
+
+[heading Synopsis]
+    template<
+        typename T,
+        typename Sequence
+        >
+    __unspecified__ find(Sequence const& seq);
+
+    template<
+        typename T,
+        typename Sequence
+        >
+    __unspecified__ find(Sequence& seq);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+    [[`seq`][A model of __forward_sequence__][The sequence to search]]
+    [[`T`][Any type][The type to search for]]
+]
+
+[heading Expression Semantics]
+    __find__<T>(seq)
+
+[*Return type]: A model of the same iterator category as the iterators of `seq`.
+
+[*Semantics]: Returns an iterator to the first element of `seq` of type `T`, or `__end__(seq)` if there is no such element.
+Equivalent to `__find_if__<boost::is_same<_, T> >(seq)`
+
+[heading Complexity]
+Linear. At most `__result_of_size__<Sequence>::value` comparisons.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/find.hpp>
+    #include <boost/fusion/include/find.hpp>
+
+[heading Example]
+    const __vector__<char,int> vec('a','0');
+    assert(*__find__<int>(vec) == '0');
+    assert(__find__<double>(vec) == __end__(vec));
+
+[endsect]
+
+[section find_if]
+Finds the first element within a sequence with a type for which a given __mpl_lambda_expression__ evaluates to
+`boost::mpl::true_`.
+
+[heading Description]
+
+[heading Synopsis]
+    template<
+        typename F,
+        typename Sequence
+        >
+    __unspecified__ find_if(Sequence const& seq);
+
+    template<
+        typename F,
+        typename Sequence
+        >
+    __unspecified__ find_if(Sequence& seq);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+    [[`seq`][A model of __forward_sequence__][The sequence to search]]
+    [[`F`][A unary __mpl_lambda_expression__][The search predicate]]
+]
+
+[heading Expression Semantics]
+    __find_if__<F>(seq)
+
+[*Return type]: An iterator of the same iterator category as the iterators of `seq`.
+
+[*Semantics]: Returns the first element of `seq` for which __mpl_lambda_expression__ `F` evaluates to `boost::mpl::true_`,
+or `__end__(seq)` if there is no such element.
+
+[heading Complexity]
+Linear. At most `__result_of_size__<Sequence>::value` comparisons.
+
+#include <boost/fusion/algorithm/query/find_if.hpp>
+#include <boost/fusion/include/find_if.hpp>
+
+[heading Example]
+    const __vector__<double,int> vec(1.0,2);
+    assert(*__find_if__<is_integral<mpl::_> >(vec) == 2);
+    assert(__find_if__<is_class<mpl::_> >(vec) == __end__(vec));
+
+[endsect]
+
+[section count]
+
+[heading Description]
+Returns the number of elements of a given type within a sequence.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename T
+        >
+    typename __result_of_count__<Sequence, T>::type count(
+        Sequence const& seq, T const& t);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+ [[`seq`][A model of __forward_sequence__, `e == t` must be a valid expression, convertible to `bool`, for each element `e` in `seq`][The sequence to search]]
+    [[`T`][Any type][The type to count]]
+]
+
+[heading Expression Semantics]
+    __count__(seq, t);
+
+[*Return type]: `int`
+
+[*Semantics]: Returns the number of elements of type `T` and equal to `t` in `seq`.
+
+[heading Complexity]
+Linear. At most `__result_of_size__<Sequence>::value` comparisons.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/count.hpp>
+    #include <boost/fusion/include/count.hpp>
+
+[heading Example]
+    const __vector__<double,int,int> vec(1.0,2,3);
+    assert(__count__(vec,2) == 1);
+
+[endsect]
+
+[section count_if]
+
+[heading Description]
+Returns the number of elements within a sequence with a type for which a given unary function object evaluates to
+`true`.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename F
+        >
+    typename __result_of_count_if__<Sequence, F>::type count_if(
+        Sequence const& seq, F f);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+ [[`seq`][A model of __forward_sequence__, `f(e)` is a valid expression, convertible to `bool`, for each element `e` in `seq`][The sequence to search]]
+    [[`f`][A unary function object][The search predicate]]
+]
+
+[heading Expression Semantics]
+    __count_if__(seq, f)
+
+[*Return type]: `int`
+
+[*Semantics]: Returns the number of elements in `seq` where `f` evaluates to `true`.
+
+[heading Complexity]
+Linear. At most `__result_of_size__<Sequence>::value` comparisons.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/count_if.hpp>
+    #include <boost/fusion/include/count_if.hpp>
+
+[heading Example]
+    const __vector__<int,int,int> vec(1,2,3);
+    assert(__count_if__(vec,odd()) == 2);
+
+[endsect]
+
+[endsect]
+
+[section Metafunctions]
+
+[section any]
+
+[heading Description]
+A metafunction returning the result type of __any__.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename F
+        >
+    struct any
+    {
+        typedef bool type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [Description]]
+    [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]]
+ [[`F`] [A model of unary __poly_func_obj__] [Operation's argument]]
+]
+
+[heading Expression Semantics]
+    __result_of_any__<Sequence, F>::type
+
+[*Return type]: `bool`.
+
+[*Semantics]: Returns the return type of __any__ given a sequence of type `Sequence` and a unary __poly_func_obj__ of type `F`. The return type is always `bool`.
+
+[heading Complexity]
+Constant.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/any.hpp>
+    #include <boost/fusion/include/any.hpp>
+
+[endsect]
+
+[section all]
+
+[heading Description]
+A metafunction returning the result type of __all__.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename F
+        >
+    struct all
+    {
+        typedef bool type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [Description]]
+    [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]]
+ [[`F`] [A model of unary __poly_func_obj__] [Operation's argument]]
+]
+
+[heading Expression Semantics]
+    __result_of_all__<Sequence, F>::type
+
+[*Return type]: `bool`.
+
+[*Semantics]: Returns the return type of __all__ given a sequence of type `Sequence` and a unary __poly_func_obj__ of type `F`. The return type is always `bool`.
+
+[heading Complexity]
+Constant.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/all.hpp>
+    #include <boost/fusion/include/all.hpp>
+
+[endsect]
+
+[section none]
+
+[heading Description]
+A metafunction returning the result type of __none__.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename F
+        >
+    struct none
+    {
+        typedef bool type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [Description]]
+    [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]]
+ [[`F`] [A model of unary __poly_func_obj__] [Operation's argument]]
+]
+
+[heading Expression Semantics]
+    __result_of_none__<Sequence, F>::type
+
+[*Return type]: `bool`.
+
+[*Semantics]: Returns the return type of __none__ given a sequence of type `Sequence` and a unary __poly_func_obj__ of type `F`. The return type is always `bool`.
+
+[heading Complexity]
+Constant.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/none.hpp>
+    #include <boost/fusion/include/none.hpp>
+
+[endsect]
+
+[section find]
+
+[heading Description]
+Returns the result type of __find__, given the sequence and search types.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename T
+        >
+    struct find
+    {
+        typedef __unspecified__ type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [Description]]
+    [[`Sequence`] [Model of __forward_sequence__] [Operation's argument]]
+    [[`T`]        [Any type] [Operation's argument]]
+]
+
+[heading Expression Semantics]
+    __result_of_find__<Sequence, T>::type
+
+[*Return type]: A model of the same iterator category as the iterators of `Sequence`.
+
+[*Semantics]: Returns an iterator to the first element of type `T` in `Sequence`, or `__result_of_end__<Sequence>::type` if there is no such element.
+
+[heading Complexity]
+Linear, at most `__result_of_size__<Sequence>::value` comparisons.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/find.hpp>
+    #include <boost/fusion/include/find.hpp>
+
+[endsect]
+
+[section find_if]
+
+[heading Description]
+Returns the result type of __find_if__ given the sequence and predicate types.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename Pred
+        >
+    struct find_if
+    {
+        typedef __unspecified__ type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [Description]]
+    [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]]
+ [[`Pred`] [A model of __mpl_lambda_expression__] [Operation's arguments]]
+]
+
+[heading Expression Semantics]
+    __result_of_find_if__<Sequence, Pred>::type
+
+[*Return type]: A model of the same iterator category as the iterators of `Sequence`.
+
+[*Semantics]: Returns an iterator to the first element in `Sequence` for which `Pred` evaluates to true. Returns `__result_of_end__<Sequence>::type` if there is no such element.
+
+[heading Complexity]
+Linear. At most `__result_of_size__<Sequence>::value` comparisons.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/find_if.hpp>
+    #include <boost/fusion/include/find_if.hpp>
+
+[endsect]
+
+[section count]
+
+[heading Description]
+A metafunction that returns the result type of `count` given the sequence and search types.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename T
+        >
+    struct count
+    {
+        typedef int type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [heading Description]]
+    [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]]
+    [[`T`] [Any type] [Operation's argument]]
+]
+
+[heading Expression Semantics]
+    __result_of_count__<T>::type
+
+[*Return type]: `int`.
+
+[*Semantics]: Returns the return type of __count__. The return type is always `int`.
+
+[heading Complexity]
+Constant.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/count.hpp>
+    #include <boost/fusion/include/count.hpp>
+
+[endsect]
+
+[section count_if]
+
+[heading Description]
+A metafunction that returns the result type of `count_if` given the sequence and predicate types.
+
+[heading Synopsis]
+    template<
+        typename Sequence,
+        typename Pred
+        >
+    struct count_if
+    {
+        typedef int type;
+    };
+
+[table Parameters
+    [[Parameter] [Requirement] [Description]]
+    [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]]
+    [[`Pred`]     [A unary function object] [Operation's argument]]
+]
+
+[heading Expression Semantics]
+    __result_of_count_if__<Sequence, Pred>::type
+
+[*Return type]: `int`.
+
+[*Semantics]: Returns the return type of __count_if__. The return type is always `int`.
+
+[heading Complexity]
+Constant.
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/query/count_if.hpp>
+    #include <boost/fusion/include/count_if.hpp>
+
+[endsect]
+
+[endsect]
+
+[endsect]
+
+[section Transformation]
+The transformation algorithms create new sequences out of existing sequences by performing some sort of transformation. In reality the new sequences are views onto the data in the original sequences.
+
+[note As the transformation algorithms return views onto their input arguments, +it is important that the lifetime of the input arguments is greater than the
+period during which you wish to use the results.]
+
+[heading Header]
+
+    #include <boost/fusion/algorithm/transformation.hpp>
+    #include <boost/fusion/include/transformation.hpp>
+
+[section Functions]
+
+[section filter]
+
+[heading Description]
+For a given sequence, filter returns a new sequences containing only the elements of a specified type.
+
+[heading Synopsis]
+    template<
+        typename T,
+        typename Sequence
+        >
+ typename __result_of_filter__<Sequence const, T>::type filter(Sequence const& seq);
+
+[table Parameters
+    [[Parameter][Requirement][Description]]
+    [[`seq`][A model of __forward_sequence__][Operation's argument]]
+    [[`T`][Any type][The type to retain]]
+]
+
+[heading Expression Semantics]
+    __filter__<T>(seq);
+
+[*Return type]:
+
+* A model of __forward_sequence__.
+* A model of __associative_sequence__ if `seq` implements the __associative_sequence__ model.
+
+[*Semantics]: Returns a sequence containing all the elements of `seq` of type `T`.
+Equivalent to `__filter_if__<boost::same_type<_, T> >(seq)`.
+
+[heading Complexity]
+Constant. Returns a view which is lazily evaluated.
+
+[heading Header]
+
***The diff for this file has been truncated for email.***
=======================================
--- /dev/null
+++ /trunk/libs/fusion/doc/changelog.qbk        Mon Feb  8 01:01:45 2010
@@ -0,0 +1,29 @@
+[/==============================================================================
+    Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
+
+    Use, modification and distribution is subject to 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)
+===============================================================================/]
+[section Change log]
+
+This section summarizes significant changes to the Fusion library.
+
+* Sep 27, 2006: Added `boost::tuple` support. (Joel de Guzman)
+* Nov 17, 2006: Added `boost::variant` support. (Joel de Guzman)
+* Feb 15, 2007: Added functional module. (Tobias Schwinger)
+* April 2, 2007: Added struct adapter. (Joel de Guzman)
+* May 8, 2007: Added associative struct adapter. (Dan Marsden)
+* Dec 20, 2007: Removed `boost::variant` support. After thorough
+  investigation, I think now that the move to make variant a
+  fusion sequence is rather quirky. A variant will always
+  have a size==1 regardless of the number of types it can contain
+  and there's no way to know at compile time what it contains.
+  Iterating over its types is simply wrong. All these imply that
+  the variant is *not* a fusion sequence. (Joel de Guzman)
+* Oct 12, 2009: The accumulator is the first argument to the functor of
+  __fold__ and __accumulate__. (Christopher Schmidt)
+* Oct 30, 2009: Added support for associative iterators and views. (Christopher
+  Schmidt)
+
+[endsect]
=======================================
--- /dev/null
+++ /trunk/libs/fusion/doc/container.qbk        Mon Feb  8 01:01:45 2010
@@ -0,0 +1,1648 @@
+[/==============================================================================
+    Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
+
+    Use, modification and distribution is subject to 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)
+===============================================================================/]
+[section Container]
+
+Fusion provides a few predefined sequences out of the box. These
+/containers/ actually hold heterogenously typed data; unlike
+__views__. These containers are more or less counterparts of those in __stl__.
+
+[heading Header]
+
+    #include <boost/fusion/container.hpp>
+    #include <boost/fusion/include/container.hpp>
+
+[section vector]
+
+[heading Description]
+
+`vector` is a __random_access_sequence__ of heterogenous typed
+data structured as a simple `struct` where each element is held
+as a member variable. `vector` is the simplest of the Fusion
+sequence container, and in many cases the most efficient.
+
+[heading Header]
+
+    #include <boost/fusion/container/vector.hpp>
+    #include <boost/fusion/include/vector.hpp>
+    #include <boost/fusion/container/vector/vector_fwd.hpp>
+    #include <boost/fusion/include/vector_fwd.hpp>
+
+    // numbered forms
+    #include <boost/fusion/container/vector/vector10.hpp>
+    #include <boost/fusion/include/vector10.hpp>
+    #include <boost/fusion/container/vector/vector20.hpp>
+    #include <boost/fusion/include/vector20.hpp>
+    #include <boost/fusion/container/vector/vector30.hpp>
+    #include <boost/fusion/include/vector30.hpp>
+    #include <boost/fusion/container/vector/vector40.hpp>
+    #include <boost/fusion/include/vector40.hpp>
+    #include <boost/fusion/container/vector/vector50.hpp>
+    #include <boost/fusion/include/vector50.hpp>
+
+[heading Synopsis]
+
+[*Numbered forms]
+
+    struct vector0;
+
+    template <typename T0>
+    struct vector1;
+
+    template <typename T0, typename T1>
+    struct vector2;
+
+    template <typename T0, typename T1, typename T2>
+    struct vector3;
+
+    ...
+
+    template <typename T0, typename T1, typename T2..., typename TN>
+    struct vectorN;
+
+[*Variadic form]
+
+    template <
+        typename T0 = __unspecified__
+      , typename T1 = __unspecified__
+      , typename T2 = __unspecified__
+        ...
+      , typename TN = __unspecified__
+    >
+    struct vector;
+
+The numbered form accepts the exact number of elements. Example:
+
+    vector3<int, char, double>
+
+The variadic form accepts `0` to `FUSION_MAX_VECTOR_SIZE` elements, where
+`FUSION_MAX_VECTOR_SIZE` is a user definable predefined maximum that
+defaults to `10`. Example:
+
+    vector<int, char, double>
+
+You may define the preprocessor constant `FUSION_MAX_VECTOR_SIZE` before
+including any Fusion header to change the default. Example:
+
+    #define FUSION_MAX_VECTOR_SIZE 20
+
+[heading Template parameters]
+
+[table
+    [[Parameter]            [Description]               [Default]]
+    [[`T0`...`TN`]          [Element types]             [['unspecified]]]
+]
+
+[heading Model of]
+
+* __random_access_sequence__
+
+[variablelist Notation
+    [[`v`]              [Instance of `vector`]]
+    [[`V`]              [A `vector` type]]
+    [[`e0`...`en`]      [Heterogeneous values]]
+    [[`s`]              [A __forward_sequence__]]
+]
+
+[heading Expression Semantics]
+
+Semantics of an expression is defined only where it differs from, or is not
+defined in __random_access_sequence__.
+
+[table
+    [[Expression]           [Semantics]]
+ [[`V()`] [Creates a vector with default constructed elements.]]
+    [[`V(e0, e1,... en)`]   [Creates a vector with elements `e0`...`en`.]]
+ [[`V(s)`] [Copy constructs a vector from a __forward_sequence__, `s`.]] + [[`v = s`] [Assigns to a vector, `v`, from a __forward_sequence__, `s`.]]
+]
+
+[heading Example]
+
+    vector<int, float> v(12, 5.5f);
+    std::cout << __at_c__<0>(v) << std::endl;
+    std::cout << __at_c__<1>(v) << std::endl;
+
+[endsect]
+
+[section cons]
+
+[heading Description]
+
+`cons` is a simple __forward_sequence__. It is a lisp style recursive list
+structure where `car` is the /head/ and `cdr` is the /tail/: usually
+another cons structure or `nil`: the empty list. Fusion's __list__ is built
+on top of this more primitive data structure. It is more efficient than
+__vector__ when the target sequence is constructed piecemeal (a data at a
+time). The runtime cost of access to each element is peculiarly constant
+(see __recursive_inline__).
+
+[heading Header]
+
+    #include <boost/fusion/container/list/cons.hpp>
+    #include <boost/fusion/include/cons.hpp>
+
+[heading Synopsis]
+
+    template <typename Car, typename Cdr = nil>
+    struct cons;
+
+[heading Template parameters]
+
+[table
+    [[Parameter]            [Description]               [Default]]
+    [[`Car`]                [Head type]                 []]
+    [[`Cdr`]                [Tail type]                 [`nil`]]
+]
+
+[heading Model of]
+
+* __forward_sequence__
+
+[variablelist Notation
+    [[`nil`]            [An empty `cons`]]
+    [[`C`]              [A `cons` type]]
+    [[`l`, `l2`]        [Instances of `cons`]]
+    [[`car`]            [An arbitrary data]]
+    [[`cdr`]            [Another `cons` list]]
+    [[`s`]              [A __forward_sequence__]]
+    [[`N`]              [An __mpl_integral_constant__]]
+]
+
+[heading Expression Semantics]
+
+Semantics of an expression is defined only where it differs from, or is not
+defined in __forward_sequence__.
+
+[table
+    [[Expression]           [Semantics]]
+    [[`nil()`]              [Creates an empty list.]]
+ [[`C()`] [Creates a cons with default constructed elements.]] + [[`C(car)`] [Creates a cons with `car` head and default constructed tail.]] + [[`C(car, cdr)`] [Creates a cons with `car` head and `cdr` tail.]] + [[`C(s)`] [Copy constructs a cons from a __forward_sequence__, `s`.]] + [[`l = s`] [Assigns to a cons, `l`, from a __forward_sequence__, `s`.]] + [[`__at__<N>(l)`] [The Nth element from the beginning of the sequence; see __at__.]]
+]
+
+[blurb __note__ `__at__<N>(l)` is provided for convenience and compatibility
+with the original __tuple__ library, despite `cons` being a
+__forward_sequence__ only (`at` is supposed to be a
+__random_access_sequence__ requirement). The runtime complexity of __at__ is
+constant (see __recursive_inline__).]
+
+[heading Example]
+
+    cons<int, cons<float> > l(12, cons<float>(5.5f));
+    std::cout << __at_c__<0>(l) << std::endl;
+    std::cout << __at_c__<1>(l) << std::endl;
+
+[endsect]
+
+[section list]
+
+[heading Description]
+
+`list` is a __forward_sequence__ of heterogenous typed data built on top of
+__cons__. It is more efficient than __vector__ when the target sequence is
+constructed piecemeal (a data at a time). The runtime cost of access to
+each element is peculiarly constant (see __recursive_inline__).
+
+[heading Header]
+
+    #include <boost/fusion/container/list.hpp>
+    #include <boost/fusion/include/list.hpp>
+    #include <boost/fusion/container/list/list_fwd.hpp>
+    #include <boost/fusion/include/list_fwd.hpp>
+
+[heading Synopsis]
+
+    template <
+        typename T0 = __unspecified__
+      , typename T1 = __unspecified__
+      , typename T2 = __unspecified__
+        ...
+      , typename TN = __unspecified__
+    >
+    struct list;
+
+The variadic class interface accepts `0` to `FUSION_MAX_LIST_SIZE`
+elements, where `FUSION_MAX_LIST_SIZE` is a user definable predefined
+maximum that defaults to `10`. Example:
+
+    list<int, char, double>
+
+You may define the preprocessor constant `FUSION_MAX_LIST_SIZE` before
+including any Fusion header to change the default. Example:
+
+    #define FUSION_MAX_LIST_SIZE 20
+
+[heading Template parameters]
+
+[table
+    [[Parameter]            [Description]               [Default]]
+ [[`T0`...`TN`] [Element types] [['unspecified-type]]]
+]
+
+[heading Model of]
+
+* __forward_sequence__
+
+[variablelist Notation
+    [[`L`]              [A `list` type]]
+    [[`l`]              [An instance of `list`]]
+    [[`e0`...`en`]      [Heterogeneous values]]
+    [[`s`]              [A __forward_sequence__]]
+    [[`N`]              [An __mpl_integral_constant__]]
+]
+
+[heading Expression Semantics]
+
+Semantics of an expression is defined only where it differs from, or is not
+defined in __forward_sequence__.
+
+[table
+    [[Expression]           [Semantics]]
+ [[`L()`] [Creates a list with default constructed elements.]]
+    [[`L(e0, e1,... en)`]   [Creates a list with elements `e0`...`en`.]]
+ [[`L(s)`] [Copy constructs a list from a __forward_sequence__, `s`.]] + [[`l = s`] [Assigns to a list, `l`, from a __forward_sequence__, `s`.]] + [[`__at__<N>(l)`] [The Nth element from the beginning of the sequence; see __at__.]]
+]
+
+[blurb __note__ `__at__<n>(l)` is provided for convenience and compatibility
+with the original __tuple__ library, despite `list` being a
+__forward_sequence__ only (__at__ is supposed to be a
+__random_access_sequence__ requirement). The runtime complexity of __at__ is
+constant (see __recursive_inline__).]
+
+[heading Example]
+
+    list<int, float> l(12, 5.5f);
+    std::cout << __at_c__<0>(l) << std::endl;
+    std::cout << __at_c__<1>(l) << std::endl;
+
+[endsect]
+
+[section set]
+
+[heading Description]
+
+set is an __associative_sequence__ of heteregenous typed data elements.
+Type identity is used to impose an equivalence relation on keys. The
+element's type is its key. A set may contain at most one element for each
+key. Membership testing and element key lookup has constant runtime
+complexity (see __overloaded_functions__).
+
+[heading Header]
+
+    #include <boost/fusion/container/set.hpp>
+    #include <boost/fusion/include/set.hpp>
+    #include <boost/fusion/container/set_fwd.hpp>
+    #include <boost/fusion/include/set_fwd.hpp>
+
+[heading Synopsis]
+
+    template <
+        typename T0 = __unspecified__
+      , typename T1 = __unspecified__
+      , typename T2 = __unspecified__
+        ...
+      , typename TN = __unspecified__
+    >
+    struct set;
+
+The variadic class interface accepts `0` to `FUSION_MAX_SET_SIZE` elements,
+where `FUSION_MAX_SET_SIZE` is a user definable predefined maximum that
+defaults to `10`. Example:
+
+    set<int, char, double>
+
+You may define the preprocessor constant `FUSION_MAX_SET_SIZE` before
+including any Fusion header to change the default. Example:
+
+    #define FUSION_MAX_SET_SIZE 20
+
+[heading Template parameters]
+
+[table
+    [[Parameter]            [Description]               [Default]]
+ [[`T0`...`TN`] [Element types] [['unspecified-type]]]
+]
+
+[heading Model of]
+
+* __associative_sequence__
+* __forward_sequence__
+
+[variablelist Notation
+    [[`S`]              [A `set` type]]
+    [[`s`]              [An instance of `set`]]
+    [[`e0`...`en`]      [Heterogeneous values]]
+    [[`fs`]             [A __forward_sequence__]]
+]
+
+[heading Expression Semantics]
+
+Semantics of an expression is defined only where it differs from, or is not
+defined in __random_access_sequence__ and __associative_sequence__.
+
+[table
+    [[Expression]           [Semantics]]
+ [[`S()`] [Creates a set with default constructed elements.]]
+    [[`S(e0, e1,... en)`]   [Creates a set with elements `e0`...`en`.]]
+ [[`S(fs)`] [Copy constructs a set from a __forward_sequence__ `fs`.]] + [[`s = fs`] [Assigns to a set, `s`, from a __forward_sequence__ `fs`.]]
+]
+
+[heading Example]
+
+    typedef set<int, float> S;
+    S s(12, 5.5f);
+    std::cout << __at_key__<int>(s) << std::endl;
+    std::cout << __at_key__<float>(s) << std::endl;
+    std::cout << __result_of_has_key__<S, double>::value << std::endl;
+
+[endsect]
+
+[section map]
+
+[heading Description]
+
+map is an __associative_sequence__ of heteregenous typed data elements.
+Each element is a key/data pair (see __fusion_pair__) where the key has no
+data (type only). Type identity is used to impose an equivalence relation
+on keys. A map may contain at most one element for each key. Membership
+testing and element key lookup has constant runtime complexity (see
+__overloaded_functions__).
+
+[heading Header]
+
+    #include <boost/fusion/container/map.hpp>
+    #include <boost/fusion/include/map.hpp>
+    #include <boost/fusion/container/map_fwd.hpp>
+    #include <boost/fusion/include/map_fwd.hpp>
+
+[heading Synopsis]
+
+    template <
+        typename T0 = __unspecified__
+      , typename T1 = __unspecified__
+      , typename T2 = __unspecified__
+        ...
+      , typename TN = __unspecified__
+    >
+    struct map;
+
+The variadic class interface accepts `0` to `FUSION_MAX_MAP_SIZE` elements,
+where `FUSION_MAX_MAP_SIZE` is a user definable predefined maximum that
+defaults to `10`. Example:
+
+    map<__pair__<int, char>, __pair__<char, char>, __pair__<double, char> >
+
+You may define the preprocessor constant `FUSION_MAX_MAP_SIZE` before
+including any Fusion header to change the default. Example:
+
+    #define FUSION_MAX_MAP_SIZE 20
+
+[heading Template parameters]
+
+[table
+    [[Parameter]            [Description]               [Default]]
+ [[`T0`...`TN`] [Element types] [['unspecified-type]]]
+]
+
+[heading Model of]
+
+* __associative_sequence__
+* __forward_sequence__
+
+[variablelist Notation
+    [[`M`]              [A `map` type]]
+    [[`m`]              [An instance of `map`]]
+ [[`e0`...`en`] [Heterogeneous key/value pairs (see __fusion_pair__)]]
+    [[`s`]              [A __forward_sequence__]]
+]
+
+[heading Expression Semantics]
+
+Semantics of an expression is defined only where it differs from, or is not
+defined in __random_access_sequence__ and __associative_sequence__.
+
+[table
+    [[Expression]           [Semantics]]
+ [[`M()`] [Creates a map with default constructed elements.]] + [[`M(e0, e1,... en)`] [Creates a map with element pairs `e0`...`en`.]] + [[`M(s)`] [Copy constructs a map from a __forward_sequence__ `s`.]] + [[`m = s`] [Assigns to a map, `m`, from a __forward_sequence__ `s`.]]
+]
+
+[heading Example]
+
+    typedef map<
+        __pair__<int, char>
+      , __pair__<double, std::string> >
+    map_type;
+
+    map_type m(
+        __fusion_make_pair__<int>('X')
+      , __fusion_make_pair__<double>("Men"));
+
+    std::cout << __at_key__<int>(m) << std::endl;
+    std::cout << __at_key__<double>(m) << std::endl;
+
+[endsect]
+
+[section Generation]
+
+These are the functions that you can use to generate various forms of
+__containers__ from elemental values.
+
+[heading Header]
+
+    #include <boost/fusion/container/generation.hpp>
+    #include <boost/fusion/include/generation.hpp>
+
+[section Functions]
+
+[section make_list]
+
+[heading Description]
+
+Create a __list__ from one or more values.
+
+[heading Synopsis]
+
+    template <typename T0, typename T1,... typename TN>
+    typename __result_of_make_list__<T0, T1,... TN>::type
+    make_list(T0 const& x0, T1 const& x1... TN const& xN);
+
+The variadic function accepts `0` to `FUSION_MAX_LIST_SIZE` elements, where
+`FUSION_MAX_LIST_SIZE` is a user definable predefined maximum that defaults
+to `10`. You may define the preprocessor constant `FUSION_MAX_LIST_SIZE`
+before including any Fusion header to change the default. Example:
+
+    #define FUSION_MAX_LIST_SIZE 20
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]                   [Description]]
+ [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `make_list`]]
+]
+
+[heading Expression Semantics]
+
+    make_list(x0, x1,... xN);
+
+[*Return type]: __result_of_make_list__`<T0, T1,... TN>::type`
+
+[*Semantics]: Create a __list__ from `x0, x1,... xN`.
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/make_list.hpp>
+    #include <boost/fusion/include/make_list.hpp>
+
+[heading Example]
+
+    make_list(123, "hello", 12.5)
+
+[heading See also]
+
+__note_boost_ref__
+
+[endsect]
+
+[section make_cons]
+
+[heading Description]
+
+Create a __cons__ from `car` (/head/) and optional `cdr` (/tail/).
+
+[heading Synopsis]
+
+    template <typename Car>
+    typename __result_of_make_cons__<Car>::type
+    make_cons(Car const& car);
+
+    template <typename Car, typename Cdr>
+    typename __result_of_make_cons__<Car, Cdr>::type
+    make_cons(Car const& car, Cdr const& cdr);
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]                   [Description]]
+    [[`car`]            [Instance of `Car`]             [The list's head]]
+ [[`cdr`] [Instance of `Cdr`] [The list's tail (optional)]]
+]
+
+[heading Expression Semantics]
+
+    make_cons(car, cdr);
+
+[*Return type]: __result_of_make_cons__`<Car, Cdr>::type` or
+__result_of_make_cons__`<Car>::type`
+
+[*Semantics]: Create a __cons__ from `car` (/head/) and optional `cdr` (/tail/).
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/make_cons.hpp>
+    #include <boost/fusion/include/make_cons.hpp>
+
+[heading Example]
+
+    make_cons('x', make_cons(123))
+
+[heading See also]
+
+__note_boost_ref__
+
+[endsect]
+
+[section make_vector]
+
+[heading Description]
+
+Create a __vector__ from one or more values.
+
+[heading Synopsis]
+
+    template <typename T0, typename T1,... typename TN>
+    typename __result_of_make_vector__<T0, T1,... TN>::type
+    make_vector(T0 const& x0, T1 const& x1... TN const& xN);
+
+The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE` elements,
+where `FUSION_MAX_VECTOR_SIZE` is a user definable predefined maximum that
+defaults to `10`. You may define the preprocessor constant
+`FUSION_MAX_VECTOR_SIZE` before including any Fusion header to change the
+default. Example:
+
+    #define FUSION_MAX_VECTOR_SIZE 20
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]                   [Description]]
+ [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `make_vector`]]
+]
+
+[heading Expression Semantics]
+
+    make_vector(x0, x1,... xN);
+
+[*Return type]: __result_of_make_vector__`<T0, T1,... TN>::type`
+
+[*Semantics]: Create a __vector__ from `x0, x1,... xN`.
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/make_vector.hpp>
+    #include <boost/fusion/include/make_vector.hpp>
+
+[heading Example]
+
+    make_vector(123, "hello", 12.5)
+
+[heading See also]
+
+__note_boost_ref__
+
+[endsect]
+
+[section make_set]
+
+[heading Description]
+
+Create a __set__ from one or more values.
+
+[heading Synopsis]
+
+    template <typename T0, typename T1,... typename TN>
+    typename __result_of_make_set__<T0, T1,... TN>::type
+    make_set(T0 const& x0, T1 const& x1... TN const& xN);
+
+The variadic function accepts `0` to `FUSION_MAX_SET_SIZE` elements,
+where `FUSION_MAX_SET_SIZE` is a user definable predefined maximum that
+defaults to `10`. You may define the preprocessor constant
+`FUSION_MAX_SET_SIZE` before including any Fusion header to change the
+default. Example:
+
+    #define FUSION_MAX_SET_SIZE 20
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]                   [Description]]
+ [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `make_set`]]
+]
+
+[heading Expression Semantics]
+
+    make_set(x0, x1,... xN);
+
+[*Return type]: __result_of_make_set__`<T0, T1,... TN>::type`
+
+[*Semantics]: Create a __set__ from `x0, x1,... xN`.
+
+[*Precondition]: There may be no duplicate key types.
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/make_set.hpp>
+    #include <boost/fusion/include/make_set.hpp>
+
+[heading Example]
+
+    make_set(123, "hello", 12.5)
+
+[heading See also]
+
+__note_boost_ref__
+
+[endsect]
+
+[section make_map]
+
+[heading Description]
+
+Create a __map__ from one or more key/data pairs.
+
+[heading Synopsis]
+
+    template <
+        typename K0, typename K1,... typename KN
+      , typename T0, typename T1,... typename TN>
+    typename __result_of_make_map__<K0, K0,... KN, T0, T1,... TN>::type
+    make_map(T0 const& x0, T1 const& x1... TN const& xN);
+
+The variadic function accepts `0` to `FUSION_MAX_MAP_SIZE` elements,
+where `FUSION_MAX_MAP_SIZE` is a user definable predefined maximum that
+defaults to `10`. You may define the preprocessor constant
+`FUSION_MAX_MAP_SIZE` before including any Fusion header to change the
+default. Example:
+
+    #define FUSION_MAX_MAP_SIZE 20
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]                   [Description]]
+ [[`K0, K1,... KN`] [The key types] [Keys associated with `x0, x1,... xN`]] + [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `make_map`]]
+]
+
+[heading Expression Semantics]
+
+    make_map<K0, K1,... KN>(x0, x1,... xN);
+
+[*Return type]: __result_of_make_map__`<K0, K0,... KN, T0, T1,... TN>::type`
+
+[*Semantics]: Create a __map__ from `K0, K1,... KN` keys and
+`x0, x1,... xN` data.
+
+[*Precondition]: There may be no duplicate key types.
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/make_map.hpp>
+    #include <boost/fusion/include/make_map.hpp>
+
+[heading Example]
+
+    make_map<int, double>('X', "Men")
+
+[heading See also]
+
+__note_boost_ref__, __fusion_pair__
+
+[endsect]
+
+[section Tiers]
+
+Tiers are sequences, where all elements are non-const reference types. They
+are constructed with a call to a couple of /tie/ function templates. The
+succeeding sections document the various /tier/ flavors.
+
+* __list_tie__
+* __vector_tie__
+* __map_tie__
+
+Example:
+
+    int i; char c; double d;
+      ...
+    __vector_tie__(i, c, a);
+
+The __vector_tie__ function creates a __vector__ of type
+`__vector__<int&, char&, double&>`. The same result could be achieved with the call +__make_vector__(__boost_ref_call__(i), __boost_ref_call__(c), __boost_ref_call__(a))
+[footnote see __boost_ref__ for details about `ref`].
+
+A /tie/ can be used to 'unpack' another tuple into variables. E.g.:
+
+    int i; char c; double d;
+    __vector_tie__(i, c, d) = __make_vector__(1,'a', 5.5);
+    std::cout << i << " " <<  c << " " << d;
+
+This code prints 1 a 5.5 to the standard output stream. A sequence
+unpacking operation like this is found for example in ML and Python. It is
+convenient when calling functions which return sequences.
+
+[heading Ignore]
+
+There is also an object called /ignore/ which allows you to ignore an
+element assigned by a sequence. The idea is that a function may return a
+sequence, only part of which you are interested in. For example:
+
+    char c;
+    __vector_tie__(ignore, c) = __make_vector__(1, 'a');
+
+[endsect]
+
+[section list_tie]
+
+[heading Description]
+
+Constructs a tie using a __list__ sequence.
+
+[heading Synopsis]
+
+    template <typename T0, typename T1,... typename TN>
+    __list__<T0&, T1&,... TN&>
+    list_tie(T0& x0, T1& x1... TN& xN);
+
+The variadic function accepts `0` to `FUSION_MAX_LIST_SIZE` elements, where
+`FUSION_MAX_LIST_SIZE` is a user definable predefined maximum that defaults
+to `10`. You may define the preprocessor constant `FUSION_MAX_LIST_SIZE`
+before including any Fusion header to change the default. Example:
+
+    #define FUSION_MAX_LIST_SIZE 20
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]                       [Description]]
+ [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `list_tie`]]
+]
+
+[heading Expression Semantics]
+
+    list_tie(x0, x1,... xN);
+
+[*Return type]: __list__<T0&, T1&,... TN&>
+
+[*Semantics]: Create a __list__ of references from `x0, x1,... xN`.
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/list_tie.hpp>
+    #include <boost/fusion/include/list_tie.hpp>
+
+[heading Example]
+
+    int i = 123;
+    double d = 123.456;
+    list_tie(i, d)
+
+[endsect]
+
+[section vector_tie]
+
+[heading Description]
+
+Constructs a tie using a __vector__ sequence.
+
+[heading Synopsis]
+
+    template <typename T0, typename T1,... typename TN>
+    __vector__<T0&, T1&,... TN&>
+    vector_tie(T0& x0, T1& x1... TN& xN);
+
+The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE` elements,
+where `FUSION_MAX_VECTOR_SIZE` is a user definable predefined maximum that
+defaults to `10`. You may define the preprocessor constant
+`FUSION_MAX_VECTOR_SIZE` before including any Fusion header to change the
+default. Example:
+
+    #define FUSION_MAX_VECTOR_SIZE 20
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]                       [Description]]
+ [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `vector_tie`]]
+]
+
+[heading Expression Semantics]
+
+    vector_tie(x0, x1,... xN);
+
+[*Return type]: __vector__<T0&, T1&,... TN&>
+
+[*Semantics]: Create a __vector__ of references from `x0, x1,... xN`.
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/vector_tie.hpp>
+    #include <boost/fusion/include/vector_tie.hpp>
+
+[heading Example]
+
+    int i = 123;
+    double d = 123.456;
+    vector_tie(i, d)
+
+[endsect]
+
+[section map_tie]
+
+[heading Description]
+
+Constructs a tie using a __map__ sequence.
+
+[heading Synopsis]
+
+ template <typename K0, typename K1,... typename KN, typename D0, typename D1,... typename DN>
+    __map__<__pair__<K0, D0&>, __pair__<K1, D1&>,... __pair__<KN, DN&> >
+    map_tie(D0& d0, D1& d1... DN& dN);
+
+The variadic function accepts `0` to `FUSION_MAX_MAP_SIZE` elements,
+where `FUSION_MAX_MAP_SIZE` is a user definable predefined maximum that
+defaults to `10`, and a corresponding number of key types.
+You may define the preprocessor constant  `FUSION_MAX_MAP_SIZE` before
+including any Fusion header to change the default. Example:
+
+    #define FUSION_MAX_MAP_SIZE 20
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]                       [Description]]
+ [[`K0, K1,... KN`] [Any type][The key types associated with each of the `x1,x2,...,xN` values]] + [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `map_tie`]]
+]
+
+[heading Expression Semantics]
+
+    map_tie<K0, K1,... KN>(x0, x1,... xN);
+
+[*Return type]: __map__<__pair__<K0, D0&>, __pair__<K1, D1&>,... __pair__<KN, DN&> >
+
+[*Semantics]: Create a __map__ of references from `x0, x1,... xN` with keys `K0, K1,... KN`
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/map_tie.hpp>
+    #include <boost/fusion/include/map_tie.hpp>
+
+[heading Example]
+
+    struct int_key;
+    struct double_key;
+    ...
+    int i = 123;
+    double d = 123.456;
+    map_tie<int_key, double_key>(i, d)
+
+[endsect]
+
+[endsect]
+
+[section MetaFunctions]
+
+[section make_list]
+
+[heading Description]
+
+Returns the result type of __make_list__.
+
+[heading Synopsis]
+
+    template <typename T0, typename T1,... typename TN>
+    struct make_list;
+
+The variadic function accepts `0` to `FUSION_MAX_LIST_SIZE` elements, where
+`FUSION_MAX_LIST_SIZE` is a user definable predefined maximum that defaults
+to `10`. You may define the preprocessor constant `FUSION_MAX_LIST_SIZE`
+before including any Fusion header to change the default. Example:
+
+    #define FUSION_MAX_LIST_SIZE 20
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]       [Description]]
+ [[`T0, T1,... TN`] [Any type] [Template arguments to `make_list`]]
+]
+
+[heading Expression Semantics]
+
+    result_of::make_list<T0, T1,... TN>::type
+
+[*Return type]: A __list__ with elements of types converted following the
+rules for __element_conversion__.
+
+[*Semantics]: Create a __list__ from `T0, T1,... TN`.
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/make_list.hpp>
+    #include <boost/fusion/include/make_list.hpp>
+
+[heading Example]
+
+    result_of::make_list<int, const char(&)[7], double>::type
+
+[endsect]
+
+[section make_cons]
+
+[heading Description]
+
+Returns the result type of __make_cons__.
+
+[heading Synopsis]
+
+    template <typename Car, typename Cdr = nil>
+    struct make_cons;
+
+[heading Parameters]
+
+[table
+    [[Parameter]        [Requirement]               [Description]]
+    [[`Car`]            [Any type]                  [The list's head type]]
+ [[`Cdr`] [A `cons`] [The list's tail type (optional)]]
+]
+
+[heading Expression Semantics]
+
+    result_of::make_cons<Car, Cdr>::type
+
+[*Return type]: A __cons__ with head element, `Car`, of type converted
+following the rules for __element_conversion__, and tail, `Cdr`.
+
+[*Semantics]: Create a __cons__ from `Car` (/head/) and optional `Cdr` (/tail/).
+
+[heading Header]
+
+    #include <boost/fusion/container/generation/make_cons.hpp>
+    #include <boost/fusion/include/make_cons.hpp>
+
+[heading Example]
***The diff for this file has been truncated for email.***
=======================================
--- /dev/null
+++ /trunk/libs/fusion/doc/extension.qbk        Mon Feb  8 01:01:45 2010
@@ -0,0 +1,487 @@
+[/==============================================================================
+    Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
+
+    Use, modification and distribution is subject to 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)
+===============================================================================/]
+[section Extension]
+
+[section:ext_full The Full Extension Mechanism]
+
+The Fusion library is designed to be extensible, new sequences types can easily +be added. In fact, the library support for `std::pair`, `boost::array` and __mpl__
+sequences is entirely provided using the extension mechanism.
+
+The process for adding a new sequence type to Fusion is:
+
+# Enable the __tag_dispatching__ mechanism used by Fusion for your sequence type
+# Design an iterator type for the sequence
+# Provide specialized behaviour for the intrinsic operations of the new Fusion sequence
+
+[heading Our example]
+
+In order to illustrate enabling a new sequence type for use with Fusion, we
+are going to use the type:
+
+    namespace example
+    {
+        struct example_struct
+        {
+            std::string name;
+            int age;
+            example_struct(
+                const std::string& n,
+                int a)
+                : name(n), age(a)
+            {}
+        };
+    }
+
+We are going to pretend that this type has been provided by a 3rd party
+library, and therefore cannot be modified. We shall work through all the
+necessary steps to enable `example_struct` to serve as an __associative_sequence__
+as described in the __quick_start__ guide.
+
+[heading Enabling Tag Dispatching]
+
+The Fusion extensibility mechanism uses __tag_dispatching__ to call the
+correct code for a given sequence type. In order to exploit the tag
+dispatching mechanism we must first declare a new tag type for the
+mechanism to use. For example:
+
+    namespace example {
+        struct example_sequence_tag; // Only definition needed
+    }
+
+Next we need to enable the `traits::tag_of` metafunction to return our newly chosen +tag type for operations involving our sequence. This is done by specializing
+`traits::tag_of` for our sequence type.
+
+    #include <boost/fusion/support/tag_of_fwd.hpp>
+    #include <boost/fusion/include/tag_of_fwd.hpp>
+
+    namespace boost { namespace fusion { namespace traits {
+        template<>
+        struct tag_of<example_struct>
+        {
+            typedef example::example_sequence_tag type;
+        };
+    }}}
+
+`traits::tag_of` also has a second template argument,
+that can be used in conjuction with `boost::enable_if` to provide tag
+support for groups of related types. This feature is not necessary
+for our sequence, but for an example see the code in:
+
+    #include <boost/fusion/adapted/array/tag_of.hpp>
+    #include <boost/fusion/include/tag_of.hpp>
+
+[heading Designing a suitable iterator]
+
+We need an iterator to describe positions, and provide access to
+the data within our sequence. As it is straightforward to do,
+we are going to provide a random access iterator in our example.
+
+We will use a simple design, in which the 2 members of
+`example_struct` are given numbered indices, 0 for `name` and
+1 for `age` respectively.
+
+    template<typename Struct, int Pos>
+    struct example_struct_iterator
+ : boost::fusion::iterator_base<example_struct_iterator<Struct, Pos> >
+    {
+        BOOST_STATIC_ASSERT(Pos >=0 && Pos < 3);
+        typedef Struct struct_type;
+        typedef boost::mpl::int_<Pos> index;
+        typedef boost::fusion::random_access_traversal_tag category;
+
+        example_struct_iterator(Struct& str)
+            : struct_(str) {}
+
+        Struct& struct_;
+    };
+
+A quick summary of the details of our iterator:
+
+# The iterator is parameterized by the type it is iterating over, and the index of the current element. +# The typedefs `struct_type` and `index` provide convenient access to information we will need later in
+  the implementation.
+# The typedef `category` allows the `traits::__category_of__` metafunction to establish
+  the traversal category of the iterator.
+# The constructor stores a reference to the `example_struct` being iterated over.
+
+We also need to enable __tag_dispatching__ for our iterator type, with another specialization of
+`traits::tag_of`.
+
+In isolation, the iterator implementation is pretty dry. Things should become clearer as we
+add features to our implementation.
+
+[heading A first couple of instructive features]
+
+To start with, we will get the __result_of_value_of__ metafunction working. To +do this, we provide a specialization of the `boost::fusion::extension::value_of_impl` template for
+our iterator's tag type.
+
+    template<>
+    struct value_of_impl<example::example_struct_iterator_tag>
+    {
+        template<typename Iterator>
+        struct apply;
+
+        template<typename Struct>
+        struct apply<example::example_struct_iterator<Struct, 0> >
+        {
+            typedef std::string type;
+        };
+
+        template<typename Struct>
+        struct apply<example::example_struct_iterator<Struct, 1> >
+        {
+            typedef int type;
+        };
+    };
+
+The implementation itself is pretty simple, it just uses 2 partial specializations to +provide the type of the 2 different members of `example_struct`, based on the index of the iterator.
+
+To understand how `value_of_impl` is used by the library we will look at the implementation of __result_of_value_of__:
+
+    template <typename Iterator>
+    struct value_of
+ : extension::value_of_impl<typename detail::tag_of<Iterator>::type>::
+            template apply<Iterator>
+    {};
+
+So __result_of_value_of__ uses __tag_dispatching__ to select an __mpl_metafunction_class__
+to provide its functionality. You will notice this pattern throughout the
+implementation of Fusion.
+
+Ok, lets enable dereferencing of our iterator. In this case we must provide a suitable
+specialization of `deref_impl`.
+
+    template<>
+    struct deref_impl<example::example_struct_iterator_tag>
+    {
+        template<typename Iterator>
+        struct apply;
+
+        template<typename Struct>
+        struct apply<example::example_struct_iterator<Struct, 0> >
+        {
+            typedef typename mpl::if_<
+ is_const<Struct>, std::string const&, std::string&>::type type;
+
+            static type
+            call(example::example_struct_iterator<Struct, 0> const& it)
+            {
+                return it.struct_.name;
+            }
+        };
+
+        template<typename Struct>
+        struct apply<example::example_struct_iterator<Struct, 1> >
+        {
+            typedef typename mpl::if_<
+                is_const<Struct>, int const&, int&>::type type;
+
+            static type
+            call(example::example_struct_iterator<Struct, 1> const& it)
+            {
+                    return it.struct_.age;
+                }
+            };
+        };
+    }
+
+The use of `deref_impl` is very similar to that of `value_of_impl`, but it also +provides some runtime functionality this time via the `call` static member function. +To see how `deref_impl` is used, lets have a look at the implementation of __deref__:
+
+    namespace result_of
+    {
+        template <typename Iterator>
+        struct __deref__
+ : extension::deref_impl<typename detail::tag_of<Iterator>::type>::
+                template apply<Iterator>
+        {};
+    }
+
+    template <typename Iterator>
+    typename result_of::deref<Iterator>::type
+    __deref__(Iterator const& i)
+    {
+        typedef result_of::deref<Iterator> deref_meta;
+        return deref_meta::call(i);
+    }
+
+So again __result_of_deref__ uses __tag_dispatching__ in exactly the
+same way as the __result_of_value_of__ implementation. The runtime functionality used
+by __deref__ is provided by the `call` static function of the selected
+__mpl_metafunction_class__.
+
+The actual implementation of `deref_impl` is slightly more complex than that of `value_of_impl`.
+We also need to implement the `call` function, which returns a reference
+to the appropriate member of the underlying sequence. We also require a little +bit of metaprogramming to return `const` references if the underlying sequence
+is const.
+
+[note Although there is a fair amount of left to do to produce a fully fledged +Fusion sequence, __result_of_value_of__ and __deref__ illustrate all the signficant concepts
+required. The remainder of the process is very repetitive, simply requiring
+implementation of a suitable `xxxx_impl` for each feature `xxxx`.
+]
+
+[heading Implementing the remaining iterator functionality]
+
+Ok, now we have seen the way __result_of_value_of__ and __deref__ work, everything else will work
+ in pretty much the same way. Lets start with forward iteration,
+by providing a `next_impl`:
+
+    template<>
+    struct next_impl<example::example_struct_iterator_tag>
+    {
+        template<typename Iterator>
+        struct apply
+        {
+            typedef typename Iterator::struct_type struct_type;
+            typedef typename Iterator::index index;
+ typedef example::example_struct_iterator<struct_type, index::value + 1> type;
+
+            static type
+            call(Iterator const& i)
+            {
+                 return type(i.struct_);
+            }
+        };
+    };
+
+This should be very familiar from our `deref_impl` implementation, we will be
+using this approach again and again now. Our design is simply to increment
+the `index` counter to move on to the next element. The various other iterator
+manipulations we need to perform will all just involve simple calculations
+with the `index` variables.
+
+We also need to provide a suitable `equal_to_impl` so that iterators can be
+correctly compared. A __bidirectional_iterator__ will also need an implementation of `prior_impl`. For a +__random_access_iterator__ `distance_impl` and `advance_impl` also need to be provided
+in order to satisfy the necessary complexity guarantees. As our iterator is
+a __random_access_iterator__ we will have to implement all of these functions.
+
+Full implementations of `prior_impl`, `advance_impl`, `distance_impl` and `equal_to_impl` are
+provided in the example code.
+
+[heading Implementing the intrinsic functions of the sequence]
+
+In order that Fusion can correctly identify our sequence as a Fusion sequence, we
+need to enable `is_sequence` for our sequence type. As usual we just create
+an `impl` type specialized for our sequence tag:
+
+     template<>
+     struct is_sequence_impl<example::example_sequence_tag>
+     {
+         template<typename T>
+         struct apply : mpl::true_ {};
+     };
+
+We've some similar formalities to complete, providing `category_of_impl` so Fusion +can correctly identify our sequence type, and `is_view_impl` so Fusion can correctly
+identify our sequence as not being a __view__ type. Implementations are
+provide in the example code.
+
+Now we've completed some formalities, on to more interesting features. Lets get +__begin__ working so that we can get an iterator to start accessing the data in
+our sequence.
+
+    template<>
+    struct begin_impl<example::example_sequence_tag>
+    {
+        template<typename Sequence>
+        struct apply
+        {
+            typedef example::example_struct_iterator<Sequence, 0> type;
+
+            static type
+            call(Sequence& seq)
+            {
+                return type(seq);
+            }
+        };
+    };
+
+The implementation uses the same ideas we have applied throughout, in this case +we are just creating one of the iterators we developed earlier, pointing to the +first element in the sequence. The implementation of __end__ is very similar, and
+is provided in the example code.
+
+For our __random_access_sequence__ we will also need to implement `size_impl`,
+`value_at_impl` and `at_impl`.
+
+[heading Enabling our type as an associative sequence]
+
+In order for `example_struct` to serve as an associative forward sequence,
+we need to adapt the traversal category of our sequence and our iterator
+accordingly and enable 3 intrinsic sequence lookup features, __at_key__,
+__value_at_key__ and __has_key__. We also need to enable 3 iterator lookup
+features, __result_of_key_of__, __result_of_value_of_data__ and __deref_data__.
+
+To implement `at_key_impl` we need to associate the `fields::name` and `fields::age` +types described in the __quick_start__ guide with the appropriate members of `example_struct`.
+Our implementation is as follows:
+
+    template<>
+    struct at_key_impl<example::example_sequence_tag>
+    {
+        template<typename Sequence, typename Key>
+        struct apply;
+
+        template<typename Sequence>
+        struct apply<Sequence, fields::name>
+        {
+            typedef typename mpl::if_<
+                is_const<Sequence>,
+                std::string const&,
+                std::string&>::type type;
+
+            static type
+            call(Sequence& seq)
+            {
+                return seq.name;
+            };
+        };
+
+        template<typename Sequence>
+        struct apply<Sequence, fields::age>
+        {
+            typedef typename mpl::if_<
+                is_const<Sequence>,
+                int const&,
+                int&>::type type;
+
+            static type
+            call(Sequence& seq)
+            {
+                return seq.age;
+            };
+        };
+    };
+
+Its all very similar to the implementations we've seen previously,
+such as `deref_impl` and `value_of_impl`. Instead of identifying
+the members by index or position, we are now selecting them using
+the types `fields::name` and `fields::age`. The implementations of
+the other functions are equally straightforward, and are provided in
+the example code.
+
+[heading Summary]
+
+We've now worked through the entire process for adding a new random
+access sequence and we've also enabled our type to serve as an associative
+sequence. The implementation was slightly longwinded, but followed
+a simple repeating pattern.
+
+The support for `std::pair`, __mpl__ sequences, and `boost::array` all
+use the same approach, and provide additional examples of the approach
+for a variety of types.
+
+[endsect]
+
+[section Sequence Facade]
+
+[heading Description]
+The __sequence_facade__ template provides an intrusive mechanism for
+producing a conforming Fusion iterator.
+
+[heading Synopsis]
+ template<typename Derived, typename TravesalTag, typename IsView = mpl::false_>
+    struct sequence_facade;
+
+[heading Usage]
+The user of __sequence_facade__ derives his sequence type from a specialization of __sequence_facade__ and passes the derived sequence type as the first template parameter. The second template parameter should be the traversal category of the sequence being implemented. The 3rd parameter should be set to `mpl::true_` if the sequence is a view.
+
+The user must the implement the key expressions required by their sequence type.
+
+[table Parameters
+[[Name][Description]]
+[[`sequence`, `Seq`][A type derived from __sequence_facade__]]
+[[`N`][An __mpl_integral_constant__]]
+]
+
+[table Key Expressions
+[[Expression][Result]]
+[[`sequence::template begin<Seq>::type`][The type of an iterator to the beginning of a sequence of type `Seq`]] +[[`sequence::template begin<Seq>::call(seq)`][An iterator to the beginning of sequence `seq`]] +[[`sequence::template end<Seq>::type`][The type of an iterator to the end of a sequence of type `Seq`]] +[[`sequence::template end<Seq>::call(seq)`][An iterator to the end of sequence `seq`]] +[[`sequence::template size<Seq>::type`][The size of a sequence of type `Seq` as an __mpl_integral_constant__]]
+[[`sequence::template size<Seq>::call(seq)`][The size of sequence `seq`]]
+[[`sequence::template at<Seq, N>::type`][The type of element `N` in a sequence of type `Seq`]] +[[`sequence::template at<Seq, N>::call(seq)`][Element `N` in sequence `seq`]] +[[`sequence::template value_at<Sequence, N>::type`][The type of the `N`th element in a sequence of type `Seq`]]
+]
+
+[heading Include]
+
+    #include <boost/fusion/sequence/sequence_facade.hpp>
+    #include <boost/fusion/include/sequence_facade.hpp>
+
+[heading Example]
+A full working example using __sequence_facade__ is provided in triple.cpp in the extension examples.
+
+[endsect]
+
+[section Iterator Facade]
+
+[heading Description]
+The __iterator_facade__ template provides an intrusive mechanism for
+producing a conforming Fusion iterator.
+
+[heading Synopsis]
+
+    template<typename Derived, typename TravesalTag>
+    struct iterator_facade;
+
+[heading Usage]
+The user of iterator_facade derives his iterator type from a specialization of iterator_facade and passes the derived iterator type as the first template parameter. The second template parameter should be the traversal category of the iterator being implemented.
+
+The user must the implement the key expressions required by their iterator type.
+
+[table Parameters
+[[Name][Description]]
+[[`iterator`, `It`, `It1`, `It2`][A type derived from __iterator_facade__]]
+[[`N`][An __mpl_integral_constant__]]
+]
+
+[table Key Expressions
+[[Expression][Result][Default]]
+[[`iterator::template value_of<It>::type`][The element stored at iterator position `It`][None]] +[[`iterator::template deref<It>::type`][The type returned when dereferencing an iterator of type `It`][None]] +[[`iterator::template deref<It>::call(it)`][Dereferences iterator `it`][None]] +[[`iterator::template next<It>::type`][The type of the next element from `It`][None]] +[[`iterator::template next<It>::call(it)`][The next iterator after `it`][None]] +[[`iterator::template prior<It>::type`][The type of the next element from `It`][None]] +[[`iterator::template prior<It>::call(it)`][The next iterator after `it`][None]] +[[`iterator::template advance<It, N>::type`][The type of an iterator advanced `N` elements from `It`][Implemented in terms of `next` and `prior`]] +[[`iterator::template advance<It, N>::call(it)`][An iterator advanced `N` elements from `it`][Implemented in terms of `next` and `prior`]] +[[`iterator::template distance<It1, It2>::type`][The distance between iterators of type `It1` and `It2` as an __mpl_integral_constant__][None]] +[[`iterator::template distance<It1, It2>::call(it1, it2)`][The distance between iterator `it1` and `it2`][None]] +[[`iterator::template equal_to<It1, It2>::type`][The distance between iterators of type `It1` and `It2`][`boost::same_type<It1, It2>::type`]] +[[`iterator::template equal_to<It1, It2>::call(it1, it2)`][The distance between iterators `it1` and `it2`][`boost::same_type<It1, It2>::type()`]] +[[`iterator::template key_of<It>::type`][The key type associated with the element from `It`][None]] +[[`iterator::template value_of_data<It>::type`][The type of the data property associated with the element from `It`][None]] +[[`iterator::template deref_data<It>::type`][The type that will be returned by dereferencing the data property of the element from `It`][None]] +[[`iterator::template deref_data<It>::call(it)`][Deferences the data property associated with the element referenced by `it`][None]]
+]
+
+[heading Header]
+
+    #include <boost/fusion/iterator/iterator_facade.hpp>
+    #include <boost/fusion/include/iterator_facade.hpp>
+
+[heading Example]
+A full working example using __iterator_facade__ is provided in triple.cpp in the extension examples.
+
+[endsect]
+
+[endsect]
+
=======================================
***Additional files exist in this changeset.***

Other related posts:

  • » [boost-doc-zh] r377 committed - 升级至1.41.0,第三批,libs/目录下f-g子目录 - boost-doc-zh